@adonisjs/core 7.0.0-next.10 → 7.0.0-next.11

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 (128) hide show
  1. package/build/commands/add.js +40 -110
  2. package/build/commands/build.js +51 -107
  3. package/build/commands/configure.js +82 -177
  4. package/build/commands/eject.js +17 -60
  5. package/build/commands/env/add.js +55 -134
  6. package/build/commands/generate_key.js +22 -66
  7. package/build/commands/inspect_rcfile.js +27 -55
  8. package/build/commands/list/routes.js +246 -116
  9. package/build/commands/make/command.js +15 -57
  10. package/build/commands/make/controller.js +43 -120
  11. package/build/commands/make/event.js +16 -62
  12. package/build/commands/make/exception.js +16 -62
  13. package/build/commands/make/listener.js +36 -93
  14. package/build/commands/make/middleware.js +41 -101
  15. package/build/commands/make/preload.js +47 -113
  16. package/build/commands/make/provider.js +47 -112
  17. package/build/commands/make/service.js +16 -55
  18. package/build/commands/make/test.js +47 -132
  19. package/build/commands/make/transformer.js +17 -64
  20. package/build/commands/make/validator.js +20 -80
  21. package/build/commands/make/view.js +15 -56
  22. package/build/commands/repl.js +17 -50
  23. package/build/commands/serve.js +80 -150
  24. package/build/commands/test.js +92 -202
  25. package/build/factories/app.js +2 -9
  26. package/build/factories/bodyparser.js +2 -9
  27. package/build/factories/core/ace.js +15 -46
  28. package/build/factories/core/ignitor.js +12 -180
  29. package/build/factories/core/main.js +22 -11
  30. package/build/factories/core/test_utils.js +19 -43
  31. package/build/factories/encryption.js +2 -9
  32. package/build/factories/events.js +2 -9
  33. package/build/factories/hash.js +2 -9
  34. package/build/factories/http.js +2 -9
  35. package/build/factories/logger.js +2 -9
  36. package/build/factories/stubs.js +28 -91
  37. package/build/index.js +13 -46
  38. package/build/modules/ace/codemods.js +222 -477
  39. package/build/modules/ace/main.js +2 -41
  40. package/build/modules/app.js +4 -26
  41. package/build/modules/bodyparser/bodyparser_middleware.js +2 -14
  42. package/build/modules/bodyparser/main.js +4 -9
  43. package/build/modules/config.js +4 -26
  44. package/build/modules/container.js +4 -9
  45. package/build/modules/dumper/main.js +6 -32
  46. package/build/modules/dumper/plugins/edge.js +2 -62
  47. package/build/modules/encryption.js +4 -26
  48. package/build/modules/env/editor.js +2 -9
  49. package/build/modules/env/main.js +2 -28
  50. package/build/modules/events.js +4 -9
  51. package/build/modules/hash/drivers/argon.js +2 -9
  52. package/build/modules/hash/drivers/bcrypt.js +2 -20
  53. package/build/modules/hash/drivers/scrypt.js +2 -9
  54. package/build/modules/hash/main.js +6 -28
  55. package/build/modules/hash/phc_formatter.js +2 -9
  56. package/build/modules/health.js +2 -9
  57. package/build/modules/http/main.js +4 -15
  58. package/build/modules/http/url_builder_client.js +2 -9
  59. package/build/modules/logger.d.ts +30 -0
  60. package/build/modules/logger.js +4 -9
  61. package/build/modules/repl.js +4 -9
  62. package/build/modules/transformers/main.js +4 -9
  63. package/build/providers/app_provider.js +147 -359
  64. package/build/providers/edge_provider.js +97 -165
  65. package/build/providers/hash_provider.js +29 -91
  66. package/build/providers/repl_provider.js +61 -152
  67. package/build/providers/vinejs_provider.d.ts +1 -1
  68. package/build/providers/vinejs_provider.js +20 -66
  69. package/build/services/ace.js +2 -17
  70. package/build/services/app.js +2 -21
  71. package/build/services/config.js +2 -13
  72. package/build/services/dumper.js +5 -21
  73. package/build/services/emitter.js +2 -14
  74. package/build/services/encryption.js +2 -14
  75. package/build/services/hash.js +2 -14
  76. package/build/services/logger.js +2 -14
  77. package/build/services/repl.js +2 -14
  78. package/build/services/router.js +2 -14
  79. package/build/services/server.js +2 -14
  80. package/build/services/test_utils.js +2 -17
  81. package/build/services/url_builder.js +5 -17
  82. package/build/src/exceptions.js +2 -49
  83. package/build/src/helpers/assert.js +2 -55
  84. package/build/src/helpers/http.js +2 -28
  85. package/build/src/helpers/is.js +3 -31
  86. package/build/src/helpers/main.js +5 -52
  87. package/build/src/helpers/string.js +2 -78
  88. package/build/src/helpers/types.js +26 -135
  89. package/build/src/helpers/verification_token.js +2 -120
  90. package/build/src/test_utils/main.js +5 -77
  91. package/build/src/types.js +0 -8
  92. package/build/src/vine.js +2 -105
  93. package/build/types/ace.js +2 -9
  94. package/build/types/app.js +2 -9
  95. package/build/types/bodyparser.js +2 -9
  96. package/build/types/common.js +2 -9
  97. package/build/types/container.js +2 -9
  98. package/build/types/encryption.js +2 -9
  99. package/build/types/events.js +2 -9
  100. package/build/types/hash.js +2 -9
  101. package/build/types/health.js +2 -9
  102. package/build/types/helpers.js +0 -8
  103. package/build/types/http.js +2 -9
  104. package/build/types/logger.js +2 -9
  105. package/build/types/repl.js +2 -9
  106. package/build/types/transformers.js +2 -9
  107. package/package.json +76 -19
  108. package/build/modules/ace/commands.js +0 -157
  109. package/build/modules/ace/create_kernel.js +0 -91
  110. package/build/modules/ace/kernel.js +0 -40
  111. package/build/modules/dumper/define_config.js +0 -36
  112. package/build/modules/dumper/dumper.js +0 -266
  113. package/build/modules/dumper/errors.js +0 -119
  114. package/build/modules/hash/define_config.js +0 -125
  115. package/build/modules/http/request_validator.js +0 -100
  116. package/build/src/assembler_hooks/index_entities.js +0 -112
  117. package/build/src/cli_formatters/routes_list.js +0 -397
  118. package/build/src/config_provider.js +0 -71
  119. package/build/src/debug.js +0 -25
  120. package/build/src/ignitor/ace.js +0 -102
  121. package/build/src/ignitor/http.js +0 -159
  122. package/build/src/ignitor/main.js +0 -124
  123. package/build/src/ignitor/test.js +0 -66
  124. package/build/src/test_utils/http.js +0 -82
  125. package/build/src/utils.js +0 -114
  126. package/build/stubs/main.js +0 -9
  127. package/build/toolkit/commands/index_commands.js +0 -30
  128. package/build/toolkit/main.js +0 -27
