diff --git a/.github/dependabot.yml b/.github/dependabot.yml index df3532e6..51931b45 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -57,7 +57,7 @@ updates: - 'hast-*' - 'mdast-*' - 'hastscript' - - 'acorn' + - 'oxc-parser' recma: patterns: - 'recma-*' diff --git a/package-lock.json b/package-lock.json index 277f7f10..55f9cda4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@orama/orama": "^3.1.11", "@orama/react-components": "^0.8.1", "@rollup/plugin-virtual": "^3.0.2", - "acorn": "^8.15.0", "commander": "^14.0.0", "dedent": "^1.6.0", "eslint-plugin-react-x": "^1.52.3", @@ -28,6 +27,7 @@ "hastscript": "^9.0.1", "lightningcss": "^1.30.1", "mdast-util-slice-markdown": "^2.0.1", + "oxc-parser": "^0.82.2", "preact": "^10.27.0", "preact-render-to-string": "^6.5.13", "reading-time": "^1.5.0", @@ -1222,6 +1222,258 @@ "lodash": "^4.17.21" } }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.82.2.tgz", + "integrity": "sha512-WixT4D23lZWoqbBQKSYjXNfQahH3Z0sGKi6SFJsqmz1RAxasulQ7MNrUyFuQwf5kKKR9RoUO0G8p3bHIlzNasw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.82.2.tgz", + "integrity": "sha512-NWnpaHRmCsJGW36BuybIf0wax9OALRWoON5Kr+JlJ3PtSWhy0UPwf2gaQ7ByKA3kxsN+zzt6xTdj28uw5z52tA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.82.2.tgz", + "integrity": "sha512-UF3hZ81WCf559Bvtq9ovg86zo9dKxfHs0ik9zX2aDsAoSEW/8j6/LN743lyvMtf8Js1FhGlmQKoDhL4Sfj9ZtQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.82.2.tgz", + "integrity": "sha512-ns+nQ6YivDhONj5mOogDm3JaryO11yxomTNqqzIdhr4S8nudxtej3jTpa/95w3GdUDtmjLMLcqKyZBFgaQ2YEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.82.2.tgz", + "integrity": "sha512-SOE99+4/KCTO6oU6D+kmm+nx+2DbX9TJjeeb1dQ8Ex1TIBvwmZh/p7SvXUmriwgIcb+MiRnP70zMPVeYyg+x8Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.82.2.tgz", + "integrity": "sha512-Haq0EPU6cbrl5dVhcTKT1vJi5h5tgMQGwrL5T1CKiQ15oSS5I4KDPx8UxlNZSyKdGQtfRbyd5Xm6dFvwhHcGvw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.82.2.tgz", + "integrity": "sha512-QPo86fU1phsUf/C3dRGxwdqVTpOH1WOMpCjYFC+BCnP6z/Ps31OVpb+pcIsG84QpBk8ny0LOwSdWLL//erHC+Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.82.2.tgz", + "integrity": "sha512-cL8ONC8P3t5eMV8JCPuFA1fTvN+ZZpm9ApXIQYdR7+x/45uDHRf5ugExT4aBOdJo93KLtjRXEtGNwPunv77jxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.82.2.tgz", + "integrity": "sha512-lkJw+sBGIRlBfQdOc9pgml77mAnYyN+4wDRySXeSYpb2hez84jE5aUpMUq4Qtb+NJMCu4o0yLfWDicCezliFMw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.82.2.tgz", + "integrity": "sha512-8LTpvii8K0iMLde8yyOQSzaPAypueEgJNsZGThcy17MOFOVaWs2zc3UulazFLBw0zenvPsKWE18vl9qbIDkeng==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.82.2.tgz", + "integrity": "sha512-uv8tswVGByNX1J3jNH5eereZtZIySc9X/prdXRMOS3YzO555u5NU59XEeS9AqUWWaW29FHwYKCiitZ7E8P8yTg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.82.2.tgz", + "integrity": "sha512-BjJDSIYHaiRlLCN8zqHze3xP0cfzUed/+8LJp9/lJzcHwSYLfyhLfZko6F9AnruKs6w3+8mVlFGqPWcIJQrmYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.82.2.tgz", + "integrity": "sha512-zb4IbEU55pJYSax7hBh+LYYhawkDnuwOY0zNURAg8g3PjPRwtYCmdz4QRaw3MZbnhsY6me2PwWtzmJw90iOvAw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.3.tgz", + "integrity": "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.82.2.tgz", + "integrity": "sha512-UnmQAHucLxiejP1oH+h37OFPgARA4baQXV2449G9jh0lVdzARFtXlJs/wkI8qMBPJt9rSuq97eNgwJhqMyJT2Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.82.2.tgz", + "integrity": "sha512-YfrVFEPn+fnKOVtNq9PGko1VfmTj5VSm0xr6nr2x79JV3KW/J9Ow5ujHQhPi+3rMiL7PtNTwJ3GYZwoGQmdCvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@oxc-project/runtime": { "version": "0.81.0", "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.81.0.tgz", @@ -7533,6 +7785,47 @@ "node": ">= 0.8.0" } }, + "node_modules/oxc-parser": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.82.2.tgz", + "integrity": "sha512-3AnHwmLCy96cw6oEQ/aYjVl57hUuru2VrGIpAGDB2trb5RU3tjSmAxkX91EUxA/WQ7m9o82aToSVJwgCPr8BZA==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.82.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm64": "0.82.2", + "@oxc-parser/binding-darwin-arm64": "0.82.2", + "@oxc-parser/binding-darwin-x64": "0.82.2", + "@oxc-parser/binding-freebsd-x64": "0.82.2", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.82.2", + "@oxc-parser/binding-linux-arm-musleabihf": "0.82.2", + "@oxc-parser/binding-linux-arm64-gnu": "0.82.2", + "@oxc-parser/binding-linux-arm64-musl": "0.82.2", + "@oxc-parser/binding-linux-riscv64-gnu": "0.82.2", + "@oxc-parser/binding-linux-s390x-gnu": "0.82.2", + "@oxc-parser/binding-linux-x64-gnu": "0.82.2", + "@oxc-parser/binding-linux-x64-musl": "0.82.2", + "@oxc-parser/binding-wasm32-wasi": "0.82.2", + "@oxc-parser/binding-win32-arm64-msvc": "0.82.2", + "@oxc-parser/binding-win32-x64-msvc": "0.82.2" + } + }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.82.2", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.82.2.tgz", + "integrity": "sha512-WMGSwd9FsNBs/WfqIOH0h3k1LBdjZJQGYjGnC+vla/fh6HUsu5HzGPerRljiq1hgMQ6gs031YJR12VyP57b/hQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", diff --git a/package.json b/package.json index cfceda13..f193267e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "@orama/orama": "^3.1.11", "@orama/react-components": "^0.8.1", "@rollup/plugin-virtual": "^3.0.2", - "acorn": "^8.15.0", "commander": "^14.0.0", "dedent": "^1.6.0", "eslint-plugin-react-x": "^1.52.3", @@ -60,6 +59,7 @@ "hastscript": "^9.0.1", "lightningcss": "^1.30.1", "mdast-util-slice-markdown": "^2.0.1", + "oxc-parser": "^0.82.2", "preact": "^10.27.0", "preact-render-to-string": "^6.5.13", "reading-time": "^1.5.0", diff --git a/src/generators/api-links/__tests__/fixtures.test.mjs b/src/generators/api-links/__tests__/fixtures.test.mjs index 2284249a..76c41387 100644 --- a/src/generators/api-links/__tests__/fixtures.test.mjs +++ b/src/generators/api-links/__tests__/fixtures.test.mjs @@ -14,7 +14,7 @@ const sourceFiles = fixtures describe('api links', () => { describe('should work correctly for all fixtures', () => { - sourceFiles.forEach(sourceFile => { + for (const sourceFile of sourceFiles) { it(`${basename(sourceFile)}`, async t => { const astJsResult = await astJs.generate(undefined, { input: [sourceFile], @@ -30,6 +30,6 @@ describe('api links', () => { t.assert.snapshot(actualOutput); }); - }); + } }); }); diff --git a/src/generators/api-links/index.mjs b/src/generators/api-links/index.mjs index 95689be5..dcb421cb 100644 --- a/src/generators/api-links/index.mjs +++ b/src/generators/api-links/index.mjs @@ -55,8 +55,12 @@ export default { // `http.js` -> `http` const baseName = basename(program.path, '.js'); + console.log(`Processing ${baseName}.js`); + const exports = extractExports(program, baseName, nameToLineNumberMap); + console.log('Exports:', exports); + findDefinitions(program, baseName, nameToLineNumberMap, exports); checkIndirectReferences(program, exports, nameToLineNumberMap); diff --git a/src/generators/api-links/utils/checkIndirectReferences.mjs b/src/generators/api-links/utils/checkIndirectReferences.mjs index 982bb111..34f106c8 100644 --- a/src/generators/api-links/utils/checkIndirectReferences.mjs +++ b/src/generators/api-links/utils/checkIndirectReferences.mjs @@ -1,7 +1,7 @@ import { visit } from 'estree-util-visit'; /** - * @param {import('acorn').Program} program + * @param {import('oxc-parser').Program} program * @param {import('../types.d.ts').ProgramExports} exports * @param {Record} nameToLineNumberMap */ diff --git a/src/generators/api-links/utils/extractExports.mjs b/src/generators/api-links/utils/extractExports.mjs index 60746eca..7b2f2583 100644 --- a/src/generators/api-links/utils/extractExports.mjs +++ b/src/generators/api-links/utils/extractExports.mjs @@ -7,7 +7,7 @@ import { CONSTRUCTOR_EXPRESSION } from '../constants.mjs'; /** * @see https://github.com/estree/estree/blob/master/es5.md#assignmentexpression * - * @param {import('acorn').ExpressionStatement} node + * @param {import('oxc-parser').ExpressionStatement} node * @param {string} basename * @param {Record} nameToLineNumberMap * @returns {import('../types').ProgramExports | undefined} @@ -229,13 +229,13 @@ export function extractExports(program, basename, nameToLineNumberMap) { const TYPE_TO_HANDLER_MAP = { /** - * @param {import('acorn').Node} node + * @param {import('oxc-parser').Node} node */ ExpressionStatement: node => handleExpression(node, basename, nameToLineNumberMap), /** - * @param {import('acorn').Node} node + * @param {import('oxc-parser').Node} node */ VariableDeclaration: node => handleVariableDeclaration(node, basename, nameToLineNumberMap), diff --git a/src/generators/api-links/utils/findDefinitions.mjs b/src/generators/api-links/utils/findDefinitions.mjs index a161e3ed..cac524f1 100644 --- a/src/generators/api-links/utils/findDefinitions.mjs +++ b/src/generators/api-links/utils/findDefinitions.mjs @@ -5,7 +5,7 @@ import { visit } from 'estree-util-visit'; /** * @see https://github.com/estree/estree/blob/master/es5.md#expressionstatement * - * @param {import('acorn').ExpressionStatement} node + * @param {import('oxc-parser').ExpressionStatement} node * @param {Record} nameToLineNumberMap * @param {import('../types').ProgramExports} exports */ @@ -86,7 +86,7 @@ function handleAssignmentExpression(node, nameToLineNumberMap, exports) { } /** - * @param {import('acorn').FunctionDeclaration} node + * @param {import('oxc-parser').FunctionDeclaration} node * @param {string} basename * @param {Record} nameToLineNumberMap * @param {import('../types').ProgramExports} exports @@ -111,7 +111,7 @@ function handleFunctionDeclaration( } /** - * @param {import('acorn').ClassDeclaration} node + * @param {import('oxc-parser').ClassDeclaration} node * @param {Record} nameToLineNumberMap * @param {import('../types').ProgramExports} exports */ @@ -139,7 +139,7 @@ function handleClassDeclaration(node, nameToLineNumberMap, exports) { } /** - * @param {import('acorn').Program} program + * @param {import('oxc-parser').Program} program * @param {string} basename * @param {Record} nameToLineNumberMap * @param {import('../types').ProgramExports} exports @@ -152,19 +152,19 @@ export function findDefinitions( ) { const TYPE_TO_HANDLER_MAP = { /** - * @param {import('acorn').Node} node + * @param {import('oxc-parser').Node} node */ ExpressionStatement: node => handleAssignmentExpression(node, nameToLineNumberMap, exports), /** - * @param {import('acorn').Node} node + * @param {import('oxc-parser').Node} node */ FunctionDeclaration: node => handleFunctionDeclaration(node, basename, nameToLineNumberMap, exports), /** - * @param {import('acorn').Node} node + * @param {import('oxc-parser').Node} node */ ClassDeclaration: node => handleClassDeclaration(node, nameToLineNumberMap, exports), diff --git a/src/parsers/javascript.mjs b/src/parsers/javascript.mjs index e68e9d9f..3acc789c 100644 --- a/src/parsers/javascript.mjs +++ b/src/parsers/javascript.mjs @@ -1,6 +1,5 @@ 'use strict'; - -import * as acorn from 'acorn'; +import { parseAsync } from 'oxc-parser'; /** * Creates a Javascript source parser for a given source file @@ -23,14 +22,27 @@ const createParser = () => { ); } - const res = acorn.parse(resolvedSourceFile.value, { - allowReturnOutsideFunction: true, - ecmaVersion: 'latest', - locations: true, - }); + const res = await parseAsync( + resolvedSourceFile.path, + resolvedSourceFile.value, + { + range: false, + lang: 'js', + astType: 'js', + sourceType: 'script', + } + ); + + if (res.errors.length > 0) { + for (const error of res.errors) { + console.error( + `Error parsing ${resolvedSourceFile.path}: ${error.message}` + ); + } + } return { - ...res, + ...res.program, path: resolvedSourceFile.path, }; }; diff --git a/src/types.d.ts b/src/types.d.ts index ca1bfaa6..6819c6fc 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,5 +1,5 @@ import type { Heading, Root } from 'mdast'; -import type { Program } from 'acorn'; +import type { Program } from 'oxc-parser'; import type { SemVer } from 'semver'; import type { Data, Node, Parent, Position } from 'unist';