eslint-plugin-next-edge-boundary 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/configs/recommended.d.ts +3 -0
  4. package/dist/configs/recommended.d.ts.map +1 -0
  5. package/dist/configs/recommended.js +13 -0
  6. package/dist/configs/recommended.js.map +1 -0
  7. package/dist/configs/strict.d.ts +3 -0
  8. package/dist/configs/strict.d.ts.map +1 -0
  9. package/dist/configs/strict.js +13 -0
  10. package/dist/configs/strict.js.map +1 -0
  11. package/dist/core/classify.d.ts +14 -0
  12. package/dist/core/classify.d.ts.map +1 -0
  13. package/dist/core/classify.js +59 -0
  14. package/dist/core/classify.js.map +1 -0
  15. package/dist/core/constants.d.ts +10 -0
  16. package/dist/core/constants.d.ts.map +1 -0
  17. package/dist/core/constants.js +92 -0
  18. package/dist/core/constants.js.map +1 -0
  19. package/dist/core/entrypoints.d.ts +2 -0
  20. package/dist/core/entrypoints.d.ts.map +1 -0
  21. package/dist/core/entrypoints.js +20 -0
  22. package/dist/core/entrypoints.js.map +1 -0
  23. package/dist/core/format-chain.d.ts +5 -0
  24. package/dist/core/format-chain.d.ts.map +1 -0
  25. package/dist/core/format-chain.js +35 -0
  26. package/dist/core/format-chain.js.map +1 -0
  27. package/dist/core/import-graph.d.ts +35 -0
  28. package/dist/core/import-graph.d.ts.map +1 -0
  29. package/dist/core/import-graph.js +169 -0
  30. package/dist/core/import-graph.js.map +1 -0
  31. package/dist/core/import-kind.d.ts +10 -0
  32. package/dist/core/import-kind.d.ts.map +1 -0
  33. package/dist/core/import-kind.js +19 -0
  34. package/dist/core/import-kind.js.map +1 -0
  35. package/dist/core/options.d.ts +26 -0
  36. package/dist/core/options.d.ts.map +1 -0
  37. package/dist/core/options.js +116 -0
  38. package/dist/core/options.js.map +1 -0
  39. package/dist/core/resolve-module.d.ts +24 -0
  40. package/dist/core/resolve-module.d.ts.map +1 -0
  41. package/dist/core/resolve-module.js +232 -0
  42. package/dist/core/resolve-module.js.map +1 -0
  43. package/dist/core/size-estimate.d.ts +17 -0
  44. package/dist/core/size-estimate.d.ts.map +1 -0
  45. package/dist/core/size-estimate.js +48 -0
  46. package/dist/core/size-estimate.js.map +1 -0
  47. package/dist/index.d.ts +18 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +40 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/rules/max-graph-bytes.d.ts +3 -0
  52. package/dist/rules/max-graph-bytes.d.ts.map +1 -0
  53. package/dist/rules/max-graph-bytes.js +123 -0
  54. package/dist/rules/max-graph-bytes.js.map +1 -0
  55. package/dist/rules/no-barrels.d.ts +3 -0
  56. package/dist/rules/no-barrels.d.ts.map +1 -0
  57. package/dist/rules/no-barrels.js +93 -0
  58. package/dist/rules/no-barrels.js.map +1 -0
  59. package/dist/rules/no-node-apis.d.ts +3 -0
  60. package/dist/rules/no-node-apis.d.ts.map +1 -0
  61. package/dist/rules/no-node-apis.js +118 -0
  62. package/dist/rules/no-node-apis.js.map +1 -0
  63. package/dist/rules/types.d.ts +30 -0
  64. package/dist/rules/types.d.ts.map +1 -0
  65. package/dist/rules/types.js +2 -0
  66. package/dist/rules/types.js.map +1 -0
  67. package/docs/hero.png +0 -0
  68. package/package.json +63 -0
