@rudderjs/cli 4.14.0 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,7 @@ import './package-manager.js';
8
8
  import './env-vars.js';
9
9
  import './structure.js';
10
10
  import './deps.js';
11
+ import './version-skew.js';
11
12
  import './runtime.js';
12
13
  import './production.js';
13
14
  export declare function loadBuiltInChecks(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,mBAAmB,CAAA;AAC1B,OAAO,sBAAsB,CAAA;AAC7B,OAAO,eAAe,CAAA;AACtB,OAAO,gBAAgB,CAAA;AACvB,OAAO,WAAW,CAAA;AAClB,OAAO,cAAc,CAAA;AACrB,OAAO,iBAAiB,CAAA;AAExB,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,mBAAmB,CAAA;AAC1B,OAAO,sBAAsB,CAAA;AAC7B,OAAO,eAAe,CAAA;AACtB,OAAO,gBAAgB,CAAA;AACvB,OAAO,WAAW,CAAA;AAClB,OAAO,mBAAmB,CAAA;AAC1B,OAAO,cAAc,CAAA;AACrB,OAAO,iBAAiB,CAAA;AAExB,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
@@ -8,6 +8,7 @@ import './package-manager.js';
8
8
  import './env-vars.js';
9
9
  import './structure.js';
10
10
  import './deps.js';
11
+ import './version-skew.js';
11
12
  import './runtime.js';
12
13
  import './production.js';
13
14
  export function loadBuiltInChecks() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/built-in/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,mBAAmB,CAAA;AAC1B,OAAO,sBAAsB,CAAA;AAC7B,OAAO,eAAe,CAAA;AACtB,OAAO,gBAAgB,CAAA;AACvB,OAAO,WAAW,CAAA;AAClB,OAAO,cAAc,CAAA;AACrB,OAAO,iBAAiB,CAAA;AAExB,MAAM,UAAU,iBAAiB;IAC/B,gEAAgE;IAChE,yEAAyE;IACzE,qEAAqE;IACrE,cAAc;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/built-in/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,mBAAmB,CAAA;AAC1B,OAAO,sBAAsB,CAAA;AAC7B,OAAO,eAAe,CAAA;AACtB,OAAO,gBAAgB,CAAA;AACvB,OAAO,WAAW,CAAA;AAClB,OAAO,mBAAmB,CAAA;AAC1B,OAAO,cAAc,CAAA;AACrB,OAAO,iBAAiB,CAAA;AAExB,MAAM,UAAU,iBAAiB;IAC/B,gEAAgE;IAChE,yEAAyE;IACzE,qEAAqE;IACrE,cAAc;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version-skew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-skew.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/version-skew.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { registerDoctorCheck } from '@rudderjs/console';
4
+ // ── Minimal semver (just enough for @rudderjs/* sibling ranges) ──
5
+ //
6
+ // Real-world shapes in our manifests: `^1.16.0`, `>=2.0.0`, exact pins, and
7
+ // `||` alternatives. Anything unparseable fails OPEN — doctor must never
8
+ // false-fire on a range it can't read.
9
+ function parseTriple(v) {
10
+ const m = /^[v\s]*(\d+)\.(\d+)\.(\d+)/.exec(v.trim().replace(/^[\^~>=<]+/, ''));
11
+ if (!m)
12
+ return null;
13
+ return { major: Number(m[1]), minor: Number(m[2]), patch: Number(m[3]) };
14
+ }
15
+ function compareTriples(a, b) {
16
+ if (a.major !== b.major)
17
+ return a.major - b.major;
18
+ if (a.minor !== b.minor)
19
+ return a.minor - b.minor;
20
+ return a.patch - b.patch;
21
+ }
22
+ /** One comparator (`^1.2.3`, `>=2.0.0`, `1.2.3`, …) against a version. */
23
+ function satisfiesComparator(v, comparator) {
24
+ const floor = parseTriple(comparator);
25
+ if (!floor)
26
+ return true; // unreadable — fail open
27
+ const cmp = compareTriples(v, floor);
28
+ if (comparator.startsWith('^')) {
29
+ // Caret: same left-most non-zero component, at or above the floor.
30
+ if (floor.major > 0)
31
+ return v.major === floor.major && cmp >= 0;
32
+ if (floor.minor > 0)
33
+ return v.major === 0 && v.minor === floor.minor && cmp >= 0;
34
+ return cmp === 0;
35
+ }
36
+ if (comparator.startsWith('~'))
37
+ return v.major === floor.major && v.minor === floor.minor && cmp >= 0;
38
+ if (comparator.startsWith('>='))
39
+ return cmp >= 0;
40
+ if (comparator.startsWith('>'))
41
+ return cmp > 0;
42
+ if (comparator.startsWith('<='))
43
+ return cmp <= 0;
44
+ if (comparator.startsWith('<'))
45
+ return cmp < 0;
46
+ return cmp === 0; // exact pin
47
+ }
48
+ /** `||` alternatives of space-joined comparators (`>=1.2.0 <2 || ^3.0.0`). */
49
+ function satisfiesRange(version, range) {
50
+ const v = parseTriple(version);
51
+ if (!v)
52
+ return true;
53
+ const r = range.trim();
54
+ if (r === '' || r === '*' || r === 'latest' || r === 'next' || r.startsWith('workspace:'))
55
+ return true;
56
+ return r.split('||').some((alt) => {
57
+ const comparators = alt.trim().split(/\s+/).filter(Boolean);
58
+ if (comparators.length === 0)
59
+ return true;
60
+ return comparators.every((c) => satisfiesComparator(v, c));
61
+ });
62
+ }
63
+ function readManifest(file) {
64
+ try {
65
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * The version of `sibling` that `fromRealDir`'s package actually loads,
73
+ * following Node's resolution shape across layouts:
74
+ *
75
+ * 1. its own nested `node_modules/<sibling>` (npm conflict-nesting),
76
+ * 2. the adjacent scope dir (pnpm virtual store puts a package's deps as
77
+ * siblings: `.pnpm/<pkg>@<v>/node_modules/@rudderjs/<sibling>`; for a
78
+ * hoisted top-level package this same step IS the top level),
79
+ * 3. the app's top-level `node_modules` (hoisted npm/yarn).
80
+ */
81
+ function resolveSiblingVersion(fromRealDir, sibling) {
82
+ const candidates = [
83
+ path.join(fromRealDir, 'node_modules', sibling, 'package.json'),
84
+ path.resolve(fromRealDir, '..', '..', sibling, 'package.json'),
85
+ path.join(process.cwd(), 'node_modules', sibling, 'package.json'),
86
+ ];
87
+ for (const candidate of candidates) {
88
+ const manifest = readManifest(candidate);
89
+ if (manifest?.version)
90
+ return manifest.version;
91
+ }
92
+ return null;
93
+ }
94
+ registerDoctorCheck({
95
+ id: 'deps:version-skew',
96
+ category: 'deps',
97
+ title: '@rudderjs/* sibling versions in range',
98
+ run() {
99
+ const scopeDir = path.join(process.cwd(), 'node_modules', '@rudderjs');
100
+ let entries;
101
+ try {
102
+ entries = fs.readdirSync(scopeDir);
103
+ }
104
+ catch {
105
+ return { status: 'ok', message: 'no @rudderjs packages installed' };
106
+ }
107
+ const violations = [];
108
+ let rangesChecked = 0;
109
+ for (const entry of entries) {
110
+ let realDir;
111
+ try {
112
+ realDir = fs.realpathSync(path.join(scopeDir, entry));
113
+ }
114
+ catch {
115
+ continue;
116
+ }
117
+ const manifest = readManifest(path.join(realDir, 'package.json'));
118
+ if (!manifest?.name || !manifest.version)
119
+ continue;
120
+ const optional = manifest.peerDependenciesMeta ?? {};
121
+ const requirements = { ...manifest.dependencies, ...manifest.peerDependencies };
122
+ for (const [sibling, range] of Object.entries(requirements)) {
123
+ if (!sibling.startsWith('@rudderjs/'))
124
+ continue;
125
+ if (range.startsWith('workspace:'))
126
+ continue; // monorepo dev link — not an installed range
127
+ const installed = resolveSiblingVersion(realDir, sibling);
128
+ if (installed === null) {
129
+ // Missing entirely: optional peers are legitimately absent; hard
130
+ // deps are deps:declared-installed's finding, not a skew.
131
+ void optional;
132
+ continue;
133
+ }
134
+ rangesChecked++;
135
+ if (!satisfiesRange(installed, range)) {
136
+ violations.push(`${manifest.name}@${manifest.version} requires ${sibling} ${range} — found ${installed}`);
137
+ }
138
+ }
139
+ }
140
+ if (violations.length > 0) {
141
+ return {
142
+ status: 'error',
143
+ message: violations.length === 1
144
+ ? violations[0]
145
+ : `${violations.length} sibling ranges violated (first: ${violations[0]})`,
146
+ fix: 'Bump the pinned version (pnpm.overrides?) so siblings satisfy their declared ranges, then reinstall',
147
+ detail: violations.join('\n'),
148
+ };
149
+ }
150
+ return { status: 'ok', message: `${rangesChecked} sibling range${rangesChecked === 1 ? '' : 's'} satisfied` };
151
+ },
152
+ });
153
+ //# sourceMappingURL=version-skew.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-skew.js","sourceRoot":"","sources":["../../../src/doctor/built-in/version-skew.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rudderjs/cli",
3
- "version": "4.14.0",
3
+ "version": "4.15.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,7 +24,7 @@
24
24
  "chalk": "^5.0.0",
25
25
  "dotenv": "^16.4.0",
26
26
  "@clack/prompts": "^1.0.0",
27
- "@rudderjs/core": "^1.11.0",
27
+ "@rudderjs/core": "^1.12.2",
28
28
  "@rudderjs/console": "^1.4.0"
29
29
  },
30
30
  "peerDependencies": {