From 46e150dcb0d4a8b0a8e77f3f24b612be8a546830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Thu, 30 Jan 2025 23:44:41 +0100 Subject: [PATCH] more types --- cli/js/40_lint.js | 33 ++++----- cli/js/40_lint_types.d.ts | 54 +-------------- cli/tsc/dts/lib.deno.unstable.d.ts | 105 +++++++++++++++++++++++------ 3 files changed, 102 insertions(+), 90 deletions(-) diff --git a/cli/js/40_lint.js b/cli/js/40_lint.js index e55a5cecf3..d8d7702a5a 100644 --- a/cli/js/40_lint.js +++ b/cli/js/40_lint.js @@ -77,13 +77,8 @@ const PropFlags = { /** @typedef {import("./40_lint_types.d.ts").VisitorFn} VisitorFn */ /** @typedef {import("./40_lint_types.d.ts").CompiledVisitor} CompiledVisitor */ /** @typedef {import("./40_lint_types.d.ts").LintState} LintState */ -/** @typedef {import("./40_lint_types.d.ts").IFixer} IFixer */ -/** @typedef {import("./40_lint_types.d.ts").RuleContext} RuleContext */ -/** @typedef {import("./40_lint_types.d.ts").LintPlugin} LintPlugin */ /** @typedef {import("./40_lint_types.d.ts").TransformFn} TransformFn */ /** @typedef {import("./40_lint_types.d.ts").MatchContext} MatchContext */ -/** @typedef {import("./40_lint_types.d.ts").INode} INode */ -/** @typedef {import("./40_lint_types.d.ts").IReportData} IReportData */ /** @type {LintState} */ const state = { @@ -108,10 +103,10 @@ class CancellationToken { } } -/** @implements {IFixer} */ +/** @implements {Deno.lint.Fixer} */ class Fixer { /** - * @param {INode} node + * @param {Deno.lint.Node} node * @param {string} text */ insertTextAfter(node, text) { @@ -122,7 +117,7 @@ class Fixer { } /** - * @param {INode["range"]} range + * @param {Deno.lint.Node["range"]} range * @param {string} text */ insertTextAfterRange(range, text) { @@ -133,7 +128,7 @@ class Fixer { } /** - * @param {INode} node + * @param {Deno.lint.Node} node * @param {string} text */ insertTextBefore(node, text) { @@ -144,7 +139,7 @@ class Fixer { } /** - * @param {INode["range"]} range + * @param {Deno.lint.Node["range"]} range * @param {string} text */ insertTextBeforeRange(range, text) { @@ -155,7 +150,7 @@ class Fixer { } /** - * @param {INode} node + * @param {Deno.lint.Node} node */ remove(node) { return { @@ -165,7 +160,7 @@ class Fixer { } /** - * @param {INode["range"]} range + * @param {Deno.lint.Node["range"]} range */ removeRange(range) { return { @@ -175,7 +170,7 @@ class Fixer { } /** - * @param {INode} node + * @param {Deno.lint.Node} node * @param {string} text */ replaceText(node, text) { @@ -186,7 +181,7 @@ class Fixer { } /** - * @param {INode["range"]} range + * @param {Deno.lint.Node["range"]} range * @param {string} text */ replaceTextRange(range, text) { @@ -200,7 +195,7 @@ class Fixer { /** * Every rule gets their own instance of this class. This is the main * API lint rules interact with. - * @implements {RuleContext} + * @implements {Deno.lint.RuleContext} */ export class Context { id; @@ -226,7 +221,7 @@ export class Context { } /** - * @param {IReportData} data + * @param {Deno.lint.ReportData} data */ report(data) { const range = data.node ? data.node.range : data.range ? data.range : null; @@ -260,7 +255,7 @@ export class Context { } /** - * @param {LintPlugin[]} plugins + * @param {Deno.lint.Plugin[]} plugins * @param {string[]} exclude */ export function installPlugins(plugins, exclude) { @@ -274,7 +269,7 @@ export function installPlugins(plugins, exclude) { } /** - * @param {LintPlugin} plugin + * @param {Deno.lint.Plugin} plugin */ function installPlugin(plugin) { if (typeof plugin !== "object") { @@ -459,7 +454,7 @@ function readType(buf, idx) { /** * @param {AstContext} ctx * @param {number} idx - * @returns {INode["range"]} + * @returns {Deno.lint.Node["range"]} */ function readSpan(ctx, idx) { let offset = ctx.spansOffset + (idx * SPAN_SIZE); diff --git a/cli/js/40_lint_types.d.ts b/cli/js/40_lint_types.d.ts index 68bb42db43..662cfc930f 100644 --- a/cli/js/40_lint_types.d.ts +++ b/cli/js/40_lint_types.d.ts @@ -1,17 +1,11 @@ // Copyright 2018-2025 the Deno authors. MIT license. -export interface INode { - type: string; - range: [number, number]; - [key: string]: unknown; -} - export interface AstContext { buf: Uint8Array; strTable: Map; strTableOffset: number; rootOffset: number; - nodes: Map; + nodes: Map; spansOffset: number; propsOffset: number; strByType: number[]; @@ -21,52 +15,8 @@ export interface AstContext { matcher: MatchContext; } -export type TRange = [number, number]; - -export interface IFixData { - range: TRange; - text?: string; -} - -export interface IFixer { - insertTextAfter(node: INode, text: string): IFixData; - insertTextAfterRange(range: TRange, text: string): IFixData; - insertTextBefore(node: INode, text: string): IFixData; - insertTextBeforeRange(range: TRange, text: string): IFixData; - remove(node: INode): IFixData; - removeRange(range: TRange): IFixData; - replaceText(node: INode, text: string): IFixData; - replaceTextRange(range: TRange, text: string): IFixData; -} - -export interface IReportData { - node?: INode; - range?: TRange; - message: string; - hint?: string; - fix?(fixer: IFixer): IFixData; -} - -// TODO(@marvinhagemeister) Remove once we land "official" types -export interface RuleContext { - id: string; - report(data: IReportData): void; -} - -// TODO(@marvinhagemeister) Remove once we land "official" types -export interface LintRule { - create(ctx: RuleContext): Record void>; - destroy?(ctx: RuleContext): void; -} - -// TODO(@marvinhagemeister) Remove once we land "official" types -export interface LintPlugin { - name: string; - rules: Record; -} - export interface LintState { - plugins: LintPlugin[]; + plugins: Deno.lint.Plugin[]; installedPlugins: Set; /** format: `/` */ ignoredRules: Set; diff --git a/cli/tsc/dts/lib.deno.unstable.d.ts b/cli/tsc/dts/lib.deno.unstable.d.ts index c1b78a3022..f59098a732 100644 --- a/cli/tsc/dts/lib.deno.unstable.d.ts +++ b/cli/tsc/dts/lib.deno.unstable.d.ts @@ -1341,24 +1341,6 @@ declare namespace Deno { export {}; // only export exports } - /** - * @category Linter - * @experimental - */ - export interface LintRule { - create(context: any): any; - destroy?(context: any): void; - } - - /** - * @category Linter - * @experimental - */ - export interface LintPlugin { - name: string; - rules: Record; - } - /** * @category Linter * @experimental @@ -1368,7 +1350,92 @@ declare namespace Deno { * @category Linter * @experimental */ - export interface LintFix { + export type Range = [number, number]; + + /** + * @category Linter + * @experimental + */ + export interface Node { + type: string; + range: Range; + [key: string]: unknown; + } + + /** + * @category Linter + * @experimental + */ + export interface FixData { + range: Range; + text?: string; + } + + /** + * @category Linter + * @experimental + */ + export interface Fixer { + insertTextAfter(node: Node, text: string): FixData; + insertTextAfterRange(range: Range, text: string): FixData; + insertTextBefore(node: Node, text: string): FixData; + insertTextBeforeRange(range: Range, text: string): FixData; + remove(node: Node): FixData; + removeRange(range: Range): FixData; + replaceText(node: Node, text: string): FixData; + replaceTextRange(range: Range, text: string): FixData; + } + + /** + * @category Linter + * @experimental + */ + export interface ReportData { + node?: Node; + range?: Range; + message: string; + hint?: string; + fix?(fixer: Fixer): FixData; + } + + /** + * @category Linter + * @experimental + */ + export interface RuleContext { + id: string; + report(data: ReportData): void; + } + + export interface Rule { + create(ctx: RuleContext): Record void>; + destroy?(ctx: RuleContext): void; + } + + /** + * In your plugins file do something like + * + * ```ts + * export default { + * name: "my-plugin", + * rules: { + * TODO:... + * } + * } satisfies Deno.lint.Plugin + * ``` + * @category Linter + * @experimental + */ + export interface Plugin { + name: string; + rules: Record; + } + + /** + * @category Linter + * @experimental + */ + export interface Fix { range: [number, number]; text?: string; }