@fluojs/cli 1.0.0-beta.1

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +155 -0
  3. package/README.md +155 -0
  4. package/bin/fluo.mjs +5 -0
  5. package/dist/cli.d.ts +37 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +292 -0
  8. package/dist/commands/generate.d.ts +40 -0
  9. package/dist/commands/generate.d.ts.map +1 -0
  10. package/dist/commands/generate.js +134 -0
  11. package/dist/commands/inspect.d.ts +30 -0
  12. package/dist/commands/inspect.d.ts.map +1 -0
  13. package/dist/commands/inspect.js +221 -0
  14. package/dist/commands/migrate.d.ts +30 -0
  15. package/dist/commands/migrate.d.ts.map +1 -0
  16. package/dist/commands/migrate.js +173 -0
  17. package/dist/commands/new.d.ts +45 -0
  18. package/dist/commands/new.d.ts.map +1 -0
  19. package/dist/commands/new.js +353 -0
  20. package/dist/generator-types.d.ts +21 -0
  21. package/dist/generator-types.d.ts.map +1 -0
  22. package/dist/generator-types.js +1 -0
  23. package/dist/generators/controller.d.ts +3 -0
  24. package/dist/generators/controller.d.ts.map +1 -0
  25. package/dist/generators/controller.js +22 -0
  26. package/dist/generators/guard.d.ts +3 -0
  27. package/dist/generators/guard.d.ts.map +1 -0
  28. package/dist/generators/guard.js +15 -0
  29. package/dist/generators/interceptor.d.ts +3 -0
  30. package/dist/generators/interceptor.d.ts.map +1 -0
  31. package/dist/generators/interceptor.js +15 -0
  32. package/dist/generators/manifest.d.ts +121 -0
  33. package/dist/generators/manifest.d.ts.map +1 -0
  34. package/dist/generators/manifest.js +130 -0
  35. package/dist/generators/middleware.d.ts +3 -0
  36. package/dist/generators/middleware.d.ts.map +1 -0
  37. package/dist/generators/middleware.js +15 -0
  38. package/dist/generators/module.d.ts +6 -0
  39. package/dist/generators/module.d.ts.map +1 -0
  40. package/dist/generators/module.js +143 -0
  41. package/dist/generators/render.d.ts +2 -0
  42. package/dist/generators/render.d.ts.map +1 -0
  43. package/dist/generators/render.js +17 -0
  44. package/dist/generators/repository.d.ts +3 -0
  45. package/dist/generators/repository.d.ts.map +1 -0
  46. package/dist/generators/repository.js +29 -0
  47. package/dist/generators/request-dto.d.ts +3 -0
  48. package/dist/generators/request-dto.d.ts.map +1 -0
  49. package/dist/generators/request-dto.js +17 -0
  50. package/dist/generators/response-dto.d.ts +3 -0
  51. package/dist/generators/response-dto.d.ts.map +1 -0
  52. package/dist/generators/response-dto.js +17 -0
  53. package/dist/generators/service.d.ts +3 -0
  54. package/dist/generators/service.d.ts.map +1 -0
  55. package/dist/generators/service.js +22 -0
  56. package/dist/generators/templates/controller.test.ts.ejs +21 -0
  57. package/dist/generators/templates/controller.ts.ejs +29 -0
  58. package/dist/generators/templates/guard.ts.ejs +7 -0
  59. package/dist/generators/templates/interceptor.ts.ejs +7 -0
  60. package/dist/generators/templates/middleware.ts.ejs +11 -0
  61. package/dist/generators/templates/module.ts.ejs +9 -0
  62. package/dist/generators/templates/repository.slice.test.ts.ejs +15 -0
  63. package/dist/generators/templates/repository.test.ts.ejs +9 -0
  64. package/dist/generators/templates/repository.ts.ejs +10 -0
  65. package/dist/generators/templates/request-dto.ts.ejs +9 -0
  66. package/dist/generators/templates/response-dto.ts.ejs +3 -0
  67. package/dist/generators/templates/service.test.ts.ejs +21 -0
  68. package/dist/generators/templates/service.ts.ejs +24 -0
  69. package/dist/generators/utils.d.ts +4 -0
  70. package/dist/generators/utils.d.ts.map +1 -0
  71. package/dist/generators/utils.js +18 -0
  72. package/dist/help.d.ts +8 -0
  73. package/dist/help.d.ts.map +1 -0
  74. package/dist/help.js +16 -0
  75. package/dist/index.d.ts +4 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +2 -0
  78. package/dist/new/install.d.ts +51 -0
  79. package/dist/new/install.d.ts.map +1 -0
  80. package/dist/new/install.js +140 -0
  81. package/dist/new/package-spec-resolver.d.ts +4 -0
  82. package/dist/new/package-spec-resolver.d.ts.map +1 -0
  83. package/dist/new/package-spec-resolver.js +397 -0
  84. package/dist/new/prompt.d.ts +56 -0
  85. package/dist/new/prompt.d.ts.map +1 -0
  86. package/dist/new/prompt.js +278 -0
  87. package/dist/new/resolver.d.ts +32 -0
  88. package/dist/new/resolver.d.ts.map +1 -0
  89. package/dist/new/resolver.js +93 -0
  90. package/dist/new/scaffold.d.ts +14 -0
  91. package/dist/new/scaffold.d.ts.map +1 -0
  92. package/dist/new/scaffold.js +2010 -0
  93. package/dist/new/starter-profiles.d.ts +91 -0
  94. package/dist/new/starter-profiles.d.ts.map +1 -0
  95. package/dist/new/starter-profiles.js +347 -0
  96. package/dist/new/types.d.ts +63 -0
  97. package/dist/new/types.d.ts.map +1 -0
  98. package/dist/new/types.js +1 -0
  99. package/dist/registry.d.ts +10 -0
  100. package/dist/registry.d.ts.map +1 -0
  101. package/dist/registry.js +30 -0
  102. package/dist/transforms/nestjs-migrate.d.ts +33 -0
  103. package/dist/transforms/nestjs-migrate.d.ts.map +1 -0
  104. package/dist/transforms/nestjs-migrate.js +891 -0
  105. package/dist/types.d.ts +12 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +1 -0
  108. package/package.json +65 -0