@@ -1,477 +1,222 @@
1
- /*
2
- * @adonisjs/core
3
- *
4
- * (c) AdonisJS
5
- *
6
- * For the full copyright and license information, please view the LICENSE
7
- * file that was distributed with this source code.
8
- */
9
- import { EventEmitter } from 'node:events';
10
- import { EnvEditor } from '@adonisjs/env/editor';
11
- import stringHelpers from "../../src/helpers/string.js";
12
- /**
13
- * Codemods class for programmatically modifying AdonisJS source files.
14
- * This class provides APIs to modify configuration files, register middleware,
15
- * generate stubs, and install packages.
16
- *
17
- * The codemod APIs rely on the "@adonisjs/assembler" package, which must be
18
- * installed as a dependency in the user application.
19
- *
20
- * @example
21
- * ```ts
22
- * const codemods = new Codemods(app, logger)
23
- *
24
- * // Generate a controller from a stub
25
- * await codemods.makeUsingStub(stubsRoot, 'controller.stub', {
26
- * filename: 'UserController',
27
- * entity: { name: 'User' }
28
- * })
29
- *
30
- * // Install packages
31
- * await codemods.installPackages([
32
- * { name: '@adonisjs/lucid', isDevDependency: false }
33
- * ])
34
- * ```
35
- */
36
- export class Codemods extends EventEmitter {
37
- /**
38
- * Reference to lazily imported assembler code transformer
39
- */
40
- #codeTransformer;
41
- /**
42
- * Reference to AdonisJS application
43
- */
44
- #app;
45
- /**
46
- * Reference to CLI logger to write logs
47
- */
48
- #cliLogger;
49
- /**
50
- * Overwrite existing files when generating files
51
- * from stubs
52
- */
53
- overwriteExisting = false;
54
- /**
55
- * Display verbose logs for package installation
56
- */
57
- verboseInstallOutput = false;
58
- constructor(app, cliLogger) {
59
- super();
60
- this.#app = app;
61
- this.#cliLogger = cliLogger;
62
- }
63
- /**
64
- * - Lazily import the code transformer
65
- * - Return a fresh or reused instance of the code transformer
66
- */
67
- async #getCodeTransformer() {
68
- try {
69
- if (!this.#codeTransformer) {
70
- const { CodeTransformer } = await import('@adonisjs/assembler/code_transformer');
71
- this.#codeTransformer = new CodeTransformer(this.#app.appRoot);
72
- }
73
- return this.#codeTransformer;
74
- }
75
- catch {
76
- return null;
77
- }
78
- }
79
- /**
80
- * Returns the installation command for different
81
- * package managers
82
- */
83
- #getInstallationCommands(packages, packageManager, isDev) {
84
- if (!packages.length) {
85
- return '';
86
- }
87
- const colors = this.#cliLogger.getColors();
88
- const devFlag = isDev ? ' -D' : '';
89
- switch (packageManager) {
90
- case 'yarn':
91
- case 'yarn@berry':
92
- return `${colors.yellow(`yarn add${devFlag}`)} ${packages.join(' ')}`;
93
- case 'pnpm':
94
- return `${colors.yellow(`pnpm add${devFlag}`)} ${packages.join(' ')}`;
95
- case 'npm':
96
- default:
97
- return `${colors.yellow(`npm i${devFlag}`)} ${packages.join(' ')}`;
98
- }
99
- }
100
- /**
101
- * Define one or more environment variables in the .env file
102
- *
103
- * @param environmentVariables - Key-value pairs of environment variables
104
- * @param options - Configuration options
105
- * @param options.omitFromExample - Keys to exclude from .env.example file
106
- *
107
- * @example
108
- * ```ts
109
- * await codemods.defineEnvVariables({
110
- * DB_CONNECTION: 'mysql',
111
- * DB_HOST: 'localhost',
112
- * SECRET_KEY: 'abc123'
113
- * }, {
114
- * omitFromExample: ['SECRET_KEY']
115
- * })
116
- * ```
117
- */
118
- async defineEnvVariables(environmentVariables, options) {
119
- const editor = new EnvEditor(this.#app.appRoot);
120
- await editor.load();
121
- Object.keys(environmentVariables).forEach((key) => {
122
- const value = environmentVariables[key];
123
- editor.add(key, value, options?.omitFromExample?.includes(key));
124
- });
125
- await editor.save();
126
- this.#cliLogger.action('update .env file').succeeded();
127
- }
128
- /**
129
- * Returns the TsMorph project instance for advanced AST manipulations.
130
- * See https://ts-morph.com/ for documentation.
131
- *
132
- * @example
133
- * ```ts
134
- * const project = await codemods.getTsMorphProject()
135
- * if (project) {
136
- * const sourceFile = project.getSourceFile('app/controllers/user_controller.ts')
137
- * // Perform advanced AST operations
138
- * }
139
- * ```
140
- */
141
- async getTsMorphProject() {
142
- const transformer = await this.#getCodeTransformer();
143
- if (!transformer) {
144
- this.#cliLogger.warning('Cannot create CodeTransformer. Install "@adonisjs/assembler" to modify source files');
145
- return;
146
- }
147
- return transformer.project;
148
- }
149
- /**
150
- * Define validations for the environment variables in the start/env.ts file.
151
- * This method updates the environment validation schema using the assembler.
152
- *
153
- * @param validations - Validation schema node for environment variables
154
- *
155
- * @example
156
- * ```ts
157
- * await codemods.defineEnvValidations({
158
- * NODE_ENV: 'Env.schema.enum(["development", "production", "test"] as const)',
159
- * PORT: 'Env.schema.number()',
160
- * HOST: 'Env.schema.string({ format: "host" })'
161
- * })
162
- * ```
163
- */
164
- async defineEnvValidations(validations) {
165
- const transformer = await this.#getCodeTransformer();
166
- if (!transformer) {
167
- this.#cliLogger.warning('Cannot update "start/env.ts" file. Install "@adonisjs/assembler" to modify source files');
168
- return;
169
- }
170
- const action = this.#cliLogger.action('update start/env.ts file');
171
- try {
172
- await transformer.defineEnvValidations(validations);
173
- action.succeeded();
174
- }
175
- catch (error) {
176
- this.emit('error', error);
177
- action.failed(error.message);
178
- }
179
- }
180
- /**
181
- * Register middleware in the start/kernel.ts file.
182
- * This method adds middleware to the specified stack (server, router, or named).
183
- *
184
- * @param stack - The middleware stack to register to ('server' | 'router' | 'named')
185
- * @param middleware - Array of middleware nodes to register
186
- *
187
- * @example
188
- * ```ts
189
- * await codemods.registerMiddleware('server', [
190
- * {
191
- * name: 'cors',
192
- * path: '@adonisjs/cors/cors_middleware'
193
- * }
194
- * ])
195
- * ```
196
- */
197
- async registerMiddleware(stack, middleware) {
198
- const transformer = await this.#getCodeTransformer();
199
- if (!transformer) {
200
- this.#cliLogger.warning('Cannot update "start/kernel.ts" file. Install "@adonisjs/assembler" to modify source files');
201
- return;
202
- }
203
- const action = this.#cliLogger.action('update start/kernel.ts file');
204
- try {
205
- await transformer.addMiddlewareToStack(stack, middleware);
206
- action.succeeded();
207
- }
208
- catch (error) {
209
- this.emit('error', error);
210
- action.failed(error.message);
211
- }
212
- }
213
- /**
214
- * Register bouncer policies to the list of policies collection exported from
215
- * the "app/policies/main.ts" file. This method adds new policy definitions
216
- * to the policies export.
217
- *
218
- * @param policies - Array of policy nodes to register
219
- *
220
- * @example
221
- * ```ts
222
- * await codemods.registerPolicies([
223
- * {
224
- * name: 'UserPolicy',
225
- * path: '#policies/user_policy'
226
- * }
227
- * ])
228
- * ```
229
- */
230
- async registerPolicies(policies) {
231
- const transformer = await this.#getCodeTransformer();
232
- if (!transformer) {
233
- this.#cliLogger.warning('Cannot update "app/policies/main.ts" file. Install "@adonisjs/assembler" to modify source files');
234
- return;
235
- }
236
- const action = this.#cliLogger.action('update app/policies/main.ts file');
237
- try {
238
- await transformer.addPolicies(policies);
239
- action.succeeded();
240
- }
241
- catch (error) {
242
- this.emit('error', error);
243
- action.failed(error.message);
244
- }
245
- }
246
- /**
247
- * Update the adonisrc.ts file with new configuration settings.
248
- * This method allows modification of the AdonisJS runtime configuration.
249
- *
250
- * @param params - Parameters for updating the RC file (varies based on update type)
251
- *
252
- * @example
253
- * ```ts
254
- * await codemods.updateRcFile((rcFile) => {
255
- * rcFile.addCommand('make:custom')
256
- * rcFile.addPreloadFile('#app/events/main')
257
- * })
258
- * ```
259
- */
260
- async updateRcFile(...params) {
261
- const transformer = await this.#getCodeTransformer();
262
- if (!transformer) {
263
- this.#cliLogger.warning('Cannot update "adonisrc.ts" file. Install "@adonisjs/assembler" to modify source files');
264
- return;
265
- }
266
- const action = this.#cliLogger.action('update adonisrc.ts file');
267
- try {
268
- await transformer.updateRcFile(...params);
269
- action.succeeded();
270
- }
271
- catch (error) {
272
- this.emit('error', error);
273
- action.failed(error.message);
274
- }
275
- }
276
- /**
277
- * Register a new Vite plugin in the vite.config.ts file.
278
- * This method adds plugin configuration to the Vite build configuration.
279
- *
280
- * @param params - Parameters for adding the Vite plugin (varies based on plugin type)
281
- *
282
- * @example
283
- * ```ts
284
- * await codemods.registerVitePlugin({
285
- * name: 'vue',
286
- * import: 'import vue from "@vitejs/plugin-vue"',
287
- * options: '()'
288
- * })
289
- * ```
290
- */
291
- async registerVitePlugin(...params) {
292
- const transformer = await this.#getCodeTransformer();
293
- if (!transformer) {
294
- this.#cliLogger.warning('Cannot update "vite.config.ts" file. Install "@adonisjs/assembler" to modify source files');
295
- return;
296
- }
297
- const action = this.#cliLogger.action('update vite.config.ts file');
298
- try {
299
- await transformer.addVitePlugin(...params);
300
- action.succeeded();
301
- }
302
- catch (error) {
303
- this.emit('error', error);
304
- action.failed(error.message);
305
- }
306
- }
307
- /**
308
- * Register a new Japa plugin in the tests/bootstrap.ts file.
309
- * This method adds plugin configuration to the test runner setup.
310
- *
311
- * @param params - Parameters for adding the Japa plugin (varies based on plugin type)
312
- *
313
- * @example
314
- * ```ts
315
- * await codemods.registerJapaPlugin({
316
- * name: 'expect',
317
- * import: 'import { expect } from "@japa/expect"'
318
- * })
319
- * ```
320
- */
321
- async registerJapaPlugin(...params) {
322
- const transformer = await this.#getCodeTransformer();
323
- if (!transformer) {
324
- this.#cliLogger.warning('Cannot update "tests/bootstrap.ts" file. Install "@adonisjs/assembler" to modify source files');
325
- return;
326
- }
327
- const action = this.#cliLogger.action('update tests/bootstrap.ts file');
328
- try {
329
- await transformer.addJapaPlugin(...params);
330
- action.succeeded();
331
- }
332
- catch (error) {
333
- this.emit('error', error);
334
- action.failed(error.message);
335
- }
336
- }
337
- /**
338
- * Generate a file using a stub template
339
- *
340
- * @param stubsRoot - Root directory containing stub files
341
- * @param stubPath - Path to the specific stub file
342
- * @param stubState - Template variables for stub generation
343
- *
344
- * @example
345
- * ```ts
346
- * const result = await codemods.makeUsingStub(
347
- * './stubs',
348
- * 'controller.stub',
349
- * {
350
- * filename: 'UserController',
351
- * entity: { name: 'User', modelName: 'User' },
352
- * resourceful: true
353
- * }
354
- * )
355
- * ```
356
- */
357
- async makeUsingStub(stubsRoot, stubPath, stubState) {
358
- const stubs = await this.#app.stubs.create();
359
- const stub = await stubs.build(stubPath, { source: stubsRoot });
360
- const output = await stub.generate({ force: this.overwriteExisting, ...stubState });
361
- const entityFileName = stringHelpers.toUnixSlash(this.#app.relativePath(output.destination));
362
- const result = { ...output, relativeFileName: entityFileName };
363
- if (output.status === 'skipped') {
364
- this.#cliLogger.action(`create ${entityFileName}`).skipped(output.skipReason);
365
- return result;
366
- }
367
- this.#cliLogger.action(`create ${entityFileName}`).succeeded();
368
- return result;
369
- }
370
- /**
371
- * Install packages using the detected or specified package manager.
372
- * Automatically detects npm, yarn, or pnpm and installs dependencies accordingly.
373
- * You can specify version of each package by setting it in the name like '@adonisjs/lucid@next'.
374
- *
375
- * @param packages - Array of packages with their dependency type
376
- * @param packageManager - Optional package manager to use (auto-detected if not provided)
377
- *
378
- * @example
379
- * ```ts
380
- * const success = await codemods.installPackages([
381
- * { name: '@adonisjs/lucid', isDevDependency: false },
382
- * { name: '@types/node', isDevDependency: true }
383
- * ])
384
- * ```
385
- */
386
- async installPackages(packages, packageManager) {
387
- const transformer = await this.#getCodeTransformer();
388
- const appPath = this.#app.makePath();
389
- const colors = this.#cliLogger.getColors();
390
- const devDependencies = packages
391
- .filter((pkg) => pkg.isDevDependency)
392
- .map(({ name }) => {
393
- return name.startsWith('@adonisjs/') ? `${name}@next` : name;
394
- });
395
- const dependencies = packages
396
- .filter((pkg) => !pkg.isDevDependency)
397
- .map(({ name }) => {
398
- return name.startsWith('@adonisjs/') ? `${name}@next` : name;
399
- });
400
- if (!transformer) {
401
- this.#cliLogger.warning('Cannot install packages. Install "@adonisjs/assembler" or manually install following packages');
402
- this.#cliLogger.log(`devDependencies: ${devDependencies.join(',')}`);
403
- this.#cliLogger.log(`dependencies: ${dependencies.join(',')}`);
404
- return false;
405
- }
406
- packageManager = packageManager ?? (await transformer.detectPackageManager(appPath)) ?? 'npm';
407
- const spinner = this.#cliLogger.await(`installing dependencies using ${packageManager} `);
408
- const silentLogs = !this.verboseInstallOutput;
409
- if (silentLogs) {
410
- spinner.start();
411
- }
412
- try {
413
- if (dependencies.length) {
414
- await transformer.installPackage(dependencies, {
415
- cwd: appPath,
416
- silent: silentLogs,
417
- packageManager,
418
- });
419
- }
420
- if (devDependencies.length) {
421
- await transformer.installPackage(devDependencies, {
422
- dev: true,
423
- cwd: appPath,
424
- silent: silentLogs,
425
- packageManager,
426
- });
427
- }
428
- if (silentLogs) {
429
- spinner.stop();
430
- }
431
- this.#cliLogger.success('Packages installed');
432
- this.#cliLogger.log(devDependencies.map((dependency) => ` ${colors.dim('dev')} ${dependency} `).join('\n'));
433
- this.#cliLogger.log(dependencies.map((dependency) => ` ${colors.dim('prod')} ${dependency} `).join('\n'));
434
- return true;
435
- }
436
- catch (error) {
437
- if (silentLogs) {
438
- spinner.update('unable to install dependencies');
439
- spinner.stop();
440
- }
441
- this.#cliLogger.fatal(error);
442
- this.emit('error', error);
443
- return false;
444
- }
445
- }
446
- /**
447
- * List the packages that should be installed manually.
448
- * This method displays installation commands for different package managers
449
- * when automatic installation is not available or desired.
450
- *
451
- * @param packages - Array of packages with their dependency type
452
- *
453
- * @example
454
- * ```ts
455
- * await codemods.listPackagesToInstall([
456
- * { name: '@adonisjs/lucid', isDevDependency: false },
457
- * { name: '@types/node', isDevDependency: true }
458
- * ])
459
- * // Output:
460
- * // Please install following packages
461
- * // npm i -D @types/node
462
- * // npm i @adonisjs/lucid
463
- * ```
464
- */
465
- async listPackagesToInstall(packages) {
466
- const appPath = this.#app.makePath();
467
- const devDependencies = packages.filter((pkg) => pkg.isDevDependency).map(({ name }) => name);
468
- const dependencies = packages.filter((pkg) => !pkg.isDevDependency).map(({ name }) => name);
469
- let packageManager = null;
470
- const transformer = await this.#getCodeTransformer();
471
- if (transformer)
472
- packageManager = await transformer.detectPackageManager(appPath);
473
- this.#cliLogger.log('Please install following packages');
474
- this.#cliLogger.log(this.#getInstallationCommands(devDependencies, packageManager || 'npm', true));
475
- this.#cliLogger.log(this.#getInstallationCommands(dependencies, packageManager || 'npm', false));
476
- }
477
- }
1
+ import { t as string_default } from "../../string-CJ7ewUFq.js";
2
+ import { EnvEditor } from "@adonisjs/env/editor";
3
+ import { EventEmitter } from "node:events";
4
+ var Codemods = class extends EventEmitter {
5
+ #codeTransformer;
6
+ #app;
7
+ #cliLogger;
8
+ overwriteExisting = false;
9
+ verboseInstallOutput = false;
10
+ constructor(app, cliLogger) {
11
+ super();
12
+ this.#app = app;
13
+ this.#cliLogger = cliLogger;
14
+ }
15
+ async #getCodeTransformer() {
16
+ try {
17
+ if (!this.#codeTransformer) {
18
+ const { CodeTransformer } = await import("@adonisjs/assembler/code_transformer");
19
+ this.#codeTransformer = new CodeTransformer(this.#app.appRoot);
20
+ }
21
+ return this.#codeTransformer;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+ #getInstallationCommands(packages, packageManager, isDev) {
27
+ if (!packages.length) return "";
28
+ const colors = this.#cliLogger.getColors();
29
+ const devFlag = isDev ? " -D" : "";
30
+ switch (packageManager) {
31
+ case "yarn":
32
+ case "yarn@berry": return `${colors.yellow(`yarn add${devFlag}`)} ${packages.join(" ")}`;
33
+ case "pnpm": return `${colors.yellow(`pnpm add${devFlag}`)} ${packages.join(" ")}`;
34
+ case "npm":
35
+ default: return `${colors.yellow(`npm i${devFlag}`)} ${packages.join(" ")}`;
36
+ }
37
+ }
38
+ async defineEnvVariables(environmentVariables, options) {
39
+ const editor = new EnvEditor(this.#app.appRoot);
40
+ await editor.load();
41
+ Object.keys(environmentVariables).forEach((key) => {
42
+ const value = environmentVariables[key];
43
+ editor.add(key, value, options?.omitFromExample?.includes(key));
44
+ });
45
+ await editor.save();
46
+ this.#cliLogger.action("update .env file").succeeded();
47
+ }
48
+ async getTsMorphProject() {
49
+ const transformer = await this.#getCodeTransformer();
50
+ if (!transformer) {
51
+ this.#cliLogger.warning("Cannot create CodeTransformer. Install \"@adonisjs/assembler\" to modify source files");
52
+ return;
53
+ }
54
+ return transformer.project;
55
+ }
56
+ async defineEnvValidations(validations) {
57
+ const transformer = await this.#getCodeTransformer();
58
+ if (!transformer) {
59
+ this.#cliLogger.warning("Cannot update \"start/env.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
60
+ return;
61
+ }
62
+ const action = this.#cliLogger.action("update start/env.ts file");
63
+ try {
64
+ await transformer.defineEnvValidations(validations);
65
+ action.succeeded();
66
+ } catch (error) {
67
+ this.emit("error", error);
68
+ action.failed(error.message);
69
+ }
70
+ }
71
+ async registerMiddleware(stack, middleware) {
72
+ const transformer = await this.#getCodeTransformer();
73
+ if (!transformer) {
74
+ this.#cliLogger.warning("Cannot update \"start/kernel.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
75
+ return;
76
+ }
77
+ const action = this.#cliLogger.action("update start/kernel.ts file");
78
+ try {
79
+ await transformer.addMiddlewareToStack(stack, middleware);
80
+ action.succeeded();
81
+ } catch (error) {
82
+ this.emit("error", error);
83
+ action.failed(error.message);
84
+ }
85
+ }
86
+ async registerPolicies(policies) {
87
+ const transformer = await this.#getCodeTransformer();
88
+ if (!transformer) {
89
+ this.#cliLogger.warning("Cannot update \"app/policies/main.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
90
+ return;
91
+ }
92
+ const action = this.#cliLogger.action("update app/policies/main.ts file");
93
+ try {
94
+ await transformer.addPolicies(policies);
95
+ action.succeeded();
96
+ } catch (error) {
97
+ this.emit("error", error);
98
+ action.failed(error.message);
99
+ }
100
+ }
101
+ async updateRcFile(...params) {
102
+ const transformer = await this.#getCodeTransformer();
103
+ if (!transformer) {
104
+ this.#cliLogger.warning("Cannot update \"adonisrc.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
105
+ return;
106
+ }
107
+ const action = this.#cliLogger.action("update adonisrc.ts file");
108
+ try {
109
+ await transformer.updateRcFile(...params);
110
+ action.succeeded();
111
+ } catch (error) {
112
+ this.emit("error", error);
113
+ action.failed(error.message);
114
+ }
115
+ }
116
+ async registerVitePlugin(...params) {
117
+ const transformer = await this.#getCodeTransformer();
118
+ if (!transformer) {
119
+ this.#cliLogger.warning("Cannot update \"vite.config.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
120
+ return;
121
+ }
122
+ const action = this.#cliLogger.action("update vite.config.ts file");
123
+ try {
124
+ await transformer.addVitePlugin(...params);
125
+ action.succeeded();
126
+ } catch (error) {
127
+ this.emit("error", error);
128
+ action.failed(error.message);
129
+ }
130
+ }
131
+ async registerJapaPlugin(...params) {
132
+ const transformer = await this.#getCodeTransformer();
133
+ if (!transformer) {
134
+ this.#cliLogger.warning("Cannot update \"tests/bootstrap.ts\" file. Install \"@adonisjs/assembler\" to modify source files");
135
+ return;
136
+ }
137
+ const action = this.#cliLogger.action("update tests/bootstrap.ts file");
138
+ try {
139
+ await transformer.addJapaPlugin(...params);
140
+ action.succeeded();
141
+ } catch (error) {
142
+ this.emit("error", error);
143
+ action.failed(error.message);
144
+ }
145
+ }
146
+ async makeUsingStub(stubsRoot, stubPath, stubState) {
147
+ const output = await (await (await this.#app.stubs.create()).build(stubPath, { source: stubsRoot })).generate({
148
+ force: this.overwriteExisting,
149
+ ...stubState
150
+ });
151
+ const entityFileName = string_default.toUnixSlash(this.#app.relativePath(output.destination));
152
+ const result = {
153
+ ...output,
154
+ relativeFileName: entityFileName
155
+ };
156
+ if (output.status === "skipped") {
157
+ this.#cliLogger.action(`create ${entityFileName}`).skipped(output.skipReason);
158
+ return result;
159
+ }
160
+ this.#cliLogger.action(`create ${entityFileName}`).succeeded();
161
+ return result;
162
+ }
163
+ async installPackages(packages, packageManager) {
164
+ const transformer = await this.#getCodeTransformer();
165
+ const appPath = this.#app.makePath();
166
+ const colors = this.#cliLogger.getColors();
167
+ const devDependencies = packages.filter((pkg) => pkg.isDevDependency).map(({ name }) => {
168
+ return name.startsWith("@adonisjs/") ? `${name}@next` : name;
169
+ });
170
+ const dependencies = packages.filter((pkg) => !pkg.isDevDependency).map(({ name }) => {
171
+ return name.startsWith("@adonisjs/") ? `${name}@next` : name;
172
+ });
173
+ if (!transformer) {
174
+ this.#cliLogger.warning("Cannot install packages. Install \"@adonisjs/assembler\" or manually install following packages");
175
+ this.#cliLogger.log(`devDependencies: ${devDependencies.join(",")}`);
176
+ this.#cliLogger.log(`dependencies: ${dependencies.join(",")}`);
177
+ return false;
178
+ }
179
+ packageManager = packageManager ?? await transformer.detectPackageManager(appPath) ?? "npm";
180
+ const spinner = this.#cliLogger.await(`installing dependencies using ${packageManager} `);
181
+ const silentLogs = !this.verboseInstallOutput;
182
+ if (silentLogs) spinner.start();
183
+ try {
184
+ if (dependencies.length) await transformer.installPackage(dependencies, {
185
+ cwd: appPath,
186
+ silent: silentLogs,
187
+ packageManager
188
+ });
189
+ if (devDependencies.length) await transformer.installPackage(devDependencies, {
190
+ dev: true,
191
+ cwd: appPath,
192
+ silent: silentLogs,
193
+ packageManager
194
+ });
195
+ if (silentLogs) spinner.stop();
196
+ this.#cliLogger.success("Packages installed");
197
+ this.#cliLogger.log(devDependencies.map((dependency) => ` ${colors.dim("dev")} ${dependency} `).join("\n"));
198
+ this.#cliLogger.log(dependencies.map((dependency) => ` ${colors.dim("prod")} ${dependency} `).join("\n"));
199
+ return true;
200
+ } catch (error) {
201
+ if (silentLogs) {
202
+ spinner.update("unable to install dependencies");
203
+ spinner.stop();
204
+ }
205
+ this.#cliLogger.fatal(error);
206
+ this.emit("error", error);
207
+ return false;
208
+ }
209
+ }
210
+ async listPackagesToInstall(packages) {
211
+ const appPath = this.#app.makePath();
212
+ const devDependencies = packages.filter((pkg) => pkg.isDevDependency).map(({ name }) => name);
213
+ const dependencies = packages.filter((pkg) => !pkg.isDevDependency).map(({ name }) => name);
214
+ let packageManager = null;
215
+ const transformer = await this.#getCodeTransformer();
216
+ if (transformer) packageManager = await transformer.detectPackageManager(appPath);
217
+ this.#cliLogger.log("Please install following packages");
218
+ this.#cliLogger.log(this.#getInstallationCommands(devDependencies, packageManager || "npm", true));
219
+ this.#cliLogger.log(this.#getInstallationCommands(dependencies, packageManager || "npm", false));
220
+ }
221
+ };
222
+ export { Codemods };