Skip to content

Commit

Permalink
fix: make plugin-kit types usable in CommonJS
Browse files Browse the repository at this point in the history
  • Loading branch information
fasttime committed Dec 27, 2024
1 parent 072ed84 commit 415532e
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 6 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,11 @@ jobs:
CI: true

test_types:
name: Test Types (core)
name: Test Types (${ matrix.package })
runs-on: ubuntu-latest
strategy:
matrix:
package: [core, plugin-kit]
steps:
- uses: actions/checkout@v4

Expand All @@ -66,7 +69,7 @@ jobs:
node-version: "lts/*"

- name: npm install and test types
working-directory: packages/core
working-directory: packages/${ matrix.package }
run: |
npm install
npm run build
Expand Down
10 changes: 10 additions & 0 deletions packages/core/tests/types/cjs-import.test.cts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/**
* @fileoverview CommonJS type import test for ESLint Core.
* @author Francesco Trotta
*/

//-----------------------------------------------------------------------------
// Imports
//-----------------------------------------------------------------------------

import "@eslint/core";
2 changes: 1 addition & 1 deletion packages/core/tests/types/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"rootDir": "../..",
"strict": true
},
"files": ["../../dist/esm/types.d.ts", "types.test.ts"]
"include": [".", "../../dist"]
}
3 changes: 2 additions & 1 deletion packages/plugin-kit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"test:jsr": "npx jsr@latest publish --dry-run",
"pretest": "npm run build",
"test": "mocha tests/",
"test:coverage": "c8 npm test"
"test:coverage": "c8 npm test",
"test:types": "tsc -p tests/types/tsconfig.json"
},
"keywords": [
"eslint",
Expand Down
4 changes: 2 additions & 2 deletions packages/plugin-kit/src/config-comment-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import levn from "levn";

/** @typedef {import("@eslint/core").RuleConfig} RuleConfig */
/** @typedef {import("@eslint/core").RulesConfig} RulesConfig */
/** @typedef {import("./types.ts").StringConfig} StringConfig */
/** @typedef {import("./types.ts").BooleanConfig} BooleanConfig */
/** @typedef {import("./types.ts", { with: { "resolution-mode": "import" } }).StringConfig} StringConfig */
/** @typedef {import("./types.ts", { with: { "resolution-mode": "import" } }).BooleanConfig} BooleanConfig */

//-----------------------------------------------------------------------------
// Helpers
Expand Down
10 changes: 10 additions & 0 deletions packages/plugin-kit/tests/types/cjs-import.test.cts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/**
* @fileoverview CommonJS type import test for ESLint Plugin Kit.
* @author Francesco Trotta
*/

//-----------------------------------------------------------------------------
// Imports
//-----------------------------------------------------------------------------

import "@eslint/plugin-kit";
9 changes: 9 additions & 0 deletions packages/plugin-kit/tests/types/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"noEmit": true,
"rootDir": "../..",
"strict": true
},
"include": [".", "../../dist"]
}
104 changes: 104 additions & 0 deletions packages/plugin-kit/tests/types/types.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/**
* @fileoverview Type tests for ESLint Plugin Kit.
* @author Francesco Trotta
*/

//-----------------------------------------------------------------------------
// Imports
//-----------------------------------------------------------------------------

import {
BooleanConfig,
CallMethodStep,
ConfigCommentParser,
Directive,
DirectiveType,
RulesConfig,
SourceLocation,
SourceRange,
StringConfig,
TextSourceCodeBase,
VisitNodeStep,
} from "@eslint/plugin-kit";

//-----------------------------------------------------------------------------
// Tests
//-----------------------------------------------------------------------------

// CallMethodStep
class TestCallMethodStep extends CallMethodStep {
constructor({ target, args }: { target: string; args: [string, number] }) {
super({ target, args });
}
}
const step2 = new TestCallMethodStep({ target: "foo", args: ["foo", 42] });
step2.args satisfies unknown[];
step2.kind satisfies 2;
step2.target satisfies string;
step2.type satisfies "call";

// ConfigCommentParser
const configCommentParser = new ConfigCommentParser();
configCommentParser.parseDirective("foo") satisfies
| { label: string; value: string; justification: string }
| undefined;
const jsonLikeConfig = configCommentParser.parseJSONLikeConfig("bar");
if (jsonLikeConfig.ok) {
jsonLikeConfig.config satisfies RulesConfig;
} else {
jsonLikeConfig.error.message satisfies string;
}
configCommentParser.parseListConfig("baz") satisfies BooleanConfig;
configCommentParser.parseStringConfig("qux") satisfies StringConfig;

// Directive
void ((type: "disable" | "enable" | "disable-next-line" | "disable-line") => {
const directive = new Directive({
type,
node: {},
value: "foo",
justification: "bar",
});
directive.justification satisfies string;
directive.node satisfies unknown;
directive.type satisfies DirectiveType;
directive.value satisfies string;
});

// TextSourceCodeBase
class TestTextSourceCode extends TextSourceCodeBase {
declare ast: { foo: string; bar: number };
constructor({
text,
ast,
}: {
text: string;
ast: { foo: string; bar: number };
}) {
super({ text, ast, lineEndingPattern: /\r\n|[\r\n\u2028\u2029]/u });
}
}
const sourceCode = new TestTextSourceCode({
text: "text",
ast: { foo: "ABC", bar: 123 },
});
sourceCode.ast satisfies { foo: string; bar: number };
sourceCode.getAncestors({}) satisfies object[];
sourceCode.getLoc({}) satisfies SourceLocation;
sourceCode.getParent({}) satisfies object | undefined;
sourceCode.getRange({}) satisfies SourceRange;
sourceCode.getText() satisfies string;
sourceCode.getText({}, 0, 1) satisfies string;

// VisitNodeStep
class TestVisitNodeStep extends VisitNodeStep {
constructor({ target, phase }: { target: object; phase: 1 | 2 }) {
super({ target, phase, args: ["foo", 42] });
}
}
const step1 = new TestVisitNodeStep({ target: { foo: "bar" }, phase: 2 });
step1.args satisfies unknown[];
step1.kind satisfies 1;
step1.phase satisfies 1 | 2;
step1.target satisfies object;
step1.type satisfies "visit";

0 comments on commit 415532e

Please sign in to comment.