Skip to content

Commit aa161eb

Browse files
authored
build: automate generation of recommended rules config (#118)
* chore: automate generation of recommended rules config * clean up workflows
1 parent 6a6684b commit aa161eb

File tree

7 files changed

+79
-30
lines changed

7 files changed

+79
-30
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ jobs:
1818
node-version: "lts/*"
1919
- name: Install dependencies
2020
run: npm install
21-
- name: Build
22-
run: npm run build
2321
- name: Lint files
2422
run: npm run lint
2523
- name: Check Formatting
@@ -56,8 +54,6 @@ jobs:
5654
node-version: "lts/*"
5755
- name: Install dependencies
5856
run: npm install
59-
- name: Build
60-
run: npm run build
6157
- name: Check Types
6258
run: npm run test:types
6359
jsr_test:
@@ -71,6 +67,4 @@ jobs:
7167
- name: Install Packages
7268
run: npm install
7369
- name: Run --dry-run
74-
run: |
75-
npm run build
76-
npm run test:jsr
70+
run: npm run test:jsr

.github/workflows/release-please.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ jobs:
2525
- name: Publish to npm
2626
run: |
2727
npm install
28-
npm run build --if-present
2928
npm publish --provenance
3029
env:
3130
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,6 @@ dist
6363

6464
# Lock files
6565
package-lock.json
66+
67+
# Build
68+
src/build

eslint.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,10 @@ export default defineConfig([
114114
"eslint-plugin/test-case-shorthand-strings": "error",
115115
},
116116
},
117+
{
118+
files: ["tools/**/*.js"],
119+
rules: {
120+
"no-console": "off",
121+
},
122+
},
117123
]);

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,17 @@
6060
"scripts": {
6161
"build:dedupe-types": "node tools/dedupe-types.js dist/cjs/index.cjs dist/esm/index.js",
6262
"build:cts": "node tools/build-cts.js",
63-
"build": "rollup -c && npm run build:dedupe-types && tsc -p tsconfig.esm.json && npm run build:cts",
63+
"build:rules": "node tools/build-rules.js",
64+
"build": "npm run build:rules && rollup -c && npm run build:dedupe-types && tsc -p tsconfig.esm.json && npm run build:cts",
6465
"build:readme": "node tools/update-readme.js",
6566
"build:update-rules-docs": "node tools/update-rules-docs.js",
66-
"test:jsr": "npx jsr@latest publish --dry-run",
67+
"prepare": "npm run build",
6768
"pretest": "npm run build",
6869
"lint": "eslint",
6970
"fmt": "prettier --write .",
7071
"fmt:check": "prettier --check .",
7172
"test": "mocha tests/**/*.js",
73+
"test:jsr": "npx jsr@latest publish --dry-run",
7274
"test:coverage": "c8 npm test",
7375
"test:types": "tsc -p tests/types/tsconfig.json"
7476
},

src/index.js

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,8 @@
99

1010
import { JSONLanguage } from "./languages/json-language.js";
1111
import { JSONSourceCode } from "./languages/json-source-code.js";
12-
import noDuplicateKeys from "./rules/no-duplicate-keys.js";
13-
import noEmptyKeys from "./rules/no-empty-keys.js";
14-
import noUnsafeValues from "./rules/no-unsafe-values.js";
15-
import noUnnormalizedKeys from "./rules/no-unnormalized-keys.js";
16-
import sortKeys from "./rules/sort-keys.js";
17-
import topLevelInterop from "./rules/top-level-interop.js";
12+
import recommendedRules from "./build/recommended-config.js";
13+
import rules from "./build/rules.js";
1814

1915
//-----------------------------------------------------------------------------
2016
// Plugin
@@ -30,23 +26,11 @@ const plugin = {
3026
jsonc: new JSONLanguage({ mode: "jsonc" }),
3127
json5: new JSONLanguage({ mode: "json5" }),
3228
},
33-
rules: {
34-
"no-duplicate-keys": noDuplicateKeys,
35-
"no-empty-keys": noEmptyKeys,
36-
"no-unsafe-values": noUnsafeValues,
37-
"no-unnormalized-keys": noUnnormalizedKeys,
38-
"sort-keys": sortKeys,
39-
"top-level-interop": topLevelInterop,
40-
},
29+
rules,
4130
configs: {
4231
recommended: {
4332
plugins: {},
44-
rules: /** @type {const} */ ({
45-
"json/no-duplicate-keys": "error",
46-
"json/no-empty-keys": "error",
47-
"json/no-unsafe-values": "error",
48-
"json/no-unnormalized-keys": "error",
49-
}),
33+
rules: recommendedRules,
5034
},
5135
},
5236
};

tools/build-rules.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* @fileoverview Generates the recommended configuration and import file for rules.
3+
*
4+
* Usage:
5+
* node tools/build-rules.js
6+
*
7+
* @author Nicholas C. Zakas
8+
*/
9+
10+
//-----------------------------------------------------------------------------
11+
// Imports
12+
//-----------------------------------------------------------------------------
13+
14+
import fs from "node:fs";
15+
import path from "node:path";
16+
import { fileURLToPath, pathToFileURL } from "node:url";
17+
18+
//-----------------------------------------------------------------------------
19+
// Main
20+
//-----------------------------------------------------------------------------
21+
22+
const thisDir = path.dirname(fileURLToPath(import.meta.url));
23+
const rulesPath = path.resolve(thisDir, "../src/rules");
24+
const rules = fs.readdirSync(rulesPath);
25+
const recommended = [];
26+
27+
for (const ruleId of rules) {
28+
const rulePath = path.resolve(rulesPath, ruleId);
29+
const rule = await import(pathToFileURL(rulePath));
30+
31+
if (rule.default.meta.docs.recommended) {
32+
recommended.push(ruleId);
33+
}
34+
}
35+
36+
const output = `const rules = /** @type {const} */ ({
37+
${recommended.map(id => `"json/${id.slice(0, -3)}": "error"`).join(",\n ")}
38+
});
39+
40+
export default rules;
41+
`;
42+
43+
fs.mkdirSync(path.resolve(thisDir, "../src/build"), { recursive: true });
44+
fs.writeFileSync(
45+
path.resolve(thisDir, "../src/build/recommended-config.js"),
46+
output,
47+
);
48+
49+
console.log("Recommended rules generated successfully.");
50+
51+
const rulesOutput = `
52+
${rules.map((id, index) => `import rule${index} from "../rules/${id}";`).join("\n")}
53+
54+
export default {
55+
${rules.map((id, index) => `"${id.slice(0, -3)}": rule${index},`).join("\n ")}
56+
};
57+
`.trim();
58+
59+
fs.writeFileSync(path.resolve(thisDir, "../src/build/rules.js"), rulesOutput);
60+
61+
console.log("Rules import file generated successfully.");

0 commit comments

Comments
 (0)