corsa-oxlint 0.45.0 → 0.46.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/dist/rule_tester.js +20 -15
- package/dist/rule_tester.js.map +1 -1
- package/package.json +2 -2
package/dist/rule_tester.js
CHANGED
|
@@ -45,6 +45,7 @@ var RuleTester = class {
|
|
|
45
45
|
}
|
|
46
46
|
run(ruleName, rule, tests) {
|
|
47
47
|
const workspace = createWorkspace();
|
|
48
|
+
writeWorkspaceConfig(workspace);
|
|
48
49
|
const transformed = {
|
|
49
50
|
valid: tests.valid.map((test, index) => prepareTestCase(workspace, test, this.#config, "valid", index)),
|
|
50
51
|
invalid: tests.invalid.map((test, index) => prepareTestCase(workspace, test, this.#config, "invalid", index))
|
|
@@ -63,16 +64,13 @@ function createWorkspace() {
|
|
|
63
64
|
}
|
|
64
65
|
function prepareTestCase(workspace, test, config, group, index) {
|
|
65
66
|
const caseWorkspace = resolve(workspace, `${group}-${index}`);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const filename = resolveCaseFilename(caseWorkspace, test.filename, "case.ts");
|
|
71
|
-
const projectRoot = isAbsolute(test.filename ?? "") ? dirname(filename) : caseWorkspace;
|
|
72
|
-
writeFixture(filename, test.code);
|
|
67
|
+
const normalized = typeof test === "string" ? { code: test } : test;
|
|
68
|
+
const filename = resolveCaseFilename(caseWorkspace, normalized.filename, "case.ts");
|
|
69
|
+
const projectRoot = isAbsolute(normalized.filename ?? "") ? dirname(filename) : workspace;
|
|
70
|
+
writeFixture(filename, normalized.code, projectRoot);
|
|
73
71
|
const testerConfig = config;
|
|
74
72
|
const baseSettings = testerConfig?.settings?.corsaOxlint;
|
|
75
|
-
const caseSettings =
|
|
73
|
+
const caseSettings = normalized.settings?.corsaOxlint;
|
|
76
74
|
const parserOptionsWithRuntime = applyRuleTesterRuntimeDefaults(mergeTypeAwareParserOptions(mergeTypeAwareParserOptions(mergeTypeAwareParserOptions(mergeTypeAwareParserOptions(baseSettings, baseSettings?.parserOptions), mergeTypeAwareParserOptions(caseSettings, caseSettings?.parserOptions)), {
|
|
77
75
|
tsconfigRootDir: projectRoot,
|
|
78
76
|
projectService: { allowDefaultProject: [
|
|
@@ -81,22 +79,22 @@ function prepareTestCase(workspace, test, config, group, index) {
|
|
|
81
79
|
"*.js",
|
|
82
80
|
"*.jsx"
|
|
83
81
|
] }
|
|
84
|
-
}), mergeTypeAwareParserOptions(config?.languageOptions?.parserOptions,
|
|
82
|
+
}), mergeTypeAwareParserOptions(config?.languageOptions?.parserOptions, normalized.languageOptions?.parserOptions)), normalized, config);
|
|
85
83
|
return {
|
|
86
|
-
...
|
|
84
|
+
...normalized,
|
|
87
85
|
filename,
|
|
88
86
|
settings: {
|
|
89
87
|
...testerConfig?.settings,
|
|
90
|
-
...
|
|
88
|
+
...normalized.settings,
|
|
91
89
|
corsaOxlint: {
|
|
92
90
|
...testerConfig?.settings?.corsaOxlint,
|
|
93
|
-
...
|
|
91
|
+
...normalized.settings?.corsaOxlint,
|
|
94
92
|
parserOptions: parserOptionsWithRuntime
|
|
95
93
|
}
|
|
96
94
|
},
|
|
97
95
|
languageOptions: {
|
|
98
96
|
...config?.languageOptions,
|
|
99
|
-
...
|
|
97
|
+
...normalized.languageOptions,
|
|
100
98
|
parserOptions: { ...parserOptionsWithRuntime }
|
|
101
99
|
}
|
|
102
100
|
};
|
|
@@ -119,10 +117,17 @@ function optionalDefaultCorsaExecutable(rootDir) {
|
|
|
119
117
|
return;
|
|
120
118
|
}
|
|
121
119
|
}
|
|
122
|
-
function
|
|
120
|
+
function writeWorkspaceConfig(workspace) {
|
|
121
|
+
writeProjectConfig(resolve(workspace, "tsconfig.json"));
|
|
122
|
+
}
|
|
123
|
+
function writeFixture(filename, code, projectRoot) {
|
|
123
124
|
mkdirSync(dirname(filename), { recursive: true });
|
|
124
125
|
writeFileSync(filename, code);
|
|
125
|
-
|
|
126
|
+
writeProjectConfig(resolve(projectRoot, "tsconfig.json"));
|
|
127
|
+
}
|
|
128
|
+
function writeProjectConfig(configPath) {
|
|
129
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
130
|
+
writeFileSync(configPath, JSON.stringify({
|
|
126
131
|
compilerOptions: {
|
|
127
132
|
module: "esnext",
|
|
128
133
|
target: "es2022",
|
package/dist/rule_tester.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule_tester.js","names":["OxlintRuleTester","#inner","#config"],"sources":["../ts/rule_tester.ts"],"sourcesContent":["import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\n\nimport { RuleTester as OxlintRuleTester } from \"oxlint/plugins-dev\";\n\nimport { defaultCorsaExecutable, mergeTypeAwareParserOptions } from \"./context\";\nimport { decorateRule } from \"./plugin\";\nimport type { CorsaOxlintSettings, TypeAwareParserOptions } from \"./types\";\n\ntype TesterConfig = import(\"oxlint/plugins-dev\").RuleTester.Config;\ntype TestCase = import(\"oxlint/plugins-dev\").RuleTester.ValidTestCase &\n Partial<import(\"oxlint/plugins-dev\").RuleTester.InvalidTestCase>;\ntype TestCases = import(\"oxlint/plugins-dev\").RuleTester.TestCases;\nexport type RuleTesterConfig = TesterConfig & {\n readonly settings?: {\n readonly corsaOxlint?: CorsaOxlintSettings;\n readonly [key: string]: unknown;\n };\n};\ntype TestLifecycleGlobal = typeof globalThis & {\n after?: (callback: () => void) => unknown;\n afterAll?: (callback: () => void) => unknown;\n};\n\nconst cleanupDirs = new Set<string>();\nlet cleanupInstalled = false;\n\nexport class RuleTester {\n /**\n * A thin Oxlint `RuleTester` wrapper that injects\n * `settings.corsaOxlint`\n * settings, temporary fixtures, and a default project service.\n *\n * @example\n * ```ts\n * const tester = new RuleTester();\n * tester.run(\"demo\", rule, {\n * valid: [{ code: \"const answer = 42;\" }],\n * invalid: [],\n * });\n * ```\n */\n static get describe() {\n return OxlintRuleTester.describe;\n }\n\n static set describe(value) {\n OxlintRuleTester.describe = value;\n }\n\n static get it() {\n return OxlintRuleTester.it;\n }\n\n static set it(value) {\n OxlintRuleTester.it = value;\n }\n\n static only(item: string | TestCase): TestCase {\n return OxlintRuleTester.only(item);\n }\n\n readonly #inner: OxlintRuleTester;\n readonly #config?: RuleTesterConfig;\n\n constructor(config?: RuleTesterConfig) {\n this.#config = config;\n this.#inner = new OxlintRuleTester(config);\n }\n\n run(ruleName: string, rule: Record<string, unknown>, tests: TestCases): void {\n const workspace = createWorkspace();\n const transformed = {\n valid: tests.valid.map((test, index) =>\n prepareTestCase(workspace, test, this.#config, \"valid\", index),\n ),\n invalid: tests.invalid.map((test, index) =>\n prepareTestCase(workspace, test, this.#config, \"invalid\", index),\n ),\n };\n try {\n this.#inner.run(ruleName, decorateRule(rule as never) as never, transformed as TestCases);\n } finally {\n cleanupWorkspace(workspace);\n }\n }\n}\n\nfunction createWorkspace(): string {\n const root = process.env.CORSA_OXLINT_RULE_TESTER_TMPDIR ?? tmpdir();\n const workspace = mkdtempSync(join(root, \"corsa-oxlint-\"));\n registerCleanup(workspace);\n return workspace;\n}\n\nfunction prepareTestCase(\n workspace: string,\n test: string | TestCase,\n config: RuleTesterConfig | undefined,\n group: \"valid\" | \"invalid\",\n index: number,\n): string | TestCase {\n const caseWorkspace = resolve(workspace, `${group}-${index}`);\n if (typeof test === \"string\") {\n const filename = resolve(caseWorkspace, \"case.ts\");\n writeFixture(filename, test);\n return test;\n }\n const filename = resolveCaseFilename(caseWorkspace, test.filename, \"case.ts\");\n const projectRoot = isAbsolute(test.filename ?? \"\") ? dirname(filename) : caseWorkspace;\n writeFixture(filename, test.code);\n const testerConfig = config;\n const baseSettings = testerConfig?.settings?.corsaOxlint;\n const caseSettings = (\n test.settings as {\n corsaOxlint?: CorsaOxlintSettings;\n }\n )?.corsaOxlint;\n const parserOptions = mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(baseSettings, baseSettings?.parserOptions),\n mergeTypeAwareParserOptions(caseSettings, caseSettings?.parserOptions),\n ),\n {\n tsconfigRootDir: projectRoot,\n projectService: {\n allowDefaultProject: [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n },\n },\n ),\n mergeTypeAwareParserOptions(\n config?.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n test.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n ),\n );\n const parserOptionsWithRuntime = applyRuleTesterRuntimeDefaults(parserOptions, test, config);\n return {\n ...test,\n filename,\n settings: {\n ...testerConfig?.settings,\n ...test.settings,\n corsaOxlint: {\n ...testerConfig?.settings?.corsaOxlint,\n ...(test.settings as { corsaOxlint?: CorsaOxlintSettings })?.corsaOxlint,\n parserOptions: parserOptionsWithRuntime,\n },\n } as never,\n languageOptions: {\n ...config?.languageOptions,\n ...test.languageOptions,\n parserOptions: {\n ...parserOptionsWithRuntime,\n } as never,\n },\n };\n}\n\nfunction resolveCaseFilename(\n caseWorkspace: string,\n filename: string | undefined,\n fallback: string,\n): string {\n if (!filename) {\n return resolve(caseWorkspace, fallback);\n }\n return isAbsolute(filename) ? filename : resolve(caseWorkspace, filename);\n}\n\nfunction applyRuleTesterRuntimeDefaults(\n parserOptions: TypeAwareParserOptions,\n test: TestCase,\n config: RuleTesterConfig | undefined,\n): TypeAwareParserOptions {\n if (parserOptions.corsa?.executable !== undefined) {\n return parserOptions;\n }\n const rootDir = resolve(test.cwd ?? config?.cwd ?? process.cwd());\n const executable = process.env.CORSA_EXECUTABLE ?? optionalDefaultCorsaExecutable(rootDir);\n if (!executable) {\n return parserOptions;\n }\n return mergeTypeAwareParserOptions(parserOptions, {\n corsa: {\n executable,\n },\n });\n}\n\nfunction optionalDefaultCorsaExecutable(rootDir: string): string | undefined {\n try {\n return defaultCorsaExecutable(rootDir);\n } catch {\n return undefined;\n }\n}\n\nfunction writeFixture(filename: string, code: string): void {\n mkdirSync(dirname(filename), { recursive: true });\n writeFileSync(filename, code);\n const configPath = resolve(dirname(filename), \"tsconfig.json\");\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n include: [\"**/*\"],\n },\n null,\n 2,\n ),\n );\n}\n\nfunction registerCleanup(workspace: string): void {\n cleanupDirs.add(workspace);\n const afterAll = lifecycleCleanup();\n if (afterAll) {\n afterAll(() => cleanupWorkspace(workspace));\n }\n if (cleanupInstalled) {\n return;\n }\n cleanupInstalled = true;\n process.once(\"beforeExit\", cleanupAllWorkspaces);\n process.once(\"exit\", cleanupAllWorkspaces);\n}\n\nfunction lifecycleCleanup(): ((callback: () => void) => unknown) | undefined {\n const testGlobal = globalThis as TestLifecycleGlobal;\n return typeof testGlobal.afterAll === \"function\"\n ? testGlobal.afterAll\n : typeof testGlobal.after === \"function\"\n ? testGlobal.after\n : undefined;\n}\n\nfunction cleanupWorkspace(workspace: string): void {\n if (!cleanupDirs.delete(workspace)) {\n return;\n }\n rmSync(workspace, { force: true, recursive: true });\n}\n\nfunction cleanupAllWorkspaces(): void {\n for (const dir of cleanupDirs) {\n cleanupWorkspace(dir);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rule_tester.js","names":["OxlintRuleTester","#inner","#config"],"sources":["../ts/rule_tester.ts"],"sourcesContent":["import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\n\nimport { RuleTester as OxlintRuleTester } from \"oxlint/plugins-dev\";\n\nimport { defaultCorsaExecutable, mergeTypeAwareParserOptions } from \"./context\";\nimport { decorateRule } from \"./plugin\";\nimport type { CorsaOxlintSettings, TypeAwareParserOptions } from \"./types\";\n\ntype TesterConfig = import(\"oxlint/plugins-dev\").RuleTester.Config;\ntype TestCase = import(\"oxlint/plugins-dev\").RuleTester.ValidTestCase &\n Partial<import(\"oxlint/plugins-dev\").RuleTester.InvalidTestCase>;\ntype TestCases = import(\"oxlint/plugins-dev\").RuleTester.TestCases;\nexport type RuleTesterConfig = TesterConfig & {\n readonly settings?: {\n readonly corsaOxlint?: CorsaOxlintSettings;\n readonly [key: string]: unknown;\n };\n};\ntype TestLifecycleGlobal = typeof globalThis & {\n after?: (callback: () => void) => unknown;\n afterAll?: (callback: () => void) => unknown;\n};\n\nconst cleanupDirs = new Set<string>();\nlet cleanupInstalled = false;\n\nexport class RuleTester {\n /**\n * A thin Oxlint `RuleTester` wrapper that injects\n * `settings.corsaOxlint`\n * settings, temporary fixtures, and a default project service.\n *\n * @example\n * ```ts\n * const tester = new RuleTester();\n * tester.run(\"demo\", rule, {\n * valid: [{ code: \"const answer = 42;\" }],\n * invalid: [],\n * });\n * ```\n */\n static get describe() {\n return OxlintRuleTester.describe;\n }\n\n static set describe(value) {\n OxlintRuleTester.describe = value;\n }\n\n static get it() {\n return OxlintRuleTester.it;\n }\n\n static set it(value) {\n OxlintRuleTester.it = value;\n }\n\n static only(item: string | TestCase): TestCase {\n return OxlintRuleTester.only(item);\n }\n\n readonly #inner: OxlintRuleTester;\n readonly #config?: RuleTesterConfig;\n\n constructor(config?: RuleTesterConfig) {\n this.#config = config;\n this.#inner = new OxlintRuleTester(config);\n }\n\n run(ruleName: string, rule: Record<string, unknown>, tests: TestCases): void {\n const workspace = createWorkspace();\n writeWorkspaceConfig(workspace);\n const transformed = {\n valid: tests.valid.map((test, index) =>\n prepareTestCase(workspace, test, this.#config, \"valid\", index),\n ),\n invalid: tests.invalid.map((test, index) =>\n prepareTestCase(workspace, test, this.#config, \"invalid\", index),\n ),\n };\n try {\n this.#inner.run(ruleName, decorateRule(rule as never) as never, transformed as TestCases);\n } finally {\n cleanupWorkspace(workspace);\n }\n }\n}\n\nfunction createWorkspace(): string {\n const root = process.env.CORSA_OXLINT_RULE_TESTER_TMPDIR ?? tmpdir();\n const workspace = mkdtempSync(join(root, \"corsa-oxlint-\"));\n registerCleanup(workspace);\n return workspace;\n}\n\nfunction prepareTestCase(\n workspace: string,\n test: string | TestCase,\n config: RuleTesterConfig | undefined,\n group: \"valid\" | \"invalid\",\n index: number,\n): TestCase {\n const caseWorkspace = resolve(workspace, `${group}-${index}`);\n const normalized = typeof test === \"string\" ? ({ code: test } as TestCase) : test;\n const filename = resolveCaseFilename(caseWorkspace, normalized.filename, \"case.ts\");\n const projectRoot = isAbsolute(normalized.filename ?? \"\") ? dirname(filename) : workspace;\n writeFixture(filename, normalized.code, projectRoot);\n const testerConfig = config;\n const baseSettings = testerConfig?.settings?.corsaOxlint;\n const caseSettings = (\n normalized.settings as {\n corsaOxlint?: CorsaOxlintSettings;\n }\n )?.corsaOxlint;\n const parserOptions = mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(baseSettings, baseSettings?.parserOptions),\n mergeTypeAwareParserOptions(caseSettings, caseSettings?.parserOptions),\n ),\n {\n tsconfigRootDir: projectRoot,\n projectService: {\n allowDefaultProject: [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n },\n },\n ),\n mergeTypeAwareParserOptions(\n config?.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n normalized.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n ),\n );\n const parserOptionsWithRuntime = applyRuleTesterRuntimeDefaults(\n parserOptions,\n normalized,\n config,\n );\n return {\n ...normalized,\n filename,\n settings: {\n ...testerConfig?.settings,\n ...normalized.settings,\n corsaOxlint: {\n ...testerConfig?.settings?.corsaOxlint,\n ...(normalized.settings as { corsaOxlint?: CorsaOxlintSettings })?.corsaOxlint,\n parserOptions: parserOptionsWithRuntime,\n },\n } as never,\n languageOptions: {\n ...config?.languageOptions,\n ...normalized.languageOptions,\n parserOptions: {\n ...parserOptionsWithRuntime,\n } as never,\n },\n };\n}\n\nfunction resolveCaseFilename(\n caseWorkspace: string,\n filename: string | undefined,\n fallback: string,\n): string {\n if (!filename) {\n return resolve(caseWorkspace, fallback);\n }\n return isAbsolute(filename) ? filename : resolve(caseWorkspace, filename);\n}\n\nfunction applyRuleTesterRuntimeDefaults(\n parserOptions: TypeAwareParserOptions,\n test: TestCase,\n config: RuleTesterConfig | undefined,\n): TypeAwareParserOptions {\n if (parserOptions.corsa?.executable !== undefined) {\n return parserOptions;\n }\n const rootDir = resolve(test.cwd ?? config?.cwd ?? process.cwd());\n const executable = process.env.CORSA_EXECUTABLE ?? optionalDefaultCorsaExecutable(rootDir);\n if (!executable) {\n return parserOptions;\n }\n return mergeTypeAwareParserOptions(parserOptions, {\n corsa: {\n executable,\n },\n });\n}\n\nfunction optionalDefaultCorsaExecutable(rootDir: string): string | undefined {\n try {\n return defaultCorsaExecutable(rootDir);\n } catch {\n return undefined;\n }\n}\n\nfunction writeWorkspaceConfig(workspace: string): void {\n writeProjectConfig(resolve(workspace, \"tsconfig.json\"));\n}\n\nfunction writeFixture(filename: string, code: string, projectRoot: string): void {\n mkdirSync(dirname(filename), { recursive: true });\n writeFileSync(filename, code);\n writeProjectConfig(resolve(projectRoot, \"tsconfig.json\"));\n}\n\nfunction writeProjectConfig(configPath: string): void {\n mkdirSync(dirname(configPath), { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n include: [\"**/*\"],\n },\n null,\n 2,\n ),\n );\n}\n\nfunction registerCleanup(workspace: string): void {\n cleanupDirs.add(workspace);\n const afterAll = lifecycleCleanup();\n if (afterAll) {\n afterAll(() => cleanupWorkspace(workspace));\n }\n if (cleanupInstalled) {\n return;\n }\n cleanupInstalled = true;\n process.once(\"beforeExit\", cleanupAllWorkspaces);\n process.once(\"exit\", cleanupAllWorkspaces);\n}\n\nfunction lifecycleCleanup(): ((callback: () => void) => unknown) | undefined {\n const testGlobal = globalThis as TestLifecycleGlobal;\n return typeof testGlobal.afterAll === \"function\"\n ? testGlobal.afterAll\n : typeof testGlobal.after === \"function\"\n ? testGlobal.after\n : undefined;\n}\n\nfunction cleanupWorkspace(workspace: string): void {\n if (!cleanupDirs.delete(workspace)) {\n return;\n }\n rmSync(workspace, { force: true, recursive: true });\n}\n\nfunction cleanupAllWorkspaces(): void {\n for (const dir of cleanupDirs) {\n cleanupWorkspace(dir);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "corsa-oxlint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"description": "Type-aware Oxlint helpers powered by Corsa",
|
|
5
5
|
"homepage": "https://github.com/ubugeeei-prod/corsa-bind/tree/main/src/bindings/nodejs/corsa_oxlint",
|
|
6
6
|
"bugs": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"./package.json": "./package.json"
|
|
102
102
|
},
|
|
103
103
|
"dependencies": {
|
|
104
|
-
"@corsa-bind/napi": "0.
|
|
104
|
+
"@corsa-bind/napi": "0.46.0"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
107
|
"@oxlint/plugins": "1.69.0",
|