@craft-ng/dev-tools 0.5.1-beta.0 → 0.6.0-beta.2

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 (51) hide show
  1. package/README.md +66 -0
  2. package/generators.json +26 -0
  3. package/package.json +18 -1
  4. package/src/bin/craft.d.ts +2 -0
  5. package/src/bin/craft.js +166 -0
  6. package/src/bin/craft.js.map +1 -0
  7. package/src/eslint-rules/craft-computed-name-match.cjs +8 -125
  8. package/src/eslint-rules/craft-method-name-match.cjs +8 -166
  9. package/src/eslint-rules/craft-name-match-utils.cjs +179 -0
  10. package/src/eslint-rules/craft-signal-source-name-match.cjs +8 -0
  11. package/src/eslint-rules/craft-source-name-match.cjs +8 -0
  12. package/src/eslint-rules/global-exception-registry-match.cjs +78 -13
  13. package/src/eslint-rules/index.cjs +8 -2
  14. package/src/eslint-rules/require-cascade-route-di-check.cjs +223 -0
  15. package/src/eslint-rules/require-primitive-generator-unwrap.cjs +267 -0
  16. package/src/generators/route/compat.d.ts +3 -0
  17. package/src/generators/route/compat.js +6 -0
  18. package/src/generators/route/compat.js.map +1 -0
  19. package/src/generators/route/generator.d.ts +31 -0
  20. package/src/generators/route/generator.js +434 -0
  21. package/src/generators/route/generator.js.map +1 -0
  22. package/src/generators/route/schema.json +50 -0
  23. package/src/generators/route/split-schema.json +19 -0
  24. package/src/index.d.ts +1 -0
  25. package/src/index.js +1 -0
  26. package/src/index.js.map +1 -1
  27. package/src/scripts/primitives/migrate-primitive-generators.d.ts +27 -0
  28. package/src/scripts/primitives/migrate-primitive-generators.js +315 -0
  29. package/src/scripts/primitives/migrate-primitive-generators.js.map +1 -0
  30. package/src/scripts/primitives/migrate-primitive-generators.ts +402 -0
  31. package/src/scripts/primitives/migrate-primitives.js +36 -4
  32. package/src/scripts/primitives/migrate-primitives.js.map +1 -1
  33. package/src/scripts/primitives/migrate-primitives.spec.ts +43 -0
  34. package/src/scripts/primitives/migrate-primitives.ts +62 -4
  35. package/src/scripts/primitives/migration-diagnostic.d.ts +1 -1
  36. package/src/scripts/primitives/migration-diagnostic.ts +1 -0
  37. package/src/scripts/routes/migrate-routes.js +4 -4
  38. package/src/scripts/routes/migrate-routes.js.map +1 -1
  39. package/src/scripts/routes/migrate-routes.ts +4 -6
  40. package/src/scripts/routes/route-command.d.ts +75 -0
  41. package/src/scripts/routes/route-command.js +1187 -0
  42. package/src/scripts/routes/route-command.js.map +1 -0
  43. package/src/scripts/routes/route-command.spec.ts +553 -0
  44. package/src/scripts/routes/route-command.ts +1790 -0
  45. package/src/scripts/services/migrate-services.js +45 -11
  46. package/src/scripts/services/migrate-services.js.map +1 -1
  47. package/src/scripts/services/migrate-services.spec.ts +46 -4
  48. package/src/scripts/services/migrate-services.ts +64 -13
  49. package/src/scripts/services/migration-diagnostic.d.ts +1 -1
  50. package/src/scripts/services/migration-diagnostic.ts +1 -0
  51. package/src/eslint-rules/require-track-on-dependent-primitives.cjs +0 -219
