From 798fe29c7a6b785f0e5f60a5d87a2e3af367063c Mon Sep 17 00:00:00 2001 From: sun0day Date: Tue, 19 Dec 2023 19:52:04 +0800 Subject: [PATCH] feat: add alias support (#4) --- Cargo.lock | 40 ++++----- crates/napi/src/lib.rs | 5 +- crates/resolver/Cargo.toml | 2 +- packages/graph/__test__/alias.spec.mjs | 22 +++++ packages/graph/__test__/fixture/code/alias.js | 3 + .../graph/__test__/fixture/parsed/alias.json | 83 +++++++++++++++++++ packages/graph/__test__/utils.mjs | 4 +- packages/graph/index.ts | 9 +- 8 files changed, 143 insertions(+), 25 deletions(-) create mode 100644 packages/graph/__test__/alias.spec.mjs create mode 100644 packages/graph/__test__/fixture/code/alias.js create mode 100644 packages/graph/__test__/fixture/parsed/alias.json diff --git a/Cargo.lock b/Cargo.lock index 8a80310..1b2701e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -329,7 +329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -509,9 +509,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hermit-abi" @@ -582,12 +582,12 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "rayon", "serde", ] @@ -927,9 +927,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "overload" @@ -945,9 +945,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "oxc_resolver" -version = "0.2.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9657cba6ac0894a8acf3aca5b9a4b7668ce8486042588cf2bf0f34eb5f37ebc6" +checksum = "7ac76a705bf7db9d1e43904ed4704039de8fa654b0f613cc729c09bb67fd89f6" dependencies = [ "dashmap", "dunce", @@ -1362,18 +1362,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -1382,9 +1382,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "indexmap", "itoa", @@ -2643,18 +2643,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" dependencies = [ "proc-macro2", "quote", diff --git a/crates/napi/src/lib.rs b/crates/napi/src/lib.rs index 7b25300..9a8db06 100644 --- a/crates/napi/src/lib.rs +++ b/crates/napi/src/lib.rs @@ -12,15 +12,16 @@ pub fn compute_root(root: Option) -> Option { } } -// alias: module1:path1 module2:path2 +// alias: name1=path1 name2=path2 pub fn compute_alias(root: &Option, alias: Option) -> Option { match alias { Some(buf) => { let alias_str = String::from_utf8_lossy(&buf).to_string(); let alias: Alias = alias_str + .trim() .split(" ") .map(|s| { - let kv: Vec<&str> = s.split(":").collect(); + let kv: Vec<&str> = s.split("=").collect(); let paths: Vec = kv[1] .split(",") .map(|p| { diff --git a/crates/resolver/Cargo.toml b/crates/resolver/Cargo.toml index da5194a..e9b9b83 100644 --- a/crates/resolver/Cargo.toml +++ b/crates/resolver/Cargo.toml @@ -6,6 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -oxc_resolver = "0.2.0" +oxc_resolver = "0.6.2" easy_ast_error = { version = "0.1.0", path = "../error" } regex = "1.10.2" \ No newline at end of file diff --git a/packages/graph/__test__/alias.spec.mjs b/packages/graph/__test__/alias.spec.mjs new file mode 100644 index 0000000..4c3dda3 --- /dev/null +++ b/packages/graph/__test__/alias.spec.mjs @@ -0,0 +1,22 @@ +import test from 'ava' +import {createParser, isWindows, readParsedFile} from './utils.mjs' + + +test('should parse alias path', async (t) => { + // skip in windows + if(isWindows) { + return t.truthy(true) + } + + const parser = createParser({'@pkg': './nested'}) + + await parser.visit('./alias.js') + const parsed = parser.parse() + const expected = readParsedFile('./alias.json') + const foo = 'nested/foo.js' + t.truthy(parsed[foo].importer.includes('nested/bar.js')) + t.truthy(parsed[foo].importer.includes('alias.js')) + delete parsed[foo].importer + delete expected[foo].importer + t.deepEqual(parsed, expected) +}) \ No newline at end of file diff --git a/packages/graph/__test__/fixture/code/alias.js b/packages/graph/__test__/fixture/code/alias.js new file mode 100644 index 0000000..fa9761a --- /dev/null +++ b/packages/graph/__test__/fixture/code/alias.js @@ -0,0 +1,3 @@ +import {read} from 'fs' +import {foo} from '@pkg/foo' +export {bar} from '@pkg/bar' \ No newline at end of file diff --git a/packages/graph/__test__/fixture/parsed/alias.json b/packages/graph/__test__/fixture/parsed/alias.json new file mode 100644 index 0000000..8561d40 --- /dev/null +++ b/packages/graph/__test__/fixture/parsed/alias.json @@ -0,0 +1,83 @@ +{ + "nested/foo.js": { + "id": "nested/foo.js", + "type": "internal", + "importer": [ + "alias.js", + "nested/bar.js" + ], + "import": null + }, + "alias.js": { + "id": "alias.js", + "type": "internal", + "importer": null, + "import": [ + { + "id": "fs", + "type": "static", + "ident": [ + { + "name": "read", + "as": "read", + "isType": false + } + ], + "typeOnly": false + }, + { + "id": "nested/foo.js", + "type": "static", + "ident": [ + { + "name": "foo", + "as": "foo", + "isType": false + } + ], + "typeOnly": false + }, + { + "id": "nested/bar.js", + "type": "static", + "ident": [ + { + "name": "bar", + "as": "bar", + "isType": false + } + ], + "typeOnly": false + } + ] + }, + "fs": { + "id": "fs", + "type": "builtin", + "importer": [ + "alias.js" + ], + "import": null + }, + "nested/bar.js": { + "id": "nested/bar.js", + "type": "internal", + "importer": [ + "alias.js" + ], + "import": [ + { + "id": "nested/foo.js", + "type": "static", + "ident": [ + { + "name": "foo", + "as": "foo", + "isType": false + } + ], + "typeOnly": false + } + ] + } +} \ No newline at end of file diff --git a/packages/graph/__test__/utils.mjs b/packages/graph/__test__/utils.mjs index 29526f8..fa5147c 100644 --- a/packages/graph/__test__/utils.mjs +++ b/packages/graph/__test__/utils.mjs @@ -6,6 +6,7 @@ import { Parser } from '../index.js' const __dirname = dirname(fileURLToPath(import.meta.url)) +export const isWindows = /\bwin/.test(process.platform) export const getCodeFile = (file) => join(__dirname, 'fixture/code', file) export const getNodeModules = (file) => join('node_modules', file).replaceAll('\\', '/') export const readParsedFile = (file, codeFiles = {}, nodeModules = {}, resolve = true) => { @@ -19,7 +20,8 @@ export const readParsedFile = (file, codeFiles = {}, nodeModules = {}, resolve = return JSON.parse(content) } -export const parser = new Parser({ root: join(process.cwd(), '__test__/fixture/code') }) +export const createParser = (alias) => new Parser({ root: join(process.cwd(), '__test__/fixture/code'), alias }) +export const parser = createParser() export const getGitRepo = repo => join(__dirname, '../../../repos', repo) export const getGitRepoFiles = (repo, pattern, ignore) => { const root = getGitRepo(repo) diff --git a/packages/graph/index.ts b/packages/graph/index.ts index 7fe9189..85ec92e 100644 --- a/packages/graph/index.ts +++ b/packages/graph/index.ts @@ -36,7 +36,14 @@ export class Parser { this.parser = new CoreParser( Buffer.from(absRoot), alias ? Buffer.from( - Object.keys(alias).reduce((s, key) => [s, `${key}:${alias[key]}`].join(' '), '') + Object + .keys(alias) + .reduce( + (s, key) => [s, `${key}=${ + isAbsolute(alias[key]) ? alias[key] : resolve(absRoot, alias[key]) + }`].join(' '), + '' + ) ) : undefined ) }