@rudderjs/cli 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/commands/add.d.ts +42 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +475 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/doctor.d.ts +12 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +83 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/remove.d.ts +24 -0
  10. package/dist/commands/remove.d.ts.map +1 -0
  11. package/dist/commands/remove.js +170 -0
  12. package/dist/commands/remove.js.map +1 -0
  13. package/dist/doctor/boot-status.d.ts +10 -0
  14. package/dist/doctor/boot-status.d.ts.map +1 -0
  15. package/dist/doctor/boot-status.js +15 -0
  16. package/dist/doctor/boot-status.js.map +1 -0
  17. package/dist/doctor/built-in/_fs.d.ts +11 -0
  18. package/dist/doctor/built-in/_fs.d.ts.map +1 -0
  19. package/dist/doctor/built-in/_fs.js +53 -0
  20. package/dist/doctor/built-in/_fs.js.map +1 -0
  21. package/dist/doctor/built-in/deps.d.ts +2 -0
  22. package/dist/doctor/built-in/deps.d.ts.map +1 -0
  23. package/dist/doctor/built-in/deps.js +81 -0
  24. package/dist/doctor/built-in/deps.js.map +1 -0
  25. package/dist/doctor/built-in/env-vars.d.ts +2 -0
  26. package/dist/doctor/built-in/env-vars.d.ts.map +1 -0
  27. package/dist/doctor/built-in/env-vars.js +99 -0
  28. package/dist/doctor/built-in/env-vars.js.map +1 -0
  29. package/dist/doctor/built-in/index.d.ts +13 -0
  30. package/dist/doctor/built-in/index.d.ts.map +1 -0
  31. package/dist/doctor/built-in/index.js +18 -0
  32. package/dist/doctor/built-in/index.js.map +1 -0
  33. package/dist/doctor/built-in/node-version.d.ts +2 -0
  34. package/dist/doctor/built-in/node-version.d.ts.map +1 -0
  35. package/dist/doctor/built-in/node-version.js +72 -0
  36. package/dist/doctor/built-in/node-version.js.map +1 -0
  37. package/dist/doctor/built-in/package-manager.d.ts +2 -0
  38. package/dist/doctor/built-in/package-manager.d.ts.map +1 -0
  39. package/dist/doctor/built-in/package-manager.js +55 -0
  40. package/dist/doctor/built-in/package-manager.js.map +1 -0
  41. package/dist/doctor/built-in/runtime.d.ts +2 -0
  42. package/dist/doctor/built-in/runtime.d.ts.map +1 -0
  43. package/dist/doctor/built-in/runtime.js +82 -0
  44. package/dist/doctor/built-in/runtime.js.map +1 -0
  45. package/dist/doctor/built-in/structure.d.ts +2 -0
  46. package/dist/doctor/built-in/structure.d.ts.map +1 -0
  47. package/dist/doctor/built-in/structure.js +93 -0
  48. package/dist/doctor/built-in/structure.js.map +1 -0
  49. package/dist/doctor/fixer.d.ts +39 -0
  50. package/dist/doctor/fixer.d.ts.map +1 -0
  51. package/dist/doctor/fixer.js +80 -0
  52. package/dist/doctor/fixer.js.map +1 -0
  53. package/dist/doctor/load-package-checks.d.ts +2 -0
  54. package/dist/doctor/load-package-checks.d.ts.map +1 -0
  55. package/dist/doctor/load-package-checks.js +53 -0
  56. package/dist/doctor/load-package-checks.js.map +1 -0
  57. package/dist/doctor/orchestrator.d.ts +34 -0
  58. package/dist/doctor/orchestrator.d.ts.map +1 -0
  59. package/dist/doctor/orchestrator.js +65 -0
  60. package/dist/doctor/orchestrator.js.map +1 -0
  61. package/dist/doctor/reporter.d.ts +21 -0
  62. package/dist/doctor/reporter.d.ts.map +1 -0
  63. package/dist/doctor/reporter.js +151 -0
  64. package/dist/doctor/reporter.js.map +1 -0
  65. package/dist/index.js +28 -1
  66. package/dist/index.js.map +1 -1
  67. package/package.json +6 -6
