@rsdk/yarn.constraints 6.0.0-next.39 → 6.0.0-next.40
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/DEPENDENCY_MODEL.md +452 -0
- package/README.MD +24 -0
- package/__tests__/compatibility.test.ts +321 -0
- package/__tests__/engine.test.ts +1002 -0
- package/__tests__/fixtures/imports/bin.js +4 -0
- package/__tests__/fixtures/imports/export-entry.mjs +1 -0
- package/__tests__/fixtures/imports/root-entry.js +3 -0
- package/__tests__/fixtures/imports/src/common.cjs +3 -0
- package/__tests__/fixtures/imports/src/common.cts +3 -0
- package/__tests__/fixtures/imports/src/component.tsx +4 -0
- package/__tests__/fixtures/imports/src/index.ts +13 -0
- package/__tests__/fixtures/imports/src/module.mjs +3 -0
- package/__tests__/fixtures/imports/src/module.mts +3 -0
- package/__tests__/fixtures/imports/src/plain.js +3 -0
- package/__tests__/fixtures/imports/src/test-only-usage.ts +1 -0
- package/__tests__/imports.test.ts +206 -0
- package/__tests__/manifest-writer.test.ts +157 -0
- package/dist/ansi.d.ts +9 -0
- package/dist/ansi.js +24 -0
- package/dist/ansi.js.map +1 -0
- package/dist/bin/depdoc.d.ts +2 -0
- package/dist/bin/depdoc.js +157 -0
- package/dist/bin/depdoc.js.map +1 -0
- package/dist/collectors/config.d.ts +2 -0
- package/dist/collectors/config.js +25 -0
- package/dist/collectors/config.js.map +1 -0
- package/dist/collectors/external-metadata.d.ts +5 -0
- package/dist/collectors/external-metadata.js +110 -0
- package/dist/collectors/external-metadata.js.map +1 -0
- package/dist/collectors/package-extensions.d.ts +3 -0
- package/dist/collectors/package-extensions.js +43 -0
- package/dist/collectors/package-extensions.js.map +1 -0
- package/dist/collectors/type-providers.d.ts +3 -0
- package/dist/collectors/type-providers.js +46 -0
- package/dist/collectors/type-providers.js.map +1 -0
- package/dist/collectors/workspaces.d.ts +2 -0
- package/dist/collectors/workspaces.js +88 -0
- package/dist/collectors/workspaces.js.map +1 -0
- package/dist/dependency-model.d.ts +11 -0
- package/dist/dependency-model.js +18 -0
- package/dist/dependency-model.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +13 -33
- package/dist/index.js.map +1 -1
- package/dist/lib/imports.d.ts +9 -0
- package/dist/lib/imports.js +249 -0
- package/dist/lib/imports.js.map +1 -0
- package/dist/lib/package-json.d.ts +21 -0
- package/dist/lib/package-json.js +32 -0
- package/dist/lib/package-json.js.map +1 -0
- package/dist/model/diagnostics.d.ts +4 -0
- package/dist/model/diagnostics.js +273 -0
- package/dist/model/diagnostics.js.map +1 -0
- package/dist/model/engine.d.ts +5 -0
- package/dist/model/engine.js +52 -0
- package/dist/model/engine.js.map +1 -0
- package/dist/model/expected.d.ts +20 -0
- package/dist/model/expected.js +89 -0
- package/dist/model/expected.js.map +1 -0
- package/dist/model/peer-propagation.d.ts +2 -0
- package/dist/model/peer-propagation.js +124 -0
- package/dist/model/peer-propagation.js.map +1 -0
- package/dist/model/placement.d.ts +9 -0
- package/dist/model/placement.js +205 -0
- package/dist/model/placement.js.map +1 -0
- package/dist/model/rules.d.ts +14 -0
- package/dist/model/rules.js +46 -0
- package/dist/model/rules.js.map +1 -0
- package/dist/model/types.d.ts +117 -0
- package/dist/model/types.js +9 -0
- package/dist/model/types.js.map +1 -0
- package/dist/model/versions.d.ts +3 -0
- package/dist/model/versions.js +73 -0
- package/dist/model/versions.js.map +1 -0
- package/dist/reporting.d.ts +3 -0
- package/dist/reporting.js +80 -0
- package/dist/reporting.js.map +1 -0
- package/dist/runner.d.ts +2 -0
- package/dist/runner.js +70 -0
- package/dist/runner.js.map +1 -0
- package/dist/writer/manifest-writer.d.ts +2 -0
- package/dist/writer/manifest-writer.js +72 -0
- package/dist/writer/manifest-writer.js.map +1 -0
- package/eslint.config.cjs +3 -0
- package/jest.config.js +1 -0
- package/package.json +7 -3
- package/src/ansi.ts +23 -0
- package/src/bin/depdoc.ts +213 -0
- package/src/collectors/config.ts +26 -0
- package/src/collectors/external-metadata.ts +148 -0
- package/src/collectors/package-extensions.ts +52 -0
- package/src/collectors/type-providers.ts +51 -0
- package/src/collectors/workspaces.ts +99 -0
- package/src/dependency-model.ts +26 -0
- package/src/index.ts +28 -45
- package/src/lib/imports.ts +293 -0
- package/src/lib/package-json.ts +46 -0
- package/src/model/diagnostics.ts +328 -0
- package/src/model/engine.ts +120 -0
- package/src/model/expected.ts +141 -0
- package/src/model/peer-propagation.ts +199 -0
- package/src/model/placement.ts +372 -0
- package/src/model/rules.ts +73 -0
- package/src/model/types.ts +164 -0
- package/src/model/versions.ts +109 -0
- package/src/reporting.ts +117 -0
- package/src/runner.ts +102 -0
- package/src/writer/manifest-writer.ts +111 -0
- package/tsconfig.build.json +1 -0
- package/tsconfig.json +6 -1
- package/dist/constraint-schema.d.ts +0 -1
- package/dist/constraint-schema.js +0 -17
- package/dist/constraint-schema.js.map +0 -1
- package/dist/dependency-checker.d.ts +0 -8
- package/dist/dependency-checker.js +0 -40
- package/dist/dependency-checker.js.map +0 -1
- package/src/constraint-schema.ts +0 -20
- package/src/dependency-checker.ts +0 -41
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared dependency-model contracts.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the data exchanged between collectors, the pure model
|
|
5
|
+
* engine, the manifest writer, and CLI reporting. It intentionally contains no
|
|
6
|
+
* filesystem or Yarn logic; callers should pass already collected facts.
|
|
7
|
+
*/
|
|
8
|
+
import type { PackageJson } from '../lib/package-json';
|
|
9
|
+
export type SectionType = 'dependencies' | 'peerDependencies' | 'devDependencies';
|
|
10
|
+
export type WorkspaceRole = 'library' | 'service' | 'cli';
|
|
11
|
+
export interface DependencyRule {
|
|
12
|
+
match: string | string[];
|
|
13
|
+
workspace?: string | string[];
|
|
14
|
+
section?: SectionType;
|
|
15
|
+
version?: string;
|
|
16
|
+
rootOnly?: boolean;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface DependencyModelConfig {
|
|
20
|
+
version?: number;
|
|
21
|
+
rules?: DependencyRule[];
|
|
22
|
+
doctor?: DoctorConfig;
|
|
23
|
+
}
|
|
24
|
+
export interface DoctorConfig {
|
|
25
|
+
buildCmd?: string;
|
|
26
|
+
lintCmd?: string;
|
|
27
|
+
typecheckCmd?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DependencyModelOptions {
|
|
30
|
+
rootDir?: string;
|
|
31
|
+
constraintsPath?: string;
|
|
32
|
+
fix?: boolean;
|
|
33
|
+
withDts?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface DependencyViolation {
|
|
36
|
+
code: 'root-private' | 'root-section' | 'role-missing' | 'role-invalid' | 'forbidden-section' | 'missing' | 'wrong-section' | 'wrong-range' | 'root-only' | 'root-only-usage' | 'unconstrained-version' | 'mirror' | 'stale' | 'dist-missing';
|
|
37
|
+
workspace: string;
|
|
38
|
+
workspaceLocation: string;
|
|
39
|
+
dependency?: string | undefined;
|
|
40
|
+
actualSection?: SectionType | undefined;
|
|
41
|
+
expectedSection?: SectionType | undefined;
|
|
42
|
+
actualRange?: string | undefined;
|
|
43
|
+
expectedRange?: string | undefined;
|
|
44
|
+
message: string;
|
|
45
|
+
}
|
|
46
|
+
export interface DependencyWarning {
|
|
47
|
+
code: 'bin-role-mismatch';
|
|
48
|
+
workspace?: string | undefined;
|
|
49
|
+
workspaceLocation?: string | undefined;
|
|
50
|
+
dependency?: string | undefined;
|
|
51
|
+
message: string;
|
|
52
|
+
}
|
|
53
|
+
export interface UsageSummary {
|
|
54
|
+
files: Set<string>;
|
|
55
|
+
runtimeFiles: Set<string>;
|
|
56
|
+
typeOnlyFiles: Set<string>;
|
|
57
|
+
}
|
|
58
|
+
export interface WorkspaceFacts {
|
|
59
|
+
name: string;
|
|
60
|
+
location: string;
|
|
61
|
+
pkg: PackageJson;
|
|
62
|
+
role: WorkspaceRole | undefined;
|
|
63
|
+
isRoot: boolean;
|
|
64
|
+
sourceUsage: Map<string, UsageSummary>;
|
|
65
|
+
dtsImports: Set<string>;
|
|
66
|
+
hasSrc: boolean;
|
|
67
|
+
hasDist: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface WorkspaceContext extends WorkspaceFacts {
|
|
70
|
+
dir: string;
|
|
71
|
+
}
|
|
72
|
+
export interface DependencyModelFacts {
|
|
73
|
+
workspaces: WorkspaceFacts[];
|
|
74
|
+
externalPeerMetadata: Map<string, Map<string, string> | null>;
|
|
75
|
+
externalTypeMetadata?: Map<string, {
|
|
76
|
+
hasBundledTypes: boolean;
|
|
77
|
+
}>;
|
|
78
|
+
typeProviderPackages?: Set<string>;
|
|
79
|
+
rules: DependencyRule[];
|
|
80
|
+
withDts?: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface DependencyModelOutput {
|
|
83
|
+
violations: DependencyViolation[];
|
|
84
|
+
warnings: DependencyWarning[];
|
|
85
|
+
expected: Map<string, ExpectedWorkspace>;
|
|
86
|
+
}
|
|
87
|
+
export interface DependencyModelResult {
|
|
88
|
+
rootDir: string;
|
|
89
|
+
violations: DependencyViolation[];
|
|
90
|
+
warnings: DependencyWarning[];
|
|
91
|
+
contexts: WorkspaceContext[];
|
|
92
|
+
expected: Map<string, ExpectedWorkspace>;
|
|
93
|
+
config: DependencyModelConfig;
|
|
94
|
+
}
|
|
95
|
+
export interface Reason {
|
|
96
|
+
kind: 'declared' | 'source-runtime' | 'source-public-type' | 'source-private-dev' | 'rule' | 'root-only' | 'dts-provider' | 'peer-propagation' | 'mirror' | 'version' | 'required-rule';
|
|
97
|
+
detail: string;
|
|
98
|
+
}
|
|
99
|
+
export interface ExpectedWorkspace {
|
|
100
|
+
workspace: WorkspaceFacts;
|
|
101
|
+
sections: Record<SectionType, Map<string, string>>;
|
|
102
|
+
reasons: Map<string, Reason[]>;
|
|
103
|
+
}
|
|
104
|
+
export interface EffectiveRule {
|
|
105
|
+
section?: SectionType;
|
|
106
|
+
version?: string;
|
|
107
|
+
rootOnly: boolean;
|
|
108
|
+
required?: boolean;
|
|
109
|
+
}
|
|
110
|
+
export interface PackageExtension {
|
|
111
|
+
dependencies?: Record<string, string>;
|
|
112
|
+
peerDependencies?: Record<string, string>;
|
|
113
|
+
peerDependenciesMeta?: Record<string, {
|
|
114
|
+
optional?: boolean;
|
|
115
|
+
}>;
|
|
116
|
+
}
|
|
117
|
+
export declare const SECTIONS: SectionType[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":";;;AA+Ja,QAAA,QAAQ,GAAkB;IACrC,cAAc;IACd,kBAAkB;IAClB,iBAAiB;CAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DependencyRule, DependencyViolation, ExpectedWorkspace, WorkspaceFacts } from './types';
|
|
2
|
+
export declare function applyVersionRules(expectedByLocation: Map<string, ExpectedWorkspace>, root: WorkspaceFacts, workspaceNames: Set<string>, rules: DependencyRule[]): void;
|
|
3
|
+
export declare function collectUnconstrainedVersionViolations(workspaces: WorkspaceFacts[], expectedByLocation: Map<string, ExpectedWorkspace>, rules: DependencyRule[]): DependencyViolation[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyVersionRules = applyVersionRules;
|
|
4
|
+
exports.collectUnconstrainedVersionViolations = collectUnconstrainedVersionViolations;
|
|
5
|
+
/**
|
|
6
|
+
* Version normalization and version-rule diagnostics.
|
|
7
|
+
*
|
|
8
|
+
* The placement engine decides where dependencies belong. This module applies
|
|
9
|
+
* version rules after placement and checks the invariant that repeated external
|
|
10
|
+
* dependencies have a global version rule.
|
|
11
|
+
*/
|
|
12
|
+
const expected_1 = require("./expected");
|
|
13
|
+
const placement_1 = require("./placement");
|
|
14
|
+
const rules_1 = require("./rules");
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
function applyVersionRules(expectedByLocation, root, workspaceNames, rules) {
|
|
17
|
+
for (const expected of expectedByLocation.values()) {
|
|
18
|
+
for (const section of types_1.SECTIONS) {
|
|
19
|
+
for (const [depIdent, range] of expected.sections[section]) {
|
|
20
|
+
const nextRange = (0, placement_1.resolveExpectedRangeAfterRulePass)(root, expected, workspaceNames, rules, depIdent, range);
|
|
21
|
+
if (nextRange !== range) {
|
|
22
|
+
expected.sections[section].set(depIdent, nextRange);
|
|
23
|
+
(0, expected_1.addReason)(expected, depIdent, {
|
|
24
|
+
kind: 'version',
|
|
25
|
+
detail: `${depIdent} range resolved to ${nextRange}`,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function collectUnconstrainedVersionViolations(workspaces, expectedByLocation, rules) {
|
|
33
|
+
const workspaceNames = new Set(workspaces.filter((ws) => !ws.isRoot).map((ws) => ws.name));
|
|
34
|
+
const occurrences = new Map();
|
|
35
|
+
const ranges = new Map();
|
|
36
|
+
const addOccurrence = (workspace, section, depIdent, range) => {
|
|
37
|
+
if (!(0, placement_1.isExternal)(depIdent, workspaceNames) || range.startsWith('workspace:'))
|
|
38
|
+
return;
|
|
39
|
+
if (!occurrences.has(depIdent))
|
|
40
|
+
occurrences.set(depIdent, new Set());
|
|
41
|
+
if (!ranges.has(depIdent))
|
|
42
|
+
ranges.set(depIdent, new Set());
|
|
43
|
+
occurrences.get(depIdent).add(`${workspace.location}:${section}`);
|
|
44
|
+
ranges.get(depIdent).add(range);
|
|
45
|
+
};
|
|
46
|
+
for (const workspace of workspaces) {
|
|
47
|
+
for (const section of types_1.SECTIONS) {
|
|
48
|
+
for (const [depIdent, range] of Object.entries(workspace.pkg[section] ?? {})) {
|
|
49
|
+
addOccurrence(workspace, section, depIdent, range);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const expected of expectedByLocation.values()) {
|
|
54
|
+
for (const section of types_1.SECTIONS) {
|
|
55
|
+
for (const [depIdent, range] of expected.sections[section]) {
|
|
56
|
+
addOccurrence(expected.workspace, section, depIdent, range);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return [...occurrences.entries()]
|
|
61
|
+
.filter(([depIdent, byOccurrence]) => byOccurrence.size > 1 && !(0, rules_1.hasGlobalVersionRule)(rules, depIdent))
|
|
62
|
+
.map(([depIdent, byOccurrence]) => {
|
|
63
|
+
const rangeList = [...(ranges.get(depIdent) ?? [])].join(', ');
|
|
64
|
+
return {
|
|
65
|
+
code: 'unconstrained-version',
|
|
66
|
+
workspace: '<root>',
|
|
67
|
+
workspaceLocation: '.',
|
|
68
|
+
dependency: depIdent,
|
|
69
|
+
message: `${depIdent} appears ${byOccurrence.size} times without a global version rule (${rangeList})`,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/model/versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DependencyModelResult } from './model/types';
|
|
2
|
+
export declare function formatDependencyModelResult(result: DependencyModelResult): string;
|
|
3
|
+
export declare function explainDependency(result: DependencyModelResult, workspaceSelector: string, depIdent: string): string;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatDependencyModelResult = formatDependencyModelResult;
|
|
4
|
+
exports.explainDependency = explainDependency;
|
|
5
|
+
/**
|
|
6
|
+
* CLI-oriented dependency model reporting.
|
|
7
|
+
*
|
|
8
|
+
* The engine returns structured diagnostics and reason trails. This module
|
|
9
|
+
* turns them into stable human-readable text for `check`, `fix`, and `explain`.
|
|
10
|
+
*/
|
|
11
|
+
const expected_1 = require("./model/expected");
|
|
12
|
+
const ansi_1 = require("./ansi");
|
|
13
|
+
function formatDependencyModelResult(result) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
for (const violation of result.violations) {
|
|
16
|
+
const dep = violation.dependency ? ` ${violation.dependency}` : '';
|
|
17
|
+
const location = violation.workspaceLocation === '.'
|
|
18
|
+
? ''
|
|
19
|
+
: ` (${violation.workspaceLocation})`;
|
|
20
|
+
lines.push(`${ansi_1.ansi.red('✖')} ${ansi_1.ansi.bold(violation.workspace)}${ansi_1.ansi.dim(location)}${ansi_1.ansi.red(dep)}: ${violation.message}`);
|
|
21
|
+
}
|
|
22
|
+
for (const warning of result.warnings) {
|
|
23
|
+
const workspace = warning.workspace ? `${warning.workspace}: ` : '';
|
|
24
|
+
lines.push(`${ansi_1.ansi.yellow('⚠')} ${ansi_1.ansi.bold(workspace)}${warning.message}`);
|
|
25
|
+
}
|
|
26
|
+
if (result.violations.length === 0) {
|
|
27
|
+
lines.push(`${ansi_1.ansi.green('✓')} ${ansi_1.ansi.bold('dependency model is consistent')}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
lines.push(`${ansi_1.ansi.red('✖')} ${ansi_1.ansi.bold(`${result.violations.length} dependency model violation(s)`)}`);
|
|
31
|
+
}
|
|
32
|
+
if (result.warnings.length > 0) {
|
|
33
|
+
lines.push(`${ansi_1.ansi.yellow('⚠')} ${ansi_1.ansi.bold(`${result.warnings.length} warning(s)`)}`);
|
|
34
|
+
}
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
function explainDependency(result, workspaceSelector, depIdent) {
|
|
38
|
+
const workspace = result.contexts.find((ctx) => ctx.name === workspaceSelector ||
|
|
39
|
+
ctx.location === workspaceSelector ||
|
|
40
|
+
(workspaceSelector === '<root>' && ctx.isRoot));
|
|
41
|
+
if (!workspace) {
|
|
42
|
+
return `Workspace not found: ${workspaceSelector}`;
|
|
43
|
+
}
|
|
44
|
+
const expected = result.expected.get(workspace.location);
|
|
45
|
+
if (!expected) {
|
|
46
|
+
return `No dependency model data for workspace: ${workspaceSelector}`;
|
|
47
|
+
}
|
|
48
|
+
const actualSection = (0, expected_1.getDeclaredSection)(workspace.pkg, depIdent);
|
|
49
|
+
const actualRange = (0, expected_1.getDeclaredRange)(workspace.pkg, depIdent);
|
|
50
|
+
const expectedSection = (0, expected_1.getExpectedSection)(expected, depIdent);
|
|
51
|
+
const expectedRange = (0, expected_1.getExpectedRange)(expected, depIdent);
|
|
52
|
+
const reasons = expected.reasons.get(depIdent) ?? [];
|
|
53
|
+
const lines = [
|
|
54
|
+
`${ansi_1.ansi.bold(workspace.name)} ${ansi_1.ansi.dim(`(${workspace.location})`)}`,
|
|
55
|
+
ansi_1.ansi.cyan(depIdent),
|
|
56
|
+
`${ansi_1.ansi.bold('actual:')} ${actualSection ? `${ansi_1.ansi.yellow(actualSection)}@${actualRange}` : ansi_1.ansi.dim('not declared')}`,
|
|
57
|
+
`${ansi_1.ansi.bold('expected:')} ${expectedSection ? `${ansi_1.ansi.green(expectedSection)}@${expectedRange}` : ansi_1.ansi.dim('not required')}`,
|
|
58
|
+
];
|
|
59
|
+
if (actualSection && !expectedSection) {
|
|
60
|
+
lines.push(`${ansi_1.ansi.bold('status:')} ${ansi_1.ansi.yellow('actual dependency is stale in the derived model')}`);
|
|
61
|
+
}
|
|
62
|
+
if (reasons.length > 0) {
|
|
63
|
+
lines.push(ansi_1.ansi.bold('reasons:'));
|
|
64
|
+
for (const reason of reasons) {
|
|
65
|
+
lines.push(` - ${ansi_1.ansi.magenta(reason.kind)}: ${reason.detail}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const usage = workspace.sourceUsage.get(depIdent);
|
|
69
|
+
if (usage) {
|
|
70
|
+
lines.push(ansi_1.ansi.bold('source imports:'));
|
|
71
|
+
for (const file of [...usage.files].sort()) {
|
|
72
|
+
lines.push(` - ${ansi_1.ansi.dim(file)}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (workspace.dtsImports.has(depIdent)) {
|
|
76
|
+
lines.push(`${ansi_1.ansi.bold('public type surface:')} ${ansi_1.ansi.green('appears in dist/**/*.d.ts')}`);
|
|
77
|
+
}
|
|
78
|
+
return lines.join('\n');
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=reporting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporting.js","sourceRoot":"","sources":["../src/reporting.ts"],"names":[],"mappings":";;AAeA,kEAsCC;AAED,8CA6DC;AApHD;;;;;GAKG;AACH,+CAK0B;AAE1B,iCAA8B;AAE9B,SAAgB,2BAA2B,CACzC,MAA6B;IAE7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,QAAQ,GACZ,SAAS,CAAC,iBAAiB,KAAK,GAAG;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,KAAK,SAAS,CAAC,iBAAiB,GAAG,CAAC;QAE1C,KAAK,CAAC,IAAI,CACR,GAAG,WAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,WAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,WAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,OAAO,EAAE,CAChH,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,GAAG,WAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,gCAAgC,CAAC,EAAE,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,GAAG,WAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,iBAAiB,CAC/B,MAA6B,EAC7B,iBAAyB,EACzB,QAAgB;IAEhB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CACpC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,KAAK,iBAAiB;QAC9B,GAAG,CAAC,QAAQ,KAAK,iBAAiB;QAClC,CAAC,iBAAiB,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,CACjD,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,wBAAwB,iBAAiB,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,2CAA2C,iBAAiB,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,6BAAkB,EAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAA,6BAAkB,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,2BAAgB,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG;QACZ,GAAG,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE;QACrE,WAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnB,GAAG,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,WAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;QACtH,GAAG,WAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,WAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,WAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;KAC9H,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CACR,GAAG,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,WAAI,CAAC,MAAM,CAAC,iDAAiD,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,WAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,WAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,WAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,OAAO,WAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CACR,GAAG,WAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,WAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/runner.d.ts
ADDED
package/dist/runner.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDependencyModel = runDependencyModel;
|
|
4
|
+
/**
|
|
5
|
+
* Dependency model runner.
|
|
6
|
+
*
|
|
7
|
+
* The runner coordinates impure work: locating the repo root, collecting facts,
|
|
8
|
+
* iterating external metadata discovery, invoking the pure engine, and applying
|
|
9
|
+
* manifest fixes when requested.
|
|
10
|
+
*/
|
|
11
|
+
const config_1 = require("./collectors/config");
|
|
12
|
+
const external_metadata_1 = require("./collectors/external-metadata");
|
|
13
|
+
const package_extensions_1 = require("./collectors/package-extensions");
|
|
14
|
+
const type_providers_1 = require("./collectors/type-providers");
|
|
15
|
+
const workspaces_1 = require("./collectors/workspaces");
|
|
16
|
+
const package_json_1 = require("./lib/package-json");
|
|
17
|
+
const engine_1 = require("./model/engine");
|
|
18
|
+
const manifest_writer_1 = require("./writer/manifest-writer");
|
|
19
|
+
function runDependencyModel(options = {}) {
|
|
20
|
+
const rootDir = options.rootDir ?? (0, package_json_1.findMonorepoRoot)(process.cwd());
|
|
21
|
+
if (!rootDir) {
|
|
22
|
+
throw new Error('Unable to find monorepo root');
|
|
23
|
+
}
|
|
24
|
+
const config = (0, config_1.loadConfig)(rootDir, options.constraintsPath);
|
|
25
|
+
const rules = config.rules ?? [];
|
|
26
|
+
const withDts = options.withDts === true;
|
|
27
|
+
const contexts = (0, workspaces_1.loadWorkspaces)(rootDir, withDts);
|
|
28
|
+
const packageExtensions = (0, package_extensions_1.loadPackageExtensions)(rootDir);
|
|
29
|
+
const workspaceNames = new Set(contexts.filter((ws) => !ws.isRoot).map((ws) => ws.name));
|
|
30
|
+
const typeProviderPackages = (0, type_providers_1.collectTypeProviderPackages)(rootDir, contexts[0].pkg, rules);
|
|
31
|
+
const externalPeerMetadata = new Map();
|
|
32
|
+
const externalTypeMetadata = new Map();
|
|
33
|
+
const providerIdents = (0, external_metadata_1.collectExternalProviderIdents)(contexts, workspaceNames);
|
|
34
|
+
let output = null;
|
|
35
|
+
for (let pass = 0; pass < 10; pass++) {
|
|
36
|
+
(0, external_metadata_1.collectExternalMetadata)(rootDir, packageExtensions, providerIdents, externalPeerMetadata, externalTypeMetadata);
|
|
37
|
+
output = (0, engine_1.deriveDependencyModel)({
|
|
38
|
+
workspaces: contexts,
|
|
39
|
+
externalPeerMetadata,
|
|
40
|
+
externalTypeMetadata,
|
|
41
|
+
typeProviderPackages,
|
|
42
|
+
rules,
|
|
43
|
+
...(withDts ? { withDts: true } : {}),
|
|
44
|
+
});
|
|
45
|
+
let changed = false;
|
|
46
|
+
for (const ident of (0, external_metadata_1.collectExternalProviderIdents)(contexts, workspaceNames, output.expected)) {
|
|
47
|
+
if (providerIdents.has(ident))
|
|
48
|
+
continue;
|
|
49
|
+
providerIdents.add(ident);
|
|
50
|
+
changed = true;
|
|
51
|
+
}
|
|
52
|
+
if (!changed)
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (!output) {
|
|
56
|
+
throw new Error('Unable to derive dependency model');
|
|
57
|
+
}
|
|
58
|
+
if (options.fix && output.violations.length > 0) {
|
|
59
|
+
(0, manifest_writer_1.writeFixes)(rootDir, output.expected);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
rootDir,
|
|
63
|
+
violations: output.violations,
|
|
64
|
+
warnings: output.warnings,
|
|
65
|
+
contexts,
|
|
66
|
+
expected: output.expected,
|
|
67
|
+
config,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.writeFixes = writeFixes;
|
|
7
|
+
/**
|
|
8
|
+
* Manifest writer.
|
|
9
|
+
*
|
|
10
|
+
* The writer is the only module that mutates package.json files. It preserves
|
|
11
|
+
* unrelated fields, rewrites dependency sections from the expected graph, and
|
|
12
|
+
* skips writes when the normalized section content is unchanged.
|
|
13
|
+
*/
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
15
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
16
|
+
const types_1 = require("../model/types");
|
|
17
|
+
function sortedRecord(map) {
|
|
18
|
+
return Object.fromEntries([...map.entries()].sort(([a], [b]) => a.localeCompare(b)));
|
|
19
|
+
}
|
|
20
|
+
function recordsEqual(actual, expected) {
|
|
21
|
+
const actualEntries = Object.entries(actual ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
22
|
+
const expectedEntries = [...expected.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
23
|
+
return JSON.stringify(actualEntries) === JSON.stringify(expectedEntries);
|
|
24
|
+
}
|
|
25
|
+
function peerDependenciesMetaEqual(actual, expected) {
|
|
26
|
+
const actualEntries = Object.entries(actual ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
27
|
+
const expectedEntries = Object.entries(expected ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
28
|
+
return JSON.stringify(actualEntries) === JSON.stringify(expectedEntries);
|
|
29
|
+
}
|
|
30
|
+
function prunePeerDependenciesMeta(pkg, expectedPeerDependencies) {
|
|
31
|
+
if (pkg.peerDependenciesMeta === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
const nextMeta = Object.fromEntries(Object.entries(pkg.peerDependenciesMeta)
|
|
34
|
+
.filter(([depIdent]) => expectedPeerDependencies.has(depIdent))
|
|
35
|
+
.sort(([a], [b]) => a.localeCompare(b)));
|
|
36
|
+
if (Object.keys(nextMeta).length === 0) {
|
|
37
|
+
delete pkg.peerDependenciesMeta;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (peerDependenciesMetaEqual(pkg.peerDependenciesMeta, nextMeta)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
pkg.peerDependenciesMeta = nextMeta;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
function writeFixes(rootDir, expectedByLocation) {
|
|
47
|
+
for (const expected of expectedByLocation.values()) {
|
|
48
|
+
const pkg = expected.workspace.pkg;
|
|
49
|
+
let changed = false;
|
|
50
|
+
for (const section of types_1.SECTIONS) {
|
|
51
|
+
if (expected.sections[section].size === 0) {
|
|
52
|
+
if (pkg[section] !== undefined) {
|
|
53
|
+
delete pkg[section];
|
|
54
|
+
changed = true;
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!recordsEqual(pkg[section], expected.sections[section])) {
|
|
59
|
+
pkg[section] = sortedRecord(expected.sections[section]);
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
changed =
|
|
64
|
+
prunePeerDependenciesMeta(pkg, expected.sections.peerDependencies) ||
|
|
65
|
+
changed;
|
|
66
|
+
if (changed) {
|
|
67
|
+
const pkgPath = node_path_1.default.join(rootDir, expected.workspace.location, 'package.json');
|
|
68
|
+
(0, node_fs_1.writeFileSync)(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=manifest-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-writer.js","sourceRoot":"","sources":["../../src/writer/manifest-writer.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@rsdk/jest/jest.config');
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/yarn.constraints",
|
|
3
|
-
"
|
|
3
|
+
"role": "cli",
|
|
4
|
+
"version": "6.0.0-next.40",
|
|
4
5
|
"description": "Useful common classes, functions and types",
|
|
5
6
|
"license": "Apache License 2.0",
|
|
6
7
|
"publishConfig": {
|
|
@@ -10,9 +11,12 @@
|
|
|
10
11
|
"url": "https://github.com/R-Vision/rsdk"
|
|
11
12
|
},
|
|
12
13
|
"main": "dist/index.js",
|
|
14
|
+
"bin": {
|
|
15
|
+
"depdoc": "dist/bin/depdoc.js"
|
|
16
|
+
},
|
|
13
17
|
"dependencies": {
|
|
14
|
-
"
|
|
18
|
+
"typescript": "5.7.3",
|
|
15
19
|
"yaml": "^2.6.1"
|
|
16
20
|
},
|
|
17
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "c220f82159e8e31cf90b2e4078e3570282d01021"
|
|
18
22
|
}
|
package/src/ansi.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared ANSI styling helpers for CLI output.
|
|
3
|
+
*
|
|
4
|
+
* Keep terminal escape codes centralized here so command/reporting modules can
|
|
5
|
+
* add restrained color without duplicating formatting details or hard-coding
|
|
6
|
+
* ANSI sequences throughout the codebase.
|
|
7
|
+
*/
|
|
8
|
+
const enabled =
|
|
9
|
+
process.env.NO_COLOR === undefined && process.env.FORCE_COLOR !== '0';
|
|
10
|
+
|
|
11
|
+
function wrap(open: string, close: string, value: string): string {
|
|
12
|
+
return enabled ? `${open}${value}${close}` : value;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const ansi = {
|
|
16
|
+
bold: (value: string): string => wrap('\u001B[1m', '\u001B[22m', value),
|
|
17
|
+
dim: (value: string): string => wrap('\u001B[2m', '\u001B[22m', value),
|
|
18
|
+
red: (value: string): string => wrap('\u001B[31m', '\u001B[39m', value),
|
|
19
|
+
green: (value: string): string => wrap('\u001B[32m', '\u001B[39m', value),
|
|
20
|
+
yellow: (value: string): string => wrap('\u001B[33m', '\u001B[39m', value),
|
|
21
|
+
cyan: (value: string): string => wrap('\u001B[36m', '\u001B[39m', value),
|
|
22
|
+
magenta: (value: string): string => wrap('\u001B[35m', '\u001B[39m', value),
|
|
23
|
+
};
|