@adonisjs/assembler 8.0.0-next.14 → 8.0.0-next.15

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.
@@ -1,445 +1,8 @@
1
1
  import {
2
- findImport,
3
- inspectClass,
4
- inspectClassMethods,
5
- inspectMethodArguments,
6
- nodeToPlainText,
7
- searchValidatorDirectUsage
8
- } from "../../../chunk-TIKQQRMX.js";
9
- import {
10
- VirtualFileSystem,
11
- debug_default,
12
- isRelative
13
- } from "../../../chunk-7ANGUQDV.js";
14
-
15
- // src/code_scanners/routes_scanner/main.ts
16
- import { cliui } from "@poppinss/cliui";
17
- import string2 from "@poppinss/utils/string";
18
- import { parseImports } from "parse-imports";
19
- import StringBuilder from "@poppinss/utils/string_builder";
20
-
21
- // src/paths_resolver.ts
22
- import { fileURLToPath } from "url";
23
- var PathsResolver = class {
24
- /**
25
- * Cache of resolved paths to avoid resolving the same specifier multiple times
26
- */
27
- #resolvedPaths = {};
28
- /**
29
- * The resolver function used to resolve import specifiers
30
- */
31
- #resolver = (specifier) => import.meta.resolve(specifier);
32
- /**
33
- * Define a custom resolver that resolves a path
34
- *
35
- * The custom resolver function will be used instead of the default
36
- * import.meta.resolve() for resolving import specifiers.
37
- *
38
- * @param resolver - Function that takes a specifier and returns resolved path
39
- */
40
- use(resolver) {
41
- this.#resolver = resolver;
42
- }
43
- /**
44
- * Resolve import specifier to an absolute file path
45
- *
46
- * This method caches resolved paths to improve performance on repeated
47
- * resolutions. Relative paths are not supported and will throw an error.
48
- *
49
- * @param specifier - The import specifier to resolve (must not be relative)
50
- * @returns The resolved absolute file path
51
- * @throws Error when attempting to resolve relative paths
52
- *
53
- * @example
54
- * const path = resolver.resolve('#app/models/user')
55
- * const path2 = resolver.resolve('@/utils/helper')
56
- */
57
- resolve(specifier) {
58
- if (isRelative(specifier)) {
59
- throw new Error("Cannot resolve relative paths using PathsResolver");
60
- }
61
- const cacheKey = specifier;
62
- const cached = this.#resolvedPaths[cacheKey];
63
- if (cached) {
64
- return cached;
65
- }
66
- this.#resolvedPaths[cacheKey] = fileURLToPath(this.#resolver(specifier));
67
- return this.#resolvedPaths[cacheKey];
68
- }
69
- };
70
-
71
- // src/code_scanners/routes_scanner/validator_extractor.ts
72
- import { relative } from "path";
73
- import string from "@poppinss/utils/string";
74
- import { fileURLToPath as fileURLToPath2, pathToFileURL } from "url";
75
- async function extractValidators(appRoot, vfs, controller) {
76
- const root = await vfs.get(controller.path);
77
- const fileContents = root.text();
78
- const controllerClass = inspectClass(root);
79
- if (!controllerClass) {
80
- debug_default(`No class defined within the "%s"`, controller.import.specifier);
81
- return;
82
- }
83
- const method = inspectClassMethods(controllerClass).find((e) => {
84
- return e.find({
85
- rule: { kind: "property_identifier", regex: `\\b${controller.method}\\b` }
86
- });
87
- });
88
- if (!method) {
89
- debug_default(`Unable to find "%s" method in "%s"`, controller.method, controller.import.specifier);
90
- return;
91
- }
92
- const validationCalls = inspectMethodArguments(method, ["request.validateUsing", "vine.validate"]).map((node) => {
93
- const firstArg = node.find({
94
- rule: { any: [{ kind: "identifier" }, { kind: "member_expression" }] }
95
- });
96
- if (!firstArg) {
97
- return;
98
- }
99
- return nodeToPlainText(firstArg);
100
- }).filter((node) => node !== void 0).concat(searchValidatorDirectUsage(method).map((node) => nodeToPlainText(node)));
101
- if (!validationCalls.length) {
102
- debug_default(
103
- `Unable to detect any validation calls in "%s.%s" method`,
104
- controller.import.specifier,
105
- controller.method
106
- );
107
- return;
108
- }
109
- const controllerName = controllerClass.find({ rule: { kind: "type_identifier" } }).text();
110
- const controllerURL = pathToFileURL(controller.path);
111
- const imports = await Promise.all(
112
- validationCalls.map(async (validationCall) => {
113
- const validatorNamespace = validationCall.split(".")[0];
114
- if (validatorNamespace === controllerName) {
115
- return {
116
- name: validationCall,
117
- import: {
118
- specifier: controller.import.specifier,
119
- type: "default",
120
- value: controllerName
121
- }
122
- };
123
- }
124
- const importCall = await findImport(fileContents, validationCall);
125
- if (!importCall) {
126
- debug_default(
127
- 'Unable to find import for "%s" used by "%s.%s" method',
128
- validationCall,
129
- controller.import.specifier,
130
- controller.method
131
- );
132
- return null;
133
- }
134
- return {
135
- name: validationCall,
136
- import: {
137
- specifier: isRelative(importCall.specifier) ? string.toUnixSlash(
138
- relative(appRoot, fileURLToPath2(new URL(importCall.specifier, controllerURL)))
139
- ) : importCall.specifier,
140
- type: importCall.clause.type,
141
- value: importCall.clause.value
142
- }
143
- };
144
- })
145
- );
146
- return imports.filter((value) => !!value);
147
- }
148
-
149
- // src/code_scanners/routes_scanner/main.ts
150
- var RoutesScanner = class {
151
- /**
152
- * The root of the application from where we will resolve
153
- * paths.
154
- */
155
- #appRoot;
156
- /**
157
- * Collection of routes by their controller file path. This helps
158
- * us re-compute request types when the controller is changed.
159
- */
160
- #controllerRoutes = {};
161
- /**
162
- * Collection of scanned routes
163
- */
164
- #scannedRoutes = [];
165
- /**
166
- * A custom method to self compute the response type for a route. Return
167
- * undefined to fallback to the default behavior
168
- */
169
- #computeResponseTypes;
170
- /**
171
- * A custom method to self compute the request type for a route. Return
172
- * undefined to fallback to the default behavior
173
- */
174
- #computeRequestTypes;
175
- /**
176
- * A custom method to self extract the validators from the route controller.
177
- * Return undefined to fallback to the default behavior.
178
- */
179
- #extractValidators;
180
- /**
181
- * CLI UI instance to log colorful messages and progress information
182
- */
183
- ui = cliui();
184
- /**
185
- * The paths resolver is used to convert subpath and package
186
- * imports to absolute paths
187
- */
188
- pathsResolver = new PathsResolver();
189
- /**
190
- * The rules to apply when scanning routes
191
- */
192
- rules = {
193
- skip: [],
194
- request: {},
195
- response: {}
196
- };
197
- /**
198
- * Create a new RoutesScanner instance
199
- *
200
- * @param appRoot - The root directory of the application
201
- * @param rulesCollection - Collection of rules to apply during scanning
202
- */
203
- constructor(appRoot, rulesCollection) {
204
- this.#appRoot = appRoot;
205
- rulesCollection.forEach((rules) => {
206
- this.rules.skip = this.rules.skip.concat(rules.skip);
207
- Object.assign(this.rules.request, rules.request);
208
- Object.assign(this.rules.response, rules.response);
209
- });
210
- this.rules.skip = Array.from(/* @__PURE__ */ new Set([...this.rules.skip]));
211
- }
212
- /**
213
- * Assumes the validators are from VineJS and computes the request types from them
214
- *
215
- * This method generates TypeScript type definitions for request validation
216
- * by analyzing VineJS validators and creating Infer types.
217
- *
218
- * @param route - The scanned route with validators
219
- * @returns Request type definition or undefined
220
- */
221
- #prepareRequestTypes(route) {
222
- if (!route.validators) {
223
- return;
224
- }
225
- const schemas = route.validators.reduce((result, validator) => {
226
- const validatorExport = validator.import.type === "default" ? ".default" : validator.import.type === "named" ? `.${validator.import.value}` : "";
227
- const [, ...segments] = validator.name.split(".");
228
- const namespace = segments.map((segment) => `['${segment}']`).join("");
229
- result.push(
230
- `Infer<(typeof import('${validator.import.specifier}')${validatorExport})${namespace}>`
231
- );
232
- return result;
233
- }, []);
234
- return {
235
- type: schemas.join("|"),
236
- imports: [`import { Infer } from '@vinejs/vine/types'`]
237
- };
238
- }
239
- /**
240
- * Inspects the controller reference and fetches its import specifier
241
- * and the controller name from it.
242
- */
243
- async #inspectControllerSpecifier(importExpression, method) {
244
- const imports = [...await parseImports(importExpression)];
245
- const importedModule = imports.find(
246
- ($import) => $import.isDynamicImport && $import.moduleSpecifier.value
247
- );
248
- if (!importedModule || importedModule.moduleSpecifier.type !== "package" || !importedModule.moduleSpecifier.value) {
249
- return null;
250
- }
251
- const specifier = importedModule.moduleSpecifier.value;
252
- const name = new StringBuilder(specifier.split("/").pop()).removeSuffix("Controller").pascalCase().suffix("Controller").toString();
253
- return {
254
- name,
255
- method: method ?? "handle",
256
- path: string2.toUnixSlash(this.pathsResolver.resolve(specifier)),
257
- import: {
258
- specifier,
259
- type: "default",
260
- value: name
261
- }
262
- };
263
- }
264
- /**
265
- * Defines the response type for the route
266
- */
267
- async #setResponse(route, controller) {
268
- const responseType = await this.#computeResponseTypes?.(route, controller, this);
269
- route.response = responseType ?? {
270
- type: `ReturnType<import('${controller.import.specifier}').default['${controller.method}']>`,
271
- imports: []
272
- };
273
- }
274
- /**
275
- * Defines the request type for the route
276
- */
277
- async #setRequest(route, controller, vfs) {
278
- route.validators = await this.#extractValidators?.(route, controller, this) ?? await extractValidators(this.#appRoot, vfs, controller);
279
- route.request = await this.#computeRequestTypes?.(route, controller, this) ?? this.#prepareRequestTypes(route);
280
- }
281
- /**
282
- * Scans a route that is not using a controller
283
- */
284
- #processRouteWithoutController(route) {
285
- if (!route.name) {
286
- debug_default(`skipping route "%s" scanning. Missing a controller reference`, route.name);
287
- return;
288
- }
289
- const scannedRoute = {
290
- name: route.name,
291
- domain: route.domain,
292
- methods: route.methods,
293
- pattern: route.pattern,
294
- tokens: route.tokens,
295
- request: this.rules.request[route.name],
296
- response: this.rules.response[route.name]
297
- };
298
- this.#scannedRoutes.push(scannedRoute);
299
- }
300
- /**
301
- * Scans a route that is using a controller reference
302
- */
303
- async #processRouteWithController(route, vfs) {
304
- const controller = await this.#inspectControllerSpecifier(
305
- route.controllerReference.importExpression,
306
- route.controllerReference.method
307
- );
308
- if (!controller) {
309
- return this.#processRouteWithoutController(route);
310
- }
311
- const routeName = route.name ?? new StringBuilder(controller.name).removeSuffix("Controller").snakeCase().suffix(`.${string2.snakeCase(controller.method)}`).toString();
312
- if (this.rules.skip.includes(routeName)) {
313
- return;
314
- }
315
- const scannedRoute = {
316
- name: routeName,
317
- domain: route.domain,
318
- methods: route.methods,
319
- pattern: route.pattern,
320
- tokens: route.tokens,
321
- request: this.rules.request[routeName],
322
- response: this.rules.response[routeName],
323
- controller
324
- };
325
- this.#scannedRoutes.push(scannedRoute);
326
- if (!scannedRoute.request || !scannedRoute.response) {
327
- this.#controllerRoutes[controller.path] ??= [];
328
- this.#controllerRoutes[controller.path].push(scannedRoute);
329
- if (!scannedRoute.response) {
330
- await this.#setResponse(scannedRoute, controller);
331
- }
332
- if (!scannedRoute.request) {
333
- await this.#setRequest(scannedRoute, controller, vfs);
334
- }
335
- }
336
- }
337
- /**
338
- * Processing a given route list item and further scan it to
339
- * fetch the controller, request and response types.
340
- */
341
- async #processRoute(route, vfs) {
342
- if (route.name && this.rules.skip.includes(route.name)) {
343
- return;
344
- }
345
- if (!route.controllerReference) {
346
- this.#processRouteWithoutController(route);
347
- return;
348
- }
349
- await this.#processRouteWithController(
350
- route,
351
- vfs
352
- );
353
- }
354
- /**
355
- * Register a callback to self compute the response types for
356
- * a given route. The callback will be executed for all
357
- * the routes and you must return undefined to fallback
358
- * to the default behavior of detecting types
359
- *
360
- * @param callback - Function to compute response types for routes
361
- * @returns This RoutesScanner instance for method chaining
362
- */
363
- defineResponse(callback) {
364
- this.#computeResponseTypes = callback;
365
- return this;
366
- }
367
- /**
368
- * Register a callback to self compute the request types for
369
- * a given route. The callback will be executed for all
370
- * the routes and you must return undefined to fallback
371
- * to the default behavior of detecting types
372
- *
373
- * @param callback - Function to compute request types for routes
374
- * @returns This RoutesScanner instance for method chaining
375
- */
376
- defineRequest(callback) {
377
- this.#computeRequestTypes = callback;
378
- return this;
379
- }
380
- /**
381
- * Register a callback to extract validators from the route controller
382
- *
383
- * @param callback - Function to extract validators from controllers
384
- * @returns This RoutesScanner instance for method chaining
385
- */
386
- extractValidators(callback) {
387
- this.#extractValidators = callback;
388
- return this;
389
- }
390
- /**
391
- * Returns the scanned routes
392
- *
393
- * @returns Array of scanned routes with their metadata
394
- */
395
- getScannedRoutes() {
396
- return this.#scannedRoutes;
397
- }
398
- /**
399
- * Returns an array of controllers bound to the provided
400
- * routes
401
- *
402
- * @returns Array of controller's absolute paths
403
- */
404
- getControllers() {
405
- return Object.keys(this.#controllerRoutes);
406
- }
407
- /**
408
- * Invalidating a controller will trigger computing the validators,
409
- * request types and the response types.
410
- *
411
- * @param controllerPath - Path to the controller file to invalidate
412
- */
413
- async invalidate(controllerPath) {
414
- const controllerRoutes = this.#controllerRoutes[controllerPath];
415
- if (!controllerRoutes) {
416
- return;
417
- }
418
- for (let scannedRoute of controllerRoutes) {
419
- if (scannedRoute.controller) {
420
- const vfs = new VirtualFileSystem(this.#appRoot);
421
- await this.#setResponse(scannedRoute, scannedRoute.controller);
422
- await this.#setRequest(scannedRoute, scannedRoute.controller, vfs);
423
- }
424
- }
425
- }
426
- /**
427
- * Scans an array of Route list items and fetches their validators,
428
- * controllers, and request/response types.
429
- *
430
- * This is the main method that processes all routes and extracts
431
- * their type information for code generation purposes.
432
- *
433
- * @param routes - Array of route list items to scan
434
- */
435
- async scan(routes) {
436
- const vfs = new VirtualFileSystem(this.#appRoot);
437
- for (let route of routes) {
438
- await this.#processRoute(route, vfs);
439
- }
440
- vfs.invalidate();
441
- }
442
- };
2
+ RoutesScanner
3
+ } from "../../../chunk-CX6VPELJ.js";
4
+ import "../../../chunk-TIKQQRMX.js";
5
+ import "../../../chunk-3GYRM5Y2.js";
443
6
  export {
444
7
  RoutesScanner
445
8
  };
@@ -1,15 +1,17 @@
1
1
  import type tsStatic from 'typescript';
2
2
  import type { DevServerOptions } from './types/common.ts';
3
3
  /**
4
- * Exposes the API to start the development server in HMR, watch or static mode.
4
+ * Exposes the API to start the development server in HMR, watch or static mode
5
5
  *
6
6
  * In HMR mode, the DevServer will exec the "bin/server.ts" file and let hot-hook
7
7
  * manage the changes using hot module reloading.
8
8
  *
9
- * In watch mode, the DevServer will start an internal watcher and restarts the after
10
- * every file change. The files must be part of the TypeScript project (via tsconfig.json),
9
+ * In watch mode, the DevServer will start an internal watcher and restarts the server
10
+ * after every file change. The files must be part of the TypeScript project (via tsconfig.json),
11
11
  * or registered as metaFiles.
12
12
  *
13
+ * In static mode, the server runs without file watching or hot reloading.
14
+ *
13
15
  * @example
14
16
  * const devServer = new DevServer(cwd, { hmr: true, hooks: [] })
15
17
  * await devServer.start(ts)
@@ -41,7 +43,12 @@ export declare class DevServer {
41
43
  useColors(colorsToUse: import("@poppinss/colors/types").Colors): void;
42
44
  };
43
45
  /**
44
- * The mode in which the DevServer is running.
46
+ * The mode in which the DevServer is running
47
+ *
48
+ * Returns the current operating mode of the development server:
49
+ * - 'hmr': Hot Module Reloading enabled
50
+ * - 'watch': File system watching with full restarts
51
+ * - 'static': No file watching or hot reloading
45
52
  */
46
53
  get mode(): "hmr" | "watch" | "static";
47
54
  /**
@@ -68,34 +75,74 @@ export declare class DevServer {
68
75
  */
69
76
  constructor(cwd: URL, options: DevServerOptions);
70
77
  /**
71
- * Add listener to get notified when dev server is closed
78
+ * Adds listener to get notified when dev server is closed
79
+ *
80
+ * Registers a callback function that will be invoked when the development
81
+ * server's child process exits. The callback receives the exit code.
72
82
  *
73
83
  * @param callback - Function to call when dev server closes
74
84
  * @returns This DevServer instance for method chaining
85
+ *
86
+ * @example
87
+ * devServer.onClose((exitCode) => {
88
+ * console.log(`Server closed with exit code: ${exitCode}`)
89
+ * })
75
90
  */
76
91
  onClose(callback: (exitCode: number) => any): this;
77
92
  /**
78
- * Add listener to get notified when dev server encounters an error
93
+ * Adds listener to get notified when dev server encounters an error
94
+ *
95
+ * Registers a callback function that will be invoked when the development
96
+ * server's child process encounters an error or fails to start.
79
97
  *
80
98
  * @param callback - Function to call when dev server encounters an error
81
99
  * @returns This DevServer instance for method chaining
100
+ *
101
+ * @example
102
+ * devServer.onError((error) => {
103
+ * console.error('Dev server error:', error.message)
104
+ * })
82
105
  */
83
106
  onError(callback: (error: any) => any): this;
84
107
  /**
85
- * Close watchers and the running child process
108
+ * Closes watchers and terminates the running child process
109
+ *
110
+ * Cleans up keyboard shortcuts, stops file system watchers, and kills
111
+ * the HTTP server child process. This should be called when shutting down
112
+ * the development server.
113
+ *
114
+ * @example
115
+ * await devServer.close()
86
116
  */
87
117
  close(): Promise<void>;
88
118
  /**
89
- * Start the development server in static or HMR mode
119
+ * Starts the development server in static or HMR mode
120
+ *
121
+ * Initializes the server and starts the HTTP server. The mode is determined
122
+ * by the `hmr` option in DevServerOptions. In HMR mode, hot-hook is configured
123
+ * to enable hot module reloading.
90
124
  *
91
125
  * @param ts - TypeScript module reference
126
+ *
127
+ * @example
128
+ * const devServer = new DevServer(cwd, { hmr: true, hooks: [] })
129
+ * await devServer.start(ts)
92
130
  */
93
131
  start(ts: typeof tsStatic): Promise<void>;
94
132
  /**
95
- * Start the development server in watch mode and restart on file changes
133
+ * Starts the development server in watch mode and restarts on file changes
134
+ *
135
+ * Initializes the server, starts the HTTP server, and sets up a file system
136
+ * watcher that monitors for changes. When files are added, modified, or deleted,
137
+ * the server automatically restarts. The watcher respects TypeScript project
138
+ * configuration and metaFiles settings.
96
139
  *
97
140
  * @param ts - TypeScript module reference
98
141
  * @param options - Watch options including polling mode
142
+ *
143
+ * @example
144
+ * const devServer = new DevServer(cwd, { hooks: [] })
145
+ * await devServer.startAndWatch(ts, { poll: false })
99
146
  */
100
147
  startAndWatch(ts: typeof tsStatic, options?: {
101
148
  poll: boolean;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IndexGenerator
3
- } from "../../chunk-TWCIFDZF.js";
4
- import "../../chunk-7ANGUQDV.js";
3
+ } from "../../chunk-KAOPWBR3.js";
4
+ import "../../chunk-3GYRM5Y2.js";
5
5
  export {
6
6
  IndexGenerator
7
7
  };
@@ -13,6 +13,7 @@
13
13
  */
14
14
  export declare class PathsResolver {
15
15
  #private;
16
+ constructor(appRoot: string);
16
17
  /**
17
18
  * Define a custom resolver that resolves a path
18
19
  *
@@ -174,12 +174,9 @@ export type RoutesListItem = {
174
174
  domain: string;
175
175
  /** HTTP methods accepted by this route */
176
176
  methods: string[];
177
- /** Controller reference information (if controller-based route) */
178
- controllerReference?: {
179
- /** Dynamic import expression for the controller */
180
- importExpression: string;
181
- /** Specific controller method to call */
182
- method?: string;
177
+ handler: Function | {
178
+ method: string;
179
+ importExpression: string | null;
183
180
  };
184
181
  /** Parsed route tokens for URI construction */
185
182
  tokens: {
@@ -36,7 +36,7 @@ export declare function runNode(cwd: string | URL, options: RunScriptOptions): i
36
36
  buffer: false;
37
37
  stdio: "pipe" | "inherit";
38
38
  env: {
39
- TZ?: string;
39
+ TZ?: string | undefined;
40
40
  FORCE_COLOR?: string | undefined;
41
41
  };
42
42
  }>;
@@ -58,7 +58,7 @@ export declare function run(cwd: string | URL, options: Omit<RunScriptOptions, '
58
58
  buffer: false;
59
59
  stdio: "pipe" | "inherit";
60
60
  env: {
61
- TZ?: string;
61
+ TZ?: string | undefined;
62
62
  FORCE_COLOR?: string | undefined;
63
63
  };
64
64
  }>;
package/package.json CHANGED
@@ -1,13 +1,10 @@
1
1
  {
2
2
  "name": "@adonisjs/assembler",
3
3
  "description": "Provides utilities to run AdonisJS development server and build project for production",
4
- "version": "8.0.0-next.14",
4
+ "version": "8.0.0-next.15",
5
5
  "engines": {
6
6
  "node": ">=24.0.0"
7
7
  },
8
- "imports": {
9
- "#tests/*": "./tests/*.ts"
10
- },
11
8
  "main": "build/index.js",
12
9
  "type": "module",
13
10
  "files": [
@@ -49,7 +46,7 @@
49
46
  "@japa/snapshot": "^2.0.9",
50
47
  "@poppinss/ts-exec": "^1.4.1",
51
48
  "@release-it/conventional-changelog": "^10.0.1",
52
- "@types/node": "^24.6.2",
49
+ "@types/node": "^24.7.2",
53
50
  "@types/picomatch": "^4.0.2",
54
51
  "@types/pretty-hrtime": "^1.0.3",
55
52
  "c8": "^10.1.3",
@@ -61,7 +58,7 @@
61
58
  "prettier": "^3.6.2",
62
59
  "release-it": "^19.0.5",
63
60
  "tsup": "^8.5.0",
64
- "typedoc": "^0.28.13",
61
+ "typedoc": "^0.28.14",
65
62
  "typescript": "^5.9.3"
66
63
  },
67
64
  "dependencies": {
@@ -69,7 +66,7 @@
69
66
  "@antfu/install-pkg": "^1.1.0",
70
67
  "@ast-grep/napi": "^0.39.6",
71
68
  "@poppinss/cliui": "^6.5.0",
72
- "@poppinss/hooks": "^7.2.6",
69
+ "@poppinss/hooks": "^7.3.0",
73
70
  "@poppinss/utils": "^7.0.0-next.3",
74
71
  "chokidar": "^4.0.3",
75
72
  "dedent": "^1.7.0",
@@ -83,7 +80,7 @@
83
80
  "picomatch": "^4.0.3",
84
81
  "pretty-hrtime": "^1.0.3",
85
82
  "tmp-cache": "^1.1.0",
86
- "ts-morph": "^27.0.0"
83
+ "ts-morph": "^27.0.2"
87
84
  },
88
85
  "peerDependencies": {
89
86
  "typescript": "^4.0.0 || ^5.0.0"