@nsis/dent 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,51 @@
10
10
 
11
11
  `npm install @nsis/dent`
12
12
 
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { createFormatter } from '@nsis/dent';
17
+
18
+ const format = createFormatter(/* user options */);
19
+
20
+ format(`
21
+ # Look ma, no indentation
22
+ Name "Demo"
23
+ Section
24
+ Nop
25
+ Section
26
+ `);
27
+ ```
28
+
29
+ ### Options
30
+
31
+ #### `options.endOfLines`
32
+
33
+ Type: `"crlf" | "lf"`
34
+ Default: `"crlf"` (Windows), `"lf"` (Linux, macOS)
35
+
36
+ #### `options.indentSize`
37
+
38
+ Type: `number`
39
+ Default: `2`
40
+
41
+ #### `options.trimEmptyLines`
42
+
43
+ Type: `boolean`
44
+ Default: `true`
45
+
46
+ #### `options.useTabs`
47
+
48
+ Type: `boolean`
49
+ Default: `true`
50
+
51
+ :white_check_mark: [Why defaulting to tabs is good for accessibility](https://github.com/prettier/prettier/issues/7475#issuecomment-668544890)
52
+
53
+ ## Related
54
+
55
+ - [CLI for `dent`](https://www.npmjs.com/package/@nsis/dent-cli)
56
+
13
57
  ## License
14
58
 
15
59
  This work is licensed under [The MIT License](LICENSE)
16
-
60
+
package/dist/index.mjs CHANGED
@@ -75,31 +75,25 @@ var rules = {
75
75
 
76
76
  // src/main.ts
77
77
  var defaultIndentation = 2;
78
- var Dent = class {
79
- options;
80
- constructor(options = {}) {
81
- this.options = {
82
- endOfLines: platform() === "win32" ? "crlf" : "lf",
83
- indentSize: defaultIndentation,
84
- trimEmptyLines: true,
85
- useTabs: true,
86
- ...options
87
- };
88
- if (options.useTabs === true && options.indentSize) {
89
- throw Error("The indentSize option can only be mixed with useTabs");
90
- }
91
- if (options.useTabs === false && options.indentSize) {
92
- if (isNaN(options.indentSize) || options.indentSize <= 0) {
93
- throw Error("The indentSize option expects a positive integer");
94
- }
78
+ function createFormatter(options = {}) {
79
+ const mergedOptions = {
80
+ endOfLines: platform() === "win32" ? "crlf" : "lf",
81
+ indentSize: defaultIndentation,
82
+ trimEmptyLines: true,
83
+ useTabs: true,
84
+ ...options
85
+ };
86
+ if (mergedOptions.useTabs === false && mergedOptions.indentSize) {
87
+ if (isNaN(mergedOptions.indentSize) || mergedOptions.indentSize <= 0) {
88
+ throw Error("The indentSize option expects a positive integer");
95
89
  }
96
90
  }
97
- format(fileContents) {
91
+ function format(fileContents) {
98
92
  let indentationLevel = 0;
99
93
  let switchIndentationLevel = 0;
100
- const lineEndings = this.detectEOL(fileContents);
94
+ const lineEndings = detectEOL(fileContents);
101
95
  const formattedLines = [];
102
- const lines = this.options.trimEmptyLines === true ? fileContents.trim().replaceAll(/^(\s*\r?\n){2,}/gm, lineEndings).split(lineEndings) : fileContents.split(lineEndings);
96
+ const lines = mergedOptions.trimEmptyLines === true ? fileContents.trim().replaceAll(/^(\s*\r?\n){2,}/gm, lineEndings).split(lineEndings) : fileContents.split(lineEndings);
103
97
  lines.forEach((line) => {
104
98
  const keyword = line.trim().split(" ").at(0) ?? "";
105
99
  if (keyword.toLowerCase() === "${Switch}") {
@@ -108,37 +102,37 @@ var Dent = class {
108
102
  switch (true) {
109
103
  case keyword.toLowerCase() === "${EndSwitch}":
110
104
  indentationLevel = switchIndentationLevel;
111
- formattedLines.push(this.appendLine(line, indentationLevel));
105
+ formattedLines.push(appendLine(line, indentationLevel));
112
106
  indentationLevel = indentationLevel === 0 ? 0 : indentationLevel - 1;
113
107
  break;
114
108
  case rules.specialIndenters.includes(keyword.toLowerCase()):
115
- formattedLines.push(this.appendLine(line, indentationLevel - 1));
109
+ formattedLines.push(appendLine(line, indentationLevel - 1));
116
110
  break;
117
111
  case rules.specialDedenters.includes(keyword.toLowerCase()):
118
- formattedLines.push(this.appendLine(line, indentationLevel));
112
+ formattedLines.push(appendLine(line, indentationLevel));
119
113
  indentationLevel--;
120
114
  break;
121
115
  case rules.indenters.includes(keyword.toLowerCase()):
122
- formattedLines.push(this.appendLine(line, indentationLevel));
116
+ formattedLines.push(appendLine(line, indentationLevel));
123
117
  indentationLevel++;
124
118
  break;
125
119
  case rules.dedenters.includes(keyword.toLowerCase()):
126
120
  indentationLevel = indentationLevel === 0 ? 0 : indentationLevel - 1;
127
- formattedLines.push(this.appendLine(line, indentationLevel));
121
+ formattedLines.push(appendLine(line, indentationLevel));
128
122
  break;
129
123
  default:
130
- formattedLines.push(this.appendLine(line, indentationLevel));
124
+ formattedLines.push(appendLine(line, indentationLevel));
131
125
  break;
132
126
  }
133
127
  });
134
128
  return formattedLines.join(lineEndings);
135
129
  }
136
- appendLine(line, level) {
137
- return line.length ? `${this.getIndentChar().repeat(level)}${line.trim()}` : "";
130
+ function appendLine(line, level) {
131
+ return line.length ? `${getIndentChar(level)}${line.trim()}` : "";
138
132
  }
139
- detectEOL(input) {
140
- if (this.options.endOfLines) {
141
- return this.options.endOfLines === "crlf" ? "\r\n" : "\n";
133
+ function detectEOL(input) {
134
+ if (mergedOptions.endOfLines) {
135
+ return mergedOptions.endOfLines === "crlf" ? "\r\n" : "\n";
142
136
  }
143
137
  const newLine = detectNewline(input);
144
138
  if (newLine !== void 0) {
@@ -147,10 +141,11 @@ var Dent = class {
147
141
  return platform() === "win32" ? "\r\n" : "\n";
148
142
  }
149
143
  }
150
- getIndentChar() {
151
- return this.options.useTabs ? " ".repeat(this.options.indentSize || defaultIndentation) : " ".repeat(this.options.indentSize || defaultIndentation);
144
+ function getIndentChar(level) {
145
+ return (mergedOptions.useTabs ? " ".repeat(mergedOptions.indentSize || defaultIndentation) : " ".repeat(mergedOptions.indentSize || defaultIndentation)).repeat(level);
152
146
  }
153
- };
147
+ return format;
148
+ }
154
149
  export {
155
- Dent
150
+ createFormatter
156
151
  };
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@nsis/dent",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "An opinionated code formatter for NSIS scripts",
5
5
  "license": "MIT",
6
6
  "scripts": {
7
- "build": "esbuild src/main.ts --bundle --platform=node --outfile=dist/index.mjs --format=esm --external:detect-newline",
7
+ "build": "esbuild src/main.ts --bundle --platform=node --outfile=dist/index.mjs --format=esm --external:detect-newline --external:globby",
8
8
  "dev": "npm run start",
9
9
  "fix": "eslint --fix ./src",
10
10
  "lint:json": "eslint ./*.json --ignore-path .gitignore",
@@ -12,21 +12,19 @@
12
12
  "lint": "npm-run-all --parallel lint:*",
13
13
  "prepack": "npm run build",
14
14
  "start": "npm run build -- --watch",
15
- "test": "uvu tests",
15
+ "test": "uvu -r tsm tests",
16
16
  "prepare": "husky install"
17
17
  },
18
18
  "files": [
19
19
  "dist/",
20
+ "types/",
20
21
  "LICENSE",
22
+ "package.json",
21
23
  "README.md"
22
24
  ],
23
25
  "type": "module",
24
- "types": "./src/main.ts",
25
- "exports": {
26
- ".": {
27
- "import": "./dist/index.mjs"
28
- }
29
- },
26
+ "typings": "types/",
27
+ "exports": "./dist/index.mjs",
30
28
  "engines": {
31
29
  "node": "^14.13.1 || >=16.0.0"
32
30
  },
@@ -39,21 +37,21 @@
39
37
  "formatter"
40
38
  ],
41
39
  "dependencies": {
42
- "detect-newline": "^4.0.0",
43
- "globby": "^13.1.4"
40
+ "detect-newline": "^4.0.0"
44
41
  },
45
42
  "devDependencies": {
46
43
  "@types/node": "^20.2.1",
47
- "@typescript-eslint/eslint-plugin": "^5.59.6",
48
- "@typescript-eslint/parser": "^5.59.6",
49
- "esbuild": "^0.17.19",
50
- "eslint": "^8.41.0",
44
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
45
+ "@typescript-eslint/parser": "^6.0.0",
46
+ "esbuild": "^0.18.13",
47
+ "eslint": "^8.45.0",
51
48
  "eslint-plugin-json": "^3.1.0",
52
49
  "husky": "^8.0.3",
53
- "lint-staged": "^13.2.2",
54
- "npm-run-all2": "^6.0.5",
55
- "tslib": "^2.5.2",
56
- "typescript": "^5.0.4",
50
+ "lint-staged": "^13.2.3",
51
+ "npm-run-all2": "^6.0.6",
52
+ "tslib": "^2.6.0",
53
+ "tsm": "^2.3.0",
54
+ "typescript": "^5.1.6",
57
55
  "uvu": "^0.5.6"
58
56
  },
59
57
  "lint-staged": {
@@ -0,0 +1,18 @@
1
+ declare namespace NsisDent {
2
+ function createFormatter(options?: Options): Formatter;
3
+
4
+ type Formatter = {
5
+ format(fileContents: string): string;
6
+ }
7
+
8
+ type Options = {
9
+ endOfLines?: 'crlf' | 'lf';
10
+ indentSize?: number;
11
+ trimEmptyLines?: boolean;
12
+ useTabs?: boolean;
13
+ }
14
+ }
15
+
16
+ export = NsisDent;
17
+ export as namespace NsisDent;
18
+
package/dist/.mjs DELETED
@@ -1,152 +0,0 @@
1
- // src/main.ts
2
- import { detectNewline } from "detect-newline";
3
- import { platform } from "node:os";
4
-
5
- // src/rules.ts
6
- var rules = {
7
- indenters: [
8
- "!if",
9
- "!ifdef",
10
- "!ifmacrodef",
11
- "!ifmacrondef",
12
- "!ifndef",
13
- "!macro",
14
- "${Case}",
15
- "${Case2}",
16
- "${Case3}",
17
- "${Case4}",
18
- "${Case5}",
19
- "${CaseElse}",
20
- "${Default}",
21
- "${Do}",
22
- "${DoUntil}",
23
- "${DoWhile}",
24
- "${For}",
25
- "${ForEach}",
26
- "${If}",
27
- "${IfNot}",
28
- "${MementoSection}",
29
- "${MementoUnselectedSection}",
30
- "${Select}",
31
- "${Switch}",
32
- "${Unless}",
33
- "Function",
34
- "PageEx",
35
- "Section",
36
- "SectionGroup"
37
- ].map((i) => i.toLowerCase()),
38
- dedenters: [
39
- "!endif",
40
- "!macroend",
41
- "${EndIf}",
42
- "${EndSelect}",
43
- "${EndSwitch}",
44
- "${EndWhile}",
45
- "${Loop}",
46
- "${LoopUntil}",
47
- "${LoopWhile}",
48
- "${MementoSectionEnd}",
49
- "${Next}",
50
- "${While}",
51
- "FunctionEnd",
52
- "PageExEnd",
53
- "SectionEnd",
54
- "SectionGroupEnd"
55
- ].map((i) => i.toLowerCase()),
56
- specialIndenters: [
57
- "!else",
58
- "!elseif",
59
- "${Else}",
60
- "${ElseIf}",
61
- "${ElseIfNot}",
62
- "${ElseUnless}",
63
- "${AndIf}",
64
- "${AndIfNot}",
65
- "${AndUnless}",
66
- "${OrIf}",
67
- "${OrIfNot}",
68
- "${OrUnless}"
69
- ].map((i) => i.toLowerCase()),
70
- specialDedenters: [
71
- "${Break}"
72
- ].map((i) => i.toLowerCase())
73
- };
74
-
75
- // src/main.ts
76
- var Dent = class {
77
- options = {
78
- indentSize: 2,
79
- trimEmptyLines: true,
80
- useTabs: true
81
- };
82
- constructor(options = {}) {
83
- if (options.useTabs === true && options.indentSize) {
84
- throw Error("The indentSize option can only be mixed with useTabs");
85
- }
86
- if (options.useTabs === false && options.indentSize) {
87
- if (isNaN(options.indentSize) || options.indentSize <= 0) {
88
- throw Error("The indentSize option expects a positive integer");
89
- }
90
- }
91
- this.options = {
92
- ...this.options,
93
- ...options
94
- };
95
- }
96
- format(fileContents) {
97
- let indentationLevel = 0;
98
- let switchIndentationLevel = 0;
99
- const lineEndings = this.detectEOL(fileContents);
100
- const formattedLines = [];
101
- const lines = this.options.trimEmptyLines === true ? fileContents.trim().replaceAll(/^(\s*\r?\n){2,}/gm, lineEndings).split(lineEndings) : fileContents.split(lineEndings);
102
- lines.forEach((line) => {
103
- const keyword = line.trim().split(" ").at(0) ?? "";
104
- if (keyword.toLowerCase() === "${Switch}") {
105
- switchIndentationLevel = indentationLevel;
106
- }
107
- switch (true) {
108
- case keyword.toLowerCase() === "${EndSwitch}":
109
- indentationLevel = switchIndentationLevel;
110
- formattedLines.push(this.appendLine(line, indentationLevel));
111
- indentationLevel = indentationLevel === 0 ? 0 : indentationLevel - 1;
112
- break;
113
- case rules.specialIndenters.includes(keyword.toLowerCase()):
114
- formattedLines.push(this.appendLine(line, indentationLevel - 1));
115
- break;
116
- case rules.specialDedenters.includes(keyword.toLowerCase()):
117
- formattedLines.push(this.appendLine(line, indentationLevel));
118
- indentationLevel--;
119
- break;
120
- case rules.indenters.includes(keyword.toLowerCase()):
121
- formattedLines.push(this.appendLine(line, indentationLevel));
122
- indentationLevel++;
123
- break;
124
- case rules.dedenters.includes(keyword.toLowerCase()):
125
- indentationLevel = indentationLevel === 0 ? 0 : indentationLevel - 1;
126
- formattedLines.push(this.appendLine(line, indentationLevel));
127
- break;
128
- default:
129
- formattedLines.push(this.appendLine(line, indentationLevel));
130
- break;
131
- }
132
- });
133
- return formattedLines.join(lineEndings);
134
- }
135
- appendLine(line, level) {
136
- return line.length ? `${this.getIndentChar(this.options).repeat(level)}${line.trim()}` : "";
137
- }
138
- detectEOL(input) {
139
- const newLine = detectNewline(input);
140
- if (newLine !== void 0) {
141
- return newLine;
142
- } else {
143
- return platform() === "win32" ? "\r\n" : "\n";
144
- }
145
- }
146
- getIndentChar(options) {
147
- return options.useTabs ? " " : " ".repeat(options.indentSize);
148
- }
149
- };
150
- export {
151
- Dent
152
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/rules.ts","../src/main.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}