@@ -0,0 +1,24 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * Walk the registry and return the aliases of packages that:
4
+ * 1. Are currently installed, AND
5
+ * 2. List `alias` in their `requires` array.
6
+ *
7
+ * Used to refuse a remove that would leave dependent packages in a broken
8
+ * state (e.g. `rudder remove auth` while sanctum/passport are still
9
+ * installed would crash both providers at boot).
10
+ */
11
+ export declare function findInstalledDependents(cwd: string, alias: string): string[];
12
+ /**
13
+ * Remove the `import <key> from './<key>.js'` line + the `<key>` entry in
14
+ * the `const configs = { ... }` object. Mirror of `registerConfigKey` in
15
+ * add.ts. Idempotent — bails cleanly if the key isn't currently registered.
16
+ *
17
+ * Returns `'ok' | 'not-registered' | 'unrecognized-shape'`.
18
+ */
19
+ export declare function unregisterConfigKey(indexPath: string, key: string): 'ok' | 'not-registered' | 'unrecognized-shape';
20
+ export declare function removeCommand(program: Command): void;
21
+ export declare const _testInternal: {
22
+ findInstalledDependents: typeof findInstalledDependents;
23
+ };
24
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BxC;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,GAAG,oBAAoB,CAoClH;AAcD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoFpD;AAGD,eAAO,MAAM,aAAa;;CAA8B,CAAA"}
@@ -0,0 +1,170 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawn } from 'node:child_process';
4
+ import { _internal } from './add.js';
5
+ const { REGISTRY, findSpec, detectPackageManager } = _internal;
6
+ function pmRemove(pm, dep) {
7
+ switch (pm) {
8
+ case 'pnpm': return ['remove', dep];
9
+ case 'npm': return ['uninstall', dep];
10
+ case 'yarn': return ['remove', dep];
11
+ case 'bun': return ['remove', dep];
12
+ }
13
+ }
14
+ // ── Helpers ──────────────────────────────────────────────────
15
+ function isInstalled(cwd, npmName) {
16
+ const pkgPath = path.join(cwd, 'package.json');
17
+ if (!existsSync(pkgPath))
18
+ return false;
19
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
20
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
21
+ return npmName in deps;
22
+ }
23
+ /**
24
+ * Walk the registry and return the aliases of packages that:
25
+ * 1. Are currently installed, AND
26
+ * 2. List `alias` in their `requires` array.
27
+ *
28
+ * Used to refuse a remove that would leave dependent packages in a broken
29
+ * state (e.g. `rudder remove auth` while sanctum/passport are still
30
+ * installed would crash both providers at boot).
31
+ */
32
+ export function findInstalledDependents(cwd, alias) {
33
+ return REGISTRY
34
+ .filter(spec => spec.requires?.includes(alias))
35
+ .filter(spec => isInstalled(cwd, spec.npmName))
36
+ .map(spec => spec.alias);
37
+ }
38
+ // ── config/index.ts surgical un-register ─────────────────────
39
+ /**
40
+ * Remove the `import <key> from './<key>.js'` line + the `<key>` entry in
41
+ * the `const configs = { ... }` object. Mirror of `registerConfigKey` in
42
+ * add.ts. Idempotent — bails cleanly if the key isn't currently registered.
43
+ *
44
+ * Returns `'ok' | 'not-registered' | 'unrecognized-shape'`.
45
+ */
46
+ export function unregisterConfigKey(indexPath, key) {
47
+ const src = readFileSync(indexPath, 'utf8');
48
+ // Find the import line for this key.
49
+ // Match: optional leading newline, `import <key>` (any whitespace), `from './<key>.js'`, trailing newline.
50
+ const importLineRe = new RegExp(`\\n?import\\s+${key}\\s+from\\s+'\\./${key}\\.js'\\s*\\n?`);
51
+ const importMatch = importLineRe.exec(src);
52
+ if (!importMatch)
53
+ return 'not-registered';
54
+ // Find the configs block.
55
+ const configsRe = /const\s+configs\s*=\s*\{([^}]*)\}/;
56
+ const configsMatch = configsRe.exec(src);
57
+ if (!configsMatch)
58
+ return 'unrecognized-shape';
59
+ // Strip the key from the configs object literal.
60
+ const keys = configsMatch[1].split(',').map(s => s.trim()).filter(Boolean);
61
+ if (!keys.includes(key))
62
+ return 'unrecognized-shape'; // import present but key absent — manual edit, bail
63
+ const remainingKeys = keys.filter(k => k !== key);
64
+ // Splice both edits. Apply the configs replacement first (further right in
65
+ // the file) so its offset stays stable while we then drop the import line.
66
+ let out = src.slice(0, configsMatch.index)
67
+ + `const configs = { ${remainingKeys.join(', ')} }`
68
+ + src.slice(configsMatch.index + configsMatch[0].length);
69
+ // Re-run the import regex on the mutated string — offsets shifted.
70
+ const newImportMatch = importLineRe.exec(out);
71
+ if (newImportMatch) {
72
+ // Preserve a single newline at the seam so the surrounding imports still
73
+ // form a contiguous block with no double blank lines.
74
+ const replacement = newImportMatch[0].startsWith('\n') && newImportMatch[0].endsWith('\n') ? '\n' : '';
75
+ out = out.slice(0, newImportMatch.index) + replacement + out.slice(newImportMatch.index + newImportMatch[0].length);
76
+ }
77
+ writeFileSync(indexPath, out);
78
+ return 'ok';
79
+ }
80
+ // ── Child-process runner ──────────────────────────────────────
81
+ function runChild(cmd, args, cwd) {
82
+ return new Promise((resolve) => {
83
+ const child = spawn(cmd, args, { cwd, stdio: 'inherit', shell: false });
84
+ child.on('close', (code) => resolve(code === 0));
85
+ child.on('error', () => resolve(false));
86
+ });
87
+ }
88
+ // ── Command ───────────────────────────────────────────────────
89
+ export function removeCommand(program) {
90
+ program
91
+ .command('remove <package>')
92
+ .description('Uninstall a RudderJS package — reverses `rudder add` (removes dep, config file, and unregisters)')
93
+ .option('--keep-config', 'Leave config/<name>.ts and the config/index.ts entry in place')
94
+ .action(async (packageName, opts) => {
95
+ const cwd = process.cwd();
96
+ const spec = findSpec(packageName);
97
+ if (!spec) {
98
+ const valid = REGISTRY.map(p => p.alias).join(', ');
99
+ console.error(`[rudder remove] Unknown package "${packageName}".\n Available: ${valid}`);
100
+ process.exit(1);
101
+ }
102
+ // Idempotency — already gone?
103
+ if (!isInstalled(cwd, spec.npmName)) {
104
+ console.log(` ${spec.npmName} is not installed — nothing to remove.`);
105
+ // Still try to clean any leftover config files (e.g. config wired but
106
+ // dep already removed by hand). Surfaces inconsistent state.
107
+ if (!opts.keepConfig && spec.config) {
108
+ const configFile = path.join(cwd, 'config', `${spec.config.key}.ts`);
109
+ const indexFile = path.join(cwd, 'config', 'index.ts');
110
+ if (existsSync(configFile)) {
111
+ unlinkSync(configFile);
112
+ console.log(` Cleaned up orphaned config/${spec.config.key}.ts`);
113
+ }
114
+ if (existsSync(indexFile)) {
115
+ const result = unregisterConfigKey(indexFile, spec.config.key);
116
+ if (result === 'ok')
117
+ console.log(` Cleaned up orphaned entry in config/index.ts`);
118
+ }
119
+ }
120
+ return;
121
+ }
122
+ // Refuse if other installed packages depend on this one.
123
+ const dependents = findInstalledDependents(cwd, spec.alias);
124
+ if (dependents.length > 0) {
125
+ console.error(`[rudder remove] Cannot remove ${spec.alias} — these installed packages depend on it: ${dependents.join(', ')}`);
126
+ console.error(` Remove them first, or keep ${spec.alias} installed.`);
127
+ process.exit(1);
128
+ }
129
+ const pm = detectPackageManager();
130
+ // 1. Uninstall the dependency
131
+ console.log(`\n Removing ${spec.npmName}...`);
132
+ const ok = await runChild(pm, pmRemove(pm, spec.npmName), cwd);
133
+ if (!ok) {
134
+ console.error(`[rudder remove] ${pm} ${pmRemove(pm, spec.npmName).join(' ')} failed.`);
135
+ process.exit(1);
136
+ }
137
+ // 2. Delete config file (unless --keep-config)
138
+ if (!opts.keepConfig && spec.config) {
139
+ const configFile = path.join(cwd, 'config', `${spec.config.key}.ts`);
140
+ if (existsSync(configFile)) {
141
+ unlinkSync(configFile);
142
+ console.log(` Deleted config/${spec.config.key}.ts`);
143
+ }
144
+ // 3. Unregister from config/index.ts
145
+ const indexFile = path.join(cwd, 'config', 'index.ts');
146
+ if (existsSync(indexFile)) {
147
+ const result = unregisterConfigKey(indexFile, spec.config.key);
148
+ if (result === 'ok') {
149
+ console.log(` Unregistered "${spec.config.key}" in config/index.ts`);
150
+ }
151
+ else if (result === 'unrecognized-shape') {
152
+ console.warn(` ⚠ Could not auto-edit config/index.ts (custom shape).`);
153
+ console.warn(` Remove manually: the import line and key for "${spec.config.key}".`);
154
+ }
155
+ // 'not-registered' is silent — nothing to do.
156
+ }
157
+ }
158
+ // 4. Refresh provider manifest so the freshly-removed provider drops out.
159
+ console.log(` Refreshing provider manifest...`);
160
+ const discoverOk = await runChild(pm, [...(pm === 'npm' ? ['exec'] : []), 'rudder', 'providers:discover'], cwd);
161
+ if (!discoverOk) {
162
+ console.warn(` ⚠ providers:discover failed — run \`${pm} rudder providers:discover\` manually.`);
163
+ }
164
+ console.log();
165
+ console.log(` ✓ ${spec.alias} removed.`);
166
+ });
167
+ }
168
+ // ── Test exports ──────────────────────────────────────────────
169
+ export const _testInternal = { findInstalledDependents };
170
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface BootStatus {
2
+ ok: boolean;
3
+ error?: string;
4
+ /** Wall-clock ms the bootApp() call took (success or failure). */
5
+ durationMs: number;
6
+ }
7
+ export declare function setBootStatus(status: BootStatus): void;
8
+ export declare function getBootStatus(): BootStatus | null;
9
+ export declare function clearBootStatus(): void;
10
+ //# sourceMappingURL=boot-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-status.d.ts","sourceRoot":"","sources":["../../src/doctor/boot-status.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAK,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
@@ -0,0 +1,15 @@
1
+ // Boot status singleton — set by the doctor command's --deep path, read by
2
+ // runtime checks. Lives on globalThis so per-package checks (which import
3
+ // from @rudderjs/cli's dist subpath) see the same value.
4
+ const KEY = '__rudderjs_doctor_boot_status__';
5
+ export function setBootStatus(status) {
6
+ ;
7
+ globalThis[KEY] = status;
8
+ }
9
+ export function getBootStatus() {
10
+ return globalThis[KEY];
11
+ }
12
+ export function clearBootStatus() {
13
+ delete globalThis[KEY];
14
+ }
15
+ //# sourceMappingURL=boot-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-status.js","sourceRoot":"","sources":["../../src/doctor/boot-status.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0EAA0E;AAC1E,yDAAyD;AASzD,MAAM,GAAG,GAAG,iCAAiC,CAAA;AAE7C,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,CAAC;IAAC,UAAsC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAQ,UAAsC,CAAC,GAAG,CAAsB,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAQ,UAAsC,CAAC,GAAG,CAAC,CAAA;AACrD,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** True if `<cwd>/<rel>` exists and is a file. */
2
+ export declare function fileExists(rel: string): boolean;
3
+ /** Read `<cwd>/<rel>` as a UTF-8 string. Returns null on any error. */
4
+ export declare function readFileSafe(rel: string): string | null;
5
+ /** `fs.stat(<cwd>/<rel>).mtimeMs` or null on error. */
6
+ export declare function mtimeMs(rel: string): number | null;
7
+ /** True if any of the given relative paths exists (file or dir). */
8
+ export declare function anyExists(rels: string[]): boolean;
9
+ /** Read JSON file at `<cwd>/<rel>` or null on error. */
10
+ export declare function readJsonSafe<T = unknown>(rel: string): T | null;
11
+ //# sourceMappingURL=_fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fs.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/_fs.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAM/C;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,uDAAuD;AACvD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMlD;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAQjD;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAQ/D"}
@@ -0,0 +1,53 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ /** True if `<cwd>/<rel>` exists and is a file. */
4
+ export function fileExists(rel) {
5
+ try {
6
+ return fs.statSync(path.join(process.cwd(), rel)).isFile();
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ /** Read `<cwd>/<rel>` as a UTF-8 string. Returns null on any error. */
13
+ export function readFileSafe(rel) {
14
+ try {
15
+ return fs.readFileSync(path.join(process.cwd(), rel), 'utf-8');
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ /** `fs.stat(<cwd>/<rel>).mtimeMs` or null on error. */
22
+ export function mtimeMs(rel) {
23
+ try {
24
+ return fs.statSync(path.join(process.cwd(), rel)).mtimeMs;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /** True if any of the given relative paths exists (file or dir). */
31
+ export function anyExists(rels) {
32
+ for (const rel of rels) {
33
+ try {
34
+ fs.statSync(path.join(process.cwd(), rel));
35
+ return true;
36
+ }
37
+ catch { /* keep looking */ }
38
+ }
39
+ return false;
40
+ }
41
+ /** Read JSON file at `<cwd>/<rel>` or null on error. */
42
+ export function readJsonSafe(rel) {
43
+ const text = readFileSafe(rel);
44
+ if (text === null)
45
+ return null;
46
+ try {
47
+ return JSON.parse(text);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ //# sourceMappingURL=_fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fs.js","sourceRoot":"","sources":["../../../src/doctor/built-in/_fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,kDAAkD;AAClD,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAc,GAAW;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/deps.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { registerDoctorCheck } from '@rudderjs/console';
4
+ import { fileExists, mtimeMs, readJsonSafe } from './_fs.js';
5
+ function isResolvable(pkg) {
6
+ const target = path.join(process.cwd(), 'node_modules', pkg, 'package.json');
7
+ try {
8
+ return fs.statSync(target).isFile();
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ registerDoctorCheck({
15
+ id: 'deps:providers-manifest',
16
+ category: 'deps',
17
+ title: 'providers manifest',
18
+ run() {
19
+ const manifest = 'bootstrap/cache/providers.json';
20
+ if (!fileExists(manifest)) {
21
+ return {
22
+ status: 'warn',
23
+ message: 'missing — providers won\'t auto-discover',
24
+ fix: 'pnpm rudder providers:discover',
25
+ };
26
+ }
27
+ const manifestMtime = mtimeMs(manifest);
28
+ const pkgMtime = mtimeMs('package.json');
29
+ if (manifestMtime !== null && pkgMtime !== null && manifestMtime < pkgMtime) {
30
+ return {
31
+ status: 'warn',
32
+ message: 'older than package.json — packages added since last refresh',
33
+ fix: 'pnpm rudder providers:discover',
34
+ };
35
+ }
36
+ return { status: 'ok', message: 'present and current' };
37
+ },
38
+ async fixer() {
39
+ // Same logic as `rudder providers:discover` but invoked in-process so
40
+ // --fix doesn't shell out. `@rudderjs/core/commands/providers-discover`
41
+ // re-exports the two pure pieces — scanner + writer.
42
+ try {
43
+ const { scanProviders, writeProviderManifest } = await import(
44
+ /* @vite-ignore */ '@rudderjs/core/commands/providers-discover');
45
+ const sorted = scanProviders(process.cwd());
46
+ writeProviderManifest(process.cwd(), sorted);
47
+ return { status: 'ok', message: `regenerated (${sorted.length} provider${sorted.length === 1 ? '' : 's'})` };
48
+ }
49
+ catch (e) {
50
+ const msg = e instanceof Error ? e.message : String(e);
51
+ return { status: 'error', message: `could not regenerate: ${msg}` };
52
+ }
53
+ },
54
+ });
55
+ registerDoctorCheck({
56
+ id: 'deps:declared-installed',
57
+ category: 'deps',
58
+ title: '@rudderjs/* installed',
59
+ run() {
60
+ const pkg = readJsonSafe('package.json');
61
+ if (!pkg) {
62
+ return { status: 'error', message: 'package.json unreadable', fix: 'Check the file exists and is valid JSON' };
63
+ }
64
+ const declared = [
65
+ ...Object.keys(pkg.dependencies ?? {}),
66
+ ...Object.keys(pkg.devDependencies ?? {}),
67
+ ].filter(name => name.startsWith('@rudderjs/') || name === 'create-rudder-app');
68
+ const missing = declared.filter(name => !isResolvable(name));
69
+ if (missing.length > 0) {
70
+ return {
71
+ status: 'error',
72
+ message: `${missing.length} declared but not in node_modules: ${missing.join(', ')}`,
73
+ fix: 'Run your package manager install (e.g. `pnpm install`)',
74
+ };
75
+ }
76
+ return { status: 'ok', message: `${declared.length} declared, all resolvable` };
77
+ },
78
+ });
79
+ // `deps:auth-views` moved to @rudderjs/auth/doctor in Phase 3 — it's a
80
+ // package-specific concern that lives with the package that owns it.
81
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../../src/doctor/built-in/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env-vars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-vars.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/env-vars.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { registerDoctorCheck } from '@rudderjs/console';
2
+ import { readFileSafe, fileExists } from './_fs.js';
3
+ /**
4
+ * Minimal `.env` parser — covers `KEY=value`, `KEY="value"`, comments, blanks.
5
+ * Doesn't expand `${VAR}` references; we only need to check declared keys.
6
+ */
7
+ function parseEnvText(text) {
8
+ const out = new Map();
9
+ for (const rawLine of text.split('\n')) {
10
+ const line = rawLine.replace(/^\s+|\s+$/g, '');
11
+ if (!line || line.startsWith('#'))
12
+ continue;
13
+ const eq = line.indexOf('=');
14
+ if (eq === -1)
15
+ continue;
16
+ const key = line.slice(0, eq).trim();
17
+ let value = line.slice(eq + 1).trim();
18
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
19
+ value = value.slice(1, -1);
20
+ }
21
+ out.set(key, value);
22
+ }
23
+ return out;
24
+ }
25
+ registerDoctorCheck({
26
+ id: 'env:dotenv-loadable',
27
+ category: 'env',
28
+ title: '.env file',
29
+ run() {
30
+ if (!fileExists('.env')) {
31
+ const exampleHint = fileExists('.env.example')
32
+ ? 'Run `cp .env.example .env` and fill in the secrets'
33
+ : 'Create a .env file with your config (APP_KEY, AUTH_SECRET, etc.)';
34
+ return { status: 'error', message: 'missing', fix: exampleHint };
35
+ }
36
+ const text = readFileSafe('.env');
37
+ if (text === null) {
38
+ return { status: 'error', message: 'present but unreadable', fix: 'Check file permissions on .env' };
39
+ }
40
+ const parsed = parseEnvText(text);
41
+ return { status: 'ok', message: `parses (${parsed.size} keys)` };
42
+ },
43
+ });
44
+ registerDoctorCheck({
45
+ id: 'env:app-key',
46
+ category: 'env',
47
+ title: 'APP_KEY',
48
+ run() {
49
+ const v = process.env['APP_KEY'];
50
+ if (!v) {
51
+ return {
52
+ status: 'error',
53
+ message: 'unset',
54
+ fix: 'Generate a 32-byte base64 key (e.g. `node -e "console.log(require(\'crypto\').randomBytes(32).toString(\'base64\'))"`) and put it in .env',
55
+ };
56
+ }
57
+ // APP_KEY can be raw or base64-encoded. Accept either form, validate decoded length.
58
+ let decodedLen;
59
+ try {
60
+ decodedLen = Buffer.from(v, 'base64').length;
61
+ }
62
+ catch {
63
+ decodedLen = Buffer.byteLength(v);
64
+ }
65
+ if (decodedLen < 32) {
66
+ return {
67
+ status: 'warn',
68
+ message: `present but only ${decodedLen} bytes — needs ≥ 32 for AES-256`,
69
+ fix: 'Generate a fresh 32-byte key with `node -e "console.log(require(\'crypto\').randomBytes(32).toString(\'base64\'))"`',
70
+ };
71
+ }
72
+ return { status: 'ok', message: `set, ${decodedLen} bytes` };
73
+ },
74
+ });
75
+ registerDoctorCheck({
76
+ id: 'env:app-env',
77
+ category: 'env',
78
+ title: 'APP_ENV',
79
+ run() {
80
+ const v = process.env['APP_ENV'] ?? process.env['NODE_ENV'];
81
+ if (!v) {
82
+ return {
83
+ status: 'warn',
84
+ message: 'unset — defaults to "production" in many adapters',
85
+ fix: 'Add `APP_ENV=local` (or `dev`/`staging`/`production`) to .env',
86
+ };
87
+ }
88
+ const known = ['local', 'dev', 'development', 'test', 'staging', 'production'];
89
+ if (!known.includes(v)) {
90
+ return {
91
+ status: 'warn',
92
+ message: `non-standard value "${v}"`,
93
+ fix: `Use one of: ${known.join(', ')}`,
94
+ };
95
+ }
96
+ return { status: 'ok', message: v };
97
+ },
98
+ });
99
+ //# sourceMappingURL=env-vars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../../src/doctor/built-in/env-vars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Built-in doctor checks owned by `@rudderjs/cli`. Each module's side-effect
3
+ * import calls `registerDoctorCheck()` so the checks are visible to the
4
+ * orchestrator after `loadBuiltInChecks()` runs.
5
+ */
6
+ import './node-version.js';
7
+ import './package-manager.js';
8
+ import './env-vars.js';
9
+ import './structure.js';
10
+ import './deps.js';
11
+ import './runtime.js';
12
+ export declare function loadBuiltInChecks(): void;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAErB,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Built-in doctor checks owned by `@rudderjs/cli`. Each module's side-effect
3
+ * import calls `registerDoctorCheck()` so the checks are visible to the
4
+ * orchestrator after `loadBuiltInChecks()` runs.
5
+ */
6
+ import './node-version.js';
7
+ import './package-manager.js';
8
+ import './env-vars.js';
9
+ import './structure.js';
10
+ import './deps.js';
11
+ import './runtime.js';
12
+ export function loadBuiltInChecks() {
13
+ // Module loading is sufficient — side-effect imports above call
14
+ // registerDoctorCheck() at module-init time. This function exists so the
15
+ // doctor command can force the imports (otherwise tree-shaking would
16
+ // drop them).
17
+ }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AAErB,MAAM,UAAU,iBAAiB;IAC/B,gEAAgE;IAChE,yEAAyE;IACzE,qEAAqE;IACrE,cAAc;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-version.d.ts","sourceRoot":"","sources":["../../../src/doctor/built-in/node-version.ts"],"names":[],"mappings":""}