@@ -0,0 +1,434 @@
1
+ import { __awaiter } from "tslib";
2
+ import { execFile } from 'node:child_process';
3
+ import { existsSync } from 'node:fs';
4
+ import { basename, dirname, join, relative, resolve, sep } from 'node:path';
5
+ import { createInterface } from 'node:readline/promises';
6
+ import { promisify } from 'node:util';
7
+ import { getProjects, logger, names, readProjectConfiguration, } from '@nx/devkit';
8
+ import { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter.js';
9
+ import { Project } from 'ts-morph';
10
+ import { findAngularDecoratedClass } from '../../scripts/angular-brand-codemod.js';
11
+ import { captureRouteEslintBaseline, listRouteCollections, runRouteAdd, runRouteSplit, validateRouteChangedFiles, } from '../../scripts/routes/route-command.js';
12
+ const execFileAsync = promisify(execFile);
13
+ export function routeGenerator(tree, options) {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ var _a, _b;
16
+ const selected = selectAngularProject(tree, options.project);
17
+ const fileSystem = createTreeFileSystem(tree);
18
+ const componentBase = join((_a = selected.configuration.sourceRoot) !== null && _a !== void 0 ? _a : join(selected.configuration.root, 'src'), 'app');
19
+ const parent = yield resolveRouteParentOption(listRouteCollections(tree.root, selected.tsConfig, fileSystem), {
20
+ configuredParent: options.parent,
21
+ rootDir: tree.root,
22
+ routePath: options.path,
23
+ });
24
+ const target = yield resolveRouteTargetOptions(options, { componentBase });
25
+ const preview = yield runRouteAdd({
26
+ rootDir: tree.root,
27
+ project: selected.tsConfig,
28
+ path: options.path,
29
+ parent,
30
+ component: target.component,
31
+ createComponent: (_b = target.createComponent) === null || _b === void 0 ? void 0 : _b.name,
32
+ featureFile: options.featureFile,
33
+ redirectTo: target.redirectTo,
34
+ dryRun: true,
35
+ yes: true,
36
+ validate: false,
37
+ fileSystem,
38
+ log: () => undefined,
39
+ });
40
+ assertSuccessful(preview);
41
+ printGeneratorPlan(tree, preview, target.createComponent, componentBase);
42
+ if (!(yield confirmGeneratorPlan(options))) {
43
+ logger.info('Cancelled. No files changed.');
44
+ return;
45
+ }
46
+ let component = target.component;
47
+ if (target.createComponent) {
48
+ component = yield generateComponent(tree, selected.name, selected.configuration, target.createComponent);
49
+ }
50
+ const result = yield runRouteAdd({
51
+ rootDir: tree.root,
52
+ project: selected.tsConfig,
53
+ path: options.path,
54
+ parent,
55
+ component,
56
+ featureFile: options.featureFile,
57
+ redirectTo: target.redirectTo,
58
+ yes: true,
59
+ validate: false,
60
+ fileSystem,
61
+ log: () => undefined,
62
+ });
63
+ assertSuccessful(result);
64
+ const eslintBaseline = options.skipValidation
65
+ ? new Set()
66
+ : yield captureRouteEslintBaseline(tree.root, resolve(tree.root, selected.configuration.root), result.changedFiles);
67
+ return options.skipValidation
68
+ ? undefined
69
+ : createValidationCallback(tree, selected, result.changedFiles, eslintBaseline);
70
+ });
71
+ }
72
+ export function resolveRouteParentOption(parents, interactive) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ if (interactive.configuredParent)
75
+ return interactive.configuredParent;
76
+ if (parents.length === 0 || (!interactive.ask && !isInteractive())) {
77
+ return undefined;
78
+ }
79
+ if (!interactive.ask) {
80
+ const readline = createInterface({
81
+ input: process.stdin,
82
+ output: process.stdout,
83
+ });
84
+ try {
85
+ return yield resolveRouteParentOption(parents, Object.assign(Object.assign({}, interactive), { ask: (prompt) => readline.question(prompt) }));
86
+ }
87
+ finally {
88
+ readline.close();
89
+ }
90
+ }
91
+ const sortedParents = [...parents].sort((left, right) => left.filePath.localeCompare(right.filePath));
92
+ logger.info([
93
+ 'Available route parents:',
94
+ ` 0. Automatic selection from ${interactive.routePath}`,
95
+ ...sortedParents.map((parent, index) => {
96
+ const filePath = relative(interactive.rootDir, parent.filePath)
97
+ .split(sep)
98
+ .join('/');
99
+ return ` ${index + 1}. ${parent.routesName} — ${filePath} (prefix: ${parent.collectionName})`;
100
+ }),
101
+ ].join('\n'));
102
+ let selection;
103
+ do {
104
+ const answer = (yield interactive.ask('Parent number [0]: ')).trim();
105
+ selection = answer === '' ? 0 : Number(answer);
106
+ } while (!Number.isInteger(selection) ||
107
+ selection < 0 ||
108
+ selection > sortedParents.length);
109
+ if (selection === 0)
110
+ return undefined;
111
+ const selected = sortedParents[selection - 1];
112
+ const filePath = relative(interactive.rootDir, selected.filePath)
113
+ .split(sep)
114
+ .join('/');
115
+ return `${filePath}#${selected.routesName}`;
116
+ });
117
+ }
118
+ export function resolveRouteTargetOptions(options, interactive) {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ const configuredTargets = [
121
+ ['component', options.component],
122
+ ['createComponent', options.createComponent],
123
+ ['redirectTo', options.redirectTo],
124
+ ].filter(([, value]) => value !== undefined);
125
+ if (configuredTargets.length > 1) {
126
+ throw new Error('Choose exactly one route target: --component, --create-component, or --redirect-to.');
127
+ }
128
+ if (configuredTargets.length === 1) {
129
+ const [name, value] = configuredTargets[0];
130
+ if (name === 'createComponent') {
131
+ return { createComponent: parseCreateComponentOption(value) };
132
+ }
133
+ return { [name]: value };
134
+ }
135
+ if (!interactive.ask) {
136
+ if (!isInteractive()) {
137
+ throw new Error('A route target is required. Pass --component, --create-component, or --redirect-to.');
138
+ }
139
+ const readline = createInterface({
140
+ input: process.stdin,
141
+ output: process.stdout,
142
+ });
143
+ try {
144
+ return yield resolveRouteTargetOptions(options, Object.assign(Object.assign({}, interactive), { ask: (prompt) => readline.question(prompt) }));
145
+ }
146
+ finally {
147
+ readline.close();
148
+ }
149
+ }
150
+ const ask = interactive.ask;
151
+ let selection;
152
+ do {
153
+ selection = (yield ask('Target: [e]xisting component, [c]reate component, [r]edirect? '))
154
+ .trim()
155
+ .toLowerCase();
156
+ } while (!['e', 'existing', 'c', 'create', 'r', 'redirect'].includes(selection));
157
+ if (selection === 'e' || selection === 'existing') {
158
+ return {
159
+ component: yield askForRequiredValue(ask, 'Component file#Class: '),
160
+ };
161
+ }
162
+ if (selection === 'c' || selection === 'create') {
163
+ const path = yield askForRequiredValue(ask, `Angular component path (relative to ${interactive.componentBase}): `);
164
+ return {
165
+ createComponent: {
166
+ path,
167
+ name: yield askForRequiredValue(ask, 'Angular component name: '),
168
+ },
169
+ };
170
+ }
171
+ return {
172
+ redirectTo: yield askForRequiredValue(ask, 'Redirect target: '),
173
+ };
174
+ });
175
+ }
176
+ function isInteractive() {
177
+ return (!!process.stdin.isTTY &&
178
+ !!process.stdout.isTTY &&
179
+ process.env['NX_INTERACTIVE'] !== 'false');
180
+ }
181
+ function parseCreateComponentOption(value) {
182
+ const name = basename(value);
183
+ const parent = dirname(value);
184
+ return {
185
+ name,
186
+ path: parent === '.' ? name : parent,
187
+ };
188
+ }
189
+ function askForRequiredValue(ask, prompt) {
190
+ return __awaiter(this, void 0, void 0, function* () {
191
+ let value;
192
+ do
193
+ value = (yield ask(prompt)).trim();
194
+ while (!value);
195
+ return value;
196
+ });
197
+ }
198
+ export function routeSplitGenerator(tree, options) {
199
+ return __awaiter(this, void 0, void 0, function* () {
200
+ const selected = selectAngularProject(tree, options.project);
201
+ const result = yield runRouteSplit({
202
+ rootDir: tree.root,
203
+ project: selected.tsConfig,
204
+ parent: options.parent,
205
+ prefix: options.prefix,
206
+ target: options.target,
207
+ yes: true,
208
+ validate: false,
209
+ fileSystem: createTreeFileSystem(tree),
210
+ log: (message) => logger.info(message),
211
+ });
212
+ assertSuccessful(result);
213
+ const eslintBaseline = options.skipValidation
214
+ ? new Set()
215
+ : yield captureRouteEslintBaseline(tree.root, resolve(tree.root, selected.configuration.root), result.changedFiles);
216
+ return options.skipValidation
217
+ ? undefined
218
+ : createValidationCallback(tree, selected, result.changedFiles, eslintBaseline);
219
+ });
220
+ }
221
+ function selectAngularProject(tree, requestedProject) {
222
+ const projects = getProjects(tree);
223
+ let name = requestedProject;
224
+ if (!name) {
225
+ const applications = [...projects.entries()].filter(([, configuration]) => findAngularApplicationTsConfig(tree, configuration));
226
+ if (applications.length !== 1) {
227
+ throw new Error('Choose a project with --project when the workspace does not contain exactly one Angular application.');
228
+ }
229
+ name = applications[0][0];
230
+ }
231
+ const configuration = readProjectConfiguration(tree, name);
232
+ const tsConfig = findAngularApplicationTsConfig(tree, configuration);
233
+ if (!tsConfig) {
234
+ throw new Error(`Project ${name} is not an Angular application.`);
235
+ }
236
+ return { configuration, name, tsConfig };
237
+ }
238
+ function findAngularApplicationTsConfig(tree, configuration) {
239
+ var _a, _b, _c;
240
+ if (configuration.projectType !== 'application')
241
+ return undefined;
242
+ const configuredTsConfig = (_c = (_b = (_a = configuration.targets) === null || _a === void 0 ? void 0 : _a['build']) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c['tsConfig'];
243
+ const fallbackTsConfig = join(configuration.root, 'tsconfig.app.json');
244
+ const tsConfig = typeof configuredTsConfig === 'string'
245
+ ? configuredTsConfig
246
+ : fallbackTsConfig;
247
+ return tree.exists(tsConfig) ? tsConfig : undefined;
248
+ }
249
+ function createTreeFileSystem(tree) {
250
+ const toTreePath = (filePath) => {
251
+ const value = relative(tree.root, resolve(filePath));
252
+ return value.split(sep).join('/');
253
+ };
254
+ return {
255
+ exists: (filePath) => tree.exists(toTreePath(filePath)),
256
+ listFiles: (rootDir) => listTreeFiles(tree, toTreePath(rootDir)).map((filePath) => resolve(tree.root, filePath)),
257
+ read: (filePath) => { var _a; return (_a = tree.read(toTreePath(filePath), 'utf8')) !== null && _a !== void 0 ? _a : undefined; },
258
+ write: (filePath, content) => tree.write(toTreePath(filePath), content),
259
+ };
260
+ }
261
+ function listTreeFiles(tree, root = '') {
262
+ if (tree.isFile(root))
263
+ return [root];
264
+ const result = [];
265
+ const visit = (directory) => {
266
+ for (const child of tree.children(directory)) {
267
+ if (['node_modules', 'dist', '.angular', '.git'].includes(child)) {
268
+ continue;
269
+ }
270
+ const filePath = directory ? `${directory}/${child}` : child;
271
+ if (tree.isFile(filePath))
272
+ result.push(filePath);
273
+ else
274
+ visit(filePath);
275
+ }
276
+ };
277
+ visit(root === '.' ? '' : root);
278
+ return result;
279
+ }
280
+ function generateComponent(tree, projectName, project, target) {
281
+ return __awaiter(this, void 0, void 0, function* () {
282
+ var _a;
283
+ const before = new Set(listTreeFiles(tree));
284
+ const sourceRoot = (_a = project.sourceRoot) !== null && _a !== void 0 ? _a : join(project.root, 'src');
285
+ const componentBase = join(sourceRoot, 'app');
286
+ const requestedPath = resolveComponentPath(project, componentBase, target);
287
+ if (tree.exists('nx.json')) {
288
+ const { componentGenerator } = yield import('@nx/angular/generators');
289
+ yield componentGenerator(tree, {
290
+ path: requestedPath,
291
+ inlineStyle: true,
292
+ inlineTemplate: true,
293
+ skipTests: true,
294
+ skipFormat: true,
295
+ });
296
+ }
297
+ else {
298
+ const angularComponent = wrapAngularDevkitSchematic('@schematics/angular', 'component');
299
+ yield angularComponent(tree, {
300
+ name: target.name,
301
+ path: dirname(requestedPath),
302
+ project: projectName,
303
+ flat: true,
304
+ inlineStyle: true,
305
+ inlineTemplate: true,
306
+ skipTests: true,
307
+ });
308
+ }
309
+ const candidates = listTreeFiles(tree).filter((filePath) => {
310
+ var _a;
311
+ return !before.has(filePath) &&
312
+ filePath.endsWith('.ts') &&
313
+ !filePath.endsWith('.spec.ts') &&
314
+ ((_a = tree.read(filePath, 'utf8')) === null || _a === void 0 ? void 0 : _a.includes('@Component'));
315
+ });
316
+ if (candidates.length !== 1) {
317
+ throw new Error(`Expected one generated Angular component, found ${candidates.length}.`);
318
+ }
319
+ const filePath = candidates[0];
320
+ const text = tree.read(filePath, 'utf8');
321
+ if (!text)
322
+ throw new Error(`Generated component is empty: ${filePath}`);
323
+ const sourceFile = new Project().createSourceFile(filePath, text);
324
+ const decorated = findAngularDecoratedClass(sourceFile);
325
+ if (decorated.skipped || !decorated.className) {
326
+ throw new Error(`Could not infer the component class in ${filePath}.`);
327
+ }
328
+ return `${filePath}#${decorated.className}`;
329
+ });
330
+ }
331
+ function resolveComponentPath(project, componentBase, target) {
332
+ const path = target.path === '.' ? '' : target.path;
333
+ const directory = path.startsWith(project.root)
334
+ ? path
335
+ : join(componentBase, path);
336
+ return join(directory, names(target.name).fileName);
337
+ }
338
+ function printGeneratorPlan(tree, result, component, componentBase) {
339
+ var _a, _b;
340
+ const lines = ['Planned changes (dry view):'];
341
+ if (component) {
342
+ const requestedPath = join(componentBase, component.path === '.' ? '' : component.path, names(component.name).fileName);
343
+ lines.push(` CREATE ${requestedPath}.ts (inline template and styles; filename normalized by Angular)`);
344
+ }
345
+ for (const filePath of (_b = (_a = result.plan) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []) {
346
+ const treePath = relative(tree.root, filePath).split(sep).join('/');
347
+ lines.push(` ${tree.exists(treePath) ? 'UPDATE' : 'CREATE'} ${treePath}`);
348
+ }
349
+ logger.info(lines.join('\n'));
350
+ }
351
+ function confirmGeneratorPlan(options) {
352
+ return __awaiter(this, void 0, void 0, function* () {
353
+ if (options.yes || process.env['NX_DRY_RUN'] === 'true')
354
+ return true;
355
+ if (!process.stdin.isTTY ||
356
+ !process.stdout.isTTY ||
357
+ process.env['NX_INTERACTIVE'] === 'false') {
358
+ throw new Error('Confirmation is required. Re-run interactively or pass --yes.');
359
+ }
360
+ const readline = createInterface({
361
+ input: process.stdin,
362
+ output: process.stdout,
363
+ });
364
+ try {
365
+ const answer = (yield readline.question('Apply this plan? [y/N] '))
366
+ .trim()
367
+ .toLowerCase();
368
+ return answer === 'y' || answer === 'yes';
369
+ }
370
+ finally {
371
+ readline.close();
372
+ }
373
+ });
374
+ }
375
+ function assertSuccessful(result) {
376
+ if (result.exitCode === 0)
377
+ return;
378
+ throw new Error(result.diagnostics
379
+ .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)
380
+ .join('\n'));
381
+ }
382
+ function createValidationCallback(tree, project, changedFiles, eslintBaseline) {
383
+ var _a, _b, _c;
384
+ const root = tree.root;
385
+ const hasNx = tree.exists('nx.json');
386
+ const buildConfiguration = ((_c = (_b = (_a = project.configuration.targets) === null || _a === void 0 ? void 0 : _a['build']) === null || _b === void 0 ? void 0 : _b.configurations) === null || _c === void 0 ? void 0 : _c['development'])
387
+ ? 'development'
388
+ : undefined;
389
+ return () => __awaiter(this, void 0, void 0, function* () {
390
+ const validationDiagnostics = yield validateRouteChangedFiles(root, resolve(root, project.configuration.root), resolve(root, project.tsConfig), changedFiles, eslintBaseline, { skipTypeCheck: true });
391
+ if (validationDiagnostics.length > 0) {
392
+ throw new Error(validationDiagnostics
393
+ .map((diagnostic) => diagnostic.message)
394
+ .join('\n'));
395
+ }
396
+ const runner = findLocalBinary(root, hasNx ? 'nx' : 'ng');
397
+ if (!runner) {
398
+ throw new Error(`Could not find the local ${hasNx ? 'Nx' : 'Angular'} CLI.`);
399
+ }
400
+ const args = hasNx
401
+ ? [
402
+ 'run',
403
+ `${project.name}:build`,
404
+ ...(buildConfiguration
405
+ ? [`--configuration=${buildConfiguration}`]
406
+ : []),
407
+ ]
408
+ : [
409
+ 'build',
410
+ project.name,
411
+ ...(buildConfiguration
412
+ ? [`--configuration=${buildConfiguration}`]
413
+ : []),
414
+ ];
415
+ yield execFileAsync(runner, args, {
416
+ cwd: root,
417
+ maxBuffer: 20 * 1024 * 1024,
418
+ });
419
+ });
420
+ }
421
+ function findLocalBinary(rootDir, name) {
422
+ let current = rootDir;
423
+ while (true) {
424
+ const candidate = join(current, 'node_modules', '.bin', name);
425
+ if (existsSync(candidate))
426
+ return candidate;
427
+ const parent = resolve(current, '..');
428
+ if (parent === current)
429
+ return undefined;
430
+ current = parent;
431
+ }
432
+ }
433
+ export default routeGenerator;
434
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../libs/dev-tools/src/generators/route/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "CraftRoute",
4
+ "title": "Add a Craft NG route",
5
+ "type": "object",
6
+ "properties": {
7
+ "path": {
8
+ "type": "string",
9
+ "description": "Absolute route path to add.",
10
+ "$default": { "$source": "argv", "index": 0 },
11
+ "x-prompt": "Route path:"
12
+ },
13
+ "project": {
14
+ "type": "string",
15
+ "description": "Angular application project.",
16
+ "x-dropdown": "projects"
17
+ },
18
+ "parent": {
19
+ "type": "string",
20
+ "description": "Parent routes file and optional collection name."
21
+ },
22
+ "component": {
23
+ "type": "string",
24
+ "description": "Existing component as file#Class."
25
+ },
26
+ "createComponent": {
27
+ "type": "string",
28
+ "description": "Create an Angular component using workspace conventions."
29
+ },
30
+ "featureFile": {
31
+ "type": "string",
32
+ "description": "Explicit lazy feature routes file."
33
+ },
34
+ "redirectTo": {
35
+ "type": "string",
36
+ "description": "Static redirect target."
37
+ },
38
+ "skipValidation": {
39
+ "type": "boolean",
40
+ "default": false,
41
+ "description": "Skip post-write ESLint and Angular diagnostics."
42
+ },
43
+ "yes": {
44
+ "type": "boolean",
45
+ "default": false,
46
+ "description": "Apply the generated plan without asking for confirmation."
47
+ }
48
+ },
49
+ "required": ["path"]
50
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "CraftRouteSplit",
4
+ "title": "Split Craft NG routes into a lazy collection",
5
+ "type": "object",
6
+ "properties": {
7
+ "project": {
8
+ "type": "string",
9
+ "description": "Angular application project.",
10
+ "$default": { "$source": "projectName" },
11
+ "x-dropdown": "projects"
12
+ },
13
+ "parent": { "type": "string" },
14
+ "prefix": { "type": "string" },
15
+ "target": { "type": "string" },
16
+ "skipValidation": { "type": "boolean", "default": false }
17
+ },
18
+ "required": ["parent", "prefix", "target"]
19
+ }
package/src/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './scripts/migrate';
4
4
  export * from './scripts/primitives/migration-diagnostic';