@@ -0,0 +1,91 @@
1
+ import type { BootstrapPlatform, BootstrapRuntime, BootstrapSchema, BootstrapShape, BootstrapToolingPreset, BootstrapTopology, BootstrapTransport } from './types.js';
2
+ /** Emitter families that decide which scaffold template tree renders the starter. */
3
+ export type StarterEmitterType = 'http' | 'microservice' | 'mixed';
4
+ /** Stable IDs for the scaffold recipes currently shipped by `fluo new`. */
5
+ export type StarterScaffoldRecipeId = 'application-bun-bun-http' | 'application-cloudflare-workers-cloudflare-workers-http' | 'application-deno-deno-http' | 'application-node-express-http' | 'application-node-fastify-http' | 'application-node-nodejs-http' | 'microservice-node-none-grpc' | 'microservice-node-none-kafka' | 'microservice-node-none-mqtt' | 'microservice-node-none-nats' | 'microservice-node-none-rabbitmq' | 'microservice-node-none-redis-streams' | 'microservice-node-none-tcp' | 'mixed-node-fastify-tcp';
6
+ type StarterDependencies = {
7
+ dependencies: readonly string[];
8
+ devDependencies: readonly string[];
9
+ };
10
+ /** Fully resolved starter metadata used by schema resolution, prompts, and scaffold emission. */
11
+ export interface StarterProfile {
12
+ dependencies: StarterDependencies;
13
+ emitter: {
14
+ platform: BootstrapPlatform;
15
+ preset: BootstrapToolingPreset;
16
+ runtime: BootstrapRuntime;
17
+ transport: BootstrapTransport;
18
+ type: StarterEmitterType;
19
+ };
20
+ id: StarterScaffoldRecipeId;
21
+ platformPromptLabel?: string;
22
+ promptLabel: string;
23
+ schema: BootstrapSchema;
24
+ }
25
+ /** Supported microservice starter transports recognized by `fluo new`. */
26
+ export declare const SUPPORTED_MICROSERVICE_STARTER_TRANSPORTS: readonly BootstrapTransport[];
27
+ /** Backward-compatible alias for the current shipped microservice starter transport list. */
28
+ export declare const DOCUMENTED_MICROSERVICE_TRANSPORTS: readonly BootstrapTransport[];
29
+ /** Source-of-truth registry for starter dependencies, prompt labels, and emitted scaffold recipes. */
30
+ export declare const STARTER_PROFILE_REGISTRY: readonly StarterProfile[];
31
+ /** Supported scaffold shapes accepted by the current starter matrix. */
32
+ export declare const SUPPORTED_BOOTSTRAP_SHAPES: readonly BootstrapShape[];
33
+ /** Supported runtime families accepted by the current starter matrix. */
34
+ export declare const SUPPORTED_BOOTSTRAP_RUNTIMES: readonly BootstrapRuntime[];
35
+ /** Supported platform adapters accepted by the current starter matrix. */
36
+ export declare const SUPPORTED_BOOTSTRAP_PLATFORMS: readonly BootstrapPlatform[];
37
+ /** Supported transports accepted by the current starter matrix. */
38
+ export declare const SUPPORTED_BOOTSTRAP_TRANSPORTS: readonly BootstrapTransport[];
39
+ /** Supported tooling presets accepted by the current starter matrix. */
40
+ export declare const SUPPORTED_BOOTSTRAP_TOOLING_PRESETS: readonly BootstrapToolingPreset[];
41
+ /** Supported topology modes accepted by the current starter matrix. */
42
+ export declare const SUPPORTED_BOOTSTRAP_TOPOLOGY_MODES: readonly BootstrapTopology['mode'][];
43
+ /** Default starter profile used for shape-less `fluo new` invocations. */
44
+ export declare const DEFAULT_BOOTSTRAP_PROFILE: StarterProfile;
45
+ /**
46
+ * Resolves the default starter profile for one shape/runtime branch.
47
+ *
48
+ * @param shape Shape requested by the caller.
49
+ * @param runtime Optional runtime override used to pick Bun/Deno/Workers application defaults.
50
+ * @returns The starter profile that defines the default contract for that branch.
51
+ */
52
+ export declare function getStarterProfileForShape(shape: BootstrapShape, runtime?: BootstrapRuntime): StarterProfile;
53
+ /**
54
+ * Lists the application starter profiles currently published by the registry.
55
+ *
56
+ * @param runtime Optional runtime filter.
57
+ * @returns Application starter profiles for the selected runtime, or all application starters when omitted.
58
+ */
59
+ export declare function getApplicationStarterProfiles(runtime?: BootstrapRuntime): readonly StarterProfile[];
60
+ /**
61
+ * Clones the default bootstrap schema for one shape/runtime branch.
62
+ *
63
+ * @param shape Shape requested by the caller.
64
+ * @param runtime Optional runtime override used for application starters.
65
+ * @returns A fresh schema object safe to mutate during resolution.
66
+ */
67
+ export declare function getDefaultBootstrapSchemaForShape(shape: BootstrapShape, runtime?: BootstrapRuntime): BootstrapSchema;
68
+ /**
69
+ * Clones the global default bootstrap schema.
70
+ *
71
+ * @returns A fresh schema object for the default Node.js + Fastify HTTP starter.
72
+ */
73
+ export declare function getDefaultBootstrapSchema(): BootstrapSchema;
74
+ /**
75
+ * Finds the starter profile that exactly matches a resolved bootstrap schema.
76
+ *
77
+ * @param schema Fully resolved bootstrap schema.
78
+ * @returns The matching starter profile, or `undefined` when the schema is validation-only.
79
+ */
80
+ export declare function getStarterProfileFromSchema(schema: BootstrapSchema): StarterProfile | undefined;
81
+ /**
82
+ * Checks whether one transport belongs to the supported microservice starter transport family.
83
+ *
84
+ * @param transport Transport selected by the caller.
85
+ * @returns `true` when the transport is part of the supported microservice starter transport set.
86
+ */
87
+ export declare function isSupportedMicroserviceStarterTransport(transport: BootstrapTransport): boolean;
88
+ /** Backward-compatible alias for starter-transport membership checks. */
89
+ export declare const isDocumentedMicroserviceTransport: typeof isSupportedMicroserviceStarterTransport;
90
+ export {};
91
+ //# sourceMappingURL=starter-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter-profiles.d.ts","sourceRoot":"","sources":["../../src/new/starter-profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,347 @@
1
+ /** Emitter families that decide which scaffold template tree renders the starter. */
2
+
3
+ /** Stable IDs for the scaffold recipes currently shipped by `fluo new`. */
4
+
5
+ /** Fully resolved starter metadata used by schema resolution, prompts, and scaffold emission. */
6
+
7
+ const DEFAULT_TOPOLOGY = {
8
+ deferred: true,
9
+ mode: 'single-package'
10
+ };
11
+ function createSchema(shape, runtime, platform, transport, tooling = 'standard') {
12
+ return {
13
+ platform,
14
+ runtime,
15
+ shape,
16
+ tooling,
17
+ topology: {
18
+ ...DEFAULT_TOPOLOGY
19
+ },
20
+ transport
21
+ };
22
+ }
23
+ function cloneBootstrapSchema(schema) {
24
+ return {
25
+ ...schema,
26
+ topology: {
27
+ ...schema.topology
28
+ }
29
+ };
30
+ }
31
+
32
+ /** Supported microservice starter transports recognized by `fluo new`. */
33
+ export const SUPPORTED_MICROSERVICE_STARTER_TRANSPORTS = ['tcp', 'redis-streams', 'nats', 'kafka', 'rabbitmq', 'mqtt', 'grpc'];
34
+
35
+ /** Backward-compatible alias for the current shipped microservice starter transport list. */
36
+ export const DOCUMENTED_MICROSERVICE_TRANSPORTS = SUPPORTED_MICROSERVICE_STARTER_TRANSPORTS;
37
+
38
+ /** Source-of-truth registry for starter dependencies, prompt labels, and emitted scaffold recipes. */
39
+ export const STARTER_PROFILE_REGISTRY = [{
40
+ dependencies: {
41
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-bun', '@fluojs/runtime'],
42
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
43
+ },
44
+ emitter: {
45
+ platform: 'bun',
46
+ preset: 'standard',
47
+ runtime: 'bun',
48
+ transport: 'http',
49
+ type: 'http'
50
+ },
51
+ id: 'application-bun-bun-http',
52
+ platformPromptLabel: 'Bun native HTTP',
53
+ promptLabel: 'Application (HTTP starter)',
54
+ schema: createSchema('application', 'bun', 'bun', 'http')
55
+ }, {
56
+ dependencies: {
57
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-deno', '@fluojs/runtime'],
58
+ devDependencies: ['@fluojs/cli']
59
+ },
60
+ emitter: {
61
+ platform: 'deno',
62
+ preset: 'standard',
63
+ runtime: 'deno',
64
+ transport: 'http',
65
+ type: 'http'
66
+ },
67
+ id: 'application-deno-deno-http',
68
+ platformPromptLabel: 'Deno native HTTP',
69
+ promptLabel: 'Application (HTTP starter)',
70
+ schema: createSchema('application', 'deno', 'deno', 'http')
71
+ }, {
72
+ dependencies: {
73
+ dependencies: ['@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-cloudflare-workers', '@fluojs/runtime'],
74
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
75
+ },
76
+ emitter: {
77
+ platform: 'cloudflare-workers',
78
+ preset: 'standard',
79
+ runtime: 'cloudflare-workers',
80
+ transport: 'http',
81
+ type: 'http'
82
+ },
83
+ id: 'application-cloudflare-workers-cloudflare-workers-http',
84
+ platformPromptLabel: 'Cloudflare Workers',
85
+ promptLabel: 'Application (HTTP starter)',
86
+ schema: createSchema('application', 'cloudflare-workers', 'cloudflare-workers', 'http')
87
+ }, {
88
+ dependencies: {
89
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-fastify', '@fluojs/runtime'],
90
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
91
+ },
92
+ emitter: {
93
+ platform: 'fastify',
94
+ preset: 'standard',
95
+ runtime: 'node',
96
+ transport: 'http',
97
+ type: 'http'
98
+ },
99
+ id: 'application-node-fastify-http',
100
+ platformPromptLabel: 'Fastify',
101
+ promptLabel: 'Application (HTTP starter)',
102
+ schema: createSchema('application', 'node', 'fastify', 'http')
103
+ }, {
104
+ dependencies: {
105
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-express', '@fluojs/runtime'],
106
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
107
+ },
108
+ emitter: {
109
+ platform: 'express',
110
+ preset: 'standard',
111
+ runtime: 'node',
112
+ transport: 'http',
113
+ type: 'http'
114
+ },
115
+ id: 'application-node-express-http',
116
+ platformPromptLabel: 'Express',
117
+ promptLabel: 'Application (HTTP starter)',
118
+ schema: createSchema('application', 'node', 'express', 'http')
119
+ }, {
120
+ dependencies: {
121
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/platform-nodejs', '@fluojs/runtime'],
122
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
123
+ },
124
+ emitter: {
125
+ platform: 'nodejs',
126
+ preset: 'standard',
127
+ runtime: 'node',
128
+ transport: 'http',
129
+ type: 'http'
130
+ },
131
+ id: 'application-node-nodejs-http',
132
+ platformPromptLabel: 'Raw Node.js HTTP',
133
+ promptLabel: 'Application (HTTP starter)',
134
+ schema: createSchema('application', 'node', 'nodejs', 'http')
135
+ }, {
136
+ dependencies: {
137
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime'],
138
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
139
+ },
140
+ emitter: {
141
+ platform: 'none',
142
+ preset: 'standard',
143
+ runtime: 'node',
144
+ transport: 'tcp',
145
+ type: 'microservice'
146
+ },
147
+ id: 'microservice-node-none-tcp',
148
+ promptLabel: 'Microservice (transport-first starter)',
149
+ schema: createSchema('microservice', 'node', 'none', 'tcp')
150
+ }, {
151
+ dependencies: {
152
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', 'ioredis'],
153
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
154
+ },
155
+ emitter: {
156
+ platform: 'none',
157
+ preset: 'standard',
158
+ runtime: 'node',
159
+ transport: 'redis-streams',
160
+ type: 'microservice'
161
+ },
162
+ id: 'microservice-node-none-redis-streams',
163
+ promptLabel: 'Microservice (Redis Streams starter)',
164
+ schema: createSchema('microservice', 'node', 'none', 'redis-streams')
165
+ }, {
166
+ dependencies: {
167
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', 'mqtt'],
168
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
169
+ },
170
+ emitter: {
171
+ platform: 'none',
172
+ preset: 'standard',
173
+ runtime: 'node',
174
+ transport: 'mqtt',
175
+ type: 'microservice'
176
+ },
177
+ id: 'microservice-node-none-mqtt',
178
+ promptLabel: 'Microservice (MQTT starter)',
179
+ schema: createSchema('microservice', 'node', 'none', 'mqtt')
180
+ }, {
181
+ dependencies: {
182
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', '@grpc/grpc-js', '@grpc/proto-loader'],
183
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
184
+ },
185
+ emitter: {
186
+ platform: 'none',
187
+ preset: 'standard',
188
+ runtime: 'node',
189
+ transport: 'grpc',
190
+ type: 'microservice'
191
+ },
192
+ id: 'microservice-node-none-grpc',
193
+ promptLabel: 'Microservice (gRPC starter)',
194
+ schema: createSchema('microservice', 'node', 'none', 'grpc')
195
+ }, {
196
+ dependencies: {
197
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', 'nats'],
198
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
199
+ },
200
+ emitter: {
201
+ platform: 'none',
202
+ preset: 'standard',
203
+ runtime: 'node',
204
+ transport: 'nats',
205
+ type: 'microservice'
206
+ },
207
+ id: 'microservice-node-none-nats',
208
+ promptLabel: 'Microservice (NATS starter)',
209
+ schema: createSchema('microservice', 'node', 'none', 'nats')
210
+ }, {
211
+ dependencies: {
212
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', 'kafkajs'],
213
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
214
+ },
215
+ emitter: {
216
+ platform: 'none',
217
+ preset: 'standard',
218
+ runtime: 'node',
219
+ transport: 'kafka',
220
+ type: 'microservice'
221
+ },
222
+ id: 'microservice-node-none-kafka',
223
+ promptLabel: 'Microservice (Kafka starter)',
224
+ schema: createSchema('microservice', 'node', 'none', 'kafka')
225
+ }, {
226
+ dependencies: {
227
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/di', '@fluojs/microservices', '@fluojs/runtime', 'amqplib'],
228
+ devDependencies: ['@fluojs/cli', '@fluojs/testing', '@types/amqplib']
229
+ },
230
+ emitter: {
231
+ platform: 'none',
232
+ preset: 'standard',
233
+ runtime: 'node',
234
+ transport: 'rabbitmq',
235
+ type: 'microservice'
236
+ },
237
+ id: 'microservice-node-none-rabbitmq',
238
+ promptLabel: 'Microservice (RabbitMQ starter)',
239
+ schema: createSchema('microservice', 'node', 'none', 'rabbitmq')
240
+ }, {
241
+ dependencies: {
242
+ dependencies: ['@fluojs/config', '@fluojs/core', '@fluojs/validation', '@fluojs/di', '@fluojs/http', '@fluojs/microservices', '@fluojs/platform-fastify', '@fluojs/runtime'],
243
+ devDependencies: ['@fluojs/cli', '@fluojs/testing']
244
+ },
245
+ emitter: {
246
+ platform: 'fastify',
247
+ preset: 'standard',
248
+ runtime: 'node',
249
+ transport: 'tcp',
250
+ type: 'mixed'
251
+ },
252
+ id: 'mixed-node-fastify-tcp',
253
+ promptLabel: 'Mixed (HTTP API + microservice starter)',
254
+ schema: createSchema('mixed', 'node', 'fastify', 'tcp')
255
+ }];
256
+
257
+ /** Supported scaffold shapes accepted by the current starter matrix. */
258
+ export const SUPPORTED_BOOTSTRAP_SHAPES = STARTER_PROFILE_REGISTRY.map(profile => profile.schema.shape);
259
+ /** Supported runtime families accepted by the current starter matrix. */
260
+ export const SUPPORTED_BOOTSTRAP_RUNTIMES = ['bun', 'cloudflare-workers', 'deno', 'node'];
261
+ /** Supported platform adapters accepted by the current starter matrix. */
262
+ export const SUPPORTED_BOOTSTRAP_PLATFORMS = ['bun', 'cloudflare-workers', 'deno', 'express', 'fastify', 'nodejs', 'none'];
263
+ /** Supported transports accepted by the current starter matrix. */
264
+ export const SUPPORTED_BOOTSTRAP_TRANSPORTS = ['http', ...SUPPORTED_MICROSERVICE_STARTER_TRANSPORTS];
265
+ /** Supported tooling presets accepted by the current starter matrix. */
266
+ export const SUPPORTED_BOOTSTRAP_TOOLING_PRESETS = ['standard'];
267
+ /** Supported topology modes accepted by the current starter matrix. */
268
+ export const SUPPORTED_BOOTSTRAP_TOPOLOGY_MODES = ['single-package'];
269
+
270
+ /** Default starter profile used for shape-less `fluo new` invocations. */
271
+ export const DEFAULT_BOOTSTRAP_PROFILE = STARTER_PROFILE_REGISTRY.find(profile => profile.id === 'application-node-fastify-http');
272
+
273
+ /**
274
+ * Resolves the default starter profile for one shape/runtime branch.
275
+ *
276
+ * @param shape Shape requested by the caller.
277
+ * @param runtime Optional runtime override used to pick Bun/Deno/Workers application defaults.
278
+ * @returns The starter profile that defines the default contract for that branch.
279
+ */
280
+ export function getStarterProfileForShape(shape, runtime) {
281
+ if (runtime !== undefined) {
282
+ return STARTER_PROFILE_REGISTRY.find(profile => profile.schema.shape === shape && profile.schema.runtime === runtime) ?? DEFAULT_BOOTSTRAP_PROFILE;
283
+ }
284
+ if (shape === 'application') {
285
+ return DEFAULT_BOOTSTRAP_PROFILE;
286
+ }
287
+ if (shape === 'microservice') {
288
+ return STARTER_PROFILE_REGISTRY.find(profile => profile.id === 'microservice-node-none-tcp') ?? DEFAULT_BOOTSTRAP_PROFILE;
289
+ }
290
+ if (shape === 'mixed') {
291
+ return STARTER_PROFILE_REGISTRY.find(profile => profile.id === 'mixed-node-fastify-tcp') ?? DEFAULT_BOOTSTRAP_PROFILE;
292
+ }
293
+ return DEFAULT_BOOTSTRAP_PROFILE;
294
+ }
295
+
296
+ /**
297
+ * Lists the application starter profiles currently published by the registry.
298
+ *
299
+ * @param runtime Optional runtime filter.
300
+ * @returns Application starter profiles for the selected runtime, or all application starters when omitted.
301
+ */
302
+ export function getApplicationStarterProfiles(runtime) {
303
+ return STARTER_PROFILE_REGISTRY.filter(profile => profile.schema.shape === 'application' && (runtime === undefined || profile.schema.runtime === runtime));
304
+ }
305
+
306
+ /**
307
+ * Clones the default bootstrap schema for one shape/runtime branch.
308
+ *
309
+ * @param shape Shape requested by the caller.
310
+ * @param runtime Optional runtime override used for application starters.
311
+ * @returns A fresh schema object safe to mutate during resolution.
312
+ */
313
+ export function getDefaultBootstrapSchemaForShape(shape, runtime) {
314
+ return cloneBootstrapSchema(getStarterProfileForShape(shape, runtime).schema);
315
+ }
316
+
317
+ /**
318
+ * Clones the global default bootstrap schema.
319
+ *
320
+ * @returns A fresh schema object for the default Node.js + Fastify HTTP starter.
321
+ */
322
+ export function getDefaultBootstrapSchema() {
323
+ return cloneBootstrapSchema(DEFAULT_BOOTSTRAP_PROFILE.schema);
324
+ }
325
+
326
+ /**
327
+ * Finds the starter profile that exactly matches a resolved bootstrap schema.
328
+ *
329
+ * @param schema Fully resolved bootstrap schema.
330
+ * @returns The matching starter profile, or `undefined` when the schema is validation-only.
331
+ */
332
+ export function getStarterProfileFromSchema(schema) {
333
+ return STARTER_PROFILE_REGISTRY.find(profile => profile.schema.shape === schema.shape && profile.schema.runtime === schema.runtime && profile.schema.platform === schema.platform && profile.schema.transport === schema.transport && profile.schema.tooling === schema.tooling && profile.schema.topology.deferred === schema.topology.deferred && profile.schema.topology.mode === schema.topology.mode);
334
+ }
335
+
336
+ /**
337
+ * Checks whether one transport belongs to the supported microservice starter transport family.
338
+ *
339
+ * @param transport Transport selected by the caller.
340
+ * @returns `true` when the transport is part of the supported microservice starter transport set.
341
+ */
342
+ export function isSupportedMicroserviceStarterTransport(transport) {
343
+ return SUPPORTED_MICROSERVICE_STARTER_TRANSPORTS.includes(transport);
344
+ }
345
+
346
+ /** Backward-compatible alias for starter-transport membership checks. */
347
+ export const isDocumentedMicroserviceTransport = isSupportedMicroserviceStarterTransport;
@@ -0,0 +1,63 @@
1
+ /** Supported package managers for generated starters. */
2
+ export type PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn';
3
+ /** Source for resolving starter package dependencies. */
4
+ export type DependencySource = 'local' | 'published';
5
+ /** Supported starter shapes for `fluo new`. */
6
+ export type BootstrapShape = 'application' | 'microservice' | 'mixed';
7
+ /** Supported runtime families for the current starter matrix. */
8
+ export type BootstrapRuntime = 'bun' | 'cloudflare-workers' | 'deno' | 'node';
9
+ /** Supported platform adapters for the current starter matrix. */
10
+ export type BootstrapPlatform = 'bun' | 'cloudflare-workers' | 'deno' | 'express' | 'fastify' | 'nodejs' | 'none';
11
+ /** Supported transport families for the current starter matrix. */
12
+ export type BootstrapTransport = 'grpc' | 'http' | 'kafka' | 'mqtt' | 'nats' | 'rabbitmq' | 'redis-streams' | 'tcp';
13
+ /** Supported tooling presets for the current starter matrix. */
14
+ export type BootstrapToolingPreset = 'standard';
15
+ /** Topology settings for the generated starter layout. */
16
+ export interface BootstrapTopology {
17
+ deferred: boolean;
18
+ mode: 'single-package';
19
+ }
20
+ /** Shape-first scaffold schema resolved before file generation. */
21
+ export interface BootstrapSchema {
22
+ platform: BootstrapPlatform;
23
+ runtime: BootstrapRuntime;
24
+ shape: BootstrapShape;
25
+ tooling: BootstrapToolingPreset;
26
+ topology: BootstrapTopology;
27
+ transport: BootstrapTransport;
28
+ }
29
+ /** Full scaffold options used by the file emitter and post-write steps. */
30
+ export interface BootstrapOptions extends BootstrapSchema {
31
+ dependencySource?: DependencySource;
32
+ force?: boolean;
33
+ initializeGit?: boolean;
34
+ installDependencies?: boolean;
35
+ packageManager: PackageManager;
36
+ projectName: string;
37
+ repoRoot?: string;
38
+ skipInstall?: boolean;
39
+ targetDirectory: string;
40
+ }
41
+ /** Prompt descriptor for bootstrap answer collection. */
42
+ export interface BootstrapPrompt {
43
+ key: keyof BootstrapAnswers;
44
+ label: string;
45
+ }
46
+ /** Resolved answers shared by flag-driven, interactive, and programmatic flows. */
47
+ export interface BootstrapAnswers extends BootstrapSchema {
48
+ initializeGit: boolean;
49
+ installDependencies: boolean;
50
+ packageManager: PackageManager;
51
+ projectName: string;
52
+ targetDirectory: string;
53
+ }
54
+ /** Programmatic overrides for `runNewCommand(...)`. */
55
+ export interface NewCommandOptions {
56
+ dependencySource?: DependencySource;
57
+ force?: boolean;
58
+ initializeGit?: boolean;
59
+ installDependencies?: boolean;
60
+ repoRoot?: string;
61
+ skipInstall?: boolean;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/new/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7D,yDAAyD;AACzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAC;AACrD,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;AACtE,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9E,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClH,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,KAAK,CAAC;AACpH,gEAAgE;AAChE,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,gBAAgB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { GeneratorFactory } from './generator-types.js';
2
+ export declare class GeneratorRegistry {
3
+ private readonly registry;
4
+ register(kind: string, factory: GeneratorFactory, description?: string): this;
5
+ resolve(kind: string): GeneratorFactory | undefined;
6
+ has(kind: string): boolean;
7
+ kinds(): string[];
8
+ }
9
+ export declare const defaultRegistry: GeneratorRegistry;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,sBAAsB,CAAC;AAIpF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IAErE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAInD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,KAAK,IAAI,MAAM,EAAE;CAGlB;AAED,eAAO,MAAM,eAAe,mBAA0B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { generatorManifest } from './generators/manifest.js';
2
+ export class GeneratorRegistry {
3
+ registry = new Map();
4
+ register(kind, factory, description) {
5
+ this.registry.set(kind, {
6
+ factory,
7
+ description
8
+ });
9
+ return this;
10
+ }
11
+ resolve(kind) {
12
+ return this.registry.get(kind)?.factory;
13
+ }
14
+ has(kind) {
15
+ return this.registry.has(kind);
16
+ }
17
+ kinds() {
18
+ return Array.from(this.registry.keys());
19
+ }
20
+ }
21
+ export const defaultRegistry = new GeneratorRegistry();
22
+ for (const entry of generatorManifest) {
23
+ defaultRegistry.register(entry.kind, entry.factory, entry.description);
24
+ const registryAliases = 'registryAliases' in entry ? entry.registryAliases : undefined;
25
+ if (registryAliases) {
26
+ for (const alias of registryAliases) {
27
+ defaultRegistry.register(alias, entry.factory, entry.description);
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,33 @@
1
+ export declare const MIGRATION_TRANSFORMS: readonly ["imports", "injectable", "scope", "bootstrap", "testing", "tsconfig"];
2
+ export type MigrationTransformKind = typeof MIGRATION_TRANSFORMS[number];
3
+ export declare const WARNING_CATEGORIES: readonly ["inject-token", "request-dto", "pipe-converter", "bootstrap-unsupported", "testing-unsupported", "import-unsupported", "injectable-options", "tsconfig-parse", "bootstrap-port"];
4
+ export type WarningCategory = typeof WARNING_CATEGORIES[number];
5
+ export type MigrationWarning = {
6
+ category: WarningCategory;
7
+ filePath: string;
8
+ line: number;
9
+ message: string;
10
+ };
11
+ export declare function getWarningCategoryLabel(category: WarningCategory): string;
12
+ export declare function groupWarningsByCategory(warnings: MigrationWarning[]): Map<WarningCategory, MigrationWarning[]>;
13
+ export type FileMigrationResult = {
14
+ appliedTransforms: MigrationTransformKind[];
15
+ changed: boolean;
16
+ filePath: string;
17
+ warnings: MigrationWarning[];
18
+ };
19
+ export type MigrationReport = {
20
+ apply: boolean;
21
+ changedFiles: number;
22
+ scannedFiles: number;
23
+ warningCount: number;
24
+ fileResults: FileMigrationResult[];
25
+ };
26
+ export type RunNestJsMigrationOptions = {
27
+ apply: boolean;
28
+ enabledTransforms: ReadonlySet<MigrationTransformKind>;
29
+ targetPath: string;
30
+ };
31
+ export declare function runNestJsMigration(options: RunNestJsMigrationOptions): MigrationReport;
32
+ export declare function renderTransformList(kinds: readonly MigrationTransformKind[]): string;
33
+ //# sourceMappingURL=nestjs-migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs-migrate.d.ts","sourceRoot":"","sources":["../../src/transforms/nestjs-migrate.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,iFAAkF,CAAC;AAEpH,MAAM,MAAM,sBAAsB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAOzE,eAAO,MAAM,kBAAkB,4LAUrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAS9G;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA6kCF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,eAAe,CAqDtF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,CAEpF"}