@component-compass/cli 0.1.7 → 0.1.9
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.
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/parse.js +1 -0
- package/dist/cli/parse.js.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/scan.d.ts +7 -0
- package/dist/commands/scan.js +112 -42
- package/dist/commands/scan.js.map +1 -1
- package/dist/identity.d.ts +9 -1
- package/dist/identity.js +5 -3
- package/dist/identity.js.map +1 -1
- package/dist/manifest/lazy-resolver.d.ts +10 -0
- package/dist/manifest/lazy-resolver.js +62 -11
- package/dist/manifest/lazy-resolver.js.map +1 -1
- package/dist/seeds.js +3 -0
- package/dist/seeds.js.map +1 -1
- package/dist/util/git.d.ts +1 -0
- package/dist/util/git.js +9 -0
- package/dist/util/git.js.map +1 -1
- package/dist/walker/bounded-definition-resolver.d.ts +9 -0
- package/dist/walker/bounded-definition-resolver.js +125 -0
- package/dist/walker/bounded-definition-resolver.js.map +1 -0
- package/dist/walker/package-alias-layers.d.ts +7 -0
- package/dist/walker/package-alias-layers.js +40 -0
- package/dist/walker/package-alias-layers.js.map +1 -0
- package/dist/walker/resolve-import.d.ts +4 -0
- package/dist/walker/resolve-import.js +32 -9
- package/dist/walker/resolve-import.js.map +1 -1
- package/dist/walker/tsconfig-discovery.d.ts +4 -2
- package/dist/walker/tsconfig-discovery.js +4 -2
- package/dist/walker/tsconfig-discovery.js.map +1 -1
- package/dist/walker/workspace-exports.js +103 -39
- package/dist/walker/workspace-exports.js.map +1 -1
- package/dist/workspace/build-graph.d.ts +14 -1
- package/dist/workspace/build-graph.js +4 -1
- package/dist/workspace/build-graph.js.map +1 -1
- package/dist/workspace/find-workspace-root.d.ts +1 -0
- package/dist/workspace/find-workspace-root.js +60 -0
- package/dist/workspace/find-workspace-root.js.map +1 -0
- package/dist/workspace/types.d.ts +3 -1
- package/package.json +8 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { statSync } from "node:fs";
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { dirname, isAbsolute, resolve as pathResolve } from "node:path";
|
|
4
4
|
import { loadTsconfigChain, compileAliasPattern } from "./tsconfig-loader.js";
|
|
@@ -8,9 +8,11 @@ import { buildWorkspaceExportEntries } from "./workspace-exports.js";
|
|
|
8
8
|
*
|
|
9
9
|
* Resolution order (first hit wins):
|
|
10
10
|
* 1. Config `aliases` (explicit user-supplied alias map).
|
|
11
|
-
* 2.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* 2. The owning workspace package's own tsconfig `paths` layer (when
|
|
12
|
+
* `packageAliasLayers` provided and `from` sits inside a member).
|
|
13
|
+
* 3. `compilerOptions.paths` from the tsconfig at `tsconfigPath`.
|
|
14
|
+
* 4. `package.json#exports` from each workspace package (when `workspaceGraph` provided).
|
|
15
|
+
* 5. Node module resolution via `require.resolve`.
|
|
14
16
|
*
|
|
15
17
|
* Returns the absolute path of the resolved file, or `null` if no layer
|
|
16
18
|
* matches. See spec §3.5.
|
|
@@ -31,6 +33,28 @@ export function createImportResolver(opts) {
|
|
|
31
33
|
const workspaceExportEntries = opts.workspaceGraph
|
|
32
34
|
? buildWorkspaceExportEntries(opts.workspaceGraph)
|
|
33
35
|
: [];
|
|
36
|
+
const pkgLayers = opts.packageAliasLayers ?? [];
|
|
37
|
+
const fromDirRealCache = new Map();
|
|
38
|
+
const ownerEntriesFor = (fromDir) => {
|
|
39
|
+
if (pkgLayers.length === 0)
|
|
40
|
+
return [];
|
|
41
|
+
let real = fromDirRealCache.get(fromDir);
|
|
42
|
+
if (real === undefined) {
|
|
43
|
+
try {
|
|
44
|
+
real = realpathSync(fromDir);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
real = fromDir;
|
|
48
|
+
}
|
|
49
|
+
fromDirRealCache.set(fromDir, real);
|
|
50
|
+
}
|
|
51
|
+
for (const layer of pkgLayers) {
|
|
52
|
+
const withSep = layer.pkgRealPath.endsWith("/") ? layer.pkgRealPath : `${layer.pkgRealPath}/`;
|
|
53
|
+
if (real === layer.pkgRealPath || real.startsWith(withSep))
|
|
54
|
+
return layer.entries;
|
|
55
|
+
}
|
|
56
|
+
return [];
|
|
57
|
+
};
|
|
34
58
|
// Reused for `require.resolve` fallback. Anchoring at <repoRoot>/_ ensures
|
|
35
59
|
// Node walks up through <repoRoot>/node_modules and parents.
|
|
36
60
|
const requireFromRepo = createRequire(pathResolve(opts.repoRoot, "_"));
|
|
@@ -50,7 +74,7 @@ export function createImportResolver(opts) {
|
|
|
50
74
|
return result;
|
|
51
75
|
};
|
|
52
76
|
function resolveUncached(fromDir, spec) {
|
|
53
|
-
for (const layers of [configEntries, tsconfigEntries, workspaceExportEntries]) {
|
|
77
|
+
for (const layers of [configEntries, ownerEntriesFor(fromDir), tsconfigEntries, workspaceExportEntries]) {
|
|
54
78
|
for (const entry of layers) {
|
|
55
79
|
const m = entry.pattern.exec(spec);
|
|
56
80
|
if (!m)
|
|
@@ -67,8 +91,8 @@ export function createImportResolver(opts) {
|
|
|
67
91
|
// Plain relative/bare resolution via Node. require.resolve doesn't try
|
|
68
92
|
// TS/JSX/Vue extensions by default, so probe them on first failure —
|
|
69
93
|
// mirrors the alias-branch tryFileWithExtensions behaviour and preserves
|
|
70
|
-
// the extensionless-relative-TS-import contract
|
|
71
|
-
//
|
|
94
|
+
// the extensionless-relative-TS-import contract this resolver must honour
|
|
95
|
+
// for its consumers.
|
|
72
96
|
try {
|
|
73
97
|
return requireFromRepo.resolve(spec, { paths: [fromDir, opts.repoRoot] });
|
|
74
98
|
}
|
|
@@ -84,8 +108,7 @@ export function createImportResolver(opts) {
|
|
|
84
108
|
// Directory-with-index fallback: Node only auto-resolves `index.js`/`.json`/`.node`.
|
|
85
109
|
// Consumer codebases use `index.jsx`/`.tsx`/`.vue`/`.ts` too; probe them explicitly so
|
|
86
110
|
// `import "./modal"` resolves when `modal/index.jsx` exists. Without this, the structural
|
|
87
|
-
// lazy-import detector
|
|
88
|
-
// target that does exist on disk.
|
|
111
|
+
// lazy-import detector reports unresolved on a target that does exist on disk.
|
|
89
112
|
for (const ext of FILE_EXTENSIONS) {
|
|
90
113
|
try {
|
|
91
114
|
return requireFromRepo.resolve(`${spec}/index${ext}`, { paths: [fromDir, opts.repoRoot] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-import.js","sourceRoot":"","sources":["../../src/walker/resolve-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-import.js","sourceRoot":"","sources":["../../src/walker/resolve-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,9 @@ export type TsconfigDiscoveryInput = {
|
|
|
28
28
|
* handles `extends` from there. Deliberately does NOT walk up from configDir
|
|
29
29
|
* or repoRoot.
|
|
30
30
|
*
|
|
31
|
-
* Per-package tsconfigs in monorepos
|
|
32
|
-
*
|
|
31
|
+
* Per-package tsconfigs in monorepos are handled separately by
|
|
32
|
+
* `buildPackageAliasLayers` (walker/package-alias-layers.ts), which calls
|
|
33
|
+
* this function once per workspace member with configDir = repoRoot = the
|
|
34
|
+
* member's own directory.
|
|
33
35
|
*/
|
|
34
36
|
export declare function resolveTsconfigPath(input: TsconfigDiscoveryInput): string | null;
|
|
@@ -17,8 +17,10 @@ import { isAbsolute, resolve, join } from "node:path";
|
|
|
17
17
|
* handles `extends` from there. Deliberately does NOT walk up from configDir
|
|
18
18
|
* or repoRoot.
|
|
19
19
|
*
|
|
20
|
-
* Per-package tsconfigs in monorepos
|
|
21
|
-
*
|
|
20
|
+
* Per-package tsconfigs in monorepos are handled separately by
|
|
21
|
+
* `buildPackageAliasLayers` (walker/package-alias-layers.ts), which calls
|
|
22
|
+
* this function once per workspace member with configDir = repoRoot = the
|
|
23
|
+
* member's own directory.
|
|
22
24
|
*/
|
|
23
25
|
export function resolveTsconfigPath(input) {
|
|
24
26
|
if (input.tsconfigPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig-discovery.js","sourceRoot":"","sources":["../../src/walker/tsconfig-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBtD
|
|
1
|
+
{"version":3,"file":"tsconfig-discovery.js","sourceRoot":"","sources":["../../src/walker/tsconfig-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA6B;IAC/D,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC;YACnC,CAAC,CAAC,KAAK,CAAC,YAAY;YACpB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IACD,wEAAwE;IACxE,uEAAuE;IACvE,2EAA2E;IAC3E,sEAAsE;IACtE,wEAAwE;IACxE,qCAAqC;IACrC,MAAM,UAAU,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,UAAU,CAAC,kBAAkB,CAAC;YAAE,OAAO,kBAAkB,CAAC;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC1D,IAAI,UAAU,CAAC,iBAAiB,CAAC;gBAAE,OAAO,iBAAiB,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,54 +1,118 @@
|
|
|
1
1
|
import { compileAliasPattern } from "./tsconfig-loader.js";
|
|
2
|
-
//
|
|
3
|
-
//
|
|
2
|
+
// The workspace-member name→source resolution seam. For every member, emit
|
|
3
|
+
// resolver entries so any import of the member's name resolves to its source
|
|
4
|
+
// on disk — independent of install state (no symlink needed) and winning over
|
|
5
|
+
// a version-pinned published copy in node_modules (this layer precedes Node
|
|
6
|
+
// resolution). Per member, in precedence order:
|
|
4
7
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
+
// 1. Declared `exports` subpaths (existing behaviour):
|
|
9
|
+
// - Constant: "./types" -> "./types.ts" matches <pkgName>/types exactly.
|
|
10
|
+
// - Pattern: "./icons/<star>" -> "./icons/<star>.tsx".
|
|
11
|
+
// Skipped shapes (follow-ups if a real consumer hits them): conditional
|
|
12
|
+
// objects, null targets, multi-wildcard targets, non-subpath keys.
|
|
13
|
+
// Note: a `null` (deny) subpath is deliberately overridden by the
|
|
14
|
+
// wildcard source probe below — this seam attributes usage to source;
|
|
15
|
+
// it does not enforce publish-time encapsulation.
|
|
16
|
+
// 2. One bare-name entry: <pkgName> -> [exports["."], module, main, ".", "./src"].
|
|
17
|
+
// The "." / "./src" directory targets rely on tryFileWithExtensions'
|
|
18
|
+
// index probing. Conditional exports["."] contributes its first string
|
|
19
|
+
// among import/module/default (one level deep).
|
|
20
|
+
// 3. One wildcard fallback: <pkgName>/<star> -> ./<star> (source-tree probe).
|
|
8
21
|
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// - Non-subpath keys (the "." self-reference, "#imports", conditional roots)
|
|
14
|
-
// - Bare-string exports (sugar for the "." main-entry case)
|
|
15
|
-
//
|
|
16
|
-
// Within a package, entries sort by static-prefix length descending so more-
|
|
17
|
-
// specific subpaths (e.g. "./icons/special") beat patterns (e.g. "./icons/<star>")
|
|
18
|
-
// for the same spec — matches the Node.js exports-map specificity rule.
|
|
22
|
+
// Within a package, subpath entries sort by static-prefix length descending so
|
|
23
|
+
// more-specific subpaths beat patterns — matches Node's exports specificity
|
|
24
|
+
// rule; the bare-name and wildcard entries follow, so declared exports always
|
|
25
|
+
// win when their targets exist on disk.
|
|
19
26
|
export function buildWorkspaceExportEntries(graph) {
|
|
20
27
|
const out = [];
|
|
21
28
|
for (const pkg of graph.packages) {
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
out.push(...subpathExportEntries(pkg));
|
|
30
|
+
out.push(bareNameEntry(pkg));
|
|
31
|
+
out.push({
|
|
32
|
+
pattern: wildcardPattern(pkg.name),
|
|
33
|
+
targets: ["./*"],
|
|
34
|
+
base: pkg.absolutePath,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function subpathExportEntries(pkg) {
|
|
40
|
+
const exports = pkg.packageJson.exports;
|
|
41
|
+
if (exports === null || exports === undefined)
|
|
42
|
+
return [];
|
|
43
|
+
if (typeof exports !== "object")
|
|
44
|
+
return [];
|
|
45
|
+
if (Array.isArray(exports))
|
|
46
|
+
return [];
|
|
47
|
+
const out = [];
|
|
48
|
+
const subpaths = Object.entries(exports)
|
|
49
|
+
.filter(([key]) => key.startsWith("./") && key !== "./")
|
|
50
|
+
.sort(([a], [b]) => staticPrefixLength(b) - staticPrefixLength(a));
|
|
51
|
+
for (const [subpath, target] of subpaths) {
|
|
52
|
+
if (target === null)
|
|
24
53
|
continue;
|
|
25
|
-
if (typeof
|
|
54
|
+
if (typeof target !== "string")
|
|
26
55
|
continue;
|
|
27
|
-
if (
|
|
56
|
+
if (target.includes("**"))
|
|
28
57
|
continue;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
continue;
|
|
39
|
-
if (target.split("*").length > 2)
|
|
40
|
-
continue;
|
|
41
|
-
// "./icons/*" + "@example/icons" → "@example/icons/icons/*"
|
|
42
|
-
const fullPattern = `${pkg.name}${subpath.slice(1)}`;
|
|
43
|
-
out.push({
|
|
44
|
-
pattern: compileAliasPattern(fullPattern),
|
|
45
|
-
targets: [target],
|
|
46
|
-
base: pkg.absolutePath,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
58
|
+
if (target.split("*").length > 2)
|
|
59
|
+
continue;
|
|
60
|
+
// "./icons/*" + "@example/icons" → "@example/icons/icons/*"
|
|
61
|
+
const fullPattern = `${pkg.name}${subpath.slice(1)}`;
|
|
62
|
+
out.push({
|
|
63
|
+
pattern: compileAliasPattern(fullPattern),
|
|
64
|
+
targets: [target],
|
|
65
|
+
base: pkg.absolutePath,
|
|
66
|
+
});
|
|
49
67
|
}
|
|
50
68
|
return out;
|
|
51
69
|
}
|
|
70
|
+
function bareNameEntry(pkg) {
|
|
71
|
+
const targets = [];
|
|
72
|
+
const dot = dotExportTarget(pkg.packageJson.exports);
|
|
73
|
+
if (dot !== null)
|
|
74
|
+
targets.push(dot);
|
|
75
|
+
if (typeof pkg.packageJson.module === "string")
|
|
76
|
+
targets.push(pkg.packageJson.module);
|
|
77
|
+
if (typeof pkg.packageJson.main === "string")
|
|
78
|
+
targets.push(pkg.packageJson.main);
|
|
79
|
+
targets.push(".", "./src");
|
|
80
|
+
return {
|
|
81
|
+
pattern: compileAliasPattern(pkg.name),
|
|
82
|
+
targets,
|
|
83
|
+
base: pkg.absolutePath,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// `<pkgName>/*` with `..` path segments rejected, so the source-tree probe
|
|
87
|
+
// cannot expand outside the member directory (`@ws/ui/../secret` falls through
|
|
88
|
+
// to Node resolution instead). `..` inside a segment name (`a..b`) stays legal.
|
|
89
|
+
// Reuses compileAliasPattern for the name's regex escaping; the name itself
|
|
90
|
+
// contains no `*`, so the compiled source is the escaped literal.
|
|
91
|
+
function wildcardPattern(pkgName) {
|
|
92
|
+
const escapedName = compileAliasPattern(pkgName).source.slice(1, -1);
|
|
93
|
+
return new RegExp(`^${escapedName}/((?!\\.\\.(?:/|$))(?:(?!/\\.\\.(?:/|$)).)*)$`);
|
|
94
|
+
}
|
|
95
|
+
// exports["."] as an entry-point target: string form, the bare-string sugar,
|
|
96
|
+
// or (one level deep) the first string among import/module/default in a
|
|
97
|
+
// conditional object. Anything else → null (bare-name entry falls through to
|
|
98
|
+
// module/main/directory probes).
|
|
99
|
+
function dotExportTarget(exports) {
|
|
100
|
+
if (typeof exports === "string")
|
|
101
|
+
return exports;
|
|
102
|
+
if (exports === null || typeof exports !== "object" || Array.isArray(exports))
|
|
103
|
+
return null;
|
|
104
|
+
const dot = exports["."];
|
|
105
|
+
if (typeof dot === "string")
|
|
106
|
+
return dot;
|
|
107
|
+
if (dot !== null && typeof dot === "object" && !Array.isArray(dot)) {
|
|
108
|
+
for (const key of ["import", "module", "default"]) {
|
|
109
|
+
const value = dot[key];
|
|
110
|
+
if (typeof value === "string")
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
52
116
|
function staticPrefixLength(subpath) {
|
|
53
117
|
const starIdx = subpath.indexOf("*");
|
|
54
118
|
return starIdx === -1 ? subpath.length : starIdx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-exports.js","sourceRoot":"","sources":["../../src/walker/workspace-exports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,+EAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"workspace-exports.js","sourceRoot":"","sources":["../../src/walker/workspace-exports.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
import type { WorkspaceGraph } from "./types.js";
|
|
1
|
+
import type { WorkspaceGraph, WorkspacePackage } from "./types.js";
|
|
2
2
|
export declare function buildWorkspaceGraph(rootPath: string): WorkspaceGraph;
|
|
3
|
+
/**
|
|
4
|
+
* Loosened input for `detectWorkspacePackages`: only the `workspaces` field
|
|
5
|
+
* is typed, plus an index signature so callers can pass any freshly-parsed,
|
|
6
|
+
* unvalidated `package.json` (e.g. `findWorkspaceRoot` walking arbitrary
|
|
7
|
+
* ancestor directories) without casting at the call site.
|
|
8
|
+
*/
|
|
9
|
+
export type DetectWorkspacePackagesInput = Record<string, unknown> & {
|
|
10
|
+
workspaces?: WorkspacePackage["packageJson"]["workspaces"];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* pnpm-workspace.yaml → package.json#workspaces → empty array.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectWorkspacePackages(absRoot: string, rootPkg: DetectWorkspacePackagesInput): WorkspacePackage[];
|
|
@@ -35,7 +35,10 @@ function sniffPackageManager(absRoot) {
|
|
|
35
35
|
return "yarn";
|
|
36
36
|
return "unknown";
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
/**
|
|
39
|
+
* pnpm-workspace.yaml → package.json#workspaces → empty array.
|
|
40
|
+
*/
|
|
41
|
+
export function detectWorkspacePackages(absRoot, rootPkg) {
|
|
39
42
|
// pnpm-workspace.yaml wins when both configs present.
|
|
40
43
|
const pnpmYamlPath = join(absRoot, "pnpm-workspace.yaml");
|
|
41
44
|
if (existsSync(pnpmYamlPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-graph.js","sourceRoot":"","sources":["../../src/workspace/build-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAGhC,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IAEhE,OAAO;QACL,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC;QAC5C,QAAQ,EAAE,OAAO;QACjB,eAAe;QACf,QAAQ,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,SAAS,CAAC;AACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-graph.js","sourceRoot":"","sources":["../../src/workspace/build-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function findWorkspaceRoot(scanRoot: string, stopAt?: string): string | null;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk up from scanRoot to the nearest ancestor that declares workspaces
|
|
3
|
+
* (pnpm-workspace.yaml or package.json#workspaces) AND whose expanded member
|
|
4
|
+
* globs include scanRoot. Spec Piece 1: ownership/resolution anchor at the
|
|
5
|
+
* true workspace root, independent of where the scan is pointed.
|
|
6
|
+
*
|
|
7
|
+
* The walk starts at dirname(scanRoot): a scanRoot that is itself a workspace
|
|
8
|
+
* root needs no promotion (caller falls back to scanRoot).
|
|
9
|
+
* Bounded by stopAt (inclusive; typically the git toplevel) and the fs root.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { detectWorkspacePackages } from "./build-graph.js";
|
|
14
|
+
export function findWorkspaceRoot(scanRoot, stopAt) {
|
|
15
|
+
const absScan = safeRealpath(resolve(scanRoot));
|
|
16
|
+
const stop = stopAt ? safeRealpath(resolve(stopAt)) : null;
|
|
17
|
+
let dir = dirname(absScan);
|
|
18
|
+
// stopAt below scanRoot's parent → nothing to walk.
|
|
19
|
+
for (;;) {
|
|
20
|
+
if (stop && !isPathPrefix(stop, dir))
|
|
21
|
+
return null;
|
|
22
|
+
const pkgJsonPath = join(dir, "package.json");
|
|
23
|
+
const hasPnpmYaml = existsSync(join(dir, "pnpm-workspace.yaml"));
|
|
24
|
+
if (hasPnpmYaml || existsSync(pkgJsonPath)) {
|
|
25
|
+
const rootPkg = readJsonSafely(pkgJsonPath) ?? {};
|
|
26
|
+
const members = detectWorkspacePackages(dir, rootPkg);
|
|
27
|
+
if (members.some((m) => safeRealpath(m.absolutePath) === absScan))
|
|
28
|
+
return dir;
|
|
29
|
+
}
|
|
30
|
+
const parent = dirname(dir);
|
|
31
|
+
if (parent === dir)
|
|
32
|
+
return null;
|
|
33
|
+
dir = parent;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function readJsonSafely(p) {
|
|
37
|
+
try {
|
|
38
|
+
// JSON.parse returns `any`, which assigns to DetectWorkspacePackagesInput
|
|
39
|
+
// without a cast — matches build-graph.ts's own local readJsonSafely.
|
|
40
|
+
return JSON.parse(readFileSync(p, "utf8"));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function safeRealpath(p) {
|
|
47
|
+
try {
|
|
48
|
+
return realpathSync(p);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return p;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isPathPrefix(prefix, candidate) {
|
|
55
|
+
if (candidate === prefix)
|
|
56
|
+
return true;
|
|
57
|
+
const withSep = prefix.endsWith("/") ? prefix : `${prefix}/`;
|
|
58
|
+
return candidate.startsWith(withSep);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=find-workspace-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-workspace-root.js","sourceRoot":"","sources":["../../src/workspace/find-workspace-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAqC,MAAM,kBAAkB,CAAC;AAE9F,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAe;IACjE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,oDAAoD;IACpD,SAAS,CAAC;QACR,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACjE,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC;gBAAE,OAAO,GAAG,CAAC;QAChF,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,IAAI,CAAC;QACH,0EAA0E;QAC1E,sEAAsE;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,SAAiB;IACrD,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;IAC7D,OAAO,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -18,6 +18,8 @@ export type WorkspacePackage = {
|
|
|
18
18
|
/** Parsed `package.json` contents. Cached for `declaredDeps`. */
|
|
19
19
|
packageJson: {
|
|
20
20
|
name?: string;
|
|
21
|
+
main?: string;
|
|
22
|
+
module?: string;
|
|
21
23
|
dependencies?: Record<string, string>;
|
|
22
24
|
devDependencies?: Record<string, string>;
|
|
23
25
|
peerDependencies?: Record<string, string>;
|
|
@@ -35,7 +37,7 @@ export type WorkspaceGraph = {
|
|
|
35
37
|
* detection — set even for single-package repos.
|
|
36
38
|
*/
|
|
37
39
|
packageManager: PackageManager;
|
|
38
|
-
/** Absolute path to the
|
|
40
|
+
/** Absolute path to the discovered workspace root. */
|
|
39
41
|
rootPath: string;
|
|
40
42
|
/** Root package name; "<unnamed>" if missing. */
|
|
41
43
|
rootPackageName: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@component-compass/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Open-source CLI for measuring design-system component usage across multi-framework consumer repos.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"@babel/parser": "7.29.3",
|
|
37
37
|
"@babel/types": "7.29.0",
|
|
38
38
|
"@clack/prompts": "^1.5.1",
|
|
39
|
-
"@component-compass/ast-utils": "0.1.
|
|
40
|
-
"@component-compass/parser-html": "0.1.
|
|
41
|
-
"@component-compass/parser-lit": "0.1.
|
|
42
|
-
"@component-compass/parser-react": "0.1.
|
|
43
|
-
"@component-compass/parser-vue": "0.1.
|
|
44
|
-
"@component-compass/plugin-core": "0.1.
|
|
45
|
-
"@component-compass/reference-graph": "0.1.
|
|
39
|
+
"@component-compass/ast-utils": "0.1.9",
|
|
40
|
+
"@component-compass/parser-html": "0.1.9",
|
|
41
|
+
"@component-compass/parser-lit": "0.1.9",
|
|
42
|
+
"@component-compass/parser-react": "0.1.9",
|
|
43
|
+
"@component-compass/parser-vue": "0.1.9",
|
|
44
|
+
"@component-compass/plugin-core": "0.1.9",
|
|
45
|
+
"@component-compass/reference-graph": "0.1.9",
|
|
46
46
|
"@vue/compiler-sfc": "3.5.33",
|
|
47
47
|
"ajv": "8.20.0",
|
|
48
48
|
"glob": "13.0.6",
|