@pie-element/cli 0.1.6-next.20261021000713 → 0.1.6
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/README.md +12 -1
- package/dist/commands/verify/dependency-integrity.js +23 -8
- package/dist/commands/verify/dependency-integrity.js.map +1 -1
- package/dist/utils/dependency-integrity.d.ts +5 -1
- package/dist/utils/dependency-integrity.js +10 -3
- package/dist/utils/dependency-integrity.js.map +1 -1
- package/dist/utils/workspace-resolution.d.ts +8 -0
- package/dist/utils/workspace-resolution.js +55 -0
- package/dist/utils/workspace-resolution.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -105,7 +105,12 @@ bun run cli verify:react-build
|
|
|
105
105
|
|
|
106
106
|
#### `verify:dependency-integrity`
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
Check that every declared `workspace:` dependency in each scanned package resolves
|
|
109
|
+
to the corresponding workspace directory, then classify source imports as direct,
|
|
110
|
+
transitive, hoist-reliant, or broken. Workspace identity is checked even without
|
|
111
|
+
source imports or build output; direct and hoisted workspace links are accepted.
|
|
112
|
+
Copies, forwarding directories, missing or broken links, and links into another
|
|
113
|
+
checkout fail the check.
|
|
109
114
|
|
|
110
115
|
```bash
|
|
111
116
|
# Scan all element/lib-react packages
|
|
@@ -118,6 +123,12 @@ bun run cli verify:dependency-integrity --package @pie-element/ebsr
|
|
|
118
123
|
bun run cli verify:dependency-integrity --fail-on-hoist
|
|
119
124
|
```
|
|
120
125
|
|
|
126
|
+
For an invalid workspace entry, restore the install with `bun install --frozen-lockfile`.
|
|
127
|
+
If install leaves a stale forwarding directory in place, move that specific entry
|
|
128
|
+
aside and install again. The checker reports the consumer, dependency, installed
|
|
129
|
+
location and expected workspace. `--fix` repairs missing declarations; it does not
|
|
130
|
+
replace installed files.
|
|
131
|
+
|
|
121
132
|
## CLI Development
|
|
122
133
|
|
|
123
134
|
```bash
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { analyzePackageDependencyIntegrity, autoFixWorkspaceDependencyDeclarations, collectWorkspacePackageDirs, } from '../../utils/dependency-integrity.js';
|
|
2
|
+
import { analyzePackageDependencyIntegrity, autoFixWorkspaceDependencyDeclarations, buildWorkspacePackageNameMap, collectWorkspacePackageDirs, } from '../../utils/dependency-integrity.js';
|
|
3
3
|
import { Logger } from '../../utils/logger.js';
|
|
4
4
|
export default class VerifyDependencyIntegrity extends Command {
|
|
5
|
-
static description = '
|
|
5
|
+
static description = 'Check workspace package identity, imports, and missing peer dependencies';
|
|
6
6
|
static examples = [
|
|
7
7
|
'<%= config.bin %> <%= command.id %>',
|
|
8
8
|
'<%= config.bin %> <%= command.id %> --package @pie-element/ebsr',
|
|
@@ -64,9 +64,11 @@ export default class VerifyDependencyIntegrity extends Command {
|
|
|
64
64
|
includeNonPackageWorkspaces: flags['include-non-package-workspaces'],
|
|
65
65
|
});
|
|
66
66
|
const results = [];
|
|
67
|
+
const workspacePackages = await buildWorkspacePackageNameMap(await collectWorkspacePackageDirs(repoRoot, { includeNonPackageWorkspaces: true }));
|
|
67
68
|
for (const pkgDir of pkgDirs) {
|
|
68
69
|
const analysis = await analyzePackageDependencyIntegrity(pkgDir, {
|
|
69
70
|
includePeerGaps: flags['check-peer-gaps'],
|
|
71
|
+
workspacePackages,
|
|
70
72
|
});
|
|
71
73
|
if (!analysis)
|
|
72
74
|
continue;
|
|
@@ -89,12 +91,14 @@ export default class VerifyDependencyIntegrity extends Command {
|
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
const byStatus = {
|
|
94
|
+
workspace: allIssues.filter((r) => r.issue.status === 'workspace'),
|
|
92
95
|
transitive: allIssues.filter((r) => r.issue.status === 'transitive'),
|
|
93
96
|
hoist: allIssues.filter((r) => r.issue.status === 'hoist'),
|
|
94
97
|
broken: allIssues.filter((r) => r.issue.status === 'broken'),
|
|
95
98
|
peer: allIssues.filter((r) => r.issue.status === 'peer'),
|
|
96
99
|
};
|
|
97
100
|
this.log(`Packages scanned: ${results.length}`);
|
|
101
|
+
this.log(`Workspace mismatches: ${byStatus.workspace.length}`);
|
|
98
102
|
this.log(`Transitive leaks: ${byStatus.transitive.length}`);
|
|
99
103
|
this.log(`Hoist-reliant: ${byStatus.hoist.length}`);
|
|
100
104
|
this.log(`Broken: ${byStatus.broken.length}\n`);
|
|
@@ -104,21 +108,28 @@ export default class VerifyDependencyIntegrity extends Command {
|
|
|
104
108
|
else {
|
|
105
109
|
this.log('');
|
|
106
110
|
}
|
|
111
|
+
this.printIssueGroup('❌ Invalid workspace resolution', byStatus.workspace);
|
|
112
|
+
if (byStatus.workspace.length > 0) {
|
|
113
|
+
this.log('Restore these entries with bun install --frozen-lockfile. If a stale directory shadows a workspace, move it aside first; install does not always replace it.\n');
|
|
114
|
+
}
|
|
107
115
|
this.printIssueGroup('❌ Broken imports', byStatus.broken);
|
|
108
116
|
if (flags['check-peer-gaps']) {
|
|
109
117
|
this.printIssueGroup('⚠️ Missing required peer dependencies', byStatus.peer);
|
|
110
118
|
}
|
|
111
119
|
this.printIssueGroup('⚠️ Hoist-reliant imports', byStatus.hoist);
|
|
112
120
|
this.printIssueGroup('ℹ️ Transitive imports (currently resolvable)', byStatus.transitive);
|
|
113
|
-
const shouldFail = byStatus.
|
|
121
|
+
const shouldFail = byStatus.workspace.length > 0 ||
|
|
122
|
+
byStatus.broken.length > 0 ||
|
|
114
123
|
(flags['fail-on-hoist'] && byStatus.hoist.length > 0) ||
|
|
115
124
|
(flags['fail-on-peer'] && byStatus.peer.length > 0);
|
|
116
125
|
if (shouldFail) {
|
|
117
|
-
const failReason = byStatus.
|
|
118
|
-
? '
|
|
119
|
-
: byStatus.
|
|
120
|
-
? '
|
|
121
|
-
:
|
|
126
|
+
const failReason = byStatus.workspace.length > 0
|
|
127
|
+
? 'Workspace dependencies resolve outside their declared packages'
|
|
128
|
+
: byStatus.broken.length > 0
|
|
129
|
+
? 'Broken imports found'
|
|
130
|
+
: byStatus.hoist.length > 0 && flags['fail-on-hoist']
|
|
131
|
+
? 'Hoist-reliant imports found (--fail-on-hoist)'
|
|
132
|
+
: 'Missing required peer dependencies found (--fail-on-peer)';
|
|
122
133
|
this.error(failReason, { exit: 1 });
|
|
123
134
|
}
|
|
124
135
|
this.logger.success('Dependency integrity check complete');
|
|
@@ -133,6 +144,10 @@ export default class VerifyDependencyIntegrity extends Command {
|
|
|
133
144
|
: '';
|
|
134
145
|
const requiredBy = row.issue.requiredBy ? ` (required by ${row.issue.requiredBy})` : '';
|
|
135
146
|
this.log(` - ${row.packageName}: ${row.issue.dependency}${requiredBy}${extra}`);
|
|
147
|
+
if (row.issue.reason)
|
|
148
|
+
this.log(` ${row.issue.reason}`);
|
|
149
|
+
if (row.issue.expectedPath)
|
|
150
|
+
this.log(` Expected: ${this.toRepoRelative(row.issue.expectedPath)}`);
|
|
136
151
|
}
|
|
137
152
|
this.log('');
|
|
138
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-integrity.js","sourceRoot":"","sources":["../../../src/commands/verify/dependency-integrity.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport {\n analyzePackageDependencyIntegrity,\n autoFixWorkspaceDependencyDeclarations,\n collectWorkspacePackageDirs,\n type ImportIntegrityIssue,\n} from '../../utils/dependency-integrity.js';\nimport { Logger } from '../../utils/logger.js';\n\ntype Row = {\n packageName: string;\n issue: ImportIntegrityIssue;\n};\n\nexport default class VerifyDependencyIntegrity extends Command {\n static override description =\n 'Inspect package imports and classify transitive, hoist-reliant, broken, and missing peer dependency resolution';\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --package @pie-element/ebsr',\n '<%= config.bin %> <%= command.id %> --fail-on-hoist',\n ];\n\n static override flags = {\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n package: Flags.string({\n description: 'Limit analysis to one package name (eg @pie-element/ebsr)',\n }),\n 'include-non-package-workspaces': Flags.boolean({\n description:\n 'Also analyze app/tool workspaces (can surface many existing issues outside package code)',\n default: false,\n }),\n 'check-peer-gaps': Flags.boolean({\n description:\n 'Also validate missing required peer dependencies from declared direct dependencies',\n default: false,\n }),\n fix: Flags.boolean({\n description: 'Auto-add missing direct dependencies for hoist/broken issues before reporting',\n default: false,\n }),\n 'fail-on-hoist': Flags.boolean({\n description: 'Exit non-zero when hoist-reliant imports are found',\n default: true,\n }),\n 'fail-on-peer': Flags.boolean({\n description: 'Exit non-zero when required peer dependencies are not declared directly',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(VerifyDependencyIntegrity);\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('🔍 Verifying dependency integrity');\n\n const repoRoot = process.cwd();\n if (flags.fix) {\n this.logger.info('Applying dependency declaration autofixes...');\n const fixResult = await autoFixWorkspaceDependencyDeclarations(repoRoot, {\n includeNonPackageWorkspaces: flags['include-non-package-workspaces'],\n packageName: flags.package,\n includePeerGaps: flags['check-peer-gaps'],\n });\n this.logger.info(\n ` Scanned: ${fixResult.packagesScanned}, Updated: ${fixResult.packagesUpdated}, Added: ${fixResult.dependenciesAdded}`\n );\n if (fixResult.unresolved.length > 0) {\n this.logger.warn(` Unresolved: ${fixResult.unresolved.length}`);\n for (const unresolved of fixResult.unresolved) {\n this.logger.warn(` - ${unresolved.packageName}: ${unresolved.dependency}`);\n }\n }\n this.log('');\n }\n\n const pkgDirs = await collectWorkspacePackageDirs(repoRoot, {\n includeNonPackageWorkspaces: flags['include-non-package-workspaces'],\n });\n const results = [];\n\n for (const pkgDir of pkgDirs) {\n const analysis = await analyzePackageDependencyIntegrity(pkgDir, {\n includePeerGaps: flags['check-peer-gaps'],\n });\n if (!analysis) continue;\n if (flags.package && analysis.packageName !== flags.package) continue;\n results.push(analysis);\n }\n\n if (results.length === 0) {\n this.error(\n flags.package\n ? `Package '${flags.package}' not found in configured workspaces`\n : 'No packages found to inspect',\n { exit: 1 }\n );\n }\n\n const allIssues: Row[] = [];\n for (const result of results) {\n for (const issue of result.issues) {\n allIssues.push({\n packageName: result.packageName,\n issue,\n });\n }\n }\n\n const byStatus = {\n transitive: allIssues.filter((r) => r.issue.status === 'transitive'),\n hoist: allIssues.filter((r) => r.issue.status === 'hoist'),\n broken: allIssues.filter((r) => r.issue.status === 'broken'),\n peer: allIssues.filter((r) => r.issue.status === 'peer'),\n };\n\n this.log(`Packages scanned: ${results.length}`);\n this.log(`Transitive leaks: ${byStatus.transitive.length}`);\n this.log(`Hoist-reliant: ${byStatus.hoist.length}`);\n this.log(`Broken: ${byStatus.broken.length}\\n`);\n if (flags['check-peer-gaps']) {\n this.log(`Peer gaps: ${byStatus.peer.length}\\n`);\n } else {\n this.log('');\n }\n\n this.printIssueGroup('❌ Broken imports', byStatus.broken);\n if (flags['check-peer-gaps']) {\n this.printIssueGroup('⚠️ Missing required peer dependencies', byStatus.peer);\n }\n this.printIssueGroup('⚠️ Hoist-reliant imports', byStatus.hoist);\n this.printIssueGroup('ℹ️ Transitive imports (currently resolvable)', byStatus.transitive);\n\n const shouldFail =\n byStatus.broken.length > 0 ||\n (flags['fail-on-hoist'] && byStatus.hoist.length > 0) ||\n (flags['fail-on-peer'] && byStatus.peer.length > 0);\n if (shouldFail) {\n const failReason =\n byStatus.broken.length > 0\n ? 'Broken imports found'\n : byStatus.hoist.length > 0 && flags['fail-on-hoist']\n ? 'Hoist-reliant imports found (--fail-on-hoist)'\n : 'Missing required peer dependencies found (--fail-on-peer)';\n this.error(failReason, { exit: 1 });\n }\n\n this.logger.success('Dependency integrity check complete');\n }\n\n private printIssueGroup(title: string, rows: Row[]): void {\n if (rows.length === 0) return;\n\n this.log(`${title}:`);\n for (const row of rows) {\n const extra = row.issue.resolvedPath\n ? ` -> ${this.toRepoRelative(row.issue.resolvedPath)}`\n : '';\n const requiredBy = row.issue.requiredBy ? ` (required by ${row.issue.requiredBy})` : '';\n this.log(` - ${row.packageName}: ${row.issue.dependency}${requiredBy}${extra}`);\n }\n this.log('');\n }\n\n private toRepoRelative(absolutePath: string): string {\n const repoRoot = process.cwd();\n if (absolutePath.startsWith(repoRoot)) {\n return absolutePath.slice(repoRoot.length + 1);\n }\n\n return absolutePath;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dependency-integrity.js","sourceRoot":"","sources":["../../../src/commands/verify/dependency-integrity.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport {\n analyzePackageDependencyIntegrity,\n autoFixWorkspaceDependencyDeclarations,\n buildWorkspacePackageNameMap,\n collectWorkspacePackageDirs,\n type ImportIntegrityIssue,\n} from '../../utils/dependency-integrity.js';\nimport { Logger } from '../../utils/logger.js';\n\ntype Row = {\n packageName: string;\n issue: ImportIntegrityIssue;\n};\n\nexport default class VerifyDependencyIntegrity extends Command {\n static override description =\n 'Check workspace package identity, imports, and missing peer dependencies';\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --package @pie-element/ebsr',\n '<%= config.bin %> <%= command.id %> --fail-on-hoist',\n ];\n\n static override flags = {\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show detailed output',\n default: false,\n }),\n package: Flags.string({\n description: 'Limit analysis to one package name (eg @pie-element/ebsr)',\n }),\n 'include-non-package-workspaces': Flags.boolean({\n description:\n 'Also analyze app/tool workspaces (can surface many existing issues outside package code)',\n default: false,\n }),\n 'check-peer-gaps': Flags.boolean({\n description:\n 'Also validate missing required peer dependencies from declared direct dependencies',\n default: false,\n }),\n fix: Flags.boolean({\n description: 'Auto-add missing direct dependencies for hoist/broken issues before reporting',\n default: false,\n }),\n 'fail-on-hoist': Flags.boolean({\n description: 'Exit non-zero when hoist-reliant imports are found',\n default: true,\n }),\n 'fail-on-peer': Flags.boolean({\n description: 'Exit non-zero when required peer dependencies are not declared directly',\n default: false,\n }),\n };\n\n private logger = new Logger();\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(VerifyDependencyIntegrity);\n this.logger = new Logger(flags.verbose);\n\n this.logger.section('🔍 Verifying dependency integrity');\n\n const repoRoot = process.cwd();\n if (flags.fix) {\n this.logger.info('Applying dependency declaration autofixes...');\n const fixResult = await autoFixWorkspaceDependencyDeclarations(repoRoot, {\n includeNonPackageWorkspaces: flags['include-non-package-workspaces'],\n packageName: flags.package,\n includePeerGaps: flags['check-peer-gaps'],\n });\n this.logger.info(\n ` Scanned: ${fixResult.packagesScanned}, Updated: ${fixResult.packagesUpdated}, Added: ${fixResult.dependenciesAdded}`\n );\n if (fixResult.unresolved.length > 0) {\n this.logger.warn(` Unresolved: ${fixResult.unresolved.length}`);\n for (const unresolved of fixResult.unresolved) {\n this.logger.warn(` - ${unresolved.packageName}: ${unresolved.dependency}`);\n }\n }\n this.log('');\n }\n\n const pkgDirs = await collectWorkspacePackageDirs(repoRoot, {\n includeNonPackageWorkspaces: flags['include-non-package-workspaces'],\n });\n const results = [];\n const workspacePackages = await buildWorkspacePackageNameMap(\n await collectWorkspacePackageDirs(repoRoot, { includeNonPackageWorkspaces: true })\n );\n\n for (const pkgDir of pkgDirs) {\n const analysis = await analyzePackageDependencyIntegrity(pkgDir, {\n includePeerGaps: flags['check-peer-gaps'],\n workspacePackages,\n });\n if (!analysis) continue;\n if (flags.package && analysis.packageName !== flags.package) continue;\n results.push(analysis);\n }\n\n if (results.length === 0) {\n this.error(\n flags.package\n ? `Package '${flags.package}' not found in configured workspaces`\n : 'No packages found to inspect',\n { exit: 1 }\n );\n }\n\n const allIssues: Row[] = [];\n for (const result of results) {\n for (const issue of result.issues) {\n allIssues.push({\n packageName: result.packageName,\n issue,\n });\n }\n }\n\n const byStatus = {\n workspace: allIssues.filter((r) => r.issue.status === 'workspace'),\n transitive: allIssues.filter((r) => r.issue.status === 'transitive'),\n hoist: allIssues.filter((r) => r.issue.status === 'hoist'),\n broken: allIssues.filter((r) => r.issue.status === 'broken'),\n peer: allIssues.filter((r) => r.issue.status === 'peer'),\n };\n\n this.log(`Packages scanned: ${results.length}`);\n this.log(`Workspace mismatches: ${byStatus.workspace.length}`);\n this.log(`Transitive leaks: ${byStatus.transitive.length}`);\n this.log(`Hoist-reliant: ${byStatus.hoist.length}`);\n this.log(`Broken: ${byStatus.broken.length}\\n`);\n if (flags['check-peer-gaps']) {\n this.log(`Peer gaps: ${byStatus.peer.length}\\n`);\n } else {\n this.log('');\n }\n\n this.printIssueGroup('❌ Invalid workspace resolution', byStatus.workspace);\n if (byStatus.workspace.length > 0) {\n this.log(\n 'Restore these entries with bun install --frozen-lockfile. If a stale directory shadows a workspace, move it aside first; install does not always replace it.\\n'\n );\n }\n this.printIssueGroup('❌ Broken imports', byStatus.broken);\n if (flags['check-peer-gaps']) {\n this.printIssueGroup('⚠️ Missing required peer dependencies', byStatus.peer);\n }\n this.printIssueGroup('⚠️ Hoist-reliant imports', byStatus.hoist);\n this.printIssueGroup('ℹ️ Transitive imports (currently resolvable)', byStatus.transitive);\n\n const shouldFail =\n byStatus.workspace.length > 0 ||\n byStatus.broken.length > 0 ||\n (flags['fail-on-hoist'] && byStatus.hoist.length > 0) ||\n (flags['fail-on-peer'] && byStatus.peer.length > 0);\n if (shouldFail) {\n const failReason =\n byStatus.workspace.length > 0\n ? 'Workspace dependencies resolve outside their declared packages'\n : byStatus.broken.length > 0\n ? 'Broken imports found'\n : byStatus.hoist.length > 0 && flags['fail-on-hoist']\n ? 'Hoist-reliant imports found (--fail-on-hoist)'\n : 'Missing required peer dependencies found (--fail-on-peer)';\n this.error(failReason, { exit: 1 });\n }\n\n this.logger.success('Dependency integrity check complete');\n }\n\n private printIssueGroup(title: string, rows: Row[]): void {\n if (rows.length === 0) return;\n\n this.log(`${title}:`);\n for (const row of rows) {\n const extra = row.issue.resolvedPath\n ? ` -> ${this.toRepoRelative(row.issue.resolvedPath)}`\n : '';\n const requiredBy = row.issue.requiredBy ? ` (required by ${row.issue.requiredBy})` : '';\n this.log(` - ${row.packageName}: ${row.issue.dependency}${requiredBy}${extra}`);\n if (row.issue.reason) this.log(` ${row.issue.reason}`);\n if (row.issue.expectedPath)\n this.log(` Expected: ${this.toRepoRelative(row.issue.expectedPath)}`);\n }\n this.log('');\n }\n\n private toRepoRelative(absolutePath: string): string {\n const repoRoot = process.cwd();\n if (absolutePath.startsWith(repoRoot)) {\n return absolutePath.slice(repoRoot.length + 1);\n }\n\n return absolutePath;\n }\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
export type ImportIntegrityStatus = 'direct' | 'transitive' | 'hoist' | 'broken' | 'peer';
|
|
1
|
+
export type ImportIntegrityStatus = 'direct' | 'transitive' | 'hoist' | 'broken' | 'peer' | 'workspace';
|
|
2
2
|
export interface ImportIntegrityIssue {
|
|
3
3
|
dependency: string;
|
|
4
4
|
status: ImportIntegrityStatus;
|
|
5
5
|
declaredDirect: boolean;
|
|
6
6
|
resolvedPath?: string;
|
|
7
7
|
requiredBy?: string;
|
|
8
|
+
expectedPath?: string;
|
|
9
|
+
reason?: string;
|
|
8
10
|
}
|
|
9
11
|
export interface PackageIntegrityResult {
|
|
10
12
|
packageName: string;
|
|
@@ -16,6 +18,7 @@ interface CollectWorkspaceOptions {
|
|
|
16
18
|
}
|
|
17
19
|
interface AnalyzeIntegrityOptions {
|
|
18
20
|
includePeerGaps?: boolean;
|
|
21
|
+
workspacePackages?: ReadonlyMap<string, string>;
|
|
19
22
|
}
|
|
20
23
|
export interface AutoFixDependencyOptions extends CollectWorkspaceOptions {
|
|
21
24
|
packageName?: string;
|
|
@@ -34,4 +37,5 @@ export interface AutoFixDependencyResult {
|
|
|
34
37
|
export declare function analyzePackageDependencyIntegrity(packagePath: string, options?: AnalyzeIntegrityOptions): Promise<PackageIntegrityResult | null>;
|
|
35
38
|
export declare function collectWorkspacePackageDirs(root: string, options?: CollectWorkspaceOptions): Promise<string[]>;
|
|
36
39
|
export declare function autoFixWorkspaceDependencyDeclarations(root: string, options?: AutoFixDependencyOptions): Promise<AutoFixDependencyResult>;
|
|
40
|
+
export declare function buildWorkspacePackageNameMap(packageDirs: string[]): Promise<Map<string, string>>;
|
|
37
41
|
export {};
|
|
@@ -4,6 +4,7 @@ import { readFile, readdir, writeFile } from 'node:fs/promises';
|
|
|
4
4
|
import { dirname, join, resolve } from 'node:path';
|
|
5
5
|
import { init, parse } from 'es-module-lexer';
|
|
6
6
|
import { loadPackageJson } from './package-json.js';
|
|
7
|
+
import { checkWorkspaceResolution } from './workspace-resolution.js';
|
|
7
8
|
const BUILTIN_SET = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)]);
|
|
8
9
|
const VALID_BARE_SPECIFIER = /^(@[a-z0-9._-]+\/[a-z0-9._-]+|[a-z0-9._-]+)(\/[a-z0-9._-]+)*$/i;
|
|
9
10
|
const WORKSPACE_SCAN_PREFIXES = ['packages/', 'apps/', 'tools/'];
|
|
@@ -37,12 +38,19 @@ export async function analyzePackageDependencyIntegrity(packagePath, options = {
|
|
|
37
38
|
if (!pkgJson?.name) {
|
|
38
39
|
return null;
|
|
39
40
|
}
|
|
41
|
+
const issues = options.workspacePackages
|
|
42
|
+
? checkWorkspaceResolution(pkgJsonPath, options.workspacePackages).map((issue) => ({
|
|
43
|
+
...issue,
|
|
44
|
+
status: 'workspace',
|
|
45
|
+
declaredDirect: true,
|
|
46
|
+
}))
|
|
47
|
+
: [];
|
|
40
48
|
const sourceDir = join(absPackagePath, 'src');
|
|
41
49
|
if (!existsSync(sourceDir)) {
|
|
42
50
|
return {
|
|
43
51
|
packageName: pkgJson.name,
|
|
44
52
|
packagePath: absPackagePath,
|
|
45
|
-
issues
|
|
53
|
+
issues,
|
|
46
54
|
};
|
|
47
55
|
}
|
|
48
56
|
const importedPackages = await collectImportedPackages(sourceDir);
|
|
@@ -54,7 +62,6 @@ export async function analyzePackageDependencyIntegrity(packagePath, options = {
|
|
|
54
62
|
]);
|
|
55
63
|
const resolveFromPackage = createRequire(pkgJsonPath);
|
|
56
64
|
const transitiveNames = await collectTransitiveDependencyNames(resolveFromPackage, declaredDirect);
|
|
57
|
-
const issues = [];
|
|
58
65
|
for (const dep of Array.from(importedPackages.keys()).sort()) {
|
|
59
66
|
if (dep === pkgJson.name) {
|
|
60
67
|
continue;
|
|
@@ -445,7 +452,7 @@ export async function autoFixWorkspaceDependencyDeclarations(root, options = {})
|
|
|
445
452
|
unresolved,
|
|
446
453
|
};
|
|
447
454
|
}
|
|
448
|
-
async function buildWorkspacePackageNameMap(packageDirs) {
|
|
455
|
+
export async function buildWorkspacePackageNameMap(packageDirs) {
|
|
449
456
|
const map = new Map();
|
|
450
457
|
for (const packageDir of packageDirs) {
|
|
451
458
|
const pkgPath = join(packageDir, 'package.json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-integrity.js","sourceRoot":"","sources":["../../src/utils/dependency-integrity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire, builtinModules } from 'node:module';\nimport { existsSync } from 'node:fs';\nimport { readFile, readdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { init, parse } from 'es-module-lexer';\nimport { loadPackageJson, type PackageJson } from './package-json.js';\n\nexport type ImportIntegrityStatus = 'direct' | 'transitive' | 'hoist' | 'broken' | 'peer';\n\nexport interface ImportIntegrityIssue {\n dependency: string;\n status: ImportIntegrityStatus;\n declaredDirect: boolean;\n resolvedPath?: string;\n requiredBy?: string;\n}\n\nexport interface PackageIntegrityResult {\n packageName: string;\n packagePath: string;\n issues: ImportIntegrityIssue[];\n}\n\nconst BUILTIN_SET = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)]);\nconst VALID_BARE_SPECIFIER = /^(@[a-z0-9._-]+\\/[a-z0-9._-]+|[a-z0-9._-]+)(\\/[a-z0-9._-]+)*$/i;\nconst WORKSPACE_SCAN_PREFIXES = ['packages/', 'apps/', 'tools/'];\nconst PLACEHOLDER_IMPORT_SPECIFIERS = new Set(['package', 'x']);\nconst IGNORED_PEER_DEPENDENCIES = new Set([\n 'react',\n 'react-dom',\n '@emotion/react',\n '@emotion/styled',\n '@emotion/core',\n]);\nconst FALLBACK_DEPENDENCY_VERSIONS: Record<string, string> = {\n 'js-combinatorics': '^2.1.2',\n 'nested-property': '^4.0.0',\n 'prosemirror-state': '^1.4.4',\n '@testing-library/react': '^16.3.2',\n '@testing-library/dom': '^10.4.1',\n '@tiptap/extensions': '^3.20.0',\n '@tiptap/extension-list': '^3.20.0',\n '@tiptap/extension-code-block': '^3.20.0',\n 'react-is': '^19.2.0',\n pluralize: '^8.0.0',\n};\n\ninterface CollectWorkspaceOptions {\n includeNonPackageWorkspaces?: boolean;\n}\n\ninterface AnalyzeIntegrityOptions {\n includePeerGaps?: boolean;\n}\n\nexport interface AutoFixDependencyOptions extends CollectWorkspaceOptions {\n packageName?: string;\n includeTransitive?: boolean;\n includePeerGaps?: boolean;\n}\n\nexport interface AutoFixDependencyResult {\n packagesScanned: number;\n packagesUpdated: number;\n dependenciesAdded: number;\n unresolved: Array<{ packageName: string; dependency: string }>;\n}\n\nexport async function analyzePackageDependencyIntegrity(\n packagePath: string,\n options: AnalyzeIntegrityOptions = {}\n): Promise<PackageIntegrityResult | null> {\n const absPackagePath = resolve(packagePath);\n const pkgJsonPath = join(absPackagePath, 'package.json');\n if (!existsSync(pkgJsonPath)) {\n return null;\n }\n\n const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;\n if (!pkgJson?.name) {\n return null;\n }\n\n const sourceDir = join(absPackagePath, 'src');\n if (!existsSync(sourceDir)) {\n return {\n packageName: pkgJson.name,\n packagePath: absPackagePath,\n issues: [],\n };\n }\n\n const importedPackages = await collectImportedPackages(sourceDir);\n const declaredDirect = new Set<string>([\n ...Object.keys(pkgJson.dependencies || {}),\n ...Object.keys(pkgJson.devDependencies || {}),\n ...Object.keys((pkgJson.peerDependencies as Record<string, string> | undefined) || {}),\n ...Object.keys((pkgJson.optionalDependencies as Record<string, string> | undefined) || {}),\n ]);\n\n const resolveFromPackage = createRequire(pkgJsonPath);\n const transitiveNames = await collectTransitiveDependencyNames(\n resolveFromPackage,\n declaredDirect\n );\n\n const issues: ImportIntegrityIssue[] = [];\n\n for (const dep of Array.from(importedPackages.keys()).sort()) {\n if (dep === pkgJson.name) {\n continue;\n }\n\n const direct = declaredDirect.has(dep);\n const specifiers = importedPackages.get(dep) || new Set<string>([dep]);\n const resolvedPath = resolveDependencyFromPackage(resolveFromPackage, dep, specifiers);\n\n if (!resolvedPath) {\n if (direct) {\n const declaredManifest = resolveDeclaredPackageManifest(resolveFromPackage, dep);\n if (declaredManifest) {\n continue;\n }\n }\n issues.push({\n dependency: dep,\n status: 'broken',\n declaredDirect: direct,\n });\n continue;\n }\n\n if (direct) {\n continue;\n }\n\n if (transitiveNames.has(dep)) {\n issues.push({\n dependency: dep,\n status: 'transitive',\n declaredDirect: false,\n resolvedPath,\n });\n } else {\n issues.push({\n dependency: dep,\n status: 'hoist',\n declaredDirect: false,\n resolvedPath,\n });\n }\n }\n\n if (options.includePeerGaps) {\n const peerIssues = await collectMissingPeerDependencyIssues(\n pkgJson,\n declaredDirect,\n resolveFromPackage\n );\n for (const peerIssue of peerIssues) {\n const alreadyReported = issues.some((issue) => issue.dependency === peerIssue.dependency);\n if (!alreadyReported) {\n issues.push(peerIssue);\n }\n }\n }\n\n return {\n packageName: pkgJson.name,\n packagePath: absPackagePath,\n issues,\n };\n}\n\nexport async function collectWorkspacePackageDirs(\n root: string,\n options: CollectWorkspaceOptions = {}\n): Promise<string[]> {\n const absRoot = resolve(root);\n const out = new Set<string>();\n const rootPkgPath = join(absRoot, 'package.json');\n const rootPkg = (await loadPackageJson(rootPkgPath)) as\n | (PackageJson & { workspaces?: string[] })\n | null;\n const workspaces = rootPkg?.workspaces || [];\n\n for (const pattern of workspaces) {\n if (!WORKSPACE_SCAN_PREFIXES.some((prefix) => pattern.startsWith(prefix))) {\n continue;\n }\n const isPackagesWorkspace = pattern.startsWith('packages/');\n if (!isPackagesWorkspace && !options.includeNonPackageWorkspaces) {\n continue;\n }\n const matches = await expandWorkspacePattern(absRoot, pattern);\n for (const match of matches) {\n if (existsSync(join(match, 'package.json'))) {\n out.add(match);\n }\n }\n }\n\n return Array.from(out).sort();\n}\n\nasync function expandWorkspacePattern(root: string, pattern: string): Promise<string[]> {\n const normalized = pattern.replace(/\\\\/g, '/').replace(/\\/$/, '');\n if (!normalized.includes('*')) {\n return [join(root, normalized)];\n }\n\n const [prefix, suffix = ''] = normalized.split('*');\n const prefixPath = join(root, prefix);\n if (!existsSync(prefixPath)) {\n return [];\n }\n\n const dirEntries = await readdir(prefixPath, { withFileTypes: true });\n const matches: string[] = [];\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = join(prefixPath, entry.name, suffix);\n if (existsSync(candidate)) {\n matches.push(candidate);\n }\n }\n\n return matches;\n}\n\nfunction resolveDependencyFromPackage(\n resolveFromPackage: NodeRequire,\n dep: string,\n specifiers: Set<string>\n): string | null {\n const candidates = new Set<string>([...specifiers, dep]);\n for (const candidate of candidates) {\n try {\n return resolveFromPackage.resolve(candidate);\n } catch {\n // try next candidate\n }\n }\n return null;\n}\n\nfunction resolveDeclaredPackageManifest(\n resolveFromPackage: NodeRequire,\n dep: string\n): string | null {\n const searchPaths = resolveFromPackage.resolve.paths(dep) || [];\n for (const basePath of searchPaths) {\n const manifestPath = join(basePath, dep, 'package.json');\n if (existsSync(manifestPath)) {\n return manifestPath;\n }\n }\n return null;\n}\n\nasync function collectMissingPeerDependencyIssues(\n pkgJson: PackageJson,\n declaredDirect: Set<string>,\n resolveFromPackage: NodeRequire\n): Promise<ImportIntegrityIssue[]> {\n const issues: ImportIntegrityIssue[] = [];\n const checkedPeers = new Set<string>();\n\n for (const directDep of Array.from(declaredDirect)) {\n if (!directDep || directDep === pkgJson.name) continue;\n\n const depRoot = await resolvePackageRoot(resolveFromPackage, directDep);\n const depPkgPath =\n depRoot && existsSync(join(depRoot, 'package.json'))\n ? join(depRoot, 'package.json')\n : resolveDeclaredPackageManifest(resolveFromPackage, directDep);\n if (!depPkgPath || !existsSync(depPkgPath)) {\n continue;\n }\n\n const depPkg = (await loadPackageJson(depPkgPath).catch(() => null)) as PackageJson | null;\n if (!depPkg?.peerDependencies || typeof depPkg.peerDependencies !== 'object') {\n continue;\n }\n\n const optionalPeers = new Set<string>(\n Object.entries((depPkg.peerDependenciesMeta as Record<string, { optional?: boolean }>) || {})\n .filter(([, meta]) => meta?.optional)\n .map(([name]) => name)\n );\n\n for (const peerDep of Object.keys(depPkg.peerDependencies)) {\n if (!peerDep || peerDep === pkgJson.name || optionalPeers.has(peerDep)) continue;\n if (IGNORED_PEER_DEPENDENCIES.has(peerDep)) continue;\n if (declaredDirect.has(peerDep) || checkedPeers.has(peerDep)) continue;\n checkedPeers.add(peerDep);\n\n const resolvedPath = resolveDependencyFromPackage(\n resolveFromPackage,\n peerDep,\n new Set([peerDep])\n );\n issues.push({\n dependency: peerDep,\n status: 'peer',\n declaredDirect: false,\n resolvedPath: resolvedPath || undefined,\n requiredBy: directDep,\n });\n }\n }\n\n return issues;\n}\n\nasync function collectImportedPackages(sourceDir: string): Promise<Map<string, Set<string>>> {\n const files = await listSourceFiles(sourceDir);\n const imported = new Map<string, Set<string>>();\n\n for (const file of files) {\n const content = await readFile(file, 'utf-8');\n if (\n file.includes('/src/lib/element-imports.') ||\n content.includes('AUTO-GENERATED') ||\n content.includes('DO NOT EDIT MANUALLY')\n ) {\n continue;\n }\n for (const importedSpec of await extractBareImports(content)) {\n if (!imported.has(importedSpec.packageName)) {\n imported.set(importedSpec.packageName, new Set<string>());\n }\n imported.get(importedSpec.packageName)?.add(importedSpec.rawSpecifier);\n }\n }\n\n return imported;\n}\n\nasync function listSourceFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listSourceFiles(fullPath)));\n continue;\n }\n\n if (/\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nasync function extractBareImports(\n content: string\n): Promise<Array<{ packageName: string; rawSpecifier: string }>> {\n const imports = new Map<string, Set<string>>();\n try {\n await init;\n const [parsedImports] = parse(content);\n for (const parsed of parsedImports) {\n const rawSpecifier = (parsed as { n?: string }).n;\n if (!rawSpecifier) continue;\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (!dep) continue;\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n } catch {\n const staticPatterns = [\n /^\\s*import\\s+[^'\"]*?\\s+from\\s+['\"]([^'\"]+)['\"]/gm,\n /^\\s*import\\s*['\"]([^'\"]+)['\"]/gm,\n /^\\s*export\\s+[^'\"]*?\\s+from\\s+['\"]([^'\"]+)['\"]/gm,\n /(?:^|[^\\w$\"'`])import\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/gm,\n ];\n for (const pattern of staticPatterns) {\n let match: RegExpExecArray | null = pattern.exec(content);\n while (match !== null) {\n const rawSpecifier = match[1];\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (dep) {\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n match = pattern.exec(content);\n }\n }\n }\n\n const requireContent = stripComments(content);\n const requirePattern =\n /^\\s*(?:const|let|var)?[\\w${}\\s,*=:.[\\]-]*\\brequire\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/gm;\n let requireMatch: RegExpExecArray | null = requirePattern.exec(requireContent);\n while (requireMatch !== null) {\n const rawSpecifier = requireMatch[1];\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (dep) {\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n requireMatch = requirePattern.exec(requireContent);\n }\n\n const out: Array<{ packageName: string; rawSpecifier: string }> = [];\n for (const [packageName, specifiers] of imports) {\n for (const rawSpecifier of specifiers) {\n out.push({ packageName, rawSpecifier });\n }\n }\n return out;\n}\n\nfunction stripComments(content: string): string {\n return content.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/(^|[^\\\\:])\\/\\/.*$/gm, '$1');\n}\n\nfunction normalizeBarePackageSpecifier(specifier: string): string | null {\n if (\n !specifier ||\n specifier.startsWith('.') ||\n specifier.startsWith('/') ||\n specifier.startsWith('node:') ||\n specifier.startsWith('$')\n ) {\n return null;\n }\n\n if (BUILTIN_SET.has(specifier)) {\n return null;\n }\n\n // Ignore virtual modules and URL/protocol specifiers.\n if (specifier.includes(':')) {\n return null;\n }\n\n if (!VALID_BARE_SPECIFIER.test(specifier)) {\n return null;\n }\n if (PLACEHOLDER_IMPORT_SPECIFIERS.has(specifier)) {\n return null;\n }\n\n if (specifier.startsWith('@')) {\n const parts = specifier.split('/');\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : null;\n }\n\n return specifier.split('/')[0] || null;\n}\n\nasync function collectTransitiveDependencyNames(\n resolveFromPackage: NodeRequire,\n roots: Set<string>\n): Promise<Set<string>> {\n const seen = new Set<string>();\n const queue = Array.from(roots);\n const transitive = new Set<string>();\n\n while (queue.length > 0) {\n const dep = queue.shift();\n if (!dep || seen.has(dep)) continue;\n seen.add(dep);\n transitive.add(dep);\n\n const root = await resolvePackageRoot(resolveFromPackage, dep);\n if (!root) continue;\n\n const pkgJsonPath = join(root, 'package.json');\n if (!existsSync(pkgJsonPath)) continue;\n\n let pkg: PackageJson | null = null;\n try {\n pkg = (await loadPackageJson(pkgJsonPath)) as PackageJson;\n } catch {\n pkg = null;\n }\n\n if (!pkg) continue;\n\n const childDeps = Object.keys(pkg.dependencies || {});\n for (const child of childDeps) {\n if (!seen.has(child)) queue.push(child);\n }\n }\n\n return transitive;\n}\n\nexport async function autoFixWorkspaceDependencyDeclarations(\n root: string,\n options: AutoFixDependencyOptions = {}\n): Promise<AutoFixDependencyResult> {\n const absRoot = resolve(root);\n const packageDirs = await collectWorkspacePackageDirs(absRoot, {\n includeNonPackageWorkspaces: options.includeNonPackageWorkspaces,\n });\n const catalog = await buildDependencyVersionCatalog(absRoot, packageDirs);\n const workspacePackages = await buildWorkspacePackageNameMap(packageDirs);\n\n let packagesScanned = 0;\n let packagesUpdated = 0;\n let dependenciesAdded = 0;\n const unresolved: Array<{ packageName: string; dependency: string }> = [];\n\n for (const packageDir of packageDirs) {\n const analysis = await analyzePackageDependencyIntegrity(packageDir, {\n includePeerGaps: options.includePeerGaps,\n });\n if (!analysis) continue;\n if (options.packageName && analysis.packageName !== options.packageName) {\n continue;\n }\n packagesScanned++;\n\n const pkgJsonPath = join(packageDir, 'package.json');\n const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;\n if (!pkgJson) continue;\n\n const needs = analysis.issues.filter((issue) => {\n if (issue.declaredDirect) {\n return false;\n }\n if (issue.status === 'hoist' || issue.status === 'broken' || issue.status === 'peer') {\n return true;\n }\n return options.includeTransitive === true && issue.status === 'transitive';\n });\n\n if (needs.length === 0) {\n continue;\n }\n\n if (!pkgJson.dependencies || typeof pkgJson.dependencies !== 'object') {\n pkgJson.dependencies = {};\n }\n const deps = pkgJson.dependencies as Record<string, string>;\n\n let modified = false;\n for (const issue of needs) {\n if (deps[issue.dependency]) {\n continue;\n }\n\n const version = await resolveDependencyVersionForPackage(\n issue.dependency,\n pkgJsonPath,\n absRoot,\n catalog,\n workspacePackages\n );\n if (!version) {\n unresolved.push({ packageName: analysis.packageName, dependency: issue.dependency });\n continue;\n }\n\n deps[issue.dependency] = version;\n modified = true;\n dependenciesAdded++;\n }\n\n if (modified) {\n await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`, 'utf-8');\n packagesUpdated++;\n }\n }\n\n return {\n packagesScanned,\n packagesUpdated,\n dependenciesAdded,\n unresolved,\n };\n}\n\nasync function buildWorkspacePackageNameMap(packageDirs: string[]): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n for (const packageDir of packageDirs) {\n const pkgPath = join(packageDir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n const pkg = (await loadPackageJson(pkgPath)) as PackageJson | null;\n if (pkg?.name) {\n map.set(pkg.name, packageDir);\n }\n }\n return map;\n}\n\nasync function buildDependencyVersionCatalog(\n rootDir: string,\n packageDirs: string[]\n): Promise<Map<string, string>> {\n const catalog = new Map<string, string>();\n\n const addVersions = (record?: Record<string, string>) => {\n if (!record) return;\n for (const [name, version] of Object.entries(record)) {\n if (!catalog.has(name)) {\n catalog.set(name, version);\n }\n }\n };\n\n const rootPkgPath = join(rootDir, 'package.json');\n if (existsSync(rootPkgPath)) {\n const rootPkg = (await loadPackageJson(rootPkgPath)) as PackageJson | null;\n if (rootPkg) {\n addVersions(rootPkg.dependencies as Record<string, string> | undefined);\n addVersions(rootPkg.devDependencies as Record<string, string> | undefined);\n addVersions(rootPkg.peerDependencies as Record<string, string> | undefined);\n addVersions(rootPkg.optionalDependencies as Record<string, string> | undefined);\n }\n }\n\n for (const packageDir of packageDirs) {\n const pkgPath = join(packageDir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n const pkg = (await loadPackageJson(pkgPath)) as PackageJson | null;\n if (!pkg) continue;\n addVersions(pkg.dependencies as Record<string, string> | undefined);\n addVersions(pkg.devDependencies as Record<string, string> | undefined);\n addVersions(pkg.peerDependencies as Record<string, string> | undefined);\n addVersions(pkg.optionalDependencies as Record<string, string> | undefined);\n }\n\n return catalog;\n}\n\nasync function resolveDependencyVersionForPackage(\n dep: string,\n pkgJsonPath: string,\n rootDir: string,\n catalog: Map<string, string>,\n workspacePackages: Map<string, string>\n): Promise<string | null> {\n if (workspacePackages.has(dep)) {\n return 'workspace:*';\n }\n\n const catalogVersion = catalog.get(dep);\n if (catalogVersion) {\n return catalogVersion;\n }\n\n if (FALLBACK_DEPENDENCY_VERSIONS[dep]) {\n return FALLBACK_DEPENDENCY_VERSIONS[dep];\n }\n\n const requireFromPackage = createRequire(pkgJsonPath);\n const packageRoot = await resolvePackageRoot(requireFromPackage, dep);\n if (!packageRoot) {\n return null;\n }\n\n const depPkgPath = join(packageRoot, 'package.json');\n if (!existsSync(depPkgPath)) {\n return null;\n }\n\n const depPkg = (await loadPackageJson(depPkgPath)) as PackageJson | null;\n if (!depPkg?.version) {\n return null;\n }\n\n // Keep workspace references if dependency resolves to local workspace package path.\n if (\n packageRoot.startsWith(join(rootDir, 'packages')) ||\n packageRoot.startsWith(join(rootDir, 'apps'))\n ) {\n return 'workspace:*';\n }\n\n return `^${depPkg.version}`;\n}\n\nasync function resolvePackageRoot(\n resolveFromPackage: NodeRequire,\n dep: string\n): Promise<string | null> {\n let resolvedFile: string;\n try {\n resolvedFile = resolveFromPackage.resolve(dep);\n } catch {\n return null;\n }\n\n let current = dirname(resolvedFile);\n const floor = dirname(current);\n while (current !== floor) {\n const pkgJsonPath = join(current, 'package.json');\n if (existsSync(pkgJsonPath)) {\n try {\n const pkg = (await loadPackageJson(pkgJsonPath)) as PackageJson;\n if (pkg.name === dep) {\n return current;\n }\n } catch {\n // ignore parse/load errors and keep walking\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dependency-integrity.js","sourceRoot":"","sources":["../../src/utils/dependency-integrity.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire, builtinModules } from 'node:module';\nimport { existsSync } from 'node:fs';\nimport { readFile, readdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { init, parse } from 'es-module-lexer';\nimport { loadPackageJson, type PackageJson } from './package-json.js';\nimport { checkWorkspaceResolution } from './workspace-resolution.js';\n\nexport type ImportIntegrityStatus =\n | 'direct'\n | 'transitive'\n | 'hoist'\n | 'broken'\n | 'peer'\n | 'workspace';\n\nexport interface ImportIntegrityIssue {\n dependency: string;\n status: ImportIntegrityStatus;\n declaredDirect: boolean;\n resolvedPath?: string;\n requiredBy?: string;\n expectedPath?: string;\n reason?: string;\n}\n\nexport interface PackageIntegrityResult {\n packageName: string;\n packagePath: string;\n issues: ImportIntegrityIssue[];\n}\n\nconst BUILTIN_SET = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)]);\nconst VALID_BARE_SPECIFIER = /^(@[a-z0-9._-]+\\/[a-z0-9._-]+|[a-z0-9._-]+)(\\/[a-z0-9._-]+)*$/i;\nconst WORKSPACE_SCAN_PREFIXES = ['packages/', 'apps/', 'tools/'];\nconst PLACEHOLDER_IMPORT_SPECIFIERS = new Set(['package', 'x']);\nconst IGNORED_PEER_DEPENDENCIES = new Set([\n 'react',\n 'react-dom',\n '@emotion/react',\n '@emotion/styled',\n '@emotion/core',\n]);\nconst FALLBACK_DEPENDENCY_VERSIONS: Record<string, string> = {\n 'js-combinatorics': '^2.1.2',\n 'nested-property': '^4.0.0',\n 'prosemirror-state': '^1.4.4',\n '@testing-library/react': '^16.3.2',\n '@testing-library/dom': '^10.4.1',\n '@tiptap/extensions': '^3.20.0',\n '@tiptap/extension-list': '^3.20.0',\n '@tiptap/extension-code-block': '^3.20.0',\n 'react-is': '^19.2.0',\n pluralize: '^8.0.0',\n};\n\ninterface CollectWorkspaceOptions {\n includeNonPackageWorkspaces?: boolean;\n}\n\ninterface AnalyzeIntegrityOptions {\n includePeerGaps?: boolean;\n workspacePackages?: ReadonlyMap<string, string>;\n}\n\nexport interface AutoFixDependencyOptions extends CollectWorkspaceOptions {\n packageName?: string;\n includeTransitive?: boolean;\n includePeerGaps?: boolean;\n}\n\nexport interface AutoFixDependencyResult {\n packagesScanned: number;\n packagesUpdated: number;\n dependenciesAdded: number;\n unresolved: Array<{ packageName: string; dependency: string }>;\n}\n\nexport async function analyzePackageDependencyIntegrity(\n packagePath: string,\n options: AnalyzeIntegrityOptions = {}\n): Promise<PackageIntegrityResult | null> {\n const absPackagePath = resolve(packagePath);\n const pkgJsonPath = join(absPackagePath, 'package.json');\n if (!existsSync(pkgJsonPath)) {\n return null;\n }\n\n const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;\n if (!pkgJson?.name) {\n return null;\n }\n\n const issues: ImportIntegrityIssue[] = options.workspacePackages\n ? checkWorkspaceResolution(pkgJsonPath, options.workspacePackages).map((issue) => ({\n ...issue,\n status: 'workspace',\n declaredDirect: true,\n }))\n : [];\n const sourceDir = join(absPackagePath, 'src');\n if (!existsSync(sourceDir)) {\n return {\n packageName: pkgJson.name,\n packagePath: absPackagePath,\n issues,\n };\n }\n\n const importedPackages = await collectImportedPackages(sourceDir);\n const declaredDirect = new Set<string>([\n ...Object.keys(pkgJson.dependencies || {}),\n ...Object.keys(pkgJson.devDependencies || {}),\n ...Object.keys((pkgJson.peerDependencies as Record<string, string> | undefined) || {}),\n ...Object.keys((pkgJson.optionalDependencies as Record<string, string> | undefined) || {}),\n ]);\n\n const resolveFromPackage = createRequire(pkgJsonPath);\n const transitiveNames = await collectTransitiveDependencyNames(\n resolveFromPackage,\n declaredDirect\n );\n\n for (const dep of Array.from(importedPackages.keys()).sort()) {\n if (dep === pkgJson.name) {\n continue;\n }\n\n const direct = declaredDirect.has(dep);\n const specifiers = importedPackages.get(dep) || new Set<string>([dep]);\n const resolvedPath = resolveDependencyFromPackage(resolveFromPackage, dep, specifiers);\n\n if (!resolvedPath) {\n if (direct) {\n const declaredManifest = resolveDeclaredPackageManifest(resolveFromPackage, dep);\n if (declaredManifest) {\n continue;\n }\n }\n issues.push({\n dependency: dep,\n status: 'broken',\n declaredDirect: direct,\n });\n continue;\n }\n\n if (direct) {\n continue;\n }\n\n if (transitiveNames.has(dep)) {\n issues.push({\n dependency: dep,\n status: 'transitive',\n declaredDirect: false,\n resolvedPath,\n });\n } else {\n issues.push({\n dependency: dep,\n status: 'hoist',\n declaredDirect: false,\n resolvedPath,\n });\n }\n }\n\n if (options.includePeerGaps) {\n const peerIssues = await collectMissingPeerDependencyIssues(\n pkgJson,\n declaredDirect,\n resolveFromPackage\n );\n for (const peerIssue of peerIssues) {\n const alreadyReported = issues.some((issue) => issue.dependency === peerIssue.dependency);\n if (!alreadyReported) {\n issues.push(peerIssue);\n }\n }\n }\n\n return {\n packageName: pkgJson.name,\n packagePath: absPackagePath,\n issues,\n };\n}\n\nexport async function collectWorkspacePackageDirs(\n root: string,\n options: CollectWorkspaceOptions = {}\n): Promise<string[]> {\n const absRoot = resolve(root);\n const out = new Set<string>();\n const rootPkgPath = join(absRoot, 'package.json');\n const rootPkg = (await loadPackageJson(rootPkgPath)) as\n | (PackageJson & { workspaces?: string[] })\n | null;\n const workspaces = rootPkg?.workspaces || [];\n\n for (const pattern of workspaces) {\n if (!WORKSPACE_SCAN_PREFIXES.some((prefix) => pattern.startsWith(prefix))) {\n continue;\n }\n const isPackagesWorkspace = pattern.startsWith('packages/');\n if (!isPackagesWorkspace && !options.includeNonPackageWorkspaces) {\n continue;\n }\n const matches = await expandWorkspacePattern(absRoot, pattern);\n for (const match of matches) {\n if (existsSync(join(match, 'package.json'))) {\n out.add(match);\n }\n }\n }\n\n return Array.from(out).sort();\n}\n\nasync function expandWorkspacePattern(root: string, pattern: string): Promise<string[]> {\n const normalized = pattern.replace(/\\\\/g, '/').replace(/\\/$/, '');\n if (!normalized.includes('*')) {\n return [join(root, normalized)];\n }\n\n const [prefix, suffix = ''] = normalized.split('*');\n const prefixPath = join(root, prefix);\n if (!existsSync(prefixPath)) {\n return [];\n }\n\n const dirEntries = await readdir(prefixPath, { withFileTypes: true });\n const matches: string[] = [];\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = join(prefixPath, entry.name, suffix);\n if (existsSync(candidate)) {\n matches.push(candidate);\n }\n }\n\n return matches;\n}\n\nfunction resolveDependencyFromPackage(\n resolveFromPackage: NodeRequire,\n dep: string,\n specifiers: Set<string>\n): string | null {\n const candidates = new Set<string>([...specifiers, dep]);\n for (const candidate of candidates) {\n try {\n return resolveFromPackage.resolve(candidate);\n } catch {\n // try next candidate\n }\n }\n return null;\n}\n\nfunction resolveDeclaredPackageManifest(\n resolveFromPackage: NodeRequire,\n dep: string\n): string | null {\n const searchPaths = resolveFromPackage.resolve.paths(dep) || [];\n for (const basePath of searchPaths) {\n const manifestPath = join(basePath, dep, 'package.json');\n if (existsSync(manifestPath)) {\n return manifestPath;\n }\n }\n return null;\n}\n\nasync function collectMissingPeerDependencyIssues(\n pkgJson: PackageJson,\n declaredDirect: Set<string>,\n resolveFromPackage: NodeRequire\n): Promise<ImportIntegrityIssue[]> {\n const issues: ImportIntegrityIssue[] = [];\n const checkedPeers = new Set<string>();\n\n for (const directDep of Array.from(declaredDirect)) {\n if (!directDep || directDep === pkgJson.name) continue;\n\n const depRoot = await resolvePackageRoot(resolveFromPackage, directDep);\n const depPkgPath =\n depRoot && existsSync(join(depRoot, 'package.json'))\n ? join(depRoot, 'package.json')\n : resolveDeclaredPackageManifest(resolveFromPackage, directDep);\n if (!depPkgPath || !existsSync(depPkgPath)) {\n continue;\n }\n\n const depPkg = (await loadPackageJson(depPkgPath).catch(() => null)) as PackageJson | null;\n if (!depPkg?.peerDependencies || typeof depPkg.peerDependencies !== 'object') {\n continue;\n }\n\n const optionalPeers = new Set<string>(\n Object.entries((depPkg.peerDependenciesMeta as Record<string, { optional?: boolean }>) || {})\n .filter(([, meta]) => meta?.optional)\n .map(([name]) => name)\n );\n\n for (const peerDep of Object.keys(depPkg.peerDependencies)) {\n if (!peerDep || peerDep === pkgJson.name || optionalPeers.has(peerDep)) continue;\n if (IGNORED_PEER_DEPENDENCIES.has(peerDep)) continue;\n if (declaredDirect.has(peerDep) || checkedPeers.has(peerDep)) continue;\n checkedPeers.add(peerDep);\n\n const resolvedPath = resolveDependencyFromPackage(\n resolveFromPackage,\n peerDep,\n new Set([peerDep])\n );\n issues.push({\n dependency: peerDep,\n status: 'peer',\n declaredDirect: false,\n resolvedPath: resolvedPath || undefined,\n requiredBy: directDep,\n });\n }\n }\n\n return issues;\n}\n\nasync function collectImportedPackages(sourceDir: string): Promise<Map<string, Set<string>>> {\n const files = await listSourceFiles(sourceDir);\n const imported = new Map<string, Set<string>>();\n\n for (const file of files) {\n const content = await readFile(file, 'utf-8');\n if (\n file.includes('/src/lib/element-imports.') ||\n content.includes('AUTO-GENERATED') ||\n content.includes('DO NOT EDIT MANUALLY')\n ) {\n continue;\n }\n for (const importedSpec of await extractBareImports(content)) {\n if (!imported.has(importedSpec.packageName)) {\n imported.set(importedSpec.packageName, new Set<string>());\n }\n imported.get(importedSpec.packageName)?.add(importedSpec.rawSpecifier);\n }\n }\n\n return imported;\n}\n\nasync function listSourceFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listSourceFiles(fullPath)));\n continue;\n }\n\n if (/\\.(ts|tsx|js|jsx|mjs|cjs)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nasync function extractBareImports(\n content: string\n): Promise<Array<{ packageName: string; rawSpecifier: string }>> {\n const imports = new Map<string, Set<string>>();\n try {\n await init;\n const [parsedImports] = parse(content);\n for (const parsed of parsedImports) {\n const rawSpecifier = (parsed as { n?: string }).n;\n if (!rawSpecifier) continue;\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (!dep) continue;\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n } catch {\n const staticPatterns = [\n /^\\s*import\\s+[^'\"]*?\\s+from\\s+['\"]([^'\"]+)['\"]/gm,\n /^\\s*import\\s*['\"]([^'\"]+)['\"]/gm,\n /^\\s*export\\s+[^'\"]*?\\s+from\\s+['\"]([^'\"]+)['\"]/gm,\n /(?:^|[^\\w$\"'`])import\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/gm,\n ];\n for (const pattern of staticPatterns) {\n let match: RegExpExecArray | null = pattern.exec(content);\n while (match !== null) {\n const rawSpecifier = match[1];\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (dep) {\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n match = pattern.exec(content);\n }\n }\n }\n\n const requireContent = stripComments(content);\n const requirePattern =\n /^\\s*(?:const|let|var)?[\\w${}\\s,*=:.[\\]-]*\\brequire\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/gm;\n let requireMatch: RegExpExecArray | null = requirePattern.exec(requireContent);\n while (requireMatch !== null) {\n const rawSpecifier = requireMatch[1];\n const dep = normalizeBarePackageSpecifier(rawSpecifier);\n if (dep) {\n if (!imports.has(dep)) {\n imports.set(dep, new Set<string>());\n }\n imports.get(dep)?.add(rawSpecifier);\n }\n requireMatch = requirePattern.exec(requireContent);\n }\n\n const out: Array<{ packageName: string; rawSpecifier: string }> = [];\n for (const [packageName, specifiers] of imports) {\n for (const rawSpecifier of specifiers) {\n out.push({ packageName, rawSpecifier });\n }\n }\n return out;\n}\n\nfunction stripComments(content: string): string {\n return content.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/(^|[^\\\\:])\\/\\/.*$/gm, '$1');\n}\n\nfunction normalizeBarePackageSpecifier(specifier: string): string | null {\n if (\n !specifier ||\n specifier.startsWith('.') ||\n specifier.startsWith('/') ||\n specifier.startsWith('node:') ||\n specifier.startsWith('$')\n ) {\n return null;\n }\n\n if (BUILTIN_SET.has(specifier)) {\n return null;\n }\n\n // Ignore virtual modules and URL/protocol specifiers.\n if (specifier.includes(':')) {\n return null;\n }\n\n if (!VALID_BARE_SPECIFIER.test(specifier)) {\n return null;\n }\n if (PLACEHOLDER_IMPORT_SPECIFIERS.has(specifier)) {\n return null;\n }\n\n if (specifier.startsWith('@')) {\n const parts = specifier.split('/');\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : null;\n }\n\n return specifier.split('/')[0] || null;\n}\n\nasync function collectTransitiveDependencyNames(\n resolveFromPackage: NodeRequire,\n roots: Set<string>\n): Promise<Set<string>> {\n const seen = new Set<string>();\n const queue = Array.from(roots);\n const transitive = new Set<string>();\n\n while (queue.length > 0) {\n const dep = queue.shift();\n if (!dep || seen.has(dep)) continue;\n seen.add(dep);\n transitive.add(dep);\n\n const root = await resolvePackageRoot(resolveFromPackage, dep);\n if (!root) continue;\n\n const pkgJsonPath = join(root, 'package.json');\n if (!existsSync(pkgJsonPath)) continue;\n\n let pkg: PackageJson | null = null;\n try {\n pkg = (await loadPackageJson(pkgJsonPath)) as PackageJson;\n } catch {\n pkg = null;\n }\n\n if (!pkg) continue;\n\n const childDeps = Object.keys(pkg.dependencies || {});\n for (const child of childDeps) {\n if (!seen.has(child)) queue.push(child);\n }\n }\n\n return transitive;\n}\n\nexport async function autoFixWorkspaceDependencyDeclarations(\n root: string,\n options: AutoFixDependencyOptions = {}\n): Promise<AutoFixDependencyResult> {\n const absRoot = resolve(root);\n const packageDirs = await collectWorkspacePackageDirs(absRoot, {\n includeNonPackageWorkspaces: options.includeNonPackageWorkspaces,\n });\n const catalog = await buildDependencyVersionCatalog(absRoot, packageDirs);\n const workspacePackages = await buildWorkspacePackageNameMap(packageDirs);\n\n let packagesScanned = 0;\n let packagesUpdated = 0;\n let dependenciesAdded = 0;\n const unresolved: Array<{ packageName: string; dependency: string }> = [];\n\n for (const packageDir of packageDirs) {\n const analysis = await analyzePackageDependencyIntegrity(packageDir, {\n includePeerGaps: options.includePeerGaps,\n });\n if (!analysis) continue;\n if (options.packageName && analysis.packageName !== options.packageName) {\n continue;\n }\n packagesScanned++;\n\n const pkgJsonPath = join(packageDir, 'package.json');\n const pkgJson = (await loadPackageJson(pkgJsonPath)) as PackageJson | null;\n if (!pkgJson) continue;\n\n const needs = analysis.issues.filter((issue) => {\n if (issue.declaredDirect) {\n return false;\n }\n if (issue.status === 'hoist' || issue.status === 'broken' || issue.status === 'peer') {\n return true;\n }\n return options.includeTransitive === true && issue.status === 'transitive';\n });\n\n if (needs.length === 0) {\n continue;\n }\n\n if (!pkgJson.dependencies || typeof pkgJson.dependencies !== 'object') {\n pkgJson.dependencies = {};\n }\n const deps = pkgJson.dependencies as Record<string, string>;\n\n let modified = false;\n for (const issue of needs) {\n if (deps[issue.dependency]) {\n continue;\n }\n\n const version = await resolveDependencyVersionForPackage(\n issue.dependency,\n pkgJsonPath,\n absRoot,\n catalog,\n workspacePackages\n );\n if (!version) {\n unresolved.push({ packageName: analysis.packageName, dependency: issue.dependency });\n continue;\n }\n\n deps[issue.dependency] = version;\n modified = true;\n dependenciesAdded++;\n }\n\n if (modified) {\n await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`, 'utf-8');\n packagesUpdated++;\n }\n }\n\n return {\n packagesScanned,\n packagesUpdated,\n dependenciesAdded,\n unresolved,\n };\n}\n\nexport async function buildWorkspacePackageNameMap(\n packageDirs: string[]\n): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n for (const packageDir of packageDirs) {\n const pkgPath = join(packageDir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n const pkg = (await loadPackageJson(pkgPath)) as PackageJson | null;\n if (pkg?.name) {\n map.set(pkg.name, packageDir);\n }\n }\n return map;\n}\n\nasync function buildDependencyVersionCatalog(\n rootDir: string,\n packageDirs: string[]\n): Promise<Map<string, string>> {\n const catalog = new Map<string, string>();\n\n const addVersions = (record?: Record<string, string>) => {\n if (!record) return;\n for (const [name, version] of Object.entries(record)) {\n if (!catalog.has(name)) {\n catalog.set(name, version);\n }\n }\n };\n\n const rootPkgPath = join(rootDir, 'package.json');\n if (existsSync(rootPkgPath)) {\n const rootPkg = (await loadPackageJson(rootPkgPath)) as PackageJson | null;\n if (rootPkg) {\n addVersions(rootPkg.dependencies as Record<string, string> | undefined);\n addVersions(rootPkg.devDependencies as Record<string, string> | undefined);\n addVersions(rootPkg.peerDependencies as Record<string, string> | undefined);\n addVersions(rootPkg.optionalDependencies as Record<string, string> | undefined);\n }\n }\n\n for (const packageDir of packageDirs) {\n const pkgPath = join(packageDir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n const pkg = (await loadPackageJson(pkgPath)) as PackageJson | null;\n if (!pkg) continue;\n addVersions(pkg.dependencies as Record<string, string> | undefined);\n addVersions(pkg.devDependencies as Record<string, string> | undefined);\n addVersions(pkg.peerDependencies as Record<string, string> | undefined);\n addVersions(pkg.optionalDependencies as Record<string, string> | undefined);\n }\n\n return catalog;\n}\n\nasync function resolveDependencyVersionForPackage(\n dep: string,\n pkgJsonPath: string,\n rootDir: string,\n catalog: Map<string, string>,\n workspacePackages: Map<string, string>\n): Promise<string | null> {\n if (workspacePackages.has(dep)) {\n return 'workspace:*';\n }\n\n const catalogVersion = catalog.get(dep);\n if (catalogVersion) {\n return catalogVersion;\n }\n\n if (FALLBACK_DEPENDENCY_VERSIONS[dep]) {\n return FALLBACK_DEPENDENCY_VERSIONS[dep];\n }\n\n const requireFromPackage = createRequire(pkgJsonPath);\n const packageRoot = await resolvePackageRoot(requireFromPackage, dep);\n if (!packageRoot) {\n return null;\n }\n\n const depPkgPath = join(packageRoot, 'package.json');\n if (!existsSync(depPkgPath)) {\n return null;\n }\n\n const depPkg = (await loadPackageJson(depPkgPath)) as PackageJson | null;\n if (!depPkg?.version) {\n return null;\n }\n\n // Keep workspace references if dependency resolves to local workspace package path.\n if (\n packageRoot.startsWith(join(rootDir, 'packages')) ||\n packageRoot.startsWith(join(rootDir, 'apps'))\n ) {\n return 'workspace:*';\n }\n\n return `^${depPkg.version}`;\n}\n\nasync function resolvePackageRoot(\n resolveFromPackage: NodeRequire,\n dep: string\n): Promise<string | null> {\n let resolvedFile: string;\n try {\n resolvedFile = resolveFromPackage.resolve(dep);\n } catch {\n return null;\n }\n\n let current = dirname(resolvedFile);\n const floor = dirname(current);\n while (current !== floor) {\n const pkgJsonPath = join(current, 'package.json');\n if (existsSync(pkgJsonPath)) {\n try {\n const pkg = (await loadPackageJson(pkgJsonPath)) as PackageJson;\n if (pkg.name === dep) {\n return current;\n }\n } catch {\n // ignore parse/load errors and keep walking\n }\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface WorkspaceResolutionIssue {
|
|
2
|
+
dependency: string;
|
|
3
|
+
expectedPath?: string;
|
|
4
|
+
resolvedPath?: string;
|
|
5
|
+
reason: string;
|
|
6
|
+
}
|
|
7
|
+
/** Check package identity without loading an entry point (dist may not exist yet). */
|
|
8
|
+
export declare function checkWorkspaceResolution(manifestPath: string, workspacePackages: ReadonlyMap<string, string>): WorkspaceResolutionIssue[];
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { lstatSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const DEPENDENCY_FIELDS = [
|
|
5
|
+
'dependencies',
|
|
6
|
+
'devDependencies',
|
|
7
|
+
'optionalDependencies',
|
|
8
|
+
'peerDependencies',
|
|
9
|
+
];
|
|
10
|
+
/** Check package identity without loading an entry point (dist may not exist yet). */
|
|
11
|
+
export function checkWorkspaceResolution(manifestPath, workspacePackages) {
|
|
12
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
13
|
+
const dependencies = new Set(DEPENDENCY_FIELDS.flatMap((field) => Object.entries(manifest[field] ?? {})
|
|
14
|
+
.filter(([, range]) => range.startsWith('workspace:'))
|
|
15
|
+
.map(([name]) => name)));
|
|
16
|
+
const requireFromConsumer = createRequire(manifestPath);
|
|
17
|
+
const issues = [];
|
|
18
|
+
for (const dependency of [...dependencies].sort()) {
|
|
19
|
+
const expectedPath = workspacePackages.get(dependency);
|
|
20
|
+
const lookupPaths = requireFromConsumer.resolve.paths(dependency) ?? [];
|
|
21
|
+
const installedPath = lookupPaths
|
|
22
|
+
.map((base) => join(base, dependency))
|
|
23
|
+
.find((candidate) => lstatSync(candidate, { throwIfNoEntry: false }));
|
|
24
|
+
let resolvedPath;
|
|
25
|
+
let installedName;
|
|
26
|
+
if (installedPath) {
|
|
27
|
+
try {
|
|
28
|
+
resolvedPath = realpathSync(installedPath);
|
|
29
|
+
installedName = JSON.parse(readFileSync(join(resolvedPath, 'package.json'), 'utf8')).name;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Keep the installed path in the diagnostic for dangling links and invalid manifests.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (expectedPath &&
|
|
36
|
+
resolvedPath === realpathSync(expectedPath) &&
|
|
37
|
+
installedName === dependency) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
issues.push({
|
|
41
|
+
dependency,
|
|
42
|
+
expectedPath,
|
|
43
|
+
resolvedPath: resolvedPath ?? installedPath,
|
|
44
|
+
reason: !expectedPath
|
|
45
|
+
? 'No workspace declares this package'
|
|
46
|
+
: !installedPath
|
|
47
|
+
? 'Workspace dependency is not installed'
|
|
48
|
+
: !installedName
|
|
49
|
+
? 'Workspace entry is broken or has no valid package manifest'
|
|
50
|
+
: 'Installed package does not resolve to the declared workspace',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return issues;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=workspace-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-resolution.js","sourceRoot":"","sources":["../../src/utils/workspace-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,iBAAiB,GAAG;IACxB,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,kBAAkB;CACV,CAAC;AAEX,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CACtC,YAAoB,EACpB,iBAA8C;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAG7D,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CACzB,CACF,CAAC;IACF,MAAM,mBAAmB,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxE,MAAM,aAAa,GAAG,WAAW;aAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;aACrC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,YAAgC,CAAC;QACrC,IAAI,aAAiC,CAAC;QACtC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC3C,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5F,CAAC;YAAC,MAAM,CAAC;gBACP,sFAAsF;YACxF,CAAC;QACH,CAAC;QACD,IACE,YAAY;YACZ,YAAY,KAAK,YAAY,CAAC,YAAY,CAAC;YAC3C,aAAa,KAAK,UAAU,EAC5B,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,UAAU;YACV,YAAY;YACZ,YAAY,EAAE,YAAY,IAAI,aAAa;YAC3C,MAAM,EAAE,CAAC,YAAY;gBACnB,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,CAAC,aAAa;oBACd,CAAC,CAAC,uCAAuC;oBACzC,CAAC,CAAC,CAAC,aAAa;wBACd,CAAC,CAAC,4DAA4D;wBAC9D,CAAC,CAAC,8DAA8D;SACvE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { lstatSync, readFileSync, realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\n\nexport interface WorkspaceResolutionIssue {\n dependency: string;\n expectedPath?: string;\n resolvedPath?: string;\n reason: string;\n}\n\nconst DEPENDENCY_FIELDS = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n 'peerDependencies',\n] as const;\n\n/** Check package identity without loading an entry point (dist may not exist yet). */\nexport function checkWorkspaceResolution(\n manifestPath: string,\n workspacePackages: ReadonlyMap<string, string>\n): WorkspaceResolutionIssue[] {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as Record<\n string,\n Record<string, string> | undefined\n >;\n const dependencies = new Set(\n DEPENDENCY_FIELDS.flatMap((field) =>\n Object.entries(manifest[field] ?? {})\n .filter(([, range]) => range.startsWith('workspace:'))\n .map(([name]) => name)\n )\n );\n const requireFromConsumer = createRequire(manifestPath);\n const issues: WorkspaceResolutionIssue[] = [];\n for (const dependency of [...dependencies].sort()) {\n const expectedPath = workspacePackages.get(dependency);\n const lookupPaths = requireFromConsumer.resolve.paths(dependency) ?? [];\n const installedPath = lookupPaths\n .map((base) => join(base, dependency))\n .find((candidate) => lstatSync(candidate, { throwIfNoEntry: false }));\n let resolvedPath: string | undefined;\n let installedName: string | undefined;\n if (installedPath) {\n try {\n resolvedPath = realpathSync(installedPath);\n installedName = JSON.parse(readFileSync(join(resolvedPath, 'package.json'), 'utf8')).name;\n } catch {\n // Keep the installed path in the diagnostic for dangling links and invalid manifests.\n }\n }\n if (\n expectedPath &&\n resolvedPath === realpathSync(expectedPath) &&\n installedName === dependency\n ) {\n continue;\n }\n issues.push({\n dependency,\n expectedPath,\n resolvedPath: resolvedPath ?? installedPath,\n reason: !expectedPath\n ? 'No workspace declares this package'\n : !installedPath\n ? 'Workspace dependency is not installed'\n : !installedName\n ? 'Workspace entry is broken or has no valid package manifest'\n : 'Installed package does not resolve to the declared workspace',\n });\n }\n return issues;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/cli",
|
|
3
|
-
"version": "0.1.6
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "CLI tools for managing PIE Elements NG",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@oclif/core": "^5.1.8",
|
|
25
25
|
"@oclif/plugin-help": "^7.0.4",
|
|
26
|
-
"@pie-element/element-bundler": "0.1.5
|
|
26
|
+
"@pie-element/element-bundler": "0.1.5",
|
|
27
27
|
"es-module-lexer": "^3.0.3",
|
|
28
28
|
"glob": "^13.0.0",
|
|
29
29
|
"open": "^11.0.4",
|