From 70c558e35b05ee1bd81a2c723d1c35b090409d2b Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Tue, 9 May 2023 11:17:36 +0900 Subject: [PATCH] feat: export meta object (#234) --- .changeset/brown-doors-crash.md | 5 ++++ lib/configs/prettier.ts | 3 +++ lib/configs/recommended-with-json.ts | 3 +++ lib/configs/recommended-with-json5.ts | 3 +++ lib/configs/recommended-with-jsonc.ts | 3 +++ lib/index.ts | 3 +++ lib/meta.ts | 5 ++++ lib/utils/rules.ts | 3 +++ package.json | 3 ++- tests/lib/meta.ts | 26 ++++++++++++++++++ tools/lib/changesets-util.ts | 20 ++------------ tools/render-rules.ts | 2 +- tools/update-meta.ts | 38 +++++++++++++++++++++++++++ tools/update-rules.ts | 6 ++++- tools/update-rulesets.ts | 6 ++++- tools/update.ts | 1 + tsconfig.json | 4 ++- 17 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 .changeset/brown-doors-crash.md create mode 100644 lib/meta.ts create mode 100644 tests/lib/meta.ts create mode 100644 tools/update-meta.ts diff --git a/.changeset/brown-doors-crash.md b/.changeset/brown-doors-crash.md new file mode 100644 index 00000000..4d4f940e --- /dev/null +++ b/.changeset/brown-doors-crash.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-jsonc": minor +--- + +feat: export meta object diff --git a/lib/configs/prettier.ts b/lib/configs/prettier.ts index dd557ef9..add16bf6 100644 --- a/lib/configs/prettier.ts +++ b/lib/configs/prettier.ts @@ -1,3 +1,6 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" import path from "path"; const base = require.resolve("./base"); const baseExtend = diff --git a/lib/configs/recommended-with-json.ts b/lib/configs/recommended-with-json.ts index 8218e75f..7143a425 100644 --- a/lib/configs/recommended-with-json.ts +++ b/lib/configs/recommended-with-json.ts @@ -1,3 +1,6 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" import path from "path"; const base = require.resolve("./base"); const baseExtend = diff --git a/lib/configs/recommended-with-json5.ts b/lib/configs/recommended-with-json5.ts index ad665905..1d9d3ac5 100644 --- a/lib/configs/recommended-with-json5.ts +++ b/lib/configs/recommended-with-json5.ts @@ -1,3 +1,6 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" import path from "path"; const base = require.resolve("./base"); const baseExtend = diff --git a/lib/configs/recommended-with-jsonc.ts b/lib/configs/recommended-with-jsonc.ts index 1150504d..9fb34983 100644 --- a/lib/configs/recommended-with-jsonc.ts +++ b/lib/configs/recommended-with-jsonc.ts @@ -1,3 +1,6 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" import path from "path"; const base = require.resolve("./base"); const baseExtend = diff --git a/lib/index.ts b/lib/index.ts index 079b31ef..1158a741 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -7,6 +7,7 @@ import recommendedWithJsonc from "./configs/recommended-with-jsonc"; import recommendedWithJson5 from "./configs/recommended-with-json5"; import prettier from "./configs/prettier"; import all from "./configs/all"; +import * as meta from "./meta"; // backward compatibility import { @@ -33,6 +34,7 @@ const rules = ruleList.reduce((obj, r) => { }, {} as { [key: string]: RuleModule }); export default { + meta, configs, rules, // as parser @@ -43,6 +45,7 @@ export default { getStaticJSONValue, }; export { + meta, configs, rules, // as parser diff --git a/lib/meta.ts b/lib/meta.ts new file mode 100644 index 00000000..7d8b4bd1 --- /dev/null +++ b/lib/meta.ts @@ -0,0 +1,5 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" +export const name = "eslint-plugin-jsonc" as const; +export const version = "2.7.0" as const; diff --git a/lib/utils/rules.ts b/lib/utils/rules.ts index 47518229..a6918b2e 100644 --- a/lib/utils/rules.ts +++ b/lib/utils/rules.ts @@ -1,3 +1,6 @@ +// IMPORTANT! +// This file has been automatically generated, +// in order to update its content execute "npm run update" import type { RuleModule } from "../types"; import arrayBracketNewline from "../rules/array-bracket-newline"; import arrayBracketSpacing from "../rules/array-bracket-spacing"; diff --git a/package.json b/package.json index 0413d3df..cb39e7c3 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ }, "scripts": { "prebuild": "npm run -s clean", - "build": "npm run build:ts && npm run build:dts", + "build": "npm run build:meta && npm run build:ts && npm run build:dts", + "build:meta": "ts-node --transpile-only ./tools/update-meta.ts", "build:ts": "tsc --project ./tsconfig.build.json", "build:dts": "npm run build:dts-step1 && npm run build:dts-step2", "build:dts-step1": "tsc --declaration --outDir dist-ts --project ./tsconfig.build.json", diff --git a/tests/lib/meta.ts b/tests/lib/meta.ts new file mode 100644 index 00000000..ec7f1d8a --- /dev/null +++ b/tests/lib/meta.ts @@ -0,0 +1,26 @@ +import assert from "assert"; +import plugin from "../../lib"; +import { version } from "../../package.json"; +const expectedMeta = { + name: "eslint-plugin-jsonc", + version, +}; + +describe("Test for meta object", () => { + it("A plugin should have a meta object.", () => { + assert.strictEqual(plugin.meta.name, expectedMeta.name); + assert.strictEqual(typeof plugin.meta.version, "string"); + }); + + for (const [name, processor] of Object.entries( + // @ts-expect-error -- missing processors + plugin.processors || {} + )) { + it(`"${name}" processor should have a meta object.`, () => { + // @ts-expect-error -- missing type + assert.strictEqual(processor.meta.name, expectedMeta.name); + // @ts-expect-error -- missing type + assert.strictEqual(typeof processor.meta.version, "string"); + }); + } +}); diff --git a/tools/lib/changesets-util.ts b/tools/lib/changesets-util.ts index a642ec40..997901c2 100644 --- a/tools/lib/changesets-util.ts +++ b/tools/lib/changesets-util.ts @@ -1,25 +1,9 @@ -import assembleReleasePlan from "@changesets/assemble-release-plan"; -import readChangesets from "@changesets/read"; -import { read } from "@changesets/config"; -import { getPackages } from "@manypkg/get-packages"; -import { readPreState } from "@changesets/pre"; +import getReleasePlan from "@changesets/get-release-plan"; import path from "path"; -const root = path.resolve(__dirname, "../.."); - /** Get new version string from changesets */ export async function getNewVersion(): Promise { - const packages = await getPackages(root); - const preState = await readPreState(root); - const config = await read(root, packages); - const changesets = await readChangesets(root); - - const releasePlan = assembleReleasePlan( - changesets, - packages, - config, - preState - ); + const releasePlan = await getReleasePlan(path.resolve(__dirname, "../..")); return releasePlan.releases.find( ({ name }) => name === "eslint-plugin-jsonc" diff --git a/tools/render-rules.ts b/tools/render-rules.ts index d02d4f59..8b2a02af 100644 --- a/tools/render-rules.ts +++ b/tools/render-rules.ts @@ -42,7 +42,7 @@ export default function renderRulesTableContent( const link = `[${rule.meta.docs.ruleId}](${buildRulePath( rule.meta.docs.ruleName || "" )})`; - const replacedRules = rule.meta.docs.replacedBy || []; + const replacedRules = rule.meta.replacedBy || []; const replacedBy = replacedRules .map((name) => `[jsonc/${name}](${buildRulePath(name)}.md)`) .join(", "); diff --git a/tools/update-meta.ts b/tools/update-meta.ts new file mode 100644 index 00000000..bbd262e0 --- /dev/null +++ b/tools/update-meta.ts @@ -0,0 +1,38 @@ +import fs from "fs"; +import path from "path"; +import { ESLint } from "eslint"; +import { name, version } from "../package.json"; +import { getNewVersion } from "./lib/changesets-util"; + +const META_PATH = path.join(__dirname, "../lib/meta.ts"); + +void main(); + +/** main */ +async function main() { + if (!fs.existsSync(META_PATH)) { + fs.writeFileSync(META_PATH, "", "utf8"); + } + const eslint = new ESLint({ fix: true }); + const [result] = await eslint.lintText( + `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +export const name = ${JSON.stringify(name)} as const; +export const version = ${JSON.stringify(await getVersion())} as const; +`, + { filePath: META_PATH } + ); + fs.writeFileSync(META_PATH, result.output!); +} + +/** Get version */ +function getVersion() { + // eslint-disable-next-line no-process-env -- ignore + if (process.env.IN_VERSION_CI_SCRIPT) { + return getNewVersion(); + } + return version; +} diff --git a/tools/update-rules.ts b/tools/update-rules.ts index 6756a939..d82f975c 100644 --- a/tools/update-rules.ts +++ b/tools/update-rules.ts @@ -12,7 +12,11 @@ function camelCase(str: string) { return str.replace(/[-/_](\w)/gu, (_, c) => (c ? c.toUpperCase() : "")); } -let content = ` +let content = `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ import type { RuleModule } from "../types" ${rules .map( diff --git a/tools/update-rulesets.ts b/tools/update-rulesets.ts index 27180600..f9092dee 100644 --- a/tools/update-rulesets.ts +++ b/tools/update-rulesets.ts @@ -58,7 +58,11 @@ const CONFIGS = { }; for (const rec of ["json", "jsonc", "json5", "prettier"] as const) { - let content = ` + let content = `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ import path from "path" const base = require.resolve("./base") const baseExtend = diff --git a/tools/update.ts b/tools/update.ts index 02c0b210..9421aa41 100644 --- a/tools/update.ts +++ b/tools/update.ts @@ -3,3 +3,4 @@ import "./update-rulesets"; import "./update-docs"; import "./update-readme"; import "./update-docs-rules-index"; +import "./update-meta"; diff --git a/tsconfig.json b/tsconfig.json index 4ce45dbe..a0bd68b2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,9 @@ "*": ["typings/*"] }, "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + + "skipLibCheck": true }, "include": [ "lib/**/*",