@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,89 @@
1
+ import { Node, type SourceFile } from 'ts-morph';
2
+ import type { DependencyGraphEdge, DependencyGraphNode } from './dependency-graph';
3
+ export interface EffectServiceNodeDetails {
4
+ readonly runtime: 'effect';
5
+ readonly tag: string;
6
+ readonly serviceName: string;
7
+ }
8
+ export interface EffectServiceRequirementDetails {
9
+ readonly runtime: 'effect';
10
+ readonly selection: 'whole-service' | 'member';
11
+ readonly member?: string;
12
+ }
13
+ export interface EffectOperationNodeDetails {
14
+ readonly runtime: 'effect';
15
+ readonly operationName: string;
16
+ readonly resolution: 'static' | 'partial' | 'unknown';
17
+ }
18
+ export interface EffectLayerNodeDetails {
19
+ readonly runtime: 'effect';
20
+ readonly layerName: string;
21
+ readonly providedServices: readonly string[];
22
+ readonly requiredServices: readonly string[];
23
+ readonly compositions: readonly string[];
24
+ readonly resolution: 'complete' | 'partial' | 'unknown';
25
+ }
26
+ export interface EffectLayerRelationDetails {
27
+ readonly runtime: 'effect';
28
+ readonly service: string;
29
+ readonly resolution: 'complete' | 'partial' | 'unknown';
30
+ }
31
+ declare module './dependency-graph' {
32
+ interface DependencyGraphNodeRegistry {
33
+ 'effect-service': EffectServiceNodeDetails;
34
+ 'effect-operation': EffectOperationNodeDetails;
35
+ 'effect-layer': EffectLayerNodeDetails;
36
+ }
37
+ interface DependencyGraphEdgeRegistry {
38
+ 'requires-service': EffectServiceRequirementDetails;
39
+ 'provided-by-layer': EffectLayerRelationDetails;
40
+ 'composes-layer': {
41
+ readonly runtime: 'effect';
42
+ };
43
+ }
44
+ }
45
+ export type EffectServiceInfo = {
46
+ /** The class name, which is also the Context tag's identity. */
47
+ readonly name: string;
48
+ /** The string key given to Context.Service()(...). */
49
+ readonly key: string;
50
+ readonly filePath: string;
51
+ readonly line: number;
52
+ };
53
+ export type EffectGraphContribution = {
54
+ readonly nodes: readonly DependencyGraphNode[];
55
+ readonly edges: readonly DependencyGraphEdge[];
56
+ };
57
+ /**
58
+ * `class UserApi extends Context.Service<UserApi, Shape>()('UserApi') {}`
59
+ *
60
+ * Matched on the *shape* of the heritage clause rather than on an import,
61
+ * because the tag is routinely re-exported through a barrel.
62
+ */
63
+ export declare function collectEffectServices(sourceFiles: readonly SourceFile[]): Map<string, EffectServiceInfo>;
64
+ /** The member names a selector picks: `({ byId }) => ({ byId })` -> ['byId']. */
65
+ export declare function selectedMemberNames(selector: Node): readonly string[];
66
+ export type EffectOperationOwner = {
67
+ readonly name: string;
68
+ readonly node: DependencyGraphNode;
69
+ readonly start: number;
70
+ readonly end: number;
71
+ readonly filePath: string;
72
+ };
73
+ /**
74
+ * Finds named Effect operations around direct service reads. This is the
75
+ * missing owner for standalone functions such as `checkUserAccess`: they are
76
+ * not Craft services or components, but they still form a meaningful graph
77
+ * boundary.
78
+ */
79
+ export declare function collectEffectOperationOwners(sourceFiles: readonly SourceFile[], services: ReadonlyMap<string, EffectServiceInfo>): Map<string, EffectOperationOwner>;
80
+ export type EffectLayerContribution = EffectGraphContribution;
81
+ /** Collects only Layer forms whose service and composition are statically visible. */
82
+ export declare function collectEffectLayers(sourceFiles: readonly SourceFile[], services: ReadonlyMap<string, EffectServiceInfo>): EffectLayerContribution;
83
+ /**
84
+ * Walks `effectService(Tag, selector?)` calls and produces the nodes and edges
85
+ * they justify. `ownerIdOf` maps a call site to the consumer node that should
86
+ * own the edge; a call outside any known consumer is skipped rather than
87
+ * attached to something arbitrary.
88
+ */
89
+ export declare function collectEffectServiceUsage(sourceFiles: readonly SourceFile[], services: Map<string, EffectServiceInfo>, ownerIdOf: (node: Node) => string | undefined, includeBackendRelations?: boolean): EffectGraphContribution;
@@ -0,0 +1,487 @@
1
+ import { Node, SyntaxKind } from 'ts-morph';
2
+ const serviceId = (name) => `service:effect:${name}`;
3
+ const effectServiceId = (name) => `effect-service:${name}`;
4
+ const memberId = (name, member) => `property:${serviceId(name)}:${member}`;
5
+ /**
6
+ * `class UserApi extends Context.Service<UserApi, Shape>()('UserApi') {}`
7
+ *
8
+ * Matched on the *shape* of the heritage clause rather than on an import,
9
+ * because the tag is routinely re-exported through a barrel.
10
+ */
11
+ export function collectEffectServices(sourceFiles) {
12
+ const services = new Map();
13
+ for (const sourceFile of sourceFiles) {
14
+ for (const declaration of sourceFile.getClasses()) {
15
+ const heritage = declaration.getExtends();
16
+ if (!heritage)
17
+ continue;
18
+ const expression = heritage.getExpression();
19
+ if (!Node.isCallExpression(expression))
20
+ continue;
21
+ // The outer call is `Context.Service<...>()('Name')`; its callee is the
22
+ // inner `Context.Service<...>()` call.
23
+ const inner = expression.getExpression();
24
+ if (!Node.isCallExpression(inner))
25
+ continue;
26
+ if (!/\bContext\.Service\b/.test(inner.getExpression().getText()))
27
+ continue;
28
+ const name = declaration.getName();
29
+ if (!name)
30
+ continue;
31
+ const keyArgument = expression.getArguments()[0];
32
+ const key = keyArgument && Node.isStringLiteral(keyArgument)
33
+ ? keyArgument.getLiteralValue()
34
+ : name;
35
+ services.set(name, {
36
+ name,
37
+ key,
38
+ filePath: sourceFile.getFilePath(),
39
+ line: declaration.getStartLineNumber(),
40
+ });
41
+ }
42
+ }
43
+ return services;
44
+ }
45
+ /** The member names a selector picks: `({ byId }) => ({ byId })` -> ['byId']. */
46
+ export function selectedMemberNames(selector) {
47
+ if (!Node.isArrowFunction(selector) && !Node.isFunctionExpression(selector)) {
48
+ return [];
49
+ }
50
+ const names = new Set();
51
+ // Preferred reading: the keys of the returned object literal, which is what
52
+ // the consumer will actually destructure.
53
+ const body = Node.isArrowFunction(selector) ? selector.getBody() : undefined;
54
+ const returned = body && Node.isParenthesizedExpression(body)
55
+ ? body.getExpression()
56
+ : body && Node.isObjectLiteralExpression(body)
57
+ ? body
58
+ : undefined;
59
+ if (returned && Node.isObjectLiteralExpression(returned)) {
60
+ for (const property of returned.getProperties()) {
61
+ if (Node.isPropertyAssignment(property) ||
62
+ Node.isShorthandPropertyAssignment(property)) {
63
+ const nameNode = property.getNameNode();
64
+ if (Node.isIdentifier(nameNode))
65
+ names.add(nameNode.getText());
66
+ }
67
+ }
68
+ }
69
+ // Fallback: the destructured parameter, for selectors that rename on the way
70
+ // out (`({ byId }) => ({ fetchUser: byId })`).
71
+ if (names.size === 0) {
72
+ const parameter = selector.getParameters()[0];
73
+ const binding = parameter?.getNameNode();
74
+ if (binding && Node.isObjectBindingPattern(binding)) {
75
+ for (const element of binding.getElements()) {
76
+ const propertyName = element.getPropertyNameNode() ?? element.getNameNode();
77
+ if (Node.isIdentifier(propertyName))
78
+ names.add(propertyName.getText());
79
+ }
80
+ }
81
+ }
82
+ return [...names];
83
+ }
84
+ const operationId = (filePath, name) => `effect-operation:${filePath}#${name}`;
85
+ /**
86
+ * Finds named Effect operations around direct service reads. This is the
87
+ * missing owner for standalone functions such as `checkUserAccess`: they are
88
+ * not Craft services or components, but they still form a meaningful graph
89
+ * boundary.
90
+ */
91
+ export function collectEffectOperationOwners(sourceFiles, services) {
92
+ const owners = new Map();
93
+ for (const sourceFile of sourceFiles) {
94
+ const candidates = [
95
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.YieldExpression),
96
+ ...sourceFile
97
+ .getDescendantsOfKind(SyntaxKind.CallExpression)
98
+ .filter((call) => {
99
+ const callee = call.getExpression().getText();
100
+ return callee === 'effectService' || callee.endsWith('.effectService');
101
+ }),
102
+ ].filter((candidate) => {
103
+ if (Node.isYieldExpression(candidate)) {
104
+ const expression = candidate.getExpression();
105
+ return (expression !== undefined &&
106
+ Node.isIdentifier(expression) &&
107
+ services.has(expression.getText()));
108
+ }
109
+ return true;
110
+ });
111
+ for (const candidate of candidates) {
112
+ const declaration = namedOperationDeclaration(candidate);
113
+ if (!declaration)
114
+ continue;
115
+ const name = declaration.getName();
116
+ if (!name)
117
+ continue;
118
+ const id = operationId(sourceFile.getFilePath(), name);
119
+ if (owners.has(id))
120
+ continue;
121
+ const node = {
122
+ id,
123
+ kind: 'effect-operation',
124
+ label: name,
125
+ filePath: sourceFile.getFilePath(),
126
+ line: declaration.getStartLineNumber(),
127
+ details: {
128
+ runtime: 'effect',
129
+ operationName: name,
130
+ resolution: 'static',
131
+ },
132
+ };
133
+ owners.set(id, {
134
+ name,
135
+ node,
136
+ start: declaration.getStart(),
137
+ end: declaration.getEnd(),
138
+ filePath: sourceFile.getFilePath(),
139
+ });
140
+ }
141
+ }
142
+ return owners;
143
+ }
144
+ function namedOperationDeclaration(node) {
145
+ let current = node.getParent();
146
+ while (current) {
147
+ if (Node.isVariableDeclaration(current) && current.getName()) {
148
+ const initializer = current.getInitializer();
149
+ if ((Node.isCallExpression(initializer) &&
150
+ initializer.getExpression().getText() === 'Effect.gen') ||
151
+ initializer?.getDescendantsOfKind(SyntaxKind.CallExpression).some((call) => call.getExpression().getText() === 'Effect.gen')) {
152
+ return current;
153
+ }
154
+ }
155
+ if (Node.isFunctionDeclaration(current) && current.getName()) {
156
+ return current;
157
+ }
158
+ current = current.getParent();
159
+ }
160
+ return undefined;
161
+ }
162
+ const layerId = (filePath, name) => `effect-layer:${filePath}#${name}`;
163
+ /** Collects only Layer forms whose service and composition are statically visible. */
164
+ export function collectEffectLayers(sourceFiles, services) {
165
+ const nodes = new Map();
166
+ const edges = new Map();
167
+ const layerDeclarations = new Map();
168
+ const layerNames = new Map();
169
+ const addNode = (node) => {
170
+ if (!nodes.has(node.id))
171
+ nodes.set(node.id, node);
172
+ };
173
+ const addEdge = (edge) => {
174
+ const key = `${edge.from}:${edge.kind}:${edge.to}`;
175
+ if (!edges.has(key))
176
+ edges.set(key, edge);
177
+ };
178
+ const proof = (node, pattern) => ({
179
+ filePath: node.getSourceFile().getFilePath(),
180
+ line: node.getStartLineNumber(),
181
+ pattern,
182
+ });
183
+ for (const sourceFile of sourceFiles) {
184
+ for (const declaration of sourceFile.getVariableDeclarations()) {
185
+ const initializer = declaration.getInitializer();
186
+ if (!initializer || !containsLayerCall(initializer))
187
+ continue;
188
+ const name = declaration.getName();
189
+ const id = layerId(sourceFile.getFilePath(), name);
190
+ layerDeclarations.set(id, declaration);
191
+ layerNames.set(name, id);
192
+ }
193
+ }
194
+ for (const [id, declaration] of layerDeclarations) {
195
+ const initializer = declaration.getInitializer();
196
+ if (!initializer)
197
+ continue;
198
+ const provided = [];
199
+ const required = [];
200
+ const compositions = [];
201
+ const calls = [
202
+ ...(Node.isCallExpression(initializer) ? [initializer] : []),
203
+ ...initializer.getDescendantsOfKind(SyntaxKind.CallExpression),
204
+ ];
205
+ for (const call of calls) {
206
+ const callee = call.getExpression().getText();
207
+ const method = callee.match(/^Layer\.(succeed|sync|effect|scoped)$/)?.[1];
208
+ if (method) {
209
+ const argument = call.getArguments()[0];
210
+ if (argument && Node.isIdentifier(argument)) {
211
+ const service = services.get(argument.getText());
212
+ if (service)
213
+ provided.push({ name: service.name, node: call });
214
+ }
215
+ }
216
+ if (callee === 'Layer.provide' || callee.endsWith('.provide')) {
217
+ const argument = call.getArguments()[0];
218
+ if (argument && Node.isIdentifier(argument)) {
219
+ const target = layerNames.get(argument.getText());
220
+ if (target)
221
+ compositions.push({ id: target, node: argument });
222
+ }
223
+ }
224
+ }
225
+ for (const yielded of initializer.getDescendantsOfKind(SyntaxKind.YieldExpression)) {
226
+ const expression = yielded.getExpression();
227
+ if (!expression || !Node.isIdentifier(expression))
228
+ continue;
229
+ const service = services.get(expression.getText());
230
+ if (service && !provided.some((item) => item.name === service.name)) {
231
+ required.push({ name: service.name, node: yielded });
232
+ }
233
+ }
234
+ const resolution = provided.length > 0 &&
235
+ required.length === 0 &&
236
+ [...initializer.getDescendantsOfKind(SyntaxKind.CallExpression)].every((call) => !isUnknownLayerCall(call))
237
+ ? 'complete'
238
+ : provided.length > 0 || required.length > 0
239
+ ? 'partial'
240
+ : 'unknown';
241
+ const node = {
242
+ id,
243
+ kind: 'effect-layer',
244
+ label: declaration.getName(),
245
+ filePath: declaration.getSourceFile().getFilePath(),
246
+ line: declaration.getStartLineNumber(),
247
+ details: {
248
+ runtime: 'effect',
249
+ layerName: declaration.getName(),
250
+ providedServices: [...new Set(provided.map((item) => item.name))],
251
+ requiredServices: [...new Set(required.map((item) => item.name))],
252
+ compositions: [...new Set(compositions.map((item) => item.id))],
253
+ resolution,
254
+ },
255
+ };
256
+ addNode(node);
257
+ for (const item of provided) {
258
+ const target = effectServiceId(item.name);
259
+ addNode({
260
+ id: target,
261
+ kind: 'effect-service',
262
+ label: item.name,
263
+ filePath: services.get(item.name)?.filePath,
264
+ line: services.get(item.name)?.line,
265
+ details: {
266
+ runtime: 'effect',
267
+ tag: services.get(item.name)?.key ?? item.name,
268
+ serviceName: item.name,
269
+ },
270
+ });
271
+ addEdge({
272
+ from: target,
273
+ to: id,
274
+ kind: 'provided-by-layer',
275
+ evidence: 'ast',
276
+ details: { runtime: 'effect', service: item.name, resolution },
277
+ proof: proof(item.node, `Layer provides ${item.name}`),
278
+ });
279
+ }
280
+ for (const item of required) {
281
+ const target = effectServiceId(item.name);
282
+ addEdge({
283
+ from: id,
284
+ to: target,
285
+ kind: 'requires-service',
286
+ evidence: 'ast',
287
+ details: { runtime: 'effect', selection: 'whole-service' },
288
+ proof: proof(item.node, `yield* ${item.name}`),
289
+ });
290
+ }
291
+ for (const item of compositions) {
292
+ addEdge({
293
+ from: id,
294
+ to: item.id,
295
+ kind: 'composes-layer',
296
+ evidence: 'ast',
297
+ details: { runtime: 'effect' },
298
+ proof: proof(item.node, `Layer provides ${item.id}`),
299
+ });
300
+ }
301
+ }
302
+ return { nodes: [...nodes.values()], edges: [...edges.values()] };
303
+ }
304
+ function containsLayerCall(node) {
305
+ return [
306
+ ...(Node.isCallExpression(node) ? [node] : []),
307
+ ...node.getDescendantsOfKind(SyntaxKind.CallExpression),
308
+ ].some((call) => call.getExpression().getText().startsWith('Layer.'));
309
+ }
310
+ function isUnknownLayerCall(call) {
311
+ const callee = call.getExpression().getText();
312
+ return callee.startsWith('Layer.') &&
313
+ !/^Layer\.(succeed|sync|effect|scoped|mergeAll|provide)$/.test(callee);
314
+ }
315
+ /**
316
+ * Walks `effectService(Tag, selector?)` calls and produces the nodes and edges
317
+ * they justify. `ownerIdOf` maps a call site to the consumer node that should
318
+ * own the edge; a call outside any known consumer is skipped rather than
319
+ * attached to something arbitrary.
320
+ */
321
+ export function collectEffectServiceUsage(sourceFiles, services, ownerIdOf, includeBackendRelations = false) {
322
+ const nodes = new Map();
323
+ const edges = new Map();
324
+ const addNode = (node) => {
325
+ if (!nodes.has(node.id))
326
+ nodes.set(node.id, node);
327
+ };
328
+ const addEffectServiceNode = (service) => {
329
+ addNode({
330
+ id: effectServiceId(service.name),
331
+ kind: 'effect-service',
332
+ label: service.name,
333
+ filePath: service.filePath,
334
+ line: service.line,
335
+ details: {
336
+ runtime: 'effect',
337
+ tag: service.key,
338
+ serviceName: service.name,
339
+ },
340
+ });
341
+ };
342
+ const proofFor = (node, pattern) => ({
343
+ filePath: node.getSourceFile().getFilePath(),
344
+ line: node.getStartLineNumber(),
345
+ pattern,
346
+ });
347
+ const addEdge = (edge) => {
348
+ const key = `${edge.from}:${edge.kind}:${edge.to}`;
349
+ if (!edges.has(key))
350
+ edges.set(key, edge);
351
+ };
352
+ for (const [, service] of services) {
353
+ addNode({
354
+ id: serviceId(service.name),
355
+ kind: 'service',
356
+ label: service.name,
357
+ filePath: service.filePath,
358
+ line: service.line,
359
+ details: { runtime: 'effect', tag: service.key },
360
+ });
361
+ addEffectServiceNode(service);
362
+ }
363
+ for (const sourceFile of sourceFiles) {
364
+ for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
365
+ const callee = call.getExpression().getText();
366
+ if (callee !== 'effectService' && !callee.endsWith('.effectService')) {
367
+ continue;
368
+ }
369
+ const [tagArgument, selectorArgument] = call.getArguments();
370
+ if (!tagArgument)
371
+ continue;
372
+ const service = services.get(tagArgument.getText());
373
+ if (!service)
374
+ continue;
375
+ const ownerId = ownerIdOf(call);
376
+ if (!ownerId)
377
+ continue;
378
+ const members = selectorArgument
379
+ ? selectedMemberNames(selectorArgument)
380
+ : [];
381
+ if (members.length === 0) {
382
+ // Whole-service dependency: coarse edge, which is the honest drawing
383
+ // when the consumer took the whole thing.
384
+ addEdge({
385
+ from: ownerId,
386
+ to: serviceId(service.name),
387
+ kind: 'depends-on',
388
+ evidence: 'ast',
389
+ details: {
390
+ runtime: 'effect',
391
+ selection: 'whole-service',
392
+ ...(isInsideLoader(call) ? { resourceRole: 'loader' } : {}),
393
+ },
394
+ });
395
+ if (includeBackendRelations) {
396
+ addEdge({
397
+ from: ownerId,
398
+ to: effectServiceId(service.name),
399
+ kind: 'requires-service',
400
+ evidence: 'ast',
401
+ details: {
402
+ runtime: 'effect',
403
+ selection: 'whole-service',
404
+ },
405
+ proof: proofFor(call, call.getExpression().getText()),
406
+ });
407
+ }
408
+ continue;
409
+ }
410
+ for (const member of members) {
411
+ addNode({
412
+ id: memberId(service.name, member),
413
+ kind: 'property',
414
+ label: `${service.name}.${member}`,
415
+ filePath: service.filePath,
416
+ line: call.getStartLineNumber(),
417
+ details: { runtime: 'effect', member },
418
+ });
419
+ addEdge({
420
+ from: serviceId(service.name),
421
+ to: memberId(service.name, member),
422
+ kind: 'contains',
423
+ evidence: 'ast',
424
+ details: { member },
425
+ });
426
+ addEdge({
427
+ from: ownerId,
428
+ to: memberId(service.name, member),
429
+ kind: 'uses-property',
430
+ evidence: 'ast',
431
+ details: {
432
+ runtime: 'effect',
433
+ property: member,
434
+ ...(isInsideLoader(call) ? { resourceRole: 'loader' } : {}),
435
+ },
436
+ });
437
+ if (includeBackendRelations) {
438
+ addEdge({
439
+ from: ownerId,
440
+ to: effectServiceId(service.name),
441
+ kind: 'requires-service',
442
+ evidence: 'ast',
443
+ details: {
444
+ runtime: 'effect',
445
+ selection: 'member',
446
+ member,
447
+ },
448
+ proof: proofFor(call, call.getExpression().getText()),
449
+ });
450
+ }
451
+ }
452
+ }
453
+ for (const yielded of includeBackendRelations
454
+ ? sourceFile.getDescendantsOfKind(SyntaxKind.YieldExpression)
455
+ : []) {
456
+ const expression = yielded.getExpression();
457
+ if (!expression || !Node.isIdentifier(expression))
458
+ continue;
459
+ const service = services.get(expression.getText());
460
+ if (!service)
461
+ continue;
462
+ const ownerId = ownerIdOf(yielded);
463
+ if (!ownerId)
464
+ continue;
465
+ addEdge({
466
+ from: ownerId,
467
+ to: effectServiceId(service.name),
468
+ kind: 'requires-service',
469
+ evidence: 'ast',
470
+ details: { runtime: 'effect', selection: 'whole-service' },
471
+ proof: proofFor(yielded, `yield* ${service.name}`),
472
+ });
473
+ }
474
+ }
475
+ return { nodes: [...nodes.values()], edges: [...edges.values()] };
476
+ }
477
+ function isInsideLoader(node) {
478
+ let current = node.getParent();
479
+ while (current) {
480
+ if (Node.isPropertyAssignment(current) && current.getName() === 'loader') {
481
+ return true;
482
+ }
483
+ current = current.getParent();
484
+ }
485
+ return false;
486
+ }
487
+ //# sourceMappingURL=effect-dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-dependency-graph.js","sourceRoot":"","sources":["../../../../../libs/dev-tools/src/scripts/effect-dependency-graph.ts"],"names":[],"mappings":"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"}