Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ import rules from "./build/rules.js";
/** @typedef {import("eslint").Linter.RulesRecord} RulesRecord*/
/** @typedef {import("eslint").Linter.Config} Config*/
/** @typedef {import("eslint").ESLint.Plugin} Plugin */
/** @typedef {import("./types.ts").MarkdownRuleDefinition} RuleModule */
/**
* @typedef {import("./types.ts").MarkdownRuleDefinition<Options>} MarkdownRuleDefinition<Options>
* @template {Partial<import("./types.ts").MarkdownRuleDefinitionTypeOptions>} [Options={}]
*/
/** @typedef {MarkdownRuleDefinition} RuleModule */
/** @typedef {import("./types.ts").MarkdownRuleVisitor} MarkdownRuleVisitor */
/** @typedef {import("@eslint/core").Language} Language */

Expand Down
78 changes: 78 additions & 0 deletions tests/types/types.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import markdown, {
IMarkdownSourceCode,
MarkdownNode,
MarkdownRuleDefinition,
MarkdownRuleVisitor,
ParentNode,
RootNode,
Expand Down Expand Up @@ -82,3 +83,80 @@ typeof processorPlugins satisfies {};
};
},
});

// All options optional - MarkdownRuleDefinition, MarkdownRuleDefinition<{}> and RuleModule
// should be the same type.
(
rule1: MarkdownRuleDefinition,
rule2: MarkdownRuleDefinition<{}>,
rule3: RuleModule,
) => {
rule1 satisfies typeof rule2 satisfies typeof rule3;
rule2 satisfies typeof rule1 satisfies typeof rule3;
rule3 satisfies typeof rule1 satisfies typeof rule2;
};

// Type restrictions should be enforced
(): MarkdownRuleDefinition<{
RuleOptions: [string, number];
MessageIds: "foo" | "bar";
ExtRuleDocs: { foo: string; bar: number };
}> => ({
meta: {
messages: {
foo: "FOO",

// @ts-expect-error Wrong type for message ID
bar: 42,
},
docs: {
foo: "FOO",

// @ts-expect-error Wrong type for declared property
bar: "BAR",

// @ts-expect-error Wrong type for predefined property
description: 42,
},
},
create({ options }) {
// Types for rule options
options[0] satisfies string;
options[1] satisfies number;

return {};
},
});

// Undeclared properties should produce an error
(): MarkdownRuleDefinition<{
MessageIds: "foo" | "bar";
ExtRuleDocs: { foo: number; bar: string };
}> => ({
meta: {
messages: {
foo: "FOO",

// Declared message ID is not required
// bar: "BAR",

// @ts-expect-error Undeclared message ID is not allowed
baz: "BAZ",
},
docs: {
foo: 42,

// Declared property is not required
// bar: "BAR",

// @ts-expect-error Undeclared property key is not allowed
baz: "BAZ",

// Predefined property is allowed
description: "Lorem ipsum",
},
},
create() {
return {};
},
});