@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.
Files changed (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/generators.json +26 -0
  4. package/package.json +119 -0
  5. package/src/bin/craft-architecture-check.d.ts +2 -0
  6. package/src/bin/craft-architecture-check.js +51 -0
  7. package/src/bin/craft-architecture-check.js.map +1 -0
  8. package/src/bin/craft-brand.d.ts +2 -0
  9. package/src/bin/craft-brand.js +9 -0
  10. package/src/bin/craft-brand.js.map +1 -0
  11. package/src/bin/craft-graph.d.ts +2 -0
  12. package/src/bin/craft-graph.js +72 -0
  13. package/src/bin/craft-graph.js.map +1 -0
  14. package/src/bin/craft-migrate-architecture.d.ts +2 -0
  15. package/src/bin/craft-migrate-architecture.js +64 -0
  16. package/src/bin/craft-migrate-architecture.js.map +1 -0
  17. package/src/bin/craft-migrate-components.d.ts +2 -0
  18. package/src/bin/craft-migrate-components.js +67 -0
  19. package/src/bin/craft-migrate-components.js.map +1 -0
  20. package/src/bin/craft-migrate-primitives.d.ts +2 -0
  21. package/src/bin/craft-migrate-primitives.js +71 -0
  22. package/src/bin/craft-migrate-primitives.js.map +1 -0
  23. package/src/bin/craft-migrate-routes.d.ts +2 -0
  24. package/src/bin/craft-migrate-routes.js +77 -0
  25. package/src/bin/craft-migrate-routes.js.map +1 -0
  26. package/src/bin/craft-migrate-services.d.ts +2 -0
  27. package/src/bin/craft-migrate-services.js +75 -0
  28. package/src/bin/craft-migrate-services.js.map +1 -0
  29. package/src/bin/craft-migrate-template.d.ts +2 -0
  30. package/src/bin/craft-migrate-template.js +68 -0
  31. package/src/bin/craft-migrate-template.js.map +1 -0
  32. package/src/bin/craft-migrate.d.ts +2 -0
  33. package/src/bin/craft-migrate.js +91 -0
  34. package/src/bin/craft-migrate.js.map +1 -0
  35. package/src/bin/craft.d.ts +2 -0
  36. package/src/bin/craft.js +318 -0
  37. package/src/bin/craft.js.map +1 -0
  38. package/src/eslint-rules/anchor-has-href.cjs +35 -0
  39. package/src/eslint-rules/app-start-registry-match.cjs +355 -0
  40. package/src/eslint-rules/button-has-type.cjs +50 -0
  41. package/src/eslint-rules/control-has-accessible-name.cjs +56 -0
  42. package/src/eslint-rules/craft-component-name-match.cjs +8 -0
  43. package/src/eslint-rules/craft-computed-name-match.cjs +63 -0
  44. package/src/eslint-rules/craft-css-token-registry.cjs +17 -0
  45. package/src/eslint-rules/craft-css-var-naming.cjs +18 -0
  46. package/src/eslint-rules/craft-css-vars-contract.cjs +34 -0
  47. package/src/eslint-rules/craft-directive-name-match.cjs +8 -0
  48. package/src/eslint-rules/craft-method-name-match.cjs +8 -0
  49. package/src/eslint-rules/craft-name-match-utils.cjs +179 -0
  50. package/src/eslint-rules/craft-primitive-context.cjs +46 -0
  51. package/src/eslint-rules/craft-signal-source-name-match.cjs +8 -0
  52. package/src/eslint-rules/craft-source-name-match.cjs +8 -0
  53. package/src/eslint-rules/craft-styles-scope-safe.cjs +25 -0
  54. package/src/eslint-rules/css-rule-utils.cjs +109 -0
  55. package/src/eslint-rules/global-exception-registry-match.cjs +562 -0
  56. package/src/eslint-rules/heading-has-content.cjs +31 -0
  57. package/src/eslint-rules/html-helpers.cjs +115 -0
  58. package/src/eslint-rules/hyperscript-walk.cjs +249 -0
  59. package/src/eslint-rules/iframe-has-title.cjs +26 -0
  60. package/src/eslint-rules/img-has-alt.cjs +28 -0
  61. package/src/eslint-rules/index.cjs +209 -0
  62. package/src/eslint-rules/index.d.cts +5 -0
  63. package/src/eslint-rules/label-has-associated-control.cjs +67 -0
  64. package/src/eslint-rules/no-async-await.cjs +46 -0
  65. package/src/eslint-rules/no-craft-computed-side-effects.cjs +301 -0
  66. package/src/eslint-rules/no-craft-use-in-template.cjs +89 -0
  67. package/src/eslint-rules/no-craft-use.cjs +42 -0
  68. package/src/eslint-rules/no-direct-temporal-globals.cjs +73 -0
  69. package/src/eslint-rules/no-effect-in-params.cjs +265 -0
  70. package/src/eslint-rules/no-effect-outside-loaders.cjs +3 -0
  71. package/src/eslint-rules/no-ephemeral-template-form-state.cjs +131 -0
  72. package/src/eslint-rules/no-hardcoded-design-values.cjs +15 -0
  73. package/src/eslint-rules/no-heading-level-skip.cjs +101 -0
  74. package/src/eslint-rules/no-imperative-craft-resource-trigger.cjs +291 -0
  75. package/src/eslint-rules/no-important-in-component-styles.cjs +12 -0
  76. package/src/eslint-rules/no-injection-token.cjs +173 -0
  77. package/src/eslint-rules/no-invalid-insertion-pipe.cjs +162 -0
  78. package/src/eslint-rules/no-manual-route-provider-list.cjs +85 -0
  79. package/src/eslint-rules/no-noninteractive-element-interactions.cjs +66 -0
  80. package/src/eslint-rules/no-positive-tabindex.cjs +44 -0
  81. package/src/eslint-rules/no-redundant-primitive-insertion.cjs +361 -0
  82. package/src/eslint-rules/no-render-writes.cjs +106 -0
  83. package/src/eslint-rules/no-throw.cjs +132 -0
  84. package/src/eslint-rules/no-transition-actions.cjs +133 -0
  85. package/src/eslint-rules/no-type-assertions-in-template.cjs +211 -0
  86. package/src/eslint-rules/no-widened-route-provider-context.cjs +39 -0
  87. package/src/eslint-rules/prefer-browser-boundaries.cjs +92 -0
  88. package/src/eslint-rules/prefer-craft-http-transport.cjs +103 -0
  89. package/src/eslint-rules/prefer-craft-template-blocks.cjs +492 -0
  90. package/src/eslint-rules/prefer-direct-yieldable-callback.cjs +105 -0
  91. package/src/eslint-rules/prefer-named-html-helpers.cjs +33 -0
  92. package/src/eslint-rules/prefer-query-method-over-state-trigger.cjs +282 -0
  93. package/src/eslint-rules/prefer-relative-heading.cjs +43 -0
  94. package/src/eslint-rules/provide-host-name-match-component.cjs +455 -0
  95. package/src/eslint-rules/recommended-config.cjs +77 -0
  96. package/src/eslint-rules/require-assert-exhaustive-route-exceptions.cjs +259 -0
  97. package/src/eslint-rules/require-cascade-route-di-check.cjs +223 -0
  98. package/src/eslint-rules/require-child-route-mount-check.cjs +224 -0
  99. package/src/eslint-rules/require-component-monitoring.cjs +212 -0
  100. package/src/eslint-rules/require-craft-exception-handler.cjs +142 -0
  101. package/src/eslint-rules/require-craft-method-for-yieldable-callback.cjs +236 -0
  102. package/src/eslint-rules/require-craft-resource-trigger-yield.cjs +209 -0
  103. package/src/eslint-rules/require-effect-adapters.cjs +86 -0
  104. package/src/eslint-rules/require-exception-component-di-check.cjs +314 -0
  105. package/src/eslint-rules/require-focus-visible.cjs +36 -0
  106. package/src/eslint-rules/require-interactive-local-name.cjs +105 -0
  107. package/src/eslint-rules/require-lazy-load-with-retry.cjs +148 -0
  108. package/src/eslint-rules/require-outlet-heading-section.cjs +70 -0
  109. package/src/eslint-rules/require-pending-component-di-check.cjs +490 -0
  110. package/src/eslint-rules/require-primitive-context.cjs +156 -0
  111. package/src/eslint-rules/require-primitive-derived-property.cjs +598 -0
  112. package/src/eslint-rules/require-primitive-generator-unwrap.cjs +274 -0
  113. package/src/eslint-rules/require-reactive-template-bindings.cjs +305 -0
  114. package/src/eslint-rules/require-reduced-motion.cjs +38 -0
  115. package/src/eslint-rules/require-route-heading-outline.cjs +166 -0
  116. package/src/eslint-rules/require-yieldable-insertion-write.cjs +98 -0
  117. package/src/eslint-rules/require-yieldable-reactive-read.cjs +102 -0
  118. package/src/eslint-rules/require-yieldable-template-method.cjs +424 -0
  119. package/src/eslint-rules/role-has-required-aria.cjs +38 -0
  120. package/src/eslint-rules/server-function-client-match.cjs +283 -0
  121. package/src/eslint-rules/target-blank-noopener.cjs +31 -0
  122. package/src/eslint-rules/template-element-name-unique.cjs +124 -0
  123. package/src/eslint-rules/valid-aria.cjs +38 -0
  124. package/src/generators/route/compat.d.ts +3 -0
  125. package/src/generators/route/compat.js +6 -0
  126. package/src/generators/route/compat.js.map +1 -0
  127. package/src/generators/route/generator.d.ts +31 -0
  128. package/src/generators/route/generator.js +402 -0
  129. package/src/generators/route/generator.js.map +1 -0
  130. package/src/generators/route/schema.json +50 -0
  131. package/src/generators/route/split-schema.json +19 -0
  132. package/src/index.d.ts +21 -0
  133. package/src/index.js +23 -0
  134. package/src/index.js.map +1 -0
  135. package/src/scripts/angular-brand-codemod.d.ts +139 -0
  136. package/src/scripts/angular-brand-codemod.js +2318 -0
  137. package/src/scripts/angular-brand-codemod.js.map +1 -0
  138. package/src/scripts/angular-brand-codemod.ts +3985 -0
  139. package/src/scripts/architecture/migrate-architecture.d.ts +14 -0
  140. package/src/scripts/architecture/migrate-architecture.js +534 -0
  141. package/src/scripts/architecture/migrate-architecture.js.map +1 -0
  142. package/src/scripts/architecture/migrate-architecture.ts +653 -0
  143. package/src/scripts/architecture-graph.d.ts +368 -0
  144. package/src/scripts/architecture-graph.js +2191 -0
  145. package/src/scripts/architecture-graph.js.map +1 -0
  146. package/src/scripts/architecture-graph.ts +3136 -0
  147. package/src/scripts/components/migrate-components.d.ts +20 -0
  148. package/src/scripts/components/migrate-components.js +163 -0
  149. package/src/scripts/components/migrate-components.js.map +1 -0
  150. package/src/scripts/components/migrate-components.ts +227 -0
  151. package/src/scripts/components/migration-diagnostic.d.ts +7 -0
  152. package/src/scripts/components/migration-diagnostic.js +2 -0
  153. package/src/scripts/components/migration-diagnostic.js.map +1 -0
  154. package/src/scripts/components/migration-diagnostic.ts +8 -0
  155. package/src/scripts/create/create-project.d.ts +20 -0
  156. package/src/scripts/create/create-project.js +783 -0
  157. package/src/scripts/create/create-project.js.map +1 -0
  158. package/src/scripts/create/create-project.ts +849 -0
  159. package/src/scripts/data-flow-graph.d.ts +36 -0
  160. package/src/scripts/data-flow-graph.js +186 -0
  161. package/src/scripts/data-flow-graph.js.map +1 -0
  162. package/src/scripts/data-flow-graph.ts +240 -0
  163. package/src/scripts/dependency-graph.d.ts +152 -0
  164. package/src/scripts/dependency-graph.js +4456 -0
  165. package/src/scripts/dependency-graph.js.map +1 -0
  166. package/src/scripts/dependency-graph.ts +5908 -0
  167. package/src/scripts/effect-dependency-graph.d.ts +89 -0
  168. package/src/scripts/effect-dependency-graph.js +487 -0
  169. package/src/scripts/effect-dependency-graph.js.map +1 -0
  170. package/src/scripts/effect-dependency-graph.ts +630 -0
  171. package/src/scripts/migrate.d.ts +37 -0
  172. package/src/scripts/migrate.js +98 -0
  173. package/src/scripts/migrate.js.map +1 -0
  174. package/src/scripts/migrate.ts +162 -0
  175. package/src/scripts/migration-workspace.d.ts +2 -0
  176. package/src/scripts/migration-workspace.js +67 -0
  177. package/src/scripts/migration-workspace.js.map +1 -0
  178. package/src/scripts/migration-workspace.ts +93 -0
  179. package/src/scripts/primitives/migrate-named-primitives.d.ts +50 -0
  180. package/src/scripts/primitives/migrate-named-primitives.js +487 -0
  181. package/src/scripts/primitives/migrate-named-primitives.js.map +1 -0
  182. package/src/scripts/primitives/migrate-named-primitives.ts +627 -0
  183. package/src/scripts/primitives/migrate-primitive-generators.d.ts +30 -0
  184. package/src/scripts/primitives/migrate-primitive-generators.js +309 -0
  185. package/src/scripts/primitives/migrate-primitive-generators.js.map +1 -0
  186. package/src/scripts/primitives/migrate-primitive-generators.ts +410 -0
  187. package/src/scripts/primitives/migrate-primitives.d.ts +27 -0
  188. package/src/scripts/primitives/migrate-primitives.js +427 -0
  189. package/src/scripts/primitives/migrate-primitives.js.map +1 -0
  190. package/src/scripts/primitives/migrate-primitives.ts +655 -0
  191. package/src/scripts/primitives/migrate-yieldable-reactive-reads.d.ts +23 -0
  192. package/src/scripts/primitives/migrate-yieldable-reactive-reads.js +382 -0
  193. package/src/scripts/primitives/migrate-yieldable-reactive-reads.js.map +1 -0
  194. package/src/scripts/primitives/migrate-yieldable-reactive-reads.ts +499 -0
  195. package/src/scripts/primitives/migration-diagnostic.d.ts +8 -0
  196. package/src/scripts/primitives/migration-diagnostic.js +2 -0
  197. package/src/scripts/primitives/migration-diagnostic.js.map +1 -0
  198. package/src/scripts/primitives/migration-diagnostic.ts +15 -0
  199. package/src/scripts/routes/migrate-routes.d.ts +34 -0
  200. package/src/scripts/routes/migrate-routes.js +657 -0
  201. package/src/scripts/routes/migrate-routes.js.map +1 -0
  202. package/src/scripts/routes/migrate-routes.ts +895 -0
  203. package/src/scripts/routes/migration-diagnostic.d.ts +16 -0
  204. package/src/scripts/routes/migration-diagnostic.js +2 -0
  205. package/src/scripts/routes/migration-diagnostic.js.map +1 -0
  206. package/src/scripts/routes/migration-diagnostic.ts +25 -0
  207. package/src/scripts/routes/route-command.d.ts +75 -0
  208. package/src/scripts/routes/route-command.js +1169 -0
  209. package/src/scripts/routes/route-command.js.map +1 -0
  210. package/src/scripts/routes/route-command.ts +1807 -0
  211. package/src/scripts/routes/verify-routes.d.ts +60 -0
  212. package/src/scripts/routes/verify-routes.js +1121 -0
  213. package/src/scripts/routes/verify-routes.js.map +1 -0
  214. package/src/scripts/routes/verify-routes.ts +1511 -0
  215. package/src/scripts/services/config.d.ts +2 -0
  216. package/src/scripts/services/config.js +38 -0
  217. package/src/scripts/services/config.js.map +1 -0
  218. package/src/scripts/services/config.ts +60 -0
  219. package/src/scripts/services/migrate-services.d.ts +29 -0
  220. package/src/scripts/services/migrate-services.js +924 -0
  221. package/src/scripts/services/migrate-services.js.map +1 -0
  222. package/src/scripts/services/migrate-services.ts +1348 -0
  223. package/src/scripts/services/migration-diagnostic.d.ts +8 -0
  224. package/src/scripts/services/migration-diagnostic.js +2 -0
  225. package/src/scripts/services/migration-diagnostic.js.map +1 -0
  226. package/src/scripts/services/migration-diagnostic.ts +28 -0
  227. package/src/scripts/template/migrate-template.d.ts +16 -0
  228. package/src/scripts/template/migrate-template.js +349 -0
  229. package/src/scripts/template/migrate-template.js.map +1 -0
  230. package/src/scripts/template/migrate-template.ts +418 -0
  231. package/src/template-migration.d.ts +1 -0
  232. package/src/template-migration.js +2 -0
  233. package/src/template-migration.js.map +1 -0
  234. package/src/testing.d.ts +19 -0
  235. package/src/testing.js +2 -0
  236. package/src/testing.js.map +1 -0
  237. package/src/tsconfig.codemod.json +13 -0
@@ -0,0 +1,14 @@
1
+ export type MigrateArchitectureOptions = {
2
+ rootDir?: string;
3
+ tsConfigFilePath?: string;
4
+ write?: boolean;
5
+ check?: boolean;
6
+ json?: boolean;
7
+ jsonFilePath?: string;
8
+ log?: (message: string) => void;
9
+ };
10
+ export type MigrateArchitectureResult = {
11
+ changedFiles: string[];
12
+ exitCode: number;
13
+ };
14
+ export declare function runArchitectureMigration(options?: MigrateArchitectureOptions): Promise<MigrateArchitectureResult>;
@@ -0,0 +1,534 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { dirname, join, relative, resolve } from 'node:path';
4
+ import { architectureCatalogToTypeScript, buildArchitectureCatalog, } from '../architecture-graph.js';
5
+ import { analyzeDependencyGraph, } from '../dependency-graph.js';
6
+ const RULES = [
7
+ {
8
+ file: 'craft-unique.spec.ts',
9
+ helper: 'assertCraftUnique',
10
+ describe: 'assertCraftUnique',
11
+ it: 'requires craftUnique identities to appear once',
12
+ call: 'assertCraftUnique(graph.graph)',
13
+ },
14
+ {
15
+ file: 'http-endpoint-unique.spec.ts',
16
+ helper: 'assertHttpEndpointUnique',
17
+ describe: 'assertHttpEndpointUnique',
18
+ it: 'owns each HTTP endpoint once',
19
+ call: 'assertHttpEndpointUnique(graph.graph)',
20
+ },
21
+ {
22
+ file: 'craft-computed-pure.spec.ts',
23
+ helper: 'assertCraftComputedPure',
24
+ describe: 'assertCraftComputedPure',
25
+ it: 'keeps craftComputed free of methods and source$ writes',
26
+ call: 'assertCraftComputedPure(graph.graph)',
27
+ },
28
+ {
29
+ file: 'no-dependency-cycles.spec.ts',
30
+ helper: 'assertNoDependencyCycles',
31
+ describe: 'assertNoDependencyCycles',
32
+ it: 'forbids depends-on cycles',
33
+ call: 'assertNoDependencyCycles(graph.graph)',
34
+ },
35
+ {
36
+ file: 'app-config-route-cycles.spec.ts',
37
+ helper: 'assertNoAppConfigRouteCycles',
38
+ describe: 'assertNoAppConfigRouteCycles',
39
+ it: 'keeps app configuration and route modules acyclic',
40
+ call: 'assertNoAppConfigRouteCycles(graph.graph)',
41
+ },
42
+ {
43
+ file: 'route-di-proofs.spec.ts',
44
+ helper: 'assertRouteDiProofs',
45
+ describe: 'assertRouteDiProofs',
46
+ it: 'requires a DI proof on every routed component and app-config error screen',
47
+ call: 'assertRouteDiProofs(graph.graph)',
48
+ },
49
+ {
50
+ file: 'mutation-react-on.spec.ts',
51
+ helper: 'assertMutationHasReactOn',
52
+ describe: 'assertMutationHasReactOn',
53
+ it: 'requires a query to react to each mutation',
54
+ call: 'assertMutationHasReactOn(graph.graph)',
55
+ },
56
+ {
57
+ file: 'persisted-primitive-unique.spec.ts',
58
+ helper: 'assertPersistedPrimitiveHasUnique',
59
+ describe: 'assertPersistedPrimitiveHasUnique',
60
+ it: 'requires craftUnique on every persisted primitive',
61
+ call: 'assertPersistedPrimitiveHasUnique(graph.graph)',
62
+ },
63
+ {
64
+ file: 'insert-select-unique.spec.ts',
65
+ helper: 'assertInsertSelectUnique',
66
+ describe: 'assertInsertSelectUnique',
67
+ it: 'keeps insertSelect keys unique on each host',
68
+ call: 'assertInsertSelectUnique(graph.graph)',
69
+ },
70
+ {
71
+ file: 'craft-effect-no-network.spec.ts',
72
+ helper: 'assertCraftEffectNoNetwork',
73
+ describe: 'assertCraftEffectNoNetwork',
74
+ it: 'keeps craftEffect off HTTP and mutations',
75
+ call: 'assertCraftEffectNoNetwork(graph.graph)',
76
+ },
77
+ {
78
+ file: 'craft-effect-no-imperative-sync.spec.ts',
79
+ helper: 'assertCraftEffectNoImperativeSync',
80
+ describe: 'assertCraftEffectNoImperativeSync',
81
+ it: 'keeps craftEffect from pushing into state, sources, queries or mutations',
82
+ call: 'assertCraftEffectNoImperativeSync(graph.graph)',
83
+ },
84
+ {
85
+ file: 'interactive-element-named.spec.ts',
86
+ helper: 'assertInteractiveElementNamed',
87
+ describe: 'assertInteractiveElementNamed',
88
+ it: 'requires a unique literal data-craft-name on every interactive element',
89
+ call: 'assertInteractiveElementNamed(graph.graph)',
90
+ },
91
+ ];
92
+ export async function runArchitectureMigration(options = {}) {
93
+ const context = await resolveContext(options);
94
+ const files = buildScaffoldFiles(context);
95
+ const changedFiles = Object.keys(files).map((relativePath) => join(context.appRoot, relativePath));
96
+ changedFiles.push(join(context.appRoot, 'architecture/catalog.ts'));
97
+ const packagePath = findPackageJson(context.appRoot, context.workspaceRoot);
98
+ const projectPath = join(context.appRoot, 'project.json');
99
+ if (!context.nx && packagePath) {
100
+ changedFiles.push(packagePath);
101
+ }
102
+ if (context.nx && existsSync(projectPath)) {
103
+ changedFiles.push(projectPath);
104
+ }
105
+ const tsconfigPath = join(context.appRoot, 'tsconfig.json');
106
+ if (existsSync(tsconfigPath))
107
+ changedFiles.push(tsconfigPath);
108
+ const eslintPath = findEslintConfig(context.appRoot, context.workspaceRoot);
109
+ if (eslintPath)
110
+ changedFiles.push(eslintPath);
111
+ if (options.write) {
112
+ const graphConfig = files['tsconfig.graph.json'];
113
+ if (graphConfig) {
114
+ await mkdir(context.appRoot, { recursive: true });
115
+ await writeFile(join(context.appRoot, 'tsconfig.graph.json'), graphConfig, 'utf8');
116
+ }
117
+ }
118
+ files['architecture/catalog.ts'] = await generateCatalog(context);
119
+ if (options.write) {
120
+ for (const [relativePath, contents] of Object.entries(files)) {
121
+ const fullPath = join(context.appRoot, relativePath);
122
+ await mkdir(dirname(fullPath), { recursive: true });
123
+ await writeFile(fullPath, contents, 'utf8');
124
+ }
125
+ if (!context.nx && packagePath) {
126
+ await patchPackageJson(packagePath, context);
127
+ }
128
+ if (context.nx) {
129
+ await patchNxProject(context);
130
+ }
131
+ await patchTsconfigReferences(context.appRoot);
132
+ await patchEslintIgnore(context.appRoot, context.workspaceRoot);
133
+ }
134
+ const exitCode = options.check && !(await scaffoldMatches(context, files)) ? 1 : 0;
135
+ const result = {
136
+ changedFiles,
137
+ exitCode,
138
+ };
139
+ if (options.jsonFilePath) {
140
+ const path = resolve(options.jsonFilePath);
141
+ await mkdir(dirname(path), { recursive: true });
142
+ await writeFile(path, `${JSON.stringify(result, null, 2)}\n`, 'utf8');
143
+ }
144
+ const log = options.log ?? console.log;
145
+ if (options.json)
146
+ log(JSON.stringify(result, null, 2));
147
+ else {
148
+ log(`${options.write ? 'Wrote' : 'Would write'} architecture suite: ${result.changedFiles.length} file(s).`);
149
+ }
150
+ return result;
151
+ }
152
+ async function resolveContext(options) {
153
+ const rootDir = resolve(options.rootDir ?? process.cwd());
154
+ const tsConfigFilePath = options.tsConfigFilePath
155
+ ? resolve(options.tsConfigFilePath)
156
+ : defaultTsConfig(rootDir);
157
+ const appRoot = dirname(tsConfigFilePath);
158
+ const workspaceRoot = findWorkspaceRoot(appRoot);
159
+ const nx = existsSync(join(appRoot, 'project.json'));
160
+ const sourceRel = posixRelative(appRoot, rootDir);
161
+ const sourceGlob = !sourceRel || sourceRel === '.' ? 'src' : sourceRel.replace(/\\/g, '/');
162
+ const projectName = await readProjectName(appRoot, nx);
163
+ return {
164
+ appRoot,
165
+ workspaceRoot,
166
+ sourceGlob,
167
+ projectName,
168
+ nx,
169
+ graphTsConfigRel: posixRelative(workspaceRoot, join(appRoot, 'tsconfig.graph.json')),
170
+ workspaceFromArchitecture: posixRelative(join(appRoot, 'architecture'), workspaceRoot),
171
+ };
172
+ }
173
+ function buildScaffoldFiles(context) {
174
+ return {
175
+ 'tsconfig.graph.json': `${JSON.stringify({
176
+ extends: './tsconfig.json',
177
+ compilerOptions: { skipLibCheck: true },
178
+ include: [`${context.sourceGlob}/**/*.ts`],
179
+ exclude: [
180
+ `${context.sourceGlob}/**/*.spec.ts`,
181
+ `${context.sourceGlob}/**/*.test.ts`,
182
+ ],
183
+ }, null, 2)}\n`,
184
+ 'tsconfig.architecture.json': `${JSON.stringify({
185
+ extends: './tsconfig.json',
186
+ compilerOptions: {
187
+ types: ['node', 'vitest/globals'],
188
+ module: 'esnext',
189
+ moduleResolution: 'bundler',
190
+ },
191
+ include: ['architecture/**/*.ts'],
192
+ }, null, 2)}\n`,
193
+ 'vitest.architecture.config.ts': vitestConfig(context),
194
+ 'architecture/load-graph.ts': loadGraphSource(context),
195
+ 'architecture/architecture.spec.ts': architectureSpecSource(),
196
+ ...Object.fromEntries(RULES.map((rule) => [
197
+ `architecture/rules/${rule.file}`,
198
+ ruleSpecSource(rule),
199
+ ])),
200
+ };
201
+ }
202
+ async function generateCatalog(context) {
203
+ const header = '// Generated. Do not edit.\n';
204
+ try {
205
+ const graph = analyzeDependencyGraph({
206
+ rootDir: context.workspaceRoot,
207
+ tsConfigFilePath: context.graphTsConfigRel,
208
+ });
209
+ return `${header}${architectureCatalogToTypeScript(buildArchitectureCatalog(graph))}`;
210
+ }
211
+ catch {
212
+ const empty = {
213
+ version: 1,
214
+ rootDir: context.workspaceRoot,
215
+ tsConfigFilePath: join(context.workspaceRoot, context.graphTsConfigRel),
216
+ nodes: [],
217
+ edges: [],
218
+ };
219
+ return `${header}${architectureCatalogToTypeScript(buildArchitectureCatalog(empty))}`;
220
+ }
221
+ }
222
+ function loadGraphSource(context) {
223
+ return `import { writeFileSync } from 'node:fs';
224
+ import { join, resolve } from 'node:path';
225
+ import {
226
+ analyzeDependencyGraph,
227
+ architectureCatalogToTypeScript,
228
+ buildArchitectureCatalog,
229
+ createArchitectureGraph,
230
+ } from '@craft-ts/dev-tools';
231
+ import { architectureCatalog } from './catalog';
232
+
233
+ const workspaceRoot = resolve(import.meta.dirname, '${context.workspaceFromArchitecture}');
234
+ const catalogPath = join(import.meta.dirname, 'catalog.ts');
235
+
236
+ let cached: ReturnType<typeof createArchitectureGraph> | undefined;
237
+
238
+ export function loadArchitectureGraph() {
239
+ if (cached) return cached;
240
+ const graph = analyzeDependencyGraph({
241
+ rootDir: workspaceRoot,
242
+ tsConfigFilePath: '${context.graphTsConfigRel}',
243
+ });
244
+ writeFileSync(
245
+ catalogPath,
246
+ \`// Generated. Do not edit.\\n\${architectureCatalogToTypeScript(buildArchitectureCatalog(graph))}\`,
247
+ );
248
+ cached = createArchitectureGraph(graph, architectureCatalog);
249
+ return cached;
250
+ }
251
+ `;
252
+ }
253
+ function architectureSpecSource() {
254
+ return `import { beforeAll, describe, expect, it } from 'vitest';
255
+ import { loadArchitectureGraph } from './load-graph';
256
+
257
+ /**
258
+ * App-specific lookups. Common architecture rules live in \`rules/\`.
259
+ */
260
+ describe('architecture', () => {
261
+ let graph: ReturnType<typeof loadArchitectureGraph>;
262
+
263
+ beforeAll(() => {
264
+ graph = loadArchitectureGraph();
265
+ }, 180_000);
266
+
267
+ it('loads the architecture graph', () => {
268
+ expect(graph.graph.version).toBe(1);
269
+ });
270
+ });
271
+ `;
272
+ }
273
+ function ruleSpecSource(rule) {
274
+ return `import { beforeAll, describe, it } from 'vitest';
275
+ import { ${rule.helper} } from '@craft-ts/dev-tools';
276
+ import { loadArchitectureGraph } from '../load-graph';
277
+
278
+ describe('${rule.describe}', () => {
279
+ let graph: ReturnType<typeof loadArchitectureGraph>;
280
+
281
+ beforeAll(() => {
282
+ graph = loadArchitectureGraph();
283
+ }, 180_000);
284
+
285
+ it('${rule.it}', () => {
286
+ ${rule.call};
287
+ });
288
+ });
289
+ `;
290
+ }
291
+ function vitestConfig(context) {
292
+ if (context.nx) {
293
+ const cacheRel = posixRelative(context.appRoot, join(context.workspaceRoot, 'node_modules', '.vite', `${context.projectName}-architecture`));
294
+ return `/// <reference types="vitest" />
295
+ import { defineConfig } from 'vite';
296
+
297
+ export default defineConfig(() => ({
298
+ root: import.meta.dirname,
299
+ cacheDir: ${JSON.stringify(cacheRel)},
300
+ plugins: [],
301
+ resolve: {
302
+ tsconfigPaths: true,
303
+ },
304
+ test: {
305
+ name: ${JSON.stringify(`${context.projectName}-architecture`)},
306
+ watch: false,
307
+ globals: true,
308
+ environment: 'node',
309
+ testTimeout: 180_000,
310
+ hookTimeout: 180_000,
311
+ include: ['architecture/**/*.spec.ts'],
312
+ },
313
+ }));
314
+ `;
315
+ }
316
+ return `/// <reference types="vitest" />
317
+ import { defineConfig } from 'vite';
318
+
319
+ export default defineConfig(() => ({
320
+ root: import.meta.dirname,
321
+ cacheDir: ${JSON.stringify(`node_modules/.vite/${context.projectName}-architecture`)},
322
+ test: {
323
+ name: ${JSON.stringify(`${context.projectName}-architecture`)},
324
+ watch: false,
325
+ globals: true,
326
+ environment: 'node',
327
+ testTimeout: 180_000,
328
+ hookTimeout: 180_000,
329
+ include: ['architecture/**/*.spec.ts'],
330
+ },
331
+ }));
332
+ `;
333
+ }
334
+ function defaultTsConfig(rootDir) {
335
+ for (const name of ['tsconfig.app.json', 'tsconfig.json']) {
336
+ const candidate = join(rootDir, name);
337
+ if (existsSync(candidate))
338
+ return candidate;
339
+ const parent = join(dirname(rootDir), name);
340
+ if (existsSync(parent))
341
+ return parent;
342
+ }
343
+ return join(rootDir, 'tsconfig.json');
344
+ }
345
+ function findWorkspaceRoot(appRoot) {
346
+ let current = appRoot;
347
+ while (true) {
348
+ if (existsSync(join(current, 'nx.json')) ||
349
+ existsSync(join(current, 'angular.json'))) {
350
+ return current;
351
+ }
352
+ const parent = dirname(current);
353
+ if (parent === current)
354
+ return appRoot;
355
+ current = parent;
356
+ }
357
+ }
358
+ async function readProjectName(appRoot, nx) {
359
+ if (nx) {
360
+ try {
361
+ const project = JSON.parse(await readFile(join(appRoot, 'project.json'), 'utf8'));
362
+ if (project.name)
363
+ return sanitizeName(project.name);
364
+ }
365
+ catch {
366
+ /* fall through */
367
+ }
368
+ }
369
+ try {
370
+ const pkg = JSON.parse(await readFile(join(appRoot, 'package.json'), 'utf8'));
371
+ if (pkg.name)
372
+ return sanitizeName(pkg.name);
373
+ }
374
+ catch {
375
+ /* fall through */
376
+ }
377
+ return sanitizeName(appRoot.split(/[\\/]/).at(-1) ?? 'app');
378
+ }
379
+ function sanitizeName(name) {
380
+ return name.replace(/^@.*\//, '').replace(/[^a-zA-Z0-9._-]/g, '-');
381
+ }
382
+ function posixRelative(from, to) {
383
+ const value = relative(from, to).split('\\').join('/');
384
+ return value === '' ? '.' : value;
385
+ }
386
+ async function patchNxProject(context) {
387
+ const projectPath = join(context.appRoot, 'project.json');
388
+ if (!existsSync(projectPath))
389
+ return;
390
+ const project = JSON.parse(await readFile(projectPath, 'utf8'));
391
+ const cwd = posixRelative(context.workspaceRoot, context.appRoot);
392
+ project.targets = {
393
+ ...project.targets,
394
+ architecture: {
395
+ executor: 'nx:run-commands',
396
+ options: {
397
+ command: 'npx vitest run --config vitest.architecture.config.ts',
398
+ cwd,
399
+ },
400
+ inputs: [
401
+ '{projectRoot}/src/**/*.ts',
402
+ '{projectRoot}/architecture/**/*.ts',
403
+ '{projectRoot}/tsconfig.graph.json',
404
+ '{projectRoot}/tsconfig.architecture.json',
405
+ ],
406
+ cache: true,
407
+ },
408
+ 'typecheck-architecture': {
409
+ executor: 'nx:run-commands',
410
+ options: {
411
+ cwd,
412
+ command: 'tsc -p tsconfig.architecture.json --noEmit --pretty false',
413
+ },
414
+ inputs: [
415
+ '{projectRoot}/tsconfig.json',
416
+ '{projectRoot}/tsconfig.architecture.json',
417
+ '{projectRoot}/architecture/**/*.ts',
418
+ ],
419
+ cache: true,
420
+ },
421
+ };
422
+ await writeFile(projectPath, `${JSON.stringify(project, null, 2)}\n`, 'utf8');
423
+ }
424
+ async function patchPackageJson(packagePath, context) {
425
+ const pkg = JSON.parse(await readFile(packagePath, 'utf8'));
426
+ const fromPkg = dirname(packagePath);
427
+ const vitestConfig = posixRelative(fromPkg, join(context.appRoot, 'vitest.architecture.config.ts'));
428
+ const architectureTsconfig = posixRelative(fromPkg, join(context.appRoot, 'tsconfig.architecture.json'));
429
+ pkg.scripts = {
430
+ ...pkg.scripts,
431
+ architecture: `vitest run --config ${vitestConfig}`,
432
+ 'typecheck-architecture': `tsc -p ${architectureTsconfig} --noEmit --pretty false`,
433
+ };
434
+ await writeFile(packagePath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf8');
435
+ }
436
+ async function scaffoldMatches(context, files) {
437
+ for (const [relativePath, contents] of Object.entries(files)) {
438
+ const fullPath = join(context.appRoot, relativePath);
439
+ if (!existsSync(fullPath))
440
+ return false;
441
+ if (relativePath === 'architecture/catalog.ts' ||
442
+ relativePath === 'architecture/architecture.spec.ts') {
443
+ continue;
444
+ }
445
+ const actual = await readFile(fullPath, 'utf8');
446
+ if (normalize(actual) !== normalize(contents))
447
+ return false;
448
+ }
449
+ if (context.nx) {
450
+ const projectPath = join(context.appRoot, 'project.json');
451
+ if (!existsSync(projectPath))
452
+ return false;
453
+ const project = JSON.parse(await readFile(projectPath, 'utf8'));
454
+ return Boolean(project.targets?.['architecture']?.options?.command);
455
+ }
456
+ const packagePath = findPackageJson(context.appRoot, context.workspaceRoot);
457
+ if (!packagePath)
458
+ return false;
459
+ const pkg = JSON.parse(await readFile(packagePath, 'utf8'));
460
+ return pkg.scripts?.['architecture']?.includes('vitest.architecture.config.ts') === true;
461
+ }
462
+ function normalize(value) {
463
+ return value.replace(/\r\n/g, '\n');
464
+ }
465
+ const ESLINT_CONFIG_NAMES = [
466
+ 'eslint.config.js',
467
+ 'eslint.config.mjs',
468
+ 'eslint.config.cjs',
469
+ 'eslint.config.ts',
470
+ 'eslint.config.mts',
471
+ 'eslint.config.cts',
472
+ ];
473
+ async function patchTsconfigReferences(appRoot) {
474
+ const tsconfigPath = join(appRoot, 'tsconfig.json');
475
+ if (!existsSync(tsconfigPath))
476
+ return;
477
+ const text = await readFile(tsconfigPath, 'utf8');
478
+ let parsed;
479
+ try {
480
+ parsed = JSON.parse(text);
481
+ }
482
+ catch {
483
+ return;
484
+ }
485
+ const references = parsed.references ?? [];
486
+ if (references.some((ref) => ref.path === './tsconfig.architecture.json')) {
487
+ return;
488
+ }
489
+ parsed.references = [...references, { path: './tsconfig.architecture.json' }];
490
+ await writeFile(tsconfigPath, `${JSON.stringify(parsed, null, 2)}\n`, 'utf8');
491
+ }
492
+ async function patchEslintIgnore(appRoot, workspaceRoot) {
493
+ const eslintPath = findEslintConfig(appRoot, workspaceRoot);
494
+ if (!eslintPath)
495
+ return;
496
+ const text = await readFile(eslintPath, 'utf8');
497
+ if (text.includes('architecture/catalog.ts'))
498
+ return;
499
+ let next = text;
500
+ if (/ignores:\s*\[/.test(next)) {
501
+ next = next.replace(/ignores:\s*\[/, "ignores: ['**/architecture/catalog.ts', ");
502
+ }
503
+ else if (/export default\s*(?:defineConfig\s*\()?\[/.test(next)) {
504
+ next = next.replace(/export default\s*(?:defineConfig\s*\()?\[/, (match) => `${match}\n { ignores: ['**/architecture/catalog.ts'] },`);
505
+ }
506
+ else {
507
+ return;
508
+ }
509
+ await writeFile(eslintPath, next, 'utf8');
510
+ }
511
+ function findEslintConfig(startDir, stopDir) {
512
+ return findUpFile(startDir, ESLINT_CONFIG_NAMES, stopDir);
513
+ }
514
+ function findPackageJson(startDir, stopDir) {
515
+ return findUpFile(startDir, ['package.json'], stopDir);
516
+ }
517
+ function findUpFile(startDir, names, stopDir) {
518
+ const stop = resolve(stopDir);
519
+ let current = resolve(startDir);
520
+ while (true) {
521
+ for (const name of names) {
522
+ const candidate = join(current, name);
523
+ if (existsSync(candidate))
524
+ return candidate;
525
+ }
526
+ if (current === stop)
527
+ return undefined;
528
+ const parent = dirname(current);
529
+ if (parent === current)
530
+ return undefined;
531
+ current = parent;
532
+ }
533
+ }
534
+ //# sourceMappingURL=migrate-architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-architecture.js","sourceRoot":"","sources":["../../../../../../libs/dev-tools/src/scripts/architecture/migrate-architecture.ts"],"names":[],"mappings":"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"}