5
5
  export * from './scripts/routes/migrate-routes';
6
6
  export * from './scripts/routes/migration-diagnostic';
7
+ export * from './scripts/routes/route-command';
7
8
  export * from './scripts/services/config';
8
9
  export * from './scripts/services/migrate-services';
9
10
  export * from './scripts/services/migration-diagnostic';
package/src/index.js CHANGED
@@ -5,6 +5,7 @@ export * from './scripts/migrate';
5
5
  export * from './scripts/primitives/migration-diagnostic';
6
6
  export * from './scripts/routes/migrate-routes';
7
7
  export * from './scripts/routes/migration-diagnostic';
8
+ export * from './scripts/routes/route-command';
8
9
  export * from './scripts/services/config';
9
10
  export * from './scripts/services/migrate-services';
10
11
  export * from './scripts/services/migration-diagnostic';
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/dev-tools/src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/dev-tools/src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Migrates call-sites of the generator-returning craft primitives (`state`,
3
+ * `query`, `mutation`, `asyncProcess`, `queryParam`):
4
+ *
5
+ * 1. `yield* track(X)` → `yield* X` (track import purged when unused).
6
+ * 2. Already-consumed invocations (`yield*`, `craftUse(...)`) are left alone.
7
+ * 3. Inside a generator function → prefix with `yield* ` (parenthesised when
8
+ * the parent is a spread / member access / template position).
9
+ * 4. Direct expression-body return of a `craftService` factory or of a
10
+ * `queryParams:` arrow stays as-is (the runtime drives the generator).
11
+ * 5. Anywhere else → wrap with `craftUse(...)` (import added).
12
+ * 6. A `craftService` factory / `queryParams:` arrow returning an object
13
+ * literal containing primitive creations is first converted to a
14
+ * `function*` so rule 3 applies.
15
+ */
16
+ export declare const ALL_PRIMITIVES: readonly ["state", "query", "mutation", "asyncProcess", "queryParam"];
17
+ export type PrimitiveName = (typeof ALL_PRIMITIVES)[number];
18
+ export type MigratePrimitiveGeneratorsOptions = {
19
+ paths: readonly string[];
20
+ primitives?: readonly PrimitiveName[];
21
+ write?: boolean;
22
+ log?: (message: string) => void;
23
+ };
24
+ export type MigratePrimitiveGeneratorsResult = {
25
+ changedFiles: string[];
26
+ };
27
+ export declare function migratePrimitiveGenerators({ paths, primitives, write, log, }: MigratePrimitiveGeneratorsOptions): Promise<MigratePrimitiveGeneratorsResult>;