@@ -0,0 +1,169 @@
1
+ import fs from "node:fs";
2
+ import { classifyModule } from "./classify.js";
3
+ import { matchesIgnorePattern } from "./options.js";
4
+ import { resolveModule } from "./resolve-module.js";
5
+ const IMPORT_RE = /(?:^|\n)\s*(?:export\s+(?:type\s+)?(?:\*|\{[^}]*\})\s+from\s*|import\s+(?:type\s+)?(?:[^'"\n]+?\s+from\s*)?)['"]([^'"]+)['"]/g;
6
+ const SIDE_EFFECT_RE = /(?:^|\n)\s*import\s*['"]([^'"]+)['"]/g;
7
+ const TYPE_IMPORT_RE = /(?:^|\n)\s*(?:import\s+type\s+|export\s+type\s+(?:\*|\{[^}]*\})\s+from\s+)/;
8
+ const fileImportCache = new Map();
9
+ const graphCache = new Map();
10
+ export function clearGraphCaches() {
11
+ fileImportCache.clear();
12
+ graphCache.clear();
13
+ }
14
+ function stripCommentsAndStringsCarefully(source) {
15
+ return source
16
+ .replace(/\/\*[\s\S]*?\*\//g, "")
17
+ .replace(/(^|[^:])\/\/.*$/gm, "$1");
18
+ }
19
+ export function collectValueImportSpecifiers(source) {
20
+ const cleaned = stripCommentsAndStringsCarefully(source);
21
+ const specifiers = new Set();
22
+ for (const match of cleaned.matchAll(IMPORT_RE)) {
23
+ const full = match[0] ?? "";
24
+ const specifier = match[1];
25
+ if (!specifier) {
26
+ continue;
27
+ }
28
+ if (TYPE_IMPORT_RE.test(full)) {
29
+ continue;
30
+ }
31
+ if (/import\s*\(/.test(full)) {
32
+ continue;
33
+ }
34
+ specifiers.add(specifier);
35
+ }
36
+ for (const match of cleaned.matchAll(SIDE_EFFECT_RE)) {
37
+ const full = match[0] ?? "";
38
+ const specifier = match[1];
39
+ if (!specifier) {
40
+ continue;
41
+ }
42
+ if (TYPE_IMPORT_RE.test(full)) {
43
+ continue;
44
+ }
45
+ specifiers.add(specifier);
46
+ }
47
+ return [...specifiers];
48
+ }
49
+ function readValueImports(filePath) {
50
+ const cached = fileImportCache.get(filePath);
51
+ if (cached) {
52
+ return cached;
53
+ }
54
+ let source = "";
55
+ try {
56
+ source = fs.readFileSync(filePath, "utf8");
57
+ }
58
+ catch {
59
+ fileImportCache.set(filePath, []);
60
+ return [];
61
+ }
62
+ const imports = collectValueImportSpecifiers(source);
63
+ fileImportCache.set(filePath, imports);
64
+ return imports;
65
+ }
66
+ function toGraphNode(resolved, options) {
67
+ const classification = classifyModule(resolved, options);
68
+ if (resolved.kind === "file") {
69
+ return { id: resolved.id, kind: "file", classification };
70
+ }
71
+ if (resolved.kind === "builtin") {
72
+ return { id: resolved.id, kind: "builtin", classification };
73
+ }
74
+ if (resolved.kind === "package") {
75
+ return {
76
+ id: resolved.id,
77
+ kind: "package",
78
+ packageName: resolved.packageName,
79
+ classification,
80
+ };
81
+ }
82
+ return { id: resolved.id, kind: "unresolved", classification };
83
+ }
84
+ export function walkImportGraph(entryFile, options = {}) {
85
+ const cacheKey = [
86
+ entryFile,
87
+ options.tsconfigPath ?? "",
88
+ (options.allowModules ?? []).join(","),
89
+ (options.denyModules ?? []).join(","),
90
+ (options.ignorePatterns ?? []).join(","),
91
+ (options.seedSpecifiers ?? []).join(","),
92
+ ].join("|");
93
+ const cached = graphCache.get(cacheKey);
94
+ if (cached) {
95
+ return cached;
96
+ }
97
+ const nodes = [];
98
+ const edges = [];
99
+ const chains = new Map();
100
+ const visited = new Set();
101
+ const queue = [];
102
+ chains.set(entryFile, [entryFile]);
103
+ queue.push({ file: entryFile, chain: [entryFile] });
104
+ visited.add(entryFile);
105
+ nodes.push(toGraphNode({ kind: "file", id: entryFile }, options));
106
+ const seed = options.seedSpecifiers;
107
+ let isFirst = true;
108
+ while (queue.length > 0) {
109
+ const current = queue.shift();
110
+ if (!current) {
111
+ break;
112
+ }
113
+ if (matchesIgnorePattern(current.file, options.ignorePatterns)) {
114
+ continue;
115
+ }
116
+ const specifiers = isFirst && seed
117
+ ? seed
118
+ : readValueImports(current.file);
119
+ isFirst = false;
120
+ for (const specifier of specifiers) {
121
+ const resolved = resolveModule(specifier, current.file, {
122
+ tsconfigPath: options.tsconfigPath,
123
+ });
124
+ edges.push({ from: current.file, specifier, resolved });
125
+ const node = toGraphNode(resolved, options);
126
+ const nodeKey = resolved.kind === "package"
127
+ ? `package:${resolved.packageName}`
128
+ : resolved.id;
129
+ if (!visited.has(nodeKey)) {
130
+ visited.add(nodeKey);
131
+ nodes.push(node);
132
+ const nextChain = [...current.chain, displayForResolved(resolved)];
133
+ chains.set(nodeKey, nextChain);
134
+ chains.set(resolved.id, nextChain);
135
+ if (resolved.kind === "file") {
136
+ queue.push({ file: resolved.id, chain: nextChain });
137
+ }
138
+ }
139
+ }
140
+ }
141
+ const result = { nodes, edges, chains };
142
+ graphCache.set(cacheKey, result);
143
+ return result;
144
+ }
145
+ function displayForResolved(resolved) {
146
+ if (resolved.kind === "builtin") {
147
+ return resolved.id.startsWith("node:") ? resolved.id : `node:${resolved.id}`;
148
+ }
149
+ if (resolved.kind === "package") {
150
+ return resolved.packageName;
151
+ }
152
+ return resolved.id;
153
+ }
154
+ export function findDeniedPaths(walk) {
155
+ const denied = [];
156
+ for (const node of walk.nodes) {
157
+ if (node.classification.kind !== "deny") {
158
+ continue;
159
+ }
160
+ const key = node.kind === "package" ? `package:${node.packageName}` : node.id;
161
+ const chain = walk.chains.get(key) ??
162
+ walk.chains.get(node.id) ??
163
+ walk.chains.get(node.classification.moduleId) ??
164
+ [node.classification.moduleId];
165
+ denied.push({ moduleId: node.classification.moduleId, chain });
166
+ }
167
+ return denied;
168
+ }
169
+ //# sourceMappingURL=import-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../../src/core/import-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ImportKind = "value" | "type" | "side-effect";
2
+ export declare function isTypeOnlyImport(importKind: string | undefined, importAttributes?: {
3
+ type?: boolean;
4
+ }): boolean;
5
+ export declare function classifyImportKind(options: {
6
+ importKind?: string;
7
+ isType?: boolean;
8
+ hasSpecifiers: boolean;
9
+ }): ImportKind;
10
+ //# sourceMappingURL=import-kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-kind.d.ts","sourceRoot":"","sources":["../../src/core/import-kind.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;AAE1D,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,OAAO,CAQT;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,UAAU,CAQb"}
@@ -0,0 +1,19 @@
1
+ export function isTypeOnlyImport(importKind, importAttributes) {
2
+ if (importKind === "type") {
3
+ return true;
4
+ }
5
+ if (importAttributes?.type) {
6
+ return true;
7
+ }
8
+ return false;
9
+ }
10
+ export function classifyImportKind(options) {
11
+ if (options.isType || options.importKind === "type") {
12
+ return "type";
13
+ }
14
+ if (!options.hasSpecifiers) {
15
+ return "side-effect";
16
+ }
17
+ return "value";
18
+ }
19
+ //# sourceMappingURL=import-kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-kind.js","sourceRoot":"","sources":["../../src/core/import-kind.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,UAA8B,EAC9B,gBAAqC;IAErC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAIlC;IACC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,26 @@
1
+ export type SharedOptions = {
2
+ allowModules?: string[];
3
+ denyModules?: string[];
4
+ ignorePatterns?: string[];
5
+ tsconfigPath?: string;
6
+ allowImportChains?: string[][];
7
+ };
8
+ export type MaxGraphBytesOptions = SharedOptions & {
9
+ max?: number;
10
+ includeNodeModules?: boolean;
11
+ packageWeights?: Record<string, number>;
12
+ };
13
+ export type NoBarrelsOptions = SharedOptions & {
14
+ barrelPatterns?: string[];
15
+ forbidNamespaceImports?: boolean;
16
+ };
17
+ export declare function assertStringArray(value: unknown, field: string): asserts value is string[] | undefined;
18
+ export declare function assertNumber(value: unknown, field: string): asserts value is number | undefined;
19
+ export declare function assertBoolean(value: unknown, field: string): asserts value is boolean | undefined;
20
+ export declare function assertRecordOfNumbers(value: unknown, field: string): asserts value is Record<string, number> | undefined;
21
+ export declare function parseSharedOptions(raw: unknown): SharedOptions;
22
+ export declare function parseMaxGraphBytesOptions(raw: unknown): MaxGraphBytesOptions;
23
+ export declare function parseNoBarrelsOptions(raw: unknown): NoBarrelsOptions;
24
+ export declare function matchesAllowOrDeny(specifier: string, patterns: string[] | undefined): boolean;
25
+ export declare function matchesIgnorePattern(filePath: string, patterns: string[] | undefined): boolean;
26
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/core/options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,IAAI,MAAM,EAAE,GAAG,SAAS,CAOvC;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,IAAI,MAAM,GAAG,SAAS,CAOrC;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,IAAI,OAAO,GAAG,SAAS,CAOtC;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAYrD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAwC9D;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAY5E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAUpE;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAC7B,OAAO,CAUT;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAC7B,OAAO,CAkBT"}
@@ -0,0 +1,116 @@
1
+ export function assertStringArray(value, field) {
2
+ if (value === undefined) {
3
+ return;
4
+ }
5
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
6
+ throw new Error(`Invalid option "${field}": expected string[].`);
7
+ }
8
+ }
9
+ export function assertNumber(value, field) {
10
+ if (value === undefined) {
11
+ return;
12
+ }
13
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
14
+ throw new Error(`Invalid option "${field}": expected a non-negative number.`);
15
+ }
16
+ }
17
+ export function assertBoolean(value, field) {
18
+ if (value === undefined) {
19
+ return;
20
+ }
21
+ if (typeof value !== "boolean") {
22
+ throw new Error(`Invalid option "${field}": expected boolean.`);
23
+ }
24
+ }
25
+ export function assertRecordOfNumbers(value, field) {
26
+ if (value === undefined) {
27
+ return;
28
+ }
29
+ if (typeof value !== "object" ||
30
+ value === null ||
31
+ Array.isArray(value) ||
32
+ Object.values(value).some((item) => typeof item !== "number")) {
33
+ throw new Error(`Invalid option "${field}": expected Record<string, number>.`);
34
+ }
35
+ }
36
+ export function parseSharedOptions(raw) {
37
+ if (raw === undefined || raw === null) {
38
+ return {};
39
+ }
40
+ if (typeof raw !== "object" || Array.isArray(raw)) {
41
+ throw new Error("Rule options must be an object.");
42
+ }
43
+ const options = raw;
44
+ assertStringArray(options.allowModules, "allowModules");
45
+ assertStringArray(options.denyModules, "denyModules");
46
+ assertStringArray(options.ignorePatterns, "ignorePatterns");
47
+ if (options.tsconfigPath !== undefined &&
48
+ typeof options.tsconfigPath !== "string") {
49
+ throw new Error('Invalid option "tsconfigPath": expected string.');
50
+ }
51
+ if (options.allowImportChains !== undefined) {
52
+ if (!Array.isArray(options.allowImportChains) ||
53
+ options.allowImportChains.some((chain) => !Array.isArray(chain) || chain.some((item) => typeof item !== "string"))) {
54
+ throw new Error('Invalid option "allowImportChains": expected string[][].');
55
+ }
56
+ }
57
+ return {
58
+ allowModules: options.allowModules,
59
+ denyModules: options.denyModules,
60
+ ignorePatterns: options.ignorePatterns,
61
+ tsconfigPath: typeof options.tsconfigPath === "string"
62
+ ? options.tsconfigPath
63
+ : undefined,
64
+ allowImportChains: options.allowImportChains,
65
+ };
66
+ }
67
+ export function parseMaxGraphBytesOptions(raw) {
68
+ const shared = parseSharedOptions(raw);
69
+ const options = (raw ?? {});
70
+ assertNumber(options.max, "max");
71
+ assertBoolean(options.includeNodeModules, "includeNodeModules");
72
+ assertRecordOfNumbers(options.packageWeights, "packageWeights");
73
+ return {
74
+ ...shared,
75
+ max: options.max,
76
+ includeNodeModules: options.includeNodeModules,
77
+ packageWeights: options.packageWeights,
78
+ };
79
+ }
80
+ export function parseNoBarrelsOptions(raw) {
81
+ const shared = parseSharedOptions(raw);
82
+ const options = (raw ?? {});
83
+ assertStringArray(options.barrelPatterns, "barrelPatterns");
84
+ assertBoolean(options.forbidNamespaceImports, "forbidNamespaceImports");
85
+ return {
86
+ ...shared,
87
+ barrelPatterns: options.barrelPatterns,
88
+ forbidNamespaceImports: options.forbidNamespaceImports,
89
+ };
90
+ }
91
+ export function matchesAllowOrDeny(specifier, patterns) {
92
+ if (!patterns || patterns.length === 0) {
93
+ return false;
94
+ }
95
+ return patterns.some((pattern) => specifier === pattern ||
96
+ specifier.startsWith(`${pattern}/`) ||
97
+ specifier.startsWith(`${pattern}:`));
98
+ }
99
+ export function matchesIgnorePattern(filePath, patterns) {
100
+ if (!patterns || patterns.length === 0) {
101
+ return false;
102
+ }
103
+ const normalized = filePath.replaceAll("\\", "/");
104
+ return patterns.some((pattern) => {
105
+ const needle = pattern.replaceAll("\\", "/");
106
+ if (needle.includes("*")) {
107
+ const regex = new RegExp(`^${needle
108
+ .replaceAll(".", "\\.")
109
+ .replaceAll("**/", "(.*/)?")
110
+ .replaceAll("*", "[^/]*")}$`);
111
+ return regex.test(normalized) || regex.test(normalized.split("/").pop() ?? "");
112
+ }
113
+ return normalized.includes(needle) || normalized.endsWith(needle);
114
+ });
115
+ }
116
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/core/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type TsPathsConfig = {
2
+ baseUrl?: string;
3
+ paths?: Record<string, string[]>;
4
+ configDir: string;
5
+ };
6
+ export type ResolveResult = {
7
+ kind: "builtin";
8
+ id: string;
9
+ } | {
10
+ kind: "package";
11
+ id: string;
12
+ packageName: string;
13
+ } | {
14
+ kind: "file";
15
+ id: string;
16
+ } | {
17
+ kind: "unresolved";
18
+ id: string;
19
+ };
20
+ export declare function clearResolveCaches(): void;
21
+ export declare function resolveModule(specifier: string, fromFile: string, options?: {
22
+ tsconfigPath?: string;
23
+ }): ResolveResult;
24
+ //# sourceMappingURL=resolve-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-module.d.ts","sourceRoot":"","sources":["../../src/core/resolve-module.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAkOvC,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACtC,aAAa,CAsCf"}
@@ -0,0 +1,232 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isBuiltin } from "node:module";
4
+ import { SOURCE_EXTENSIONS } from "./constants.js";
5
+ const tsconfigCache = new Map();
6
+ const resolveCache = new Map();
7
+ function fileExists(filePath) {
8
+ try {
9
+ return fs.statSync(filePath).isFile();
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function tryExtensions(basePath) {
16
+ if (fileExists(basePath)) {
17
+ return basePath;
18
+ }
19
+ for (const ext of SOURCE_EXTENSIONS) {
20
+ const withExt = `${basePath}${ext}`;
21
+ if (fileExists(withExt)) {
22
+ return withExt;
23
+ }
24
+ }
25
+ for (const ext of SOURCE_EXTENSIONS) {
26
+ const indexPath = path.join(basePath, `index${ext}`);
27
+ if (fileExists(indexPath)) {
28
+ return indexPath;
29
+ }
30
+ }
31
+ return null;
32
+ }
33
+ function readJson(filePath) {
34
+ try {
35
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function stripJsonComments(text) {
42
+ return text
43
+ .replace(/\/\*[\s\S]*?\*\//g, "")
44
+ .replace(/^\s*\/\/.*$/gm, "");
45
+ }
46
+ function loadTsConfig(startDir, overridePath) {
47
+ if (overridePath) {
48
+ const absolute = path.isAbsolute(overridePath)
49
+ ? overridePath
50
+ : path.resolve(startDir, overridePath);
51
+ const cached = tsconfigCache.get(absolute);
52
+ if (cached !== undefined) {
53
+ return cached;
54
+ }
55
+ const parsed = parseTsConfigFile(absolute);
56
+ tsconfigCache.set(absolute, parsed);
57
+ return parsed;
58
+ }
59
+ let dir = startDir;
60
+ for (;;) {
61
+ const cached = tsconfigCache.get(dir);
62
+ if (cached !== undefined) {
63
+ return cached;
64
+ }
65
+ for (const name of ["tsconfig.json", "jsconfig.json"]) {
66
+ const candidate = path.join(dir, name);
67
+ if (fileExists(candidate)) {
68
+ const parsed = parseTsConfigFile(candidate);
69
+ tsconfigCache.set(dir, parsed);
70
+ return parsed;
71
+ }
72
+ }
73
+ tsconfigCache.set(dir, null);
74
+ const parent = path.dirname(dir);
75
+ if (parent === dir) {
76
+ return null;
77
+ }
78
+ dir = parent;
79
+ }
80
+ }
81
+ function parseTsConfigFile(configPath) {
82
+ const rawText = fs.readFileSync(configPath, "utf8");
83
+ let data;
84
+ try {
85
+ data = JSON.parse(stripJsonComments(rawText));
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ if (!data || typeof data !== "object") {
91
+ return null;
92
+ }
93
+ const compilerOptions = data.compilerOptions;
94
+ if (!compilerOptions || typeof compilerOptions !== "object") {
95
+ return {
96
+ configDir: path.dirname(configPath),
97
+ };
98
+ }
99
+ const opts = compilerOptions;
100
+ const paths = opts.paths && typeof opts.paths === "object" && !Array.isArray(opts.paths)
101
+ ? opts.paths
102
+ : undefined;
103
+ return {
104
+ configDir: path.dirname(configPath),
105
+ baseUrl: typeof opts.baseUrl === "string" ? opts.baseUrl : undefined,
106
+ paths,
107
+ };
108
+ }
109
+ function matchTsPath(specifier, config) {
110
+ if (!config.paths) {
111
+ if (config.baseUrl) {
112
+ const base = path.resolve(config.configDir, config.baseUrl);
113
+ return tryExtensions(path.join(base, specifier));
114
+ }
115
+ return null;
116
+ }
117
+ for (const [pattern, targets] of Object.entries(config.paths)) {
118
+ if (pattern.includes("*")) {
119
+ const [prefix, suffix] = pattern.split("*");
120
+ if (specifier.startsWith(prefix) &&
121
+ (suffix === undefined || specifier.endsWith(suffix))) {
122
+ const star = specifier.slice(prefix.length, suffix ? specifier.length - suffix.length : undefined);
123
+ for (const target of targets) {
124
+ const mapped = target.replace("*", star);
125
+ const absolute = path.resolve(config.configDir, config.baseUrl ?? ".", mapped);
126
+ const resolved = tryExtensions(absolute);
127
+ if (resolved) {
128
+ return resolved;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ else if (specifier === pattern) {
134
+ for (const target of targets) {
135
+ const absolute = path.resolve(config.configDir, config.baseUrl ?? ".", target);
136
+ const resolved = tryExtensions(absolute);
137
+ if (resolved) {
138
+ return resolved;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ if (config.baseUrl) {
144
+ const absolute = path.resolve(config.configDir, config.baseUrl, specifier);
145
+ return tryExtensions(absolute);
146
+ }
147
+ return null;
148
+ }
149
+ function packageNameFromSpecifier(specifier) {
150
+ if (specifier.startsWith("@")) {
151
+ const parts = specifier.split("/");
152
+ return parts.slice(0, 2).join("/");
153
+ }
154
+ return specifier.split("/")[0] ?? specifier;
155
+ }
156
+ function resolvePackageEntry(fromFile, packageName) {
157
+ let dir = path.dirname(fromFile);
158
+ for (;;) {
159
+ const pkgRoot = path.join(dir, "node_modules", packageName);
160
+ const pkgJsonPath = path.join(pkgRoot, "package.json");
161
+ if (fileExists(pkgJsonPath)) {
162
+ const pkg = readJson(pkgJsonPath);
163
+ if (!pkg) {
164
+ return pkgRoot;
165
+ }
166
+ if (typeof pkg.exports === "string") {
167
+ const resolved = tryExtensions(path.join(pkgRoot, pkg.exports));
168
+ if (resolved) {
169
+ return resolved;
170
+ }
171
+ }
172
+ for (const field of [pkg.module, pkg.main]) {
173
+ if (typeof field === "string") {
174
+ const resolved = tryExtensions(path.join(pkgRoot, field));
175
+ if (resolved) {
176
+ return resolved;
177
+ }
178
+ }
179
+ }
180
+ return tryExtensions(pkgRoot) ?? pkgRoot;
181
+ }
182
+ const parent = path.dirname(dir);
183
+ if (parent === dir) {
184
+ return null;
185
+ }
186
+ dir = parent;
187
+ }
188
+ }
189
+ export function clearResolveCaches() {
190
+ tsconfigCache.clear();
191
+ resolveCache.clear();
192
+ }
193
+ export function resolveModule(specifier, fromFile, options = {}) {
194
+ const cacheKey = `${fromFile}::${specifier}::${options.tsconfigPath ?? ""}`;
195
+ const cached = resolveCache.get(cacheKey);
196
+ if (cached) {
197
+ return cached;
198
+ }
199
+ let result;
200
+ if (specifier.startsWith("node:") || isBuiltin(specifier)) {
201
+ const id = specifier.startsWith("node:")
202
+ ? specifier
203
+ : `node:${specifier}`;
204
+ result = { kind: "builtin", id };
205
+ }
206
+ else if (specifier.startsWith(".") || specifier.startsWith("/")) {
207
+ const base = path.resolve(path.dirname(fromFile), specifier);
208
+ const file = tryExtensions(base);
209
+ result = file
210
+ ? { kind: "file", id: file }
211
+ : { kind: "unresolved", id: specifier };
212
+ }
213
+ else {
214
+ const tsconfig = loadTsConfig(path.dirname(fromFile), options.tsconfigPath);
215
+ const aliased = tsconfig ? matchTsPath(specifier, tsconfig) : null;
216
+ if (aliased) {
217
+ result = { kind: "file", id: aliased };
218
+ }
219
+ else {
220
+ const packageName = packageNameFromSpecifier(specifier);
221
+ const entry = resolvePackageEntry(fromFile, packageName);
222
+ result = {
223
+ kind: "package",
224
+ id: entry ?? specifier,
225
+ packageName,
226
+ };
227
+ }
228
+ }
229
+ resolveCache.set(cacheKey, result);
230
+ return result;
231
+ }
232
+ //# sourceMappingURL=resolve-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-module.js","sourceRoot":"","sources":["../../src/core/resolve-module.ts"],"names":[],"mappings":"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"}