@craft-ts/dev-tools 0.7.0-beta.13
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.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/generators.json +26 -0
- package/package.json +119 -0
- package/src/bin/craft-architecture-check.d.ts +2 -0
- package/src/bin/craft-architecture-check.js +51 -0
- package/src/bin/craft-architecture-check.js.map +1 -0
- package/src/bin/craft-brand.d.ts +2 -0
- package/src/bin/craft-brand.js +9 -0
- package/src/bin/craft-brand.js.map +1 -0
- package/src/bin/craft-graph.d.ts +2 -0
- package/src/bin/craft-graph.js +72 -0
- package/src/bin/craft-graph.js.map +1 -0
- package/src/bin/craft-migrate-architecture.d.ts +2 -0
- package/src/bin/craft-migrate-architecture.js +64 -0
- package/src/bin/craft-migrate-architecture.js.map +1 -0
- package/src/bin/craft-migrate-components.d.ts +2 -0
- package/src/bin/craft-migrate-components.js +67 -0
- package/src/bin/craft-migrate-components.js.map +1 -0
- package/src/bin/craft-migrate-primitives.d.ts +2 -0
- package/src/bin/craft-migrate-primitives.js +71 -0
- package/src/bin/craft-migrate-primitives.js.map +1 -0
- package/src/bin/craft-migrate-routes.d.ts +2 -0
- package/src/bin/craft-migrate-routes.js +77 -0
- package/src/bin/craft-migrate-routes.js.map +1 -0
- package/src/bin/craft-migrate-services.d.ts +2 -0
- package/src/bin/craft-migrate-services.js +75 -0
- package/src/bin/craft-migrate-services.js.map +1 -0
- package/src/bin/craft-migrate-template.d.ts +2 -0
- package/src/bin/craft-migrate-template.js +68 -0
- package/src/bin/craft-migrate-template.js.map +1 -0
- package/src/bin/craft-migrate.d.ts +2 -0
- package/src/bin/craft-migrate.js +91 -0
- package/src/bin/craft-migrate.js.map +1 -0
- package/src/bin/craft.d.ts +2 -0
- package/src/bin/craft.js +318 -0
- package/src/bin/craft.js.map +1 -0
- package/src/eslint-rules/anchor-has-href.cjs +35 -0
- package/src/eslint-rules/app-start-registry-match.cjs +355 -0
- package/src/eslint-rules/button-has-type.cjs +50 -0
- package/src/eslint-rules/control-has-accessible-name.cjs +56 -0
- package/src/eslint-rules/craft-component-name-match.cjs +8 -0
- package/src/eslint-rules/craft-computed-name-match.cjs +63 -0
- package/src/eslint-rules/craft-css-token-registry.cjs +17 -0
- package/src/eslint-rules/craft-css-var-naming.cjs +18 -0
- package/src/eslint-rules/craft-css-vars-contract.cjs +34 -0
- package/src/eslint-rules/craft-directive-name-match.cjs +8 -0
- package/src/eslint-rules/craft-method-name-match.cjs +8 -0
- package/src/eslint-rules/craft-name-match-utils.cjs +179 -0
- package/src/eslint-rules/craft-primitive-context.cjs +46 -0
- package/src/eslint-rules/craft-signal-source-name-match.cjs +8 -0
- package/src/eslint-rules/craft-source-name-match.cjs +8 -0
- package/src/eslint-rules/craft-styles-scope-safe.cjs +25 -0
- package/src/eslint-rules/css-rule-utils.cjs +109 -0
- package/src/eslint-rules/global-exception-registry-match.cjs +562 -0
- package/src/eslint-rules/heading-has-content.cjs +31 -0
- package/src/eslint-rules/html-helpers.cjs +115 -0
- package/src/eslint-rules/hyperscript-walk.cjs +249 -0
- package/src/eslint-rules/iframe-has-title.cjs +26 -0
- package/src/eslint-rules/img-has-alt.cjs +28 -0
- package/src/eslint-rules/index.cjs +209 -0
- package/src/eslint-rules/index.d.cts +5 -0
- package/src/eslint-rules/label-has-associated-control.cjs +67 -0
- package/src/eslint-rules/no-async-await.cjs +46 -0
- package/src/eslint-rules/no-craft-computed-side-effects.cjs +301 -0
- package/src/eslint-rules/no-craft-use-in-template.cjs +89 -0
- package/src/eslint-rules/no-craft-use.cjs +42 -0
- package/src/eslint-rules/no-direct-temporal-globals.cjs +73 -0
- package/src/eslint-rules/no-effect-in-params.cjs +265 -0
- package/src/eslint-rules/no-effect-outside-loaders.cjs +3 -0
- package/src/eslint-rules/no-ephemeral-template-form-state.cjs +131 -0
- package/src/eslint-rules/no-hardcoded-design-values.cjs +15 -0
- package/src/eslint-rules/no-heading-level-skip.cjs +101 -0
- package/src/eslint-rules/no-imperative-craft-resource-trigger.cjs +291 -0
- package/src/eslint-rules/no-important-in-component-styles.cjs +12 -0
- package/src/eslint-rules/no-injection-token.cjs +173 -0
- package/src/eslint-rules/no-invalid-insertion-pipe.cjs +162 -0
- package/src/eslint-rules/no-manual-route-provider-list.cjs +85 -0
- package/src/eslint-rules/no-noninteractive-element-interactions.cjs +66 -0
- package/src/eslint-rules/no-positive-tabindex.cjs +44 -0
- package/src/eslint-rules/no-redundant-primitive-insertion.cjs +361 -0
- package/src/eslint-rules/no-render-writes.cjs +106 -0
- package/src/eslint-rules/no-throw.cjs +132 -0
- package/src/eslint-rules/no-transition-actions.cjs +133 -0
- package/src/eslint-rules/no-type-assertions-in-template.cjs +211 -0
- package/src/eslint-rules/no-widened-route-provider-context.cjs +39 -0
- package/src/eslint-rules/prefer-browser-boundaries.cjs +92 -0
- package/src/eslint-rules/prefer-craft-http-transport.cjs +103 -0
- package/src/eslint-rules/prefer-craft-template-blocks.cjs +492 -0
- package/src/eslint-rules/prefer-direct-yieldable-callback.cjs +105 -0
- package/src/eslint-rules/prefer-named-html-helpers.cjs +33 -0
- package/src/eslint-rules/prefer-query-method-over-state-trigger.cjs +282 -0
- package/src/eslint-rules/prefer-relative-heading.cjs +43 -0
- package/src/eslint-rules/provide-host-name-match-component.cjs +455 -0
- package/src/eslint-rules/recommended-config.cjs +77 -0
- package/src/eslint-rules/require-assert-exhaustive-route-exceptions.cjs +259 -0
- package/src/eslint-rules/require-cascade-route-di-check.cjs +223 -0
- package/src/eslint-rules/require-child-route-mount-check.cjs +224 -0
- package/src/eslint-rules/require-component-monitoring.cjs +212 -0
- package/src/eslint-rules/require-craft-exception-handler.cjs +142 -0
- package/src/eslint-rules/require-craft-method-for-yieldable-callback.cjs +236 -0
- package/src/eslint-rules/require-craft-resource-trigger-yield.cjs +209 -0
- package/src/eslint-rules/require-effect-adapters.cjs +86 -0
- package/src/eslint-rules/require-exception-component-di-check.cjs +314 -0
- package/src/eslint-rules/require-focus-visible.cjs +36 -0
- package/src/eslint-rules/require-interactive-local-name.cjs +105 -0
- package/src/eslint-rules/require-lazy-load-with-retry.cjs +148 -0
- package/src/eslint-rules/require-outlet-heading-section.cjs +70 -0
- package/src/eslint-rules/require-pending-component-di-check.cjs +490 -0
- package/src/eslint-rules/require-primitive-context.cjs +156 -0
- package/src/eslint-rules/require-primitive-derived-property.cjs +598 -0
- package/src/eslint-rules/require-primitive-generator-unwrap.cjs +274 -0
- package/src/eslint-rules/require-reactive-template-bindings.cjs +305 -0
- package/src/eslint-rules/require-reduced-motion.cjs +38 -0
- package/src/eslint-rules/require-route-heading-outline.cjs +166 -0
- package/src/eslint-rules/require-yieldable-insertion-write.cjs +98 -0
- package/src/eslint-rules/require-yieldable-reactive-read.cjs +102 -0
- package/src/eslint-rules/require-yieldable-template-method.cjs +424 -0
- package/src/eslint-rules/role-has-required-aria.cjs +38 -0
- package/src/eslint-rules/server-function-client-match.cjs +283 -0
- package/src/eslint-rules/target-blank-noopener.cjs +31 -0
- package/src/eslint-rules/template-element-name-unique.cjs +124 -0
- package/src/eslint-rules/valid-aria.cjs +38 -0
- package/src/generators/route/compat.d.ts +3 -0
- package/src/generators/route/compat.js +6 -0
- package/src/generators/route/compat.js.map +1 -0
- package/src/generators/route/generator.d.ts +31 -0
- package/src/generators/route/generator.js +402 -0
- package/src/generators/route/generator.js.map +1 -0
- package/src/generators/route/schema.json +50 -0
- package/src/generators/route/split-schema.json +19 -0
- package/src/index.d.ts +21 -0
- package/src/index.js +23 -0
- package/src/index.js.map +1 -0
- package/src/scripts/angular-brand-codemod.d.ts +139 -0
- package/src/scripts/angular-brand-codemod.js +2318 -0
- package/src/scripts/angular-brand-codemod.js.map +1 -0
- package/src/scripts/angular-brand-codemod.ts +3985 -0
- package/src/scripts/architecture/migrate-architecture.d.ts +14 -0
- package/src/scripts/architecture/migrate-architecture.js +534 -0
- package/src/scripts/architecture/migrate-architecture.js.map +1 -0
- package/src/scripts/architecture/migrate-architecture.ts +653 -0
- package/src/scripts/architecture-graph.d.ts +368 -0
- package/src/scripts/architecture-graph.js +2191 -0
- package/src/scripts/architecture-graph.js.map +1 -0
- package/src/scripts/architecture-graph.ts +3136 -0
- package/src/scripts/components/migrate-components.d.ts +20 -0
- package/src/scripts/components/migrate-components.js +163 -0
- package/src/scripts/components/migrate-components.js.map +1 -0
- package/src/scripts/components/migrate-components.ts +227 -0
- package/src/scripts/components/migration-diagnostic.d.ts +7 -0
- package/src/scripts/components/migration-diagnostic.js +2 -0
- package/src/scripts/components/migration-diagnostic.js.map +1 -0
- package/src/scripts/components/migration-diagnostic.ts +8 -0
- package/src/scripts/create/create-project.d.ts +20 -0
- package/src/scripts/create/create-project.js +783 -0
- package/src/scripts/create/create-project.js.map +1 -0
- package/src/scripts/create/create-project.ts +849 -0
- package/src/scripts/data-flow-graph.d.ts +36 -0
- package/src/scripts/data-flow-graph.js +186 -0
- package/src/scripts/data-flow-graph.js.map +1 -0
- package/src/scripts/data-flow-graph.ts +240 -0
- package/src/scripts/dependency-graph.d.ts +152 -0
- package/src/scripts/dependency-graph.js +4456 -0
- package/src/scripts/dependency-graph.js.map +1 -0
- package/src/scripts/dependency-graph.ts +5908 -0
- package/src/scripts/effect-dependency-graph.d.ts +89 -0
- package/src/scripts/effect-dependency-graph.js +487 -0
- package/src/scripts/effect-dependency-graph.js.map +1 -0
- package/src/scripts/effect-dependency-graph.ts +630 -0
- package/src/scripts/migrate.d.ts +37 -0
- package/src/scripts/migrate.js +98 -0
- package/src/scripts/migrate.js.map +1 -0
- package/src/scripts/migrate.ts +162 -0
- package/src/scripts/migration-workspace.d.ts +2 -0
- package/src/scripts/migration-workspace.js +67 -0
- package/src/scripts/migration-workspace.js.map +1 -0
- package/src/scripts/migration-workspace.ts +93 -0
- package/src/scripts/primitives/migrate-named-primitives.d.ts +50 -0
- package/src/scripts/primitives/migrate-named-primitives.js +487 -0
- package/src/scripts/primitives/migrate-named-primitives.js.map +1 -0
- package/src/scripts/primitives/migrate-named-primitives.ts +627 -0
- package/src/scripts/primitives/migrate-primitive-generators.d.ts +30 -0
- package/src/scripts/primitives/migrate-primitive-generators.js +309 -0
- package/src/scripts/primitives/migrate-primitive-generators.js.map +1 -0
- package/src/scripts/primitives/migrate-primitive-generators.ts +410 -0
- package/src/scripts/primitives/migrate-primitives.d.ts +27 -0
- package/src/scripts/primitives/migrate-primitives.js +427 -0
- package/src/scripts/primitives/migrate-primitives.js.map +1 -0
- package/src/scripts/primitives/migrate-primitives.ts +655 -0
- package/src/scripts/primitives/migrate-yieldable-reactive-reads.d.ts +23 -0
- package/src/scripts/primitives/migrate-yieldable-reactive-reads.js +382 -0
- package/src/scripts/primitives/migrate-yieldable-reactive-reads.js.map +1 -0
- package/src/scripts/primitives/migrate-yieldable-reactive-reads.ts +499 -0
- package/src/scripts/primitives/migration-diagnostic.d.ts +8 -0
- package/src/scripts/primitives/migration-diagnostic.js +2 -0
- package/src/scripts/primitives/migration-diagnostic.js.map +1 -0
- package/src/scripts/primitives/migration-diagnostic.ts +15 -0
- package/src/scripts/routes/migrate-routes.d.ts +34 -0
- package/src/scripts/routes/migrate-routes.js +657 -0
- package/src/scripts/routes/migrate-routes.js.map +1 -0
- package/src/scripts/routes/migrate-routes.ts +895 -0
- package/src/scripts/routes/migration-diagnostic.d.ts +16 -0
- package/src/scripts/routes/migration-diagnostic.js +2 -0
- package/src/scripts/routes/migration-diagnostic.js.map +1 -0
- package/src/scripts/routes/migration-diagnostic.ts +25 -0
- package/src/scripts/routes/route-command.d.ts +75 -0
- package/src/scripts/routes/route-command.js +1169 -0
- package/src/scripts/routes/route-command.js.map +1 -0
- package/src/scripts/routes/route-command.ts +1807 -0
- package/src/scripts/routes/verify-routes.d.ts +60 -0
- package/src/scripts/routes/verify-routes.js +1121 -0
- package/src/scripts/routes/verify-routes.js.map +1 -0
- package/src/scripts/routes/verify-routes.ts +1511 -0
- package/src/scripts/services/config.d.ts +2 -0
- package/src/scripts/services/config.js +38 -0
- package/src/scripts/services/config.js.map +1 -0
- package/src/scripts/services/config.ts +60 -0
- package/src/scripts/services/migrate-services.d.ts +29 -0
- package/src/scripts/services/migrate-services.js +924 -0
- package/src/scripts/services/migrate-services.js.map +1 -0
- package/src/scripts/services/migrate-services.ts +1348 -0
- package/src/scripts/services/migration-diagnostic.d.ts +8 -0
- package/src/scripts/services/migration-diagnostic.js +2 -0
- package/src/scripts/services/migration-diagnostic.js.map +1 -0
- package/src/scripts/services/migration-diagnostic.ts +28 -0
- package/src/scripts/template/migrate-template.d.ts +16 -0
- package/src/scripts/template/migrate-template.js +349 -0
- package/src/scripts/template/migrate-template.js.map +1 -0
- package/src/scripts/template/migrate-template.ts +418 -0
- package/src/template-migration.d.ts +1 -0
- package/src/template-migration.js +2 -0
- package/src/template-migration.js.map +1 -0
- package/src/testing.d.ts +19 -0
- package/src/testing.js +2 -0
- package/src/testing.js.map +1 -0
- package/src/tsconfig.codemod.json +13 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { runPrimitivesMigration, } from './primitives/migrate-primitives.js';
|
|
4
|
+
import { runRoutesMigration, } from './routes/migrate-routes.js';
|
|
5
|
+
import { runServicesMigration, } from './services/migrate-services.js';
|
|
6
|
+
import { runComponentsMigration, } from './components/migrate-components.js';
|
|
7
|
+
import { runArchitectureMigration, } from './architecture/migrate-architecture.js';
|
|
8
|
+
export async function runMigration(options = {}) {
|
|
9
|
+
const log = options.log ?? console.log;
|
|
10
|
+
const stepLog = options.json ? () => undefined : log;
|
|
11
|
+
const shared = {
|
|
12
|
+
rootDir: options.rootDir,
|
|
13
|
+
tsConfigFilePath: options.tsConfigFilePath,
|
|
14
|
+
files: options.files,
|
|
15
|
+
write: options.write,
|
|
16
|
+
check: options.check,
|
|
17
|
+
failOnManual: options.failOnManual,
|
|
18
|
+
log: stepLog,
|
|
19
|
+
};
|
|
20
|
+
if (!options.json)
|
|
21
|
+
log('1/5 Migrating primitives and Signal Forms...');
|
|
22
|
+
const primitives = await runPrimitivesMigration({
|
|
23
|
+
...shared,
|
|
24
|
+
eslint: options.eslint,
|
|
25
|
+
});
|
|
26
|
+
if (!options.json)
|
|
27
|
+
log('2/5 Migrating Angular services...');
|
|
28
|
+
const services = await runServicesMigration({
|
|
29
|
+
...shared,
|
|
30
|
+
configFilePath: options.configFilePath,
|
|
31
|
+
eslint: options.eslint,
|
|
32
|
+
});
|
|
33
|
+
if (!options.json)
|
|
34
|
+
log('3/5 Migrating Angular routes...');
|
|
35
|
+
const routes = await runRoutesMigration({
|
|
36
|
+
...shared,
|
|
37
|
+
collectionName: options.collectionName,
|
|
38
|
+
parentMount: options.parentMount,
|
|
39
|
+
parentNames: options.parentNames,
|
|
40
|
+
});
|
|
41
|
+
if (!options.json)
|
|
42
|
+
log('4/5 Migrating Craft components and directives...');
|
|
43
|
+
const components = await runComponentsMigration({
|
|
44
|
+
...shared,
|
|
45
|
+
eslint: options.eslint,
|
|
46
|
+
});
|
|
47
|
+
if (!options.json)
|
|
48
|
+
log('5/5 Scaffolding architecture tests...');
|
|
49
|
+
const architecture = await runArchitectureMigration({
|
|
50
|
+
rootDir: options.rootDir,
|
|
51
|
+
tsConfigFilePath: options.tsConfigFilePath,
|
|
52
|
+
write: options.write,
|
|
53
|
+
check: options.check,
|
|
54
|
+
log: stepLog,
|
|
55
|
+
});
|
|
56
|
+
const result = {
|
|
57
|
+
primitives,
|
|
58
|
+
services,
|
|
59
|
+
routes,
|
|
60
|
+
components,
|
|
61
|
+
architecture,
|
|
62
|
+
changedFiles: [
|
|
63
|
+
...new Set([
|
|
64
|
+
...primitives.changedFiles,
|
|
65
|
+
...services.changedFiles,
|
|
66
|
+
...routes.changedFiles,
|
|
67
|
+
...components.changedFiles,
|
|
68
|
+
...architecture.changedFiles,
|
|
69
|
+
]),
|
|
70
|
+
],
|
|
71
|
+
diagnostics: {
|
|
72
|
+
primitives: primitives.diagnostics,
|
|
73
|
+
services: services.diagnostics,
|
|
74
|
+
routes: routes.diagnostics,
|
|
75
|
+
components: components.diagnostics,
|
|
76
|
+
},
|
|
77
|
+
exitCode: Math.max(primitives.exitCode, services.exitCode, routes.exitCode, components.exitCode, architecture.exitCode),
|
|
78
|
+
};
|
|
79
|
+
if (options.jsonFilePath) {
|
|
80
|
+
const path = resolve(options.jsonFilePath);
|
|
81
|
+
await mkdir(dirname(path), { recursive: true });
|
|
82
|
+
await writeFile(path, `${JSON.stringify(result, null, 2)}\n`, 'utf8');
|
|
83
|
+
}
|
|
84
|
+
if (options.json)
|
|
85
|
+
log(JSON.stringify(result, null, 2));
|
|
86
|
+
else {
|
|
87
|
+
const manualCount = primitives.diagnostics.length +
|
|
88
|
+
services.diagnostics.length +
|
|
89
|
+
routes.diagnostics.length +
|
|
90
|
+
components.diagnostics.length;
|
|
91
|
+
log(`Migration complete: ${result.changedFiles.length} changed file(s), ${manualCount} manual diagnostic(s).`);
|
|
92
|
+
if (manualCount > 0) {
|
|
93
|
+
log('Review the diagnostics, then run the project type-check, tests and production build.');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../../libs/dev-tools/src/scripts/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import {
|
|
4
|
+
runPrimitivesMigration,
|
|
5
|
+
type MigratePrimitivesResult,
|
|
6
|
+
} from './primitives/migrate-primitives.js';
|
|
7
|
+
import {
|
|
8
|
+
runRoutesMigration,
|
|
9
|
+
type MigrateRoutesResult,
|
|
10
|
+
} from './routes/migrate-routes.js';
|
|
11
|
+
import {
|
|
12
|
+
runServicesMigration,
|
|
13
|
+
type MigrateServicesResult,
|
|
14
|
+
} from './services/migrate-services.js';
|
|
15
|
+
import {
|
|
16
|
+
runComponentsMigration,
|
|
17
|
+
type MigrateComponentsResult,
|
|
18
|
+
} from './components/migrate-components.js';
|
|
19
|
+
import {
|
|
20
|
+
runArchitectureMigration,
|
|
21
|
+
type MigrateArchitectureResult,
|
|
22
|
+
} from './architecture/migrate-architecture.js';
|
|
23
|
+
|
|
24
|
+
export type MigrateOptions = {
|
|
25
|
+
rootDir?: string;
|
|
26
|
+
tsConfigFilePath?: string;
|
|
27
|
+
configFilePath?: string;
|
|
28
|
+
files?: readonly string[];
|
|
29
|
+
write?: boolean;
|
|
30
|
+
check?: boolean;
|
|
31
|
+
json?: boolean;
|
|
32
|
+
jsonFilePath?: string;
|
|
33
|
+
failOnManual?: boolean;
|
|
34
|
+
eslint?: boolean;
|
|
35
|
+
collectionName?: string;
|
|
36
|
+
parentMount?: string;
|
|
37
|
+
parentNames?: readonly string[];
|
|
38
|
+
log?: (message: string) => void;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export type MigrateResult = {
|
|
42
|
+
primitives: MigratePrimitivesResult;
|
|
43
|
+
services: MigrateServicesResult;
|
|
44
|
+
routes: MigrateRoutesResult;
|
|
45
|
+
components: MigrateComponentsResult;
|
|
46
|
+
architecture: MigrateArchitectureResult;
|
|
47
|
+
changedFiles: string[];
|
|
48
|
+
diagnostics: {
|
|
49
|
+
primitives: MigratePrimitivesResult['diagnostics'];
|
|
50
|
+
services: MigrateServicesResult['diagnostics'];
|
|
51
|
+
routes: MigrateRoutesResult['diagnostics'];
|
|
52
|
+
components: MigrateComponentsResult['diagnostics'];
|
|
53
|
+
};
|
|
54
|
+
exitCode: number;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export async function runMigration(
|
|
58
|
+
options: MigrateOptions = {},
|
|
59
|
+
): Promise<MigrateResult> {
|
|
60
|
+
const log = options.log ?? console.log;
|
|
61
|
+
const stepLog = options.json ? () => undefined : log;
|
|
62
|
+
const shared = {
|
|
63
|
+
rootDir: options.rootDir,
|
|
64
|
+
tsConfigFilePath: options.tsConfigFilePath,
|
|
65
|
+
files: options.files,
|
|
66
|
+
write: options.write,
|
|
67
|
+
check: options.check,
|
|
68
|
+
failOnManual: options.failOnManual,
|
|
69
|
+
log: stepLog,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if (!options.json) log('1/5 Migrating primitives and Signal Forms...');
|
|
73
|
+
const primitives = await runPrimitivesMigration({
|
|
74
|
+
...shared,
|
|
75
|
+
eslint: options.eslint,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
if (!options.json) log('2/5 Migrating Angular services...');
|
|
79
|
+
const services = await runServicesMigration({
|
|
80
|
+
...shared,
|
|
81
|
+
configFilePath: options.configFilePath,
|
|
82
|
+
eslint: options.eslint,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (!options.json) log('3/5 Migrating Angular routes...');
|
|
86
|
+
const routes = await runRoutesMigration({
|
|
87
|
+
...shared,
|
|
88
|
+
collectionName: options.collectionName,
|
|
89
|
+
parentMount: options.parentMount,
|
|
90
|
+
parentNames: options.parentNames,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
if (!options.json) log('4/5 Migrating Craft components and directives...');
|
|
94
|
+
const components = await runComponentsMigration({
|
|
95
|
+
...shared,
|
|
96
|
+
eslint: options.eslint,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
if (!options.json) log('5/5 Scaffolding architecture tests...');
|
|
100
|
+
const architecture = await runArchitectureMigration({
|
|
101
|
+
rootDir: options.rootDir,
|
|
102
|
+
tsConfigFilePath: options.tsConfigFilePath,
|
|
103
|
+
write: options.write,
|
|
104
|
+
check: options.check,
|
|
105
|
+
log: stepLog,
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const result: MigrateResult = {
|
|
109
|
+
primitives,
|
|
110
|
+
services,
|
|
111
|
+
routes,
|
|
112
|
+
components,
|
|
113
|
+
architecture,
|
|
114
|
+
changedFiles: [
|
|
115
|
+
...new Set([
|
|
116
|
+
...primitives.changedFiles,
|
|
117
|
+
...services.changedFiles,
|
|
118
|
+
...routes.changedFiles,
|
|
119
|
+
...components.changedFiles,
|
|
120
|
+
...architecture.changedFiles,
|
|
121
|
+
]),
|
|
122
|
+
],
|
|
123
|
+
diagnostics: {
|
|
124
|
+
primitives: primitives.diagnostics,
|
|
125
|
+
services: services.diagnostics,
|
|
126
|
+
routes: routes.diagnostics,
|
|
127
|
+
components: components.diagnostics,
|
|
128
|
+
},
|
|
129
|
+
exitCode: Math.max(
|
|
130
|
+
primitives.exitCode,
|
|
131
|
+
services.exitCode,
|
|
132
|
+
routes.exitCode,
|
|
133
|
+
components.exitCode,
|
|
134
|
+
architecture.exitCode,
|
|
135
|
+
),
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (options.jsonFilePath) {
|
|
139
|
+
const path = resolve(options.jsonFilePath);
|
|
140
|
+
await mkdir(dirname(path), { recursive: true });
|
|
141
|
+
await writeFile(path, `${JSON.stringify(result, null, 2)}\n`, 'utf8');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (options.json) log(JSON.stringify(result, null, 2));
|
|
145
|
+
else {
|
|
146
|
+
const manualCount =
|
|
147
|
+
primitives.diagnostics.length +
|
|
148
|
+
services.diagnostics.length +
|
|
149
|
+
routes.diagnostics.length +
|
|
150
|
+
components.diagnostics.length;
|
|
151
|
+
log(
|
|
152
|
+
`Migration complete: ${result.changedFiles.length} changed file(s), ${manualCount} manual diagnostic(s).`,
|
|
153
|
+
);
|
|
154
|
+
if (manualCount > 0) {
|
|
155
|
+
log(
|
|
156
|
+
'Review the diagnostics, then run the project type-check, tests and production build.',
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { Node, SyntaxKind } from 'ts-morph';
|
|
4
|
+
const ESLINT_CONFIG_NAMES = [
|
|
5
|
+
'eslint.config.js',
|
|
6
|
+
'eslint.config.mjs',
|
|
7
|
+
'eslint.config.cjs',
|
|
8
|
+
'eslint.config.ts',
|
|
9
|
+
'eslint.config.mts',
|
|
10
|
+
'eslint.config.cts',
|
|
11
|
+
];
|
|
12
|
+
export function migrateEslintConfig(project, searchFromDir) {
|
|
13
|
+
const filePath = findUp(searchFromDir, ESLINT_CONFIG_NAMES);
|
|
14
|
+
if (!filePath)
|
|
15
|
+
return undefined;
|
|
16
|
+
const sourceFile = project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
|
|
17
|
+
const rulesObjects = sourceFile
|
|
18
|
+
.getDescendantsOfKind(SyntaxKind.PropertyAssignment)
|
|
19
|
+
.filter((property) => property.getName() === 'rules')
|
|
20
|
+
.map((property) => ({
|
|
21
|
+
config: property.getFirstAncestorByKind(SyntaxKind.ObjectLiteralExpression),
|
|
22
|
+
rules: property.getInitializer(),
|
|
23
|
+
}))
|
|
24
|
+
.filter((entry) => Boolean(entry.config && Node.isObjectLiteralExpression(entry.rules)));
|
|
25
|
+
const rulesEntry = rulesObjects.find((entry) => /\*\*\/\*\.ts|\.tsx|\[jt\]s/.test(entry.config.getProperty('files')?.getText() ?? '')) ?? rulesObjects.at(-1);
|
|
26
|
+
const rules = rulesEntry && Node.isObjectLiteralExpression(rulesEntry.rules)
|
|
27
|
+
? rulesEntry.rules
|
|
28
|
+
: undefined;
|
|
29
|
+
if (!rules)
|
|
30
|
+
return undefined;
|
|
31
|
+
const changedReturnTypeRule = setRule(rules, '@typescript-eslint/explicit-function-return-type', "'off'");
|
|
32
|
+
const changedEmptyObjectRule = setRule(rules, '@typescript-eslint/no-empty-object-type', "['error', { allowObjectTypes: 'always' }]");
|
|
33
|
+
return changedReturnTypeRule || changedEmptyObjectRule ? sourceFile : undefined;
|
|
34
|
+
}
|
|
35
|
+
function setRule(rules, ruleName, initializer) {
|
|
36
|
+
const existing = rules.getProperty((property) => Node.isPropertyAssignment(property) &&
|
|
37
|
+
getPropertyName(property.getNameNode()) === ruleName);
|
|
38
|
+
if (Node.isPropertyAssignment(existing)) {
|
|
39
|
+
if (existing.getInitializer()?.getText() === initializer)
|
|
40
|
+
return false;
|
|
41
|
+
existing.setInitializer(initializer);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
rules.addPropertyAssignment({ name: `'${ruleName}'`, initializer });
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
function getPropertyName(node) {
|
|
49
|
+
return Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)
|
|
50
|
+
? node.getLiteralValue()
|
|
51
|
+
: node.getText();
|
|
52
|
+
}
|
|
53
|
+
function findUp(startDir, names) {
|
|
54
|
+
let current = resolve(startDir);
|
|
55
|
+
while (true) {
|
|
56
|
+
for (const name of names) {
|
|
57
|
+
const candidate = join(current, name);
|
|
58
|
+
if (existsSync(candidate))
|
|
59
|
+
return candidate;
|
|
60
|
+
}
|
|
61
|
+
const parent = dirname(current);
|
|
62
|
+
if (parent === current)
|
|
63
|
+
return undefined;
|
|
64
|
+
current = parent;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=migration-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-workspace.js","sourceRoot":"","sources":["../../../../../libs/dev-tools/src/scripts/migration-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { Node, Project, SourceFile, SyntaxKind } from 'ts-morph';
|
|
4
|
+
|
|
5
|
+
const ESLINT_CONFIG_NAMES = [
|
|
6
|
+
'eslint.config.js',
|
|
7
|
+
'eslint.config.mjs',
|
|
8
|
+
'eslint.config.cjs',
|
|
9
|
+
'eslint.config.ts',
|
|
10
|
+
'eslint.config.mts',
|
|
11
|
+
'eslint.config.cts',
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export function migrateEslintConfig(
|
|
15
|
+
project: Project,
|
|
16
|
+
searchFromDir: string,
|
|
17
|
+
): SourceFile | undefined {
|
|
18
|
+
const filePath = findUp(searchFromDir, ESLINT_CONFIG_NAMES);
|
|
19
|
+
if (!filePath) return undefined;
|
|
20
|
+
const sourceFile =
|
|
21
|
+
project.getSourceFile(filePath) ?? project.addSourceFileAtPath(filePath);
|
|
22
|
+
const rulesObjects = sourceFile
|
|
23
|
+
.getDescendantsOfKind(SyntaxKind.PropertyAssignment)
|
|
24
|
+
.filter((property) => property.getName() === 'rules')
|
|
25
|
+
.map((property) => ({
|
|
26
|
+
config: property.getFirstAncestorByKind(SyntaxKind.ObjectLiteralExpression),
|
|
27
|
+
rules: property.getInitializer(),
|
|
28
|
+
}))
|
|
29
|
+
.filter(
|
|
30
|
+
(entry): entry is { config: NonNullable<typeof entry.config>; rules: NonNullable<typeof entry.rules> } =>
|
|
31
|
+
Boolean(entry.config && Node.isObjectLiteralExpression(entry.rules)),
|
|
32
|
+
);
|
|
33
|
+
const rulesEntry =
|
|
34
|
+
rulesObjects.find((entry) =>
|
|
35
|
+
/\*\*\/\*\.ts|\.tsx|\[jt\]s/.test(
|
|
36
|
+
entry.config.getProperty('files')?.getText() ?? '',
|
|
37
|
+
),
|
|
38
|
+
) ?? rulesObjects.at(-1);
|
|
39
|
+
const rules =
|
|
40
|
+
rulesEntry && Node.isObjectLiteralExpression(rulesEntry.rules)
|
|
41
|
+
? rulesEntry.rules
|
|
42
|
+
: undefined;
|
|
43
|
+
if (!rules) return undefined;
|
|
44
|
+
const changedReturnTypeRule = setRule(
|
|
45
|
+
rules,
|
|
46
|
+
'@typescript-eslint/explicit-function-return-type',
|
|
47
|
+
"'off'",
|
|
48
|
+
);
|
|
49
|
+
const changedEmptyObjectRule = setRule(
|
|
50
|
+
rules,
|
|
51
|
+
'@typescript-eslint/no-empty-object-type',
|
|
52
|
+
"['error', { allowObjectTypes: 'always' }]",
|
|
53
|
+
);
|
|
54
|
+
return changedReturnTypeRule || changedEmptyObjectRule ? sourceFile : undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function setRule(
|
|
58
|
+
rules: import('ts-morph').ObjectLiteralExpression,
|
|
59
|
+
ruleName: string,
|
|
60
|
+
initializer: string,
|
|
61
|
+
): boolean {
|
|
62
|
+
const existing = rules.getProperty(
|
|
63
|
+
(property) =>
|
|
64
|
+
Node.isPropertyAssignment(property) &&
|
|
65
|
+
getPropertyName(property.getNameNode()) === ruleName,
|
|
66
|
+
);
|
|
67
|
+
if (Node.isPropertyAssignment(existing)) {
|
|
68
|
+
if (existing.getInitializer()?.getText() === initializer) return false;
|
|
69
|
+
existing.setInitializer(initializer);
|
|
70
|
+
} else {
|
|
71
|
+
rules.addPropertyAssignment({ name: `'${ruleName}'`, initializer });
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getPropertyName(node: Node): string {
|
|
77
|
+
return Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)
|
|
78
|
+
? node.getLiteralValue()
|
|
79
|
+
: node.getText();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function findUp(startDir: string, names: readonly string[]): string | undefined {
|
|
83
|
+
let current = resolve(startDir);
|
|
84
|
+
while (true) {
|
|
85
|
+
for (const name of names) {
|
|
86
|
+
const candidate = join(current, name);
|
|
87
|
+
if (existsSync(candidate)) return candidate;
|
|
88
|
+
}
|
|
89
|
+
const parent = dirname(current);
|
|
90
|
+
if (parent === current) return undefined;
|
|
91
|
+
current = parent;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SourceFile } from 'ts-morph';
|
|
2
|
+
/**
|
|
3
|
+
* Migrates call-sites to the *named* craft primitives.
|
|
4
|
+
*
|
|
5
|
+
* The five primitives now take their name as first argument and resolve to the
|
|
6
|
+
* primitive reference itself. `craftComputed` / `craftMethod` already take a
|
|
7
|
+
* name and also return their reference directly:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const users = yield* query({ loader }); // before
|
|
11
|
+
* const users = yield* query('users', { loader }); // after
|
|
12
|
+
*
|
|
13
|
+
* const handleFoo = craftMethod('handleFoo', fn); // unchanged
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* The name is taken from the binding the call is assigned to:
|
|
17
|
+
*
|
|
18
|
+
* 1. `const X = <call>` → `const X = <call>` (the name literal is `'X'`).
|
|
19
|
+
* 2. `const X = craftUse(<call>)` → same, looking through `craftUse` / `yield*`.
|
|
20
|
+
* 3. Class fields and object properties keep the direct primitive reference.
|
|
21
|
+
* 4. For `craftComputed` / `craftMethod` the name literal already exists and
|
|
22
|
+
* wins; the binding is left unchanged.
|
|
23
|
+
*
|
|
24
|
+
* Anything the codemod cannot name — an inline call with no binding, an
|
|
25
|
+
* existing destructuring pattern — is left untouched and reported so it can be
|
|
26
|
+
* fixed by hand.
|
|
27
|
+
*/
|
|
28
|
+
export declare const NAMED_PRIMITIVES: readonly ["state", "query", "mutation", "asyncProcess", "queryParams"];
|
|
29
|
+
/** Helpers that already take a name literal; only their return shape changed. */
|
|
30
|
+
export declare const PRE_NAMED_HELPERS: readonly ["craftComputed", "craftMethod"];
|
|
31
|
+
export type NamedPrimitiveName = (typeof NAMED_PRIMITIVES)[number] | (typeof PRE_NAMED_HELPERS)[number];
|
|
32
|
+
export type MigrateNamedPrimitivesOptions = {
|
|
33
|
+
paths: readonly string[];
|
|
34
|
+
write?: boolean;
|
|
35
|
+
log?: (message: string) => void;
|
|
36
|
+
};
|
|
37
|
+
export type UnmigratedCall = {
|
|
38
|
+
file: string;
|
|
39
|
+
line: number;
|
|
40
|
+
primitive: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
text: string;
|
|
43
|
+
};
|
|
44
|
+
export type MigrateNamedPrimitivesResult = {
|
|
45
|
+
changedFiles: string[];
|
|
46
|
+
unmigrated: UnmigratedCall[];
|
|
47
|
+
};
|
|
48
|
+
export declare function migrateNamedPrimitives({ paths, write, log, }: MigrateNamedPrimitivesOptions): Promise<MigrateNamedPrimitivesResult>;
|
|
49
|
+
/** Applies the named-primitive rewrite to an already loaded source file. */
|
|
50
|
+
export declare function migrateNamedPrimitivesInFile(sourceFile: SourceFile, unmigrated?: UnmigratedCall[]): boolean;
|