Passed
Push — master ( c1d503...0431b4 )
by Andrii
02:39
created

src/rewrite.ts   A

Complexity

Total Complexity 10
Complexity/F 10

Size

Lines of Code 67
Function Count 1

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 10
eloc 56
mnd 9
bc 9
fnc 1
dl 0
loc 67
rs 10
bpm 9
cpm 10
noi 0
c 0
b 0
f 0

1 Function

Rating   Name   Duplication   Size   Complexity  
C rewrite.ts ➔ rewrite 0 54 10
1
import {promisify} from "util"
2
import {createReadStream, open, writeFile, close, truncate } from 'fs'
3
import {createInterface} from 'readline'
4
import { $exists } from "./utils"
5
6
const $open = promisify(open)
7
, $write = promisify(writeFile)
8
, $truncate = promisify(truncate)
9
, $close = promisify(close)
10
11
export = rewrite
12
13
// TODO #12 with .trim() https://jsbench.me/fykmaajqmc/
14
15
async function rewrite(filename: string, lines: string[], eol: string, checkMode: boolean) {
16
  const {length} = lines
17
  , {length: eolLength} = eol
18
  , fileExists = await $exists(filename)
19
20
  let row = 0
21
  , position = 0
22
23
  if (fileExists) {
24
    const lineReader = createInterface({
25
      input: createReadStream(filename),
26
      crlfDelay: Infinity,
27
      historySize: 0
28
    })
29
30
    let isSame = true
31
32
    for await (const line of lineReader) {
33
      if (line !== lines[row]) {
34
        isSame = false
35
        continue
36
      }
37
      row++
38
      position += line.length
39
    }
40
41
    lineReader.close()
42
43
    if (isSame) {
44
      if (lines[row] === "")
45
        row++
46
      if (length === row)
47
        return
48
    }
49
50
    !checkMode && await $truncate(filename, position + eolLength * (row - 1))
51
  }
52
53
  if (checkMode)
54
    throw Error(`Content of "${filename}" should be another`)
55
56
  const fd = await $open(filename, "a")
57
58
  for (let i = row; i < length; i++)
59
    await $write(fd, `${
60
      i ? eol : ''
61
    }${
62
      lines[i]
63
    }`)
64
65
  await $close(fd)
66
}
67