@rudderjs/cli 4.12.0 → 4.14.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 (80) hide show
  1. package/dist/commands/fresh.d.ts +18 -0
  2. package/dist/commands/fresh.d.ts.map +1 -0
  3. package/dist/commands/fresh.js +75 -0
  4. package/dist/commands/fresh.js.map +1 -0
  5. package/dist/commands/maintenance.d.ts +22 -0
  6. package/dist/commands/maintenance.d.ts.map +1 -0
  7. package/dist/commands/maintenance.js +67 -0
  8. package/dist/commands/maintenance.js.map +1 -0
  9. package/dist/commands/make/_shared.d.ts +7 -0
  10. package/dist/commands/make/_shared.d.ts.map +1 -1
  11. package/dist/commands/make/_shared.js +36 -0
  12. package/dist/commands/make/_shared.js.map +1 -1
  13. package/dist/commands/make/cast.d.ts +4 -0
  14. package/dist/commands/make/cast.d.ts.map +1 -0
  15. package/dist/commands/make/cast.js +37 -0
  16. package/dist/commands/make/cast.js.map +1 -0
  17. package/dist/commands/make/command.d.ts.map +1 -1
  18. package/dist/commands/make/command.js +1 -0
  19. package/dist/commands/make/command.js.map +1 -1
  20. package/dist/commands/make/controller.d.ts.map +1 -1
  21. package/dist/commands/make/controller.js +1 -0
  22. package/dist/commands/make/controller.js.map +1 -1
  23. package/dist/commands/make/event.d.ts.map +1 -1
  24. package/dist/commands/make/event.js +1 -0
  25. package/dist/commands/make/event.js.map +1 -1
  26. package/dist/commands/make/exception.d.ts +6 -0
  27. package/dist/commands/make/exception.d.ts.map +1 -0
  28. package/dist/commands/make/exception.js +53 -0
  29. package/dist/commands/make/exception.js.map +1 -0
  30. package/dist/commands/make/job.d.ts.map +1 -1
  31. package/dist/commands/make/job.js +1 -0
  32. package/dist/commands/make/job.js.map +1 -1
  33. package/dist/commands/make/listener.d.ts.map +1 -1
  34. package/dist/commands/make/listener.js +1 -0
  35. package/dist/commands/make/listener.js.map +1 -1
  36. package/dist/commands/make/mail.d.ts.map +1 -1
  37. package/dist/commands/make/mail.js +1 -0
  38. package/dist/commands/make/mail.js.map +1 -1
  39. package/dist/commands/make/middleware.d.ts.map +1 -1
  40. package/dist/commands/make/middleware.js +1 -0
  41. package/dist/commands/make/middleware.js.map +1 -1
  42. package/dist/commands/make/model.d.ts.map +1 -1
  43. package/dist/commands/make/model.js +1 -0
  44. package/dist/commands/make/model.js.map +1 -1
  45. package/dist/commands/make/notification.d.ts +4 -0
  46. package/dist/commands/make/notification.d.ts.map +1 -0
  47. package/dist/commands/make/notification.js +39 -0
  48. package/dist/commands/make/notification.js.map +1 -0
  49. package/dist/commands/make/observer.d.ts +4 -0
  50. package/dist/commands/make/observer.d.ts.map +1 -0
  51. package/dist/commands/make/observer.js +45 -0
  52. package/dist/commands/make/observer.js.map +1 -0
  53. package/dist/commands/make/policy.d.ts +4 -0
  54. package/dist/commands/make/policy.d.ts.map +1 -0
  55. package/dist/commands/make/policy.js +56 -0
  56. package/dist/commands/make/policy.js.map +1 -0
  57. package/dist/commands/make/provider.d.ts.map +1 -1
  58. package/dist/commands/make/provider.js +1 -0
  59. package/dist/commands/make/provider.js.map +1 -1
  60. package/dist/commands/make/request.d.ts.map +1 -1
  61. package/dist/commands/make/request.js +1 -0
  62. package/dist/commands/make/request.js.map +1 -1
  63. package/dist/commands/make/test-stubs.d.ts +24 -0
  64. package/dist/commands/make/test-stubs.d.ts.map +1 -0
  65. package/dist/commands/make/test-stubs.js +50 -0
  66. package/dist/commands/make/test-stubs.js.map +1 -0
  67. package/dist/commands/make/test.d.ts +2 -14
  68. package/dist/commands/make/test.d.ts.map +1 -1
  69. package/dist/commands/make/test.js +2 -41
  70. package/dist/commands/make/test.js.map +1 -1
  71. package/dist/commands/make.d.ts.map +1 -1
  72. package/dist/commands/make.js +10 -0
  73. package/dist/commands/make.js.map +1 -1
  74. package/dist/commands/optimize-clear.d.ts +28 -0
  75. package/dist/commands/optimize-clear.d.ts.map +1 -0
  76. package/dist/commands/optimize-clear.js +50 -0
  77. package/dist/commands/optimize-clear.js.map +1 -0
  78. package/dist/index.js +30 -2
  79. package/dist/index.js.map +1 -1
  80. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/commands/make/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAyB9C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUvD"}
@@ -0,0 +1,39 @@
1
+ import { registerMake } from './_shared.js';
2
+ export function stub(className) {
3
+ return `import { Notification, type Notifiable } from '@rudderjs/notification'
4
+
5
+ /**
6
+ * Notification. Send it with notify(user, new ${className}()).
7
+ * Declare the channels in via(), then implement the matching builder
8
+ * (toMail / toDatabase / toBroadcast).
9
+ */
10
+ export class ${className} extends Notification {
11
+ via(_notifiable: Notifiable): string[] {
12
+ // TODO: choose channels — 'mail', 'database', 'broadcast'
13
+ return ['database']
14
+ }
15
+
16
+ toDatabase(_notifiable: Notifiable): Record<string, unknown> {
17
+ return {
18
+ // TODO: the data to persist for this notification
19
+ }
20
+ }
21
+
22
+ // toMail(notifiable: Notifiable) {
23
+ // return new SomeMailable()
24
+ // }
25
+ }
26
+ `;
27
+ }
28
+ export function makeNotification(program) {
29
+ registerMake(program, {
30
+ command: 'make:notification',
31
+ description: 'Create a new notification class',
32
+ label: 'Notification created',
33
+ suffix: 'Notification',
34
+ directory: 'app/Notifications',
35
+ testKind: 'unit',
36
+ stub,
37
+ });
38
+ }
39
+ //# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../src/commands/make/notification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;;iDAGwC,SAAS;;;;eAI3C,SAAS;;;;;;;;;;;;;;;;CAgBvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,mBAAmB;QAChC,WAAW,EAAE,iCAAiC;QAC9C,KAAK,EAAQ,sBAAsB;QACnC,MAAM,EAAO,cAAc;QAC3B,SAAS,EAAI,mBAAmB;QAChC,QAAQ,EAAK,MAAM;QACnB,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ export declare function stub(className: string): string;
3
+ export declare function makeObserver(program: Command): void;
4
+ //# sourceMappingURL=observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/commands/make/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+B9C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnD"}
@@ -0,0 +1,45 @@
1
+ import { registerMake } from './_shared.js';
2
+ export function stub(className) {
3
+ return `import type { ModelObserver } from '@rudderjs/orm'
4
+
5
+ /**
6
+ * Model observer. Register it on a model (e.g. in a provider's boot()):
7
+ *
8
+ * Post.observe(${className})
9
+ *
10
+ * Implement any subset of the lifecycle hooks below — 'creating'/'updating'/
11
+ * 'saving' may return a (possibly mutated) attributes object; 'deleting'/
12
+ * 'updating'/'restoring' may return false to cancel the operation.
13
+ */
14
+ export class ${className} implements ModelObserver {
15
+ creating(data: Record<string, unknown>): Record<string, unknown> | void {
16
+ // TODO: inspect/mutate attributes before the row is inserted
17
+ return data
18
+ }
19
+
20
+ created(_record: Record<string, unknown>): void {
21
+ // TODO: react after the row is inserted
22
+ }
23
+
24
+ updating(_id: string | number, data: Record<string, unknown>): Record<string, unknown> | false | void {
25
+ return data
26
+ }
27
+
28
+ updated(_record: Record<string, unknown>): void {}
29
+
30
+ deleted(_id: string | number): void {}
31
+ }
32
+ `;
33
+ }
34
+ export function makeObserver(program) {
35
+ registerMake(program, {
36
+ command: 'make:observer',
37
+ description: 'Create a new model observer class',
38
+ label: 'Observer created',
39
+ suffix: 'Observer',
40
+ directory: 'app/Observers',
41
+ testKind: 'unit',
42
+ stub,
43
+ });
44
+ }
45
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/commands/make/observer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;;;;oBAKW,SAAS;;;;;;eAMd,SAAS;;;;;;;;;;;;;;;;;;CAkBvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,eAAe;QAC5B,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAQ,kBAAkB;QAC/B,MAAM,EAAO,UAAU;QACvB,SAAS,EAAI,eAAe;QAC5B,QAAQ,EAAK,MAAM;QACnB,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ export declare function stub(className: string): string;
3
+ export declare function makePolicy(program: Command): void;
4
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/commands/make/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA0C9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUjD"}
@@ -0,0 +1,56 @@
1
+ import { registerMake } from './_shared.js';
2
+ export function stub(className) {
3
+ return `import type { Authenticatable } from '@rudderjs/auth'
4
+ import { Policy } from '@rudderjs/auth'
5
+
6
+ /**
7
+ * Authorization policy. Register it against a model in a provider's boot():
8
+ *
9
+ * Gate.policy(Post, ${className})
10
+ *
11
+ * then authorize with Gate.allows('update', post) / Gate.authorize(...).
12
+ * Each method below is an "ability" — return true to allow, false to deny.
13
+ */
14
+ export class ${className} extends Policy {
15
+ /**
16
+ * Runs before every ability. Return true/false to short-circuit (e.g. grant
17
+ * admins everything), or null/undefined to fall through to the ability below.
18
+ */
19
+ // before(user: Authenticatable) {
20
+ // return null
21
+ // }
22
+
23
+ viewAny(_user: Authenticatable): boolean {
24
+ return true
25
+ }
26
+
27
+ view(_user: Authenticatable, _model: unknown): boolean {
28
+ return true
29
+ }
30
+
31
+ create(_user: Authenticatable): boolean {
32
+ return true
33
+ }
34
+
35
+ update(_user: Authenticatable, _model: unknown): boolean {
36
+ return false
37
+ }
38
+
39
+ delete(_user: Authenticatable, _model: unknown): boolean {
40
+ return false
41
+ }
42
+ }
43
+ `;
44
+ }
45
+ export function makePolicy(program) {
46
+ registerMake(program, {
47
+ command: 'make:policy',
48
+ description: 'Create a new authorization policy class',
49
+ label: 'Policy created',
50
+ suffix: 'Policy',
51
+ directory: 'app/Policies',
52
+ testKind: 'unit',
53
+ stub,
54
+ });
55
+ }
56
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/commands/make/policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;;;;;yBAMgB,SAAS;;;;;eAKnB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,aAAa;QAC1B,WAAW,EAAE,yCAAyC;QACtD,KAAK,EAAQ,gBAAgB;QAC7B,MAAM,EAAO,QAAQ;QACrB,SAAS,EAAI,cAAc;QAC3B,QAAQ,EAAK,MAAM;QACnB,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc9C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASnD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc9C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnD"}
@@ -21,6 +21,7 @@ export function makeProvider(program) {
21
21
  label: 'Provider created',
22
22
  suffix: 'ServiceProvider',
23
23
  directory: 'app/Providers',
24
+ testKind: 'unit',
24
25
  stub,
25
26
  });
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;eAEM,SAAS;;;;;;;;;;CAUvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,eAAe;QAC5B,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAQ,kBAAkB;QAC/B,MAAM,EAAO,iBAAiB;QAC9B,SAAS,EAAI,eAAe;QAC5B,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;eAEM,SAAS;;;;;;;;;;CAUvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,eAAe;QAC5B,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAQ,kBAAkB;QAC/B,MAAM,EAAO,iBAAiB;QAC9B,SAAS,EAAI,eAAe;QAC5B,QAAQ,EAAK,MAAM;QACnB,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/commands/make/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAuC9C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASlD"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/commands/make/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAuC9C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUlD"}
@@ -46,6 +46,7 @@ export function makeRequest(program) {
46
46
  label: 'Request created',
47
47
  suffix: 'Request',
48
48
  directory: 'app/Http/Requests',
49
+ testKind: 'unit',
49
50
  stub,
50
51
  });
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/commands/make/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;eAEM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,cAAc;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,KAAK,EAAQ,iBAAiB;QAC9B,MAAM,EAAO,SAAS;QACtB,SAAS,EAAI,mBAAmB;QAChC,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/commands/make/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,SAAiB;IACpC,OAAO;;eAEM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,cAAc;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,KAAK,EAAQ,iBAAiB;QAC9B,MAAM,EAAO,SAAS;QACtB,SAAS,EAAI,mBAAmB;QAChC,QAAQ,EAAK,MAAM;QACnB,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Test-file stubs shared by `make:test` and the `--with-test` flag on the
3
+ * other `make:*` generators. Kept import-free so `_shared.ts` (the generator
4
+ * harness) and `test.ts` (the make:test command) can both use them without a
5
+ * module cycle.
6
+ */
7
+ /**
8
+ * Feature test — boots the app via `AppTestCase` and exercises HTTP / DB /
9
+ * services. The convention assumed here matches `docs/guide/testing.md`:
10
+ * apps export `class AppTestCase extends TestCase` from `tests/TestCase.ts`.
11
+ * The generated file uses Node's built-in `node:test` runner (the documented
12
+ * runner — runs via `tsx --test tests/**\/*.test.ts`).
13
+ *
14
+ * @param sourceRel — when set (the `--with-test` flow), a `// Covers …`
15
+ * comment points the test back at the file it was generated alongside.
16
+ */
17
+ export declare function featureStub(testName: string, sourceRel?: string): string;
18
+ /**
19
+ * Unit test — plain `node:test` + `assert`. No app boot, no TestCase,
20
+ * no `@rudderjs/testing`. The right shape for pure functions, validators,
21
+ * domain logic, or anything that shouldn't pay the boot cost.
22
+ */
23
+ export declare function unitStub(testName: string, sourceRel?: string): string;
24
+ //# sourceMappingURL=test-stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-stubs.d.ts","sourceRoot":"","sources":["../../../src/commands/make/test-stubs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAUrE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Test-file stubs shared by `make:test` and the `--with-test` flag on the
3
+ * other `make:*` generators. Kept import-free so `_shared.ts` (the generator
4
+ * harness) and `test.ts` (the make:test command) can both use them without a
5
+ * module cycle.
6
+ */
7
+ /**
8
+ * Feature test — boots the app via `AppTestCase` and exercises HTTP / DB /
9
+ * services. The convention assumed here matches `docs/guide/testing.md`:
10
+ * apps export `class AppTestCase extends TestCase` from `tests/TestCase.ts`.
11
+ * The generated file uses Node's built-in `node:test` runner (the documented
12
+ * runner — runs via `tsx --test tests/**\/*.test.ts`).
13
+ *
14
+ * @param sourceRel — when set (the `--with-test` flow), a `// Covers …`
15
+ * comment points the test back at the file it was generated alongside.
16
+ */
17
+ export function featureStub(testName, sourceRel) {
18
+ return `import { describe, it, before, after } from 'node:test'
19
+ import { AppTestCase } from './TestCase.js'
20
+ ${sourceRel ? `\n// Covers ${sourceRel}` : ''}
21
+ describe('${testName}', () => {
22
+ let t: AppTestCase
23
+
24
+ before(async () => { t = await AppTestCase.create() })
25
+ after (async () => { await t.teardown() })
26
+
27
+ it('does something', async () => {
28
+ const res = await t.get('/')
29
+ res.assertOk()
30
+ })
31
+ })
32
+ `;
33
+ }
34
+ /**
35
+ * Unit test — plain `node:test` + `assert`. No app boot, no TestCase,
36
+ * no `@rudderjs/testing`. The right shape for pure functions, validators,
37
+ * domain logic, or anything that shouldn't pay the boot cost.
38
+ */
39
+ export function unitStub(testName, sourceRel) {
40
+ return `import { describe, it } from 'node:test'
41
+ import assert from 'node:assert/strict'
42
+ ${sourceRel ? `\n// Covers ${sourceRel}` : ''}
43
+ describe('${testName}', () => {
44
+ it('does something', () => {
45
+ assert.equal(1 + 1, 2)
46
+ })
47
+ })
48
+ `;
49
+ }
50
+ //# sourceMappingURL=test-stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-stubs.js","sourceRoot":"","sources":["../../../src/commands/make/test-stubs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAkB;IAC9D,OAAO;;EAEP,SAAS,CAAC,CAAC,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;YACjC,QAAQ;;;;;;;;;;;CAWnB,CAAA;AACD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,SAAkB;IAC3D,OAAO;;EAEP,SAAS,CAAC,CAAC,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;YACjC,QAAQ;;;;;CAKnB,CAAA;AACD,CAAC"}
@@ -1,17 +1,5 @@
1
1
  import type { Command } from 'commander';
2
- /**
3
- * Feature test — boots the app via `AppTestCase` and exercises HTTP / DB /
4
- * services. The convention assumed here matches `docs/guide/testing.md`:
5
- * apps export `class AppTestCase extends TestCase` from `tests/TestCase.ts`.
6
- * The generated file uses Node's built-in `node:test` runner (the documented
7
- * runner — runs via `tsx --test tests/**\/*.test.ts`).
8
- */
9
- export declare function featureStub(testName: string): string;
10
- /**
11
- * Unit test — plain `node:test` + `assert`. No app boot, no TestCase,
12
- * no `@rudderjs/testing`. The right shape for pure functions, validators,
13
- * domain logic, or anything that shouldn't pay the boot cost.
14
- */
15
- export declare function unitStub(testName: string): string;
2
+ import { featureStub, unitStub } from './test-stubs.js';
3
+ export { featureStub, unitStub };
16
4
  export declare function makeTest(program: Command): void;
17
5
  //# sourceMappingURL=test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/commands/make/test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBpD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUjD;AAqBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB/C"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/commands/make/test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;AAqBhC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB/C"}
@@ -2,47 +2,8 @@ import { existsSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import chalk from 'chalk';
4
4
  import { registerMake } from './_shared.js';
5
- // ── Stubs ─────────────────────────────────────────────────────
6
- /**
7
- * Feature test — boots the app via `AppTestCase` and exercises HTTP / DB /
8
- * services. The convention assumed here matches `docs/guide/testing.md`:
9
- * apps export `class AppTestCase extends TestCase` from `tests/TestCase.ts`.
10
- * The generated file uses Node's built-in `node:test` runner (the documented
11
- * runner — runs via `tsx --test tests/**\/*.test.ts`).
12
- */
13
- export function featureStub(testName) {
14
- return `import { describe, it, before, after } from 'node:test'
15
- import { AppTestCase } from './TestCase.js'
16
-
17
- describe('${testName}', () => {
18
- let t: AppTestCase
19
-
20
- before(async () => { t = await AppTestCase.create() })
21
- after (async () => { await t.teardown() })
22
-
23
- it('does something', async () => {
24
- const res = await t.get('/')
25
- res.assertOk()
26
- })
27
- })
28
- `;
29
- }
30
- /**
31
- * Unit test — plain `node:test` + `assert`. No app boot, no TestCase,
32
- * no `@rudderjs/testing`. The right shape for pure functions, validators,
33
- * domain logic, or anything that shouldn't pay the boot cost.
34
- */
35
- export function unitStub(testName) {
36
- return `import { describe, it } from 'node:test'
37
- import assert from 'node:assert/strict'
38
-
39
- describe('${testName}', () => {
40
- it('does something', () => {
41
- assert.equal(1 + 1, 2)
42
- })
43
- })
44
- `;
45
- }
5
+ import { featureStub, unitStub } from './test-stubs.js';
6
+ export { featureStub, unitStub };
46
7
  // ── Helpers ───────────────────────────────────────────────────
47
8
  /**
48
9
  * Trim a trailing `.test` so `make:test User` produces a `describe('User', …)`
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/make/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,iEAAiE;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO;;;YAGG,QAAQ;;;;;;;;;;;CAWnB,CAAA;AACD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO;;;YAGG,QAAQ;;;;;CAKnB,CAAA;AACD,CAAC;AAED,iEAAiE;AAEjE;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACvE,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAA6B;IAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;AAClE,CAAC;AAED,iEAAiE;AAEjE,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,WAAW;QACxB,WAAW,EAAE,0FAA0F;QACvG,KAAK,EAAQ,cAAc;QAC3B,sEAAsE;QACtE,mEAAmE;QACnE,8DAA8D;QAC9D,MAAM,EAAO,OAAO;QACpB,SAAS,EAAI,OAAO;QACpB,IAAI,EAAS,QAAQ;QACrB,YAAY,EAAE;YACZ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kEAAkE,EAAE;SACzG;QACD,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAChD,uEAAuE;YACvE,2DAA2D;YAC3D,IAAI,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAM;YACxB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;YACxE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uFAAuF,CAAC,CAAC,CAAA;YACpH,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW;IACX,QAAQ;IACR,eAAe;IACf,QAAQ;CACT,CAAA"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/make/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;AAEhC,iEAAiE;AAEjE;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACvE,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAA6B;IAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;AAClE,CAAC;AAED,iEAAiE;AAEjE,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,YAAY,CAAC,OAAO,EAAE;QACpB,OAAO,EAAM,WAAW;QACxB,WAAW,EAAE,0FAA0F;QACvG,KAAK,EAAQ,cAAc;QAC3B,sEAAsE;QACtE,mEAAmE;QACnE,8DAA8D;QAC9D,MAAM,EAAO,OAAO;QACpB,SAAS,EAAI,OAAO;QACpB,IAAI,EAAS,QAAQ;QACrB,YAAY,EAAE;YACZ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kEAAkE,EAAE;SACzG;QACD,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAChD,uEAAuE;YACvE,2DAA2D;YAC3D,IAAI,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAM;YACxB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;YACxE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uFAAuF,CAAC,CAAC,CAAA;YACpH,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW;IACX,QAAQ;IACR,eAAe;IACf,QAAQ;CACT,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"make.d.ts","sourceRoot":"","sources":["../../src/commands/make.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAexC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8BlD"}
1
+ {"version":3,"file":"make.d.ts","sourceRoot":"","sources":["../../src/commands/make.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmClD"}
@@ -8,9 +8,14 @@ import { makeRequest } from './make/request.js';
8
8
  import { makeProvider } from './make/provider.js';
9
9
  import { makeCommandCmd } from './make/command.js';
10
10
  import { makeEvent } from './make/event.js';
11
+ import { makeException } from './make/exception.js';
11
12
  import { makeListener } from './make/listener.js';
12
13
  import { makeMail } from './make/mail.js';
13
14
  import { makeTest } from './make/test.js';
15
+ import { makePolicy } from './make/policy.js';
16
+ import { makeObserver } from './make/observer.js';
17
+ import { makeCast } from './make/cast.js';
18
+ import { makeNotification } from './make/notification.js';
14
19
  export function makeCommand(program) {
15
20
  // CLI-owned generic scaffolders
16
21
  makeController(program);
@@ -21,9 +26,14 @@ export function makeCommand(program) {
21
26
  makeProvider(program);
22
27
  makeCommandCmd(program);
23
28
  makeEvent(program);
29
+ makeException(program);
24
30
  makeListener(program);
25
31
  makeMail(program);
26
32
  makeTest(program);
33
+ makePolicy(program);
34
+ makeObserver(program);
35
+ makeCast(program);
36
+ makeNotification(program);
27
37
  // Package-contributed scaffolders (registered via registerMakeSpecs)
28
38
  for (const spec of getMakeSpecs()) {
29
39
  program
@@ -1 +1 @@
1
- {"version":3,"file":"make.js","sourceRoot":"","sources":["../../src/commands/make.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,gCAAgC;IAChC,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,SAAS,CAAC,OAAO,CAAC,CAAA;IAClB,OAAO,CAAC,OAAO,CAAC,CAAA;IAChB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,WAAW,CAAC,OAAO,CAAC,CAAA;IACpB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,SAAS,CAAC,OAAO,CAAC,CAAA;IAClB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,CAAA;IACjB,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjB,qEAAqE;IACrE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,EAAE,CAAC;QAClC,OAAO;aACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,CAAC;aACjC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;aAC7B,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;aACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;gBACzD,OAAM;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;IACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"make.js","sourceRoot":"","sources":["../../src/commands/make.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Command } from 'commander';
2
+ interface ClearResult {
3
+ /** Path relative to the app root, e.g. `bootstrap/cache/` */
4
+ target: string;
5
+ /** What the target holds — shown next to the checkmark */
6
+ label: string;
7
+ cleared: boolean;
8
+ }
9
+ /**
10
+ * Remove the framework's filesystem caches. Everything here is regenerated
11
+ * automatically: the provider manifest self-heals at boot, and Vite rebuilds
12
+ * its dep-optimizer cache on the next dev server start.
13
+ *
14
+ * Deliberately NOT cleared: `.rudder/types/` and `pages/__view/` (committed,
15
+ * regenerated by scanners — wiping them breaks a fresh-clone typecheck) and
16
+ * `dist/` (build output, that's `pnpm clean`'s job).
17
+ */
18
+ export declare function clearFrameworkCaches(cwd: string): ClearResult[];
19
+ /** Print one line per target — ✔ cleared / dim already-empty. */
20
+ export declare function reportClearResults(results: ClearResult[]): void;
21
+ /**
22
+ * `rudder optimize:clear` — Laravel-parity name for "wipe the framework's
23
+ * filesystem caches". Skip-boot: it must work when a corrupt cache is the
24
+ * reason the app can't boot.
25
+ */
26
+ export declare function optimizeClearCommand(program: Command): void;
27
+ export {};
28
+ //# sourceMappingURL=optimize-clear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize-clear.d.ts","sourceRoot":"","sources":["../../src/commands/optimize-clear.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,UAAU,WAAW;IACnB,6DAA6D;IAC7D,MAAM,EAAG,MAAM,CAAA;IACf,0DAA0D;IAC1D,KAAK,EAAI,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAY/D;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAQ/D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO3D"}
@@ -0,0 +1,50 @@
1
+ import { rmSync, existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import chalk from 'chalk';
4
+ /**
5
+ * Remove the framework's filesystem caches. Everything here is regenerated
6
+ * automatically: the provider manifest self-heals at boot, and Vite rebuilds
7
+ * its dep-optimizer cache on the next dev server start.
8
+ *
9
+ * Deliberately NOT cleared: `.rudder/types/` and `pages/__view/` (committed,
10
+ * regenerated by scanners — wiping them breaks a fresh-clone typecheck) and
11
+ * `dist/` (build output, that's `pnpm clean`'s job).
12
+ */
13
+ export function clearFrameworkCaches(cwd) {
14
+ const targets = [
15
+ { target: 'bootstrap/cache/', label: 'provider manifest (self-heals at boot)' },
16
+ { target: 'node_modules/.vite/', label: 'Vite dep-optimizer cache' },
17
+ ];
18
+ return targets.map(({ target, label }) => {
19
+ const abs = path.join(cwd, target);
20
+ if (!existsSync(abs))
21
+ return { target, label, cleared: false };
22
+ rmSync(abs, { recursive: true, force: true });
23
+ return { target, label, cleared: true };
24
+ });
25
+ }
26
+ /** Print one line per target — ✔ cleared / dim already-empty. */
27
+ export function reportClearResults(results) {
28
+ for (const r of results) {
29
+ if (r.cleared) {
30
+ console.log(chalk.green(' ✔ Cleared:'), chalk.cyan(r.target), chalk.dim(`— ${r.label}`));
31
+ }
32
+ else {
33
+ console.log(chalk.dim(` - ${r.target} already empty`));
34
+ }
35
+ }
36
+ }
37
+ /**
38
+ * `rudder optimize:clear` — Laravel-parity name for "wipe the framework's
39
+ * filesystem caches". Skip-boot: it must work when a corrupt cache is the
40
+ * reason the app can't boot.
41
+ */
42
+ export function optimizeClearCommand(program) {
43
+ program
44
+ .command('optimize:clear')
45
+ .description('Remove framework filesystem caches (provider manifest, Vite dep-optimizer cache)')
46
+ .action(() => {
47
+ reportClearResults(clearFrameworkCaches(process.cwd()));
48
+ });
49
+ }
50
+ //# sourceMappingURL=optimize-clear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize-clear.js","sourceRoot":"","sources":["../../src/commands/optimize-clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,OAAO,GAAwC;QACnD,EAAE,MAAM,EAAE,kBAAkB,EAAK,KAAK,EAAE,wCAAwC,EAAE;QAClF,EAAE,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,0BAA0B,EAAE;KACrE,CAAA;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC9D,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,GAAG,EAAE;QACX,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACN,CAAC"}
package/dist/index.js CHANGED
@@ -17,6 +17,9 @@ import { aboutCommand } from './commands/about.js';
17
17
  import { testCommand } from './commands/test.js';
18
18
  import { doctorCommand } from './commands/doctor.js';
19
19
  import { tinkerCommand } from './commands/tinker.js';
20
+ import { optimizeClearCommand } from './commands/optimize-clear.js';
21
+ import { freshCommand } from './commands/fresh.js';
22
+ import { downCommand, upCommand } from './commands/maintenance.js';
20
23
  import { rudder, parseSignature, CancelledError, commandObservers } from '@rudderjs/console';
21
24
  import { CliError } from './errors.js';
22
25
  // The `rudder` CLI's own version, read from its package.json at runtime — works
@@ -215,8 +218,9 @@ async function loadPackageCommands() {
215
218
  const register = mod['registerSchemaTypesCommand'];
216
219
  register(rudder, { bootApp });
217
220
  },
218
- // @rudderjs/orm → db:show, db:table. Resolves the native engine (via
219
- // bootApp on demand, like schema:types) to inspect its live connection.
221
+ // @rudderjs/orm → db:show, db:table, db:query. The inspect pair resolves
222
+ // the native engine (via bootApp on demand, like schema:types); db:query
223
+ // rides the DB facade on whatever adapter the app runs.
220
224
  async () => {
221
225
  const mod = await tryImport('@rudderjs/orm', 'commands/db-inspect');
222
226
  const register = mod['registerDbInspectCommands'];
@@ -249,6 +253,12 @@ async function loadPackageCommands() {
249
253
  const register = mod['registerRouteListCommand'];
250
254
  register(rudder);
251
255
  },
256
+ // @rudderjs/openapi → openapi:generate
257
+ async () => {
258
+ const mod = await tryImport('@rudderjs/openapi', 'commands/openapi-generate');
259
+ const register = mod['registerOpenApiGenerateCommand'];
260
+ register(rudder);
261
+ },
252
262
  // @rudderjs/core → event:list
253
263
  async () => {
254
264
  const mod = await tryImport('@rudderjs/core', 'commands/event-list');
@@ -289,6 +299,12 @@ async function loadPackageCommands() {
289
299
  const register = mod['registerEnvSyncCommand'];
290
300
  register(rudder);
291
301
  },
302
+ // @rudderjs/vite → config:sync
303
+ async () => {
304
+ const mod = await tryImport('@rudderjs/vite', 'commands/config-sync');
305
+ const register = mod['registerConfigSyncCommand'];
306
+ register(rudder);
307
+ },
292
308
  ];
293
309
  await Promise.all(loaders.map(fn => fn().catch(() => { })));
294
310
  }
@@ -366,6 +382,10 @@ async function main() {
366
382
  testCommand(program);
367
383
  doctorCommand(program, { bootApp });
368
384
  tinkerCommand(program);
385
+ optimizeClearCommand(program);
386
+ freshCommand(program);
387
+ downCommand(program);
388
+ upCommand(program);
369
389
  // Commands that scan files / manage tooling state must work even when the
370
390
  // app cannot boot (e.g. fresh clone, missing manifest, broken provider config).
371
391
  // List them here to skip the bootApp() phase entirely.
@@ -391,11 +411,19 @@ async function main() {
391
411
  // - `remove` uninstalls a package — the about-to-be-deleted provider
392
412
  // may still be in node_modules but is being torn out; booting would
393
413
  // be wasted work at best and surface confusing errors at worst.
414
+ // - `optimize:clear` must work when a corrupt cache is the reason the
415
+ // app can't boot. `fresh` is an orchestrator — each step that needs
416
+ // the app boots its own child process, so `fresh` itself never holds
417
+ // connections to the database it is about to drop.
394
418
  const NO_BOOT_EXACT = new Set([
395
419
  'providers:discover', 'module:publish', 'view:sync', 'routes:sync', 'env:sync',
396
420
  'db:generate', 'db:push',
397
421
  'migrate', 'migrate:fresh', 'migrate:status', 'migrate:rollback', 'migrate:refresh',
398
422
  'add', 'remove', 'upgrade', 'key:generate', 'about', 'test',
423
+ 'optimize:clear', 'fresh',
424
+ // `down`/`up` just write/remove the storage/framework/down flag file — no
425
+ // app context needed (and the app may be down because it can't boot).
426
+ 'down', 'up',
399
427
  // `doctor` fast-path runs filesystem/env checks only. `--deep` is handled
400
428
  // inside the command's handler, which boots the app on demand (Phase 4).
401
429
  'doctor',