diff --git a/.github/generated/ast_changes_watch_list.yml b/.github/generated/ast_changes_watch_list.yml index 245f5466aaa24..d826c8b346af3 100644 --- a/.github/generated/ast_changes_watch_list.yml +++ b/.github/generated/ast_changes_watch_list.yml @@ -74,7 +74,7 @@ src: - 'napi/parser/generated/lazy/walk.mjs' - 'napi/parser/generated/visit/keys.mjs' - 'napi/parser/generated/visit/types.mjs' - - 'napi/parser/generated/visit/visitor.d.ts' + - 'napi/parser/generated/visit/visitor.d.mts' - 'napi/parser/generated/visit/walk.mjs' - 'napi/parser/src/generated/assert_layouts.rs' - 'napi/parser/src/generated/derive_estree.rs' diff --git a/apps/oxlint/scripts/build.js b/apps/oxlint/scripts/build.js index 622330dffb092..c813a1b092e84 100755 --- a/apps/oxlint/scripts/build.js +++ b/apps/oxlint/scripts/build.js @@ -34,7 +34,7 @@ const parserFilePaths = [ */ 'generated/deserialize/ts.mjs', 'generated/visit/types.mjs', - 'generated/visit/visitor.d.ts', + 'generated/visit/visitor.d.mts', 'generated/visit/walk.mjs', ]; diff --git a/apps/oxlint/src-js/plugins/types.ts b/apps/oxlint/src-js/plugins/types.ts index d9e34df585579..9ee44985eaccc 100644 --- a/apps/oxlint/src-js/plugins/types.ts +++ b/apps/oxlint/src-js/plugins/types.ts @@ -6,7 +6,7 @@ export interface Visitor { } */ -import type { VisitorObject as Visitor } from '../../dist/generated/visit/visitor.d.ts'; +import type { VisitorObject as Visitor } from '../../dist/generated/visit/visitor.d.mts'; export type { Visitor }; // Hook function that runs before traversal. diff --git a/dprint.json b/dprint.json index 83fcfee85cb69..0726e30017aba 100644 --- a/dprint.json +++ b/dprint.json @@ -28,6 +28,7 @@ "napi/{parser,transform,minify,playground}/**/wasi-worker.mjs", "napi/{parser,transform,minify,playground}/**/browser.js", "napi/parser/src-js/bindings.mjs", + "napi/parser/src-js/index.d.mts", "npm/*/package.json", "npm/oxlint/configuration_schema.json", "npm/oxc-wasm/**", diff --git a/napi/parser/generated/visit/visitor.d.ts b/napi/parser/generated/visit/visitor.d.mts similarity index 100% rename from napi/parser/generated/visit/visitor.d.ts rename to napi/parser/generated/visit/visitor.d.mts diff --git a/napi/parser/package.json b/napi/parser/package.json index eb3e57fc3dfc7..9b36238a41aa0 100644 --- a/napi/parser/package.json +++ b/napi/parser/package.json @@ -5,7 +5,7 @@ "main": "src-js/index.mjs", "browser": "src-js/wasm.mjs", "scripts": { - "build-dev": "napi build --esm --platform --js bindings.mjs --output-dir src-js", + "build-dev": "napi build --esm --platform --js bindings.mjs --dts index.d.mts --output-dir src-js", "build-test": "pnpm run build-dev --profile coverage", "build": "pnpm run build-dev --features allocator --release", "postbuild-dev": "node scripts/patch.mjs", @@ -46,10 +46,10 @@ "generated/lazy/walk.mjs", "generated/visit/keys.mjs", "generated/visit/types.mjs", - "generated/visit/visitor.d.ts", + "generated/visit/visitor.d.mts", "generated/visit/walk.mjs", "src-js/bindings.mjs", - "src-js/index.d.ts", + "src-js/index.d.mts", "src-js/index.mjs", "src-js/wasm.mjs", "src-js/webcontainer-fallback.js", @@ -107,6 +107,6 @@ "fs": false } }, - "dtsHeaderFile": "src-js/header.d.ts" + "dtsHeaderFile": "src-js/header.d.mts" } } diff --git a/napi/parser/src-js/header.d.ts b/napi/parser/src-js/header.d.mts similarity index 84% rename from napi/parser/src-js/header.d.ts rename to napi/parser/src-js/header.d.mts index 7773551b02753..542727d2a3cbb 100644 --- a/napi/parser/src-js/header.d.ts +++ b/napi/parser/src-js/header.d.mts @@ -2,12 +2,14 @@ /* eslint-disable */ import type { Program } from '@oxc-project/types'; -import type { VisitorObject } from '../generated/visit/visitor.d.ts'; +import type { VisitorObject } from '../generated/visit/visitor.d.mts'; export * from '@oxc-project/types'; export { VisitorObject }; +export const visitorKeys: Record; + export class Visitor { constructor(visitor: VisitorObject); visit(program: Program): void; diff --git a/napi/parser/src-js/index.d.ts b/napi/parser/src-js/index.d.mts similarity index 99% rename from napi/parser/src-js/index.d.ts rename to napi/parser/src-js/index.d.mts index d74fc0834f38d..9ef6ee174f22b 100644 --- a/napi/parser/src-js/index.d.ts +++ b/napi/parser/src-js/index.d.mts @@ -2,12 +2,14 @@ /* eslint-disable */ import type { Program } from '@oxc-project/types'; -import type { VisitorObject } from '../generated/visit/visitor.d.ts'; +import type { VisitorObject } from '../generated/visit/visitor.d.mts'; export * from '@oxc-project/types'; export { VisitorObject }; +export const visitorKeys: Record; + export class Visitor { constructor(visitor: VisitorObject); visit(program: Program): void; diff --git a/napi/parser/test/parse-raw.test.ts b/napi/parser/test/parse-raw.test.ts index 13885258805eb..aba12faa9465f 100644 --- a/napi/parser/test/parse-raw.test.ts +++ b/napi/parser/test/parse-raw.test.ts @@ -5,7 +5,7 @@ import { basename, join as pathJoin } from 'node:path'; import Tinypool from 'tinypool'; import { describe, expect, it } from 'vitest'; -import { parseAsync, parseSync } from '../src-js/index.mjs'; +import { parseAsync, parseSync, type TSTypeAliasDeclaration, type VariableDeclaration } from '../src-js/index.mjs'; import { ACORN_TEST262_DIR_PATH, @@ -273,7 +273,8 @@ describe.concurrent('`preserveParens` option', () => { // @ts-ignore let ret = parseSync('test.js', code, { experimentalRawTransfer: true, preserveParens: false }); expect(ret.errors.length).toBe(0); - expect(ret.program.body[0].declarations[0].init.type).toBe('BinaryExpression'); + const firstStatement = ret.program.body[0] as VariableDeclaration; + expect(firstStatement.declarations[0].init.type).toBe('BinaryExpression'); }); it.concurrent('TS', async () => { @@ -282,8 +283,10 @@ describe.concurrent('`preserveParens` option', () => { // @ts-ignore let ret = parseSync('test.ts', code, { experimentalRawTransfer: true, preserveParens: false }); expect(ret.errors.length).toBe(0); - expect(ret.program.body[0].declarations[0].init.type).toBe('BinaryExpression'); - expect(ret.program.body[1].typeAnnotation.type).toBe('TSStringKeyword'); + const firstStatement = ret.program.body[0] as VariableDeclaration; + expect(firstStatement.declarations[0].init.type).toBe('BinaryExpression'); + const secondStatement = ret.program.body[1] as TSTypeAliasDeclaration; + expect(secondStatement.typeAnnotation.type).toBe('TSStringKeyword'); }); }); @@ -294,7 +297,8 @@ describe.concurrent('`preserveParens` option', () => { // @ts-ignore let ret = parseSync('test.js', code, { experimentalRawTransfer: true, preserveParens: true }); expect(ret.errors.length).toBe(0); - expect(ret.program.body[0].declarations[0].init.type).toBe('ParenthesizedExpression'); + const firstStatement = ret.program.body[0] as VariableDeclaration; + expect(firstStatement.declarations[0].init.type).toBe('ParenthesizedExpression'); }); it.concurrent('TS', async () => { @@ -303,8 +307,10 @@ describe.concurrent('`preserveParens` option', () => { // @ts-ignore let ret = parseSync('test.ts', code, { experimentalRawTransfer: true, preserveParens: true }); expect(ret.errors.length).toBe(0); - expect(ret.program.body[0].declarations[0].init.type).toBe('ParenthesizedExpression'); - expect(ret.program.body[1].typeAnnotation.type).toBe('TSParenthesizedType'); + const firstStatement = ret.program.body[0] as VariableDeclaration; + expect(firstStatement.declarations[0].init.type).toBe('ParenthesizedExpression'); + const secondStatement = ret.program.body[1] as TSTypeAliasDeclaration; + expect(secondStatement.typeAnnotation.type).toBe('TSParenthesizedType'); }); }); }); diff --git a/napi/parser/test/visit.test.ts b/napi/parser/test/visit.test.ts index 32c099729ab0a..461c6d1da6829 100644 --- a/napi/parser/test/visit.test.ts +++ b/napi/parser/test/visit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { parseSync, Visitor, visitorKeys } from '../src-js/index.mjs'; +import { parseSync, Visitor, visitorKeys, type VisitorObject } from '../src-js/index.mjs'; describe('visit', () => { it('empty visitor', () => { @@ -12,6 +12,7 @@ describe('visit', () => { describe('invalid visitor', () => { it('undefined visitor object', () => { + // @ts-ignore expect(() => new Visitor()).toThrow(new TypeError('Visitor must be an object')); }); @@ -20,19 +21,23 @@ describe('visit', () => { }); it('boolean visitor object', () => { - expect(() => new Visitor(true)).toThrow(new TypeError('Visitor must be an object')); + expect(() => new Visitor(true as unknown as VisitorObject)).toThrow(new TypeError('Visitor must be an object')); }); it('unknown type in entry', () => { - expect(() => new Visitor({ Foo() {} })).toThrow(new Error("Unknown node type 'Foo' in visitor object")); + expect(() => new Visitor({ Foo() {} } as VisitorObject)).toThrow( + new Error("Unknown node type 'Foo' in visitor object"), + ); }); it('unknown type in exit', () => { - expect(() => new Visitor({ 'Foo:exit'() {} })).toThrow(new Error("Unknown node type 'Foo' in visitor object")); + expect(() => new Visitor({ 'Foo:exit'() {} } as VisitorObject)).toThrow( + new Error("Unknown node type 'Foo' in visitor object"), + ); }); it('invalid postfix', () => { - expect(() => new Visitor({ 'Identifier:foo'() {} })).toThrow( + expect(() => new Visitor({ 'Identifier:foo'() {} } as VisitorObject)).toThrow( new Error("Unknown node type 'Identifier:foo' in visitor object"), ); }); diff --git a/tasks/ast_tools/src/generators/estree_visit.rs b/tasks/ast_tools/src/generators/estree_visit.rs index edbb4c01a8ae2..364af39825b11 100644 --- a/tasks/ast_tools/src/generators/estree_visit.rs +++ b/tasks/ast_tools/src/generators/estree_visit.rs @@ -52,7 +52,7 @@ impl Generator for ESTreeVisitGenerator { code: type_ids_map, }, Output::Javascript { - path: format!("{NAPI_PARSER_PACKAGE_PATH}/generated/visit/visitor.d.ts"), + path: format!("{NAPI_PARSER_PACKAGE_PATH}/generated/visit/visitor.d.mts"), code: visitor_type, }, ]