@pixel-point/toolcraft 0.0.17 → 0.0.19

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 (503) hide show
  1. package/package.json +1 -1
  2. package/src/generate-demand-only-lifecycle.test.mjs +9 -1
  3. package/src/generate-performance-iteration-execution.test.mjs +3 -3
  4. package/src/generate-test-delivery-architecture-assertions.mjs +11 -73
  5. package/src/generate-test-demand-only-lifecycle.mjs +34 -36
  6. package/src/generate-test-dependency-sandbox.mjs +4 -1
  7. package/src/generate-test-doc-assertions.mjs +81 -89
  8. package/src/generate-test-doc-assertions.test.mjs +44 -1
  9. package/src/generate-test-doc-policy-assertions.mjs +92 -0
  10. package/src/generate-test-export-doc-assertions.mjs +53 -0
  11. package/src/generate-test-file-assertions.mjs +77 -83
  12. package/src/generate-test-integrity-assertions.mjs +5 -2
  13. package/src/generate-test-integrity-manifest-assertions.mjs +16 -5
  14. package/src/generate-test-integrity-ownership-assertions.mjs +36 -4
  15. package/src/generate-test-package-assertions.mjs +4 -0
  16. package/src/generate-test-product-fixture.mjs +1 -1
  17. package/src/generate-test-product-fixture.test.mjs +35 -38
  18. package/src/generate-test-product-iteration.mjs +0 -1
  19. package/src/generate-test-product-iteration.test.mjs +17 -1
  20. package/src/generate-test-runtime-boundary-assertions.mjs +178 -0
  21. package/src/generate-test-standalone-assertions.mjs +7 -13
  22. package/src/generate-test-standalone-delivery-stages.mjs +2 -86
  23. package/src/generate.test.mjs +4 -0
  24. package/src/generated-integrity-manifest.test.mjs +5 -2
  25. package/src/generated-source-policy.test.mjs +0 -4
  26. package/src/package-json.mjs +5 -0
  27. package/src/package-json.test.mjs +21 -0
  28. package/src/package-manager.mjs +2 -0
  29. package/src/package-manager.test.mjs +8 -0
  30. package/src/packaged-template-fallback-helpers.mjs +254 -0
  31. package/src/packaged-template-fallback.test.mjs +121 -46
  32. package/src/packaged-template-runtime-assertions.mjs +150 -0
  33. package/templates/runtime/contracts/component-contracts.choices.test.ts +64 -5
  34. package/templates/runtime/contracts/component-contracts.choices.ts +55 -5
  35. package/templates/runtime/contracts/component-contracts.inputs.test.ts +6 -6
  36. package/templates/runtime/contracts/component-contracts.inputs.ts +8 -7
  37. package/templates/runtime/contracts/component-contracts.media-custom.test.ts +8 -2
  38. package/templates/runtime/contracts/component-contracts.media-custom.ts +8 -2
  39. package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +22 -8
  40. package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +7 -1
  41. package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +3 -0
  42. package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +4 -1
  43. package/templates/runtime/contracts/component-contracts.runtime.ts +19 -12
  44. package/templates/runtime/contracts/component-contracts.test.ts +2 -0
  45. package/templates/runtime/contracts/component-contracts.visual.test.ts +20 -0
  46. package/templates/runtime/contracts/component-contracts.visual.ts +4 -0
  47. package/templates/runtime/contracts/decision-contracts.test.ts +35 -11
  48. package/templates/runtime/contracts/decision-contracts.ts +12 -12
  49. package/templates/runtime/contracts/performance-verification-policy.test.ts +12 -12
  50. package/templates/runtime/contracts/performance-verification-policy.ts +8 -8
  51. package/templates/runtime/export/artifact-download.ts +1 -0
  52. package/templates/runtime/export/artifact-frame-renderer.ts +2 -15
  53. package/templates/runtime/export/artifact-frame-state.ts +16 -0
  54. package/templates/runtime/export/artifact-scene-frame.test.ts +3 -3
  55. package/templates/runtime/export/artifact-scene-frame.ts +3 -3
  56. package/templates/runtime/export/export-background.ts +0 -19
  57. package/templates/runtime/export/export-error.ts +5 -0
  58. package/templates/runtime/export/export-renderer-coverage.ts +54 -0
  59. package/templates/runtime/export/export.test.ts +45 -42
  60. package/templates/runtime/export/image-artifact-export.ts +2 -2
  61. package/templates/runtime/export/index.ts +57 -16
  62. package/templates/runtime/export/product-export-renderer.test.ts +38 -4
  63. package/templates/runtime/export/product-export-renderer.ts +0 -41
  64. package/templates/runtime/export/product-svg-export-renderer.ts +21 -0
  65. package/templates/runtime/export/svg-artifact-export.test.ts +98 -0
  66. package/templates/runtime/export/svg-artifact-export.ts +120 -0
  67. package/templates/runtime/export/svg-document.test.ts +221 -0
  68. package/templates/runtime/export/svg-document.ts +400 -0
  69. package/templates/runtime/export/svg-policy.ts +47 -0
  70. package/templates/runtime/index.ts +3 -0
  71. package/templates/runtime/model-import/model-import-limits.ts +15 -4
  72. package/templates/runtime/react/app-shell/runtime-public-api.test.tsx +21 -1
  73. package/templates/runtime/react/app-shell/settings-transfer.test.ts +21 -0
  74. package/templates/runtime/react/app-shell/toolcraft-app.scene-export.test.tsx +75 -1
  75. package/templates/runtime/react/app-shell/toolcraft-app.tsx +24 -9
  76. package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +30 -0
  77. package/templates/runtime/react/canvas/canvas-shell-pinch-interactions.test.tsx +155 -0
  78. package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +77 -1
  79. package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +13 -1
  80. package/templates/runtime/react/canvas/canvas-shell.tsx +32 -6
  81. package/templates/runtime/react/canvas/canvas-viewport-geometry.ts +133 -0
  82. package/templates/runtime/react/canvas/product-scene-surface.test.tsx +195 -0
  83. package/templates/runtime/react/canvas/product-scene-surface.tsx +155 -0
  84. package/templates/runtime/react/canvas/runtime-scene-export.ts +1 -1
  85. package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +285 -36
  86. package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +61 -0
  87. package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +89 -0
  88. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-applicability-layout.test.tsx +134 -0
  89. package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +16 -1
  90. package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +40 -19
  91. package/templates/runtime/react/controls-panel/__tests__/controls-panel.render-isolation.test.tsx +2 -0
  92. package/templates/runtime/react/controls-panel/__tests__/controls-panel.scene-export-actions.test.tsx +40 -1
  93. package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +3 -3
  94. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-collection.test.tsx +59 -0
  95. package/templates/runtime/react/controls-panel/__tests__/controls-panel.source-color-bank.test.tsx +67 -0
  96. package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +6 -6
  97. package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +4 -6
  98. package/templates/runtime/react/controls-panel/actions/export-action-runner.ts +41 -6
  99. package/templates/runtime/react/controls-panel/conditions/control-conditions.ts +32 -119
  100. package/templates/runtime/react/controls-panel/layout/controls-panel-control-group.tsx +5 -2
  101. package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +41 -10
  102. package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +7 -4
  103. package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +2 -1
  104. package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +2 -52
  105. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.test.tsx +63 -0
  106. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-item-fields.tsx +138 -0
  107. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-items.tsx +104 -0
  108. package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +115 -236
  109. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.test.tsx +95 -0
  110. package/templates/runtime/react/controls-panel/renderers/controls-panel-file-drop-item-controls.tsx +82 -0
  111. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.test.tsx +73 -1
  112. package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +50 -1
  113. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +1 -1
  114. package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +2 -1
  115. package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +38 -6
  116. package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +1 -9
  117. package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +7 -2
  118. package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +1 -0
  119. package/templates/runtime/react/index.ts +4 -0
  120. package/templates/runtime/react/model-rendering/model-export.ts +1 -1
  121. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-math.ts +9 -69
  122. package/templates/runtime/react/orientation-gizmo/orientation-gizmo-selection.ts +5 -5
  123. package/templates/runtime/react/orientation-gizmo/use-toolcraft-orientation-control-selection.ts +2 -2
  124. package/templates/runtime/scene/scene-bounds.test.ts +23 -0
  125. package/templates/runtime/scene/scene-bounds.ts +31 -17
  126. package/templates/runtime/schema/app-capabilities.test.ts +4 -0
  127. package/templates/runtime/schema/artifact-export-actions.test.ts +47 -0
  128. package/templates/runtime/schema/artifact-export-actions.ts +49 -0
  129. package/templates/runtime/schema/collection-item-controls.ts +29 -0
  130. package/templates/runtime/schema/control-applicability.test.ts +127 -0
  131. package/templates/runtime/schema/control-applicability.ts +433 -0
  132. package/templates/runtime/schema/control-schema-normalization.ts +177 -11
  133. package/templates/runtime/schema/controls-panel-actions.ts +2 -2
  134. package/templates/runtime/schema/controls-panel-section-layout.ts +14 -9
  135. package/templates/runtime/schema/controls-panel-section-roundtrip.test.ts +59 -0
  136. package/templates/runtime/schema/define-toolcraft.collection-actions-item-controls.test.ts +127 -0
  137. package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +10 -4
  138. package/templates/runtime/schema/define-toolcraft.file-drop-item-controls.test.ts +98 -0
  139. package/templates/runtime/schema/define-toolcraft.file-drop-normalization.test.ts +27 -0
  140. package/templates/runtime/schema/define-toolcraft.segmented-control-fit.test.ts +20 -2
  141. package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +16 -3
  142. package/templates/runtime/schema/define-toolcraft.source-collection.test.ts +79 -0
  143. package/templates/runtime/schema/runtime-setup-section.ts +24 -5
  144. package/templates/runtime/schema/types.ts +69 -13
  145. package/templates/runtime/state/canvas-background-state.ts +1 -16
  146. package/templates/runtime/state/canvas-state.ts +32 -20
  147. package/templates/runtime/state/control-value-codecs.test.ts +98 -0
  148. package/templates/runtime/state/control-value-codecs.ts +700 -0
  149. package/templates/runtime/state/control-value-normalization.test.ts +1 -1
  150. package/templates/runtime/state/control-value-normalization.ts +127 -135
  151. package/templates/runtime/state/controls-reducer.ts +26 -3
  152. package/templates/runtime/state/create-template-state.test.ts +30 -0
  153. package/templates/runtime/state/create-template-state.ts +52 -31
  154. package/templates/runtime/state/orientation-pose.ts +80 -0
  155. package/templates/runtime/state/persistence-control-values.test.ts +59 -0
  156. package/templates/runtime/state/reducer-controls.test.ts +45 -0
  157. package/templates/runtime/state/reducer-media-reset.test.ts +1 -1
  158. package/templates/runtime/state/reducer-timeline.test.ts +70 -0
  159. package/templates/runtime/state/timeline-reducer.ts +40 -2
  160. package/templates/runtime/testing/performance-schema-queries.ts +2 -2
  161. package/templates/starter/AGENTS.md +29 -28
  162. package/templates/starter/docs/toolcraft/README.md +6 -6
  163. package/templates/starter/docs/toolcraft/acceptance-testing.md +34 -48
  164. package/templates/starter/docs/toolcraft/agent-worklog.md +103 -1
  165. package/templates/starter/docs/toolcraft/assembly-workflow.md +16 -8
  166. package/templates/starter/docs/toolcraft/component-rules.md +9 -7
  167. package/templates/starter/docs/toolcraft/core/control-selection.md +9 -3
  168. package/templates/starter/docs/toolcraft/core/layout.md +13 -8
  169. package/templates/starter/docs/toolcraft/core/media-upload.md +3 -1
  170. package/templates/starter/docs/toolcraft/core/performance.md +8 -10
  171. package/templates/starter/docs/toolcraft/core/reference-study.md +80 -19
  172. package/templates/starter/docs/toolcraft/core/runtime-boundary.md +15 -3
  173. package/templates/starter/docs/toolcraft/core/setup-export.md +67 -11
  174. package/templates/starter/docs/toolcraft/custom-controls.md +6 -4
  175. package/templates/starter/docs/toolcraft/decision-contract.md +4 -2
  176. package/templates/starter/docs/toolcraft/performance.md +8 -10
  177. package/templates/starter/docs/toolcraft/renderer-technique.md +6 -2
  178. package/templates/starter/docs/toolcraft/schema-reference.md +24 -22
  179. package/templates/starter/docs/toolcraft/workflow.md +14 -14
  180. package/templates/starter/e2e/app-browser-control-applicability-requirements.spec.ts +163 -0
  181. package/templates/starter/e2e/app-browser-infinity-canvas-evidence.spec.ts +45 -2
  182. package/templates/starter/e2e/app-browser-motion-reference-requirements.spec.ts +411 -0
  183. package/templates/starter/e2e/app-browser-orientation-evidence.spec.ts +174 -21
  184. package/templates/starter/e2e/app-browser-proof-session.spec.ts +85 -0
  185. package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +63 -33
  186. package/templates/starter/e2e/app-browser-selection-scope-evidence.spec.ts +137 -0
  187. package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +61 -15
  188. package/templates/starter/e2e/{browser-conditional-output-evidence-helpers.ts → browser-background-output-evidence.ts} +0 -68
  189. package/templates/starter/e2e/browser-control-applicability-evidence.ts +114 -0
  190. package/templates/starter/e2e/browser-infinity-canvas-evidence.ts +20 -11
  191. package/templates/starter/e2e/browser-infinity-canvas-svg-evidence.ts +42 -0
  192. package/templates/starter/e2e/browser-layer-evidence-helpers.ts +15 -36
  193. package/templates/starter/e2e/browser-orientation-gizmo-evidence-helpers.ts +4 -0
  194. package/templates/starter/e2e/browser-orientation-gizmo-live-preconditions.ts +86 -0
  195. package/templates/starter/e2e/browser-product-raster-snapshot.ts +213 -0
  196. package/templates/starter/e2e/browser-proof-session.ts +43 -15
  197. package/templates/starter/e2e/browser-proof-surface-action.ts +79 -0
  198. package/templates/starter/e2e/browser-proof-types.ts +15 -0
  199. package/templates/starter/e2e/browser-runtime-applicability-requirements.ts +84 -0
  200. package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +9 -2
  201. package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +51 -32
  202. package/templates/starter/e2e/browser-selection-scope-evidence.ts +269 -0
  203. package/templates/starter/e2e/browser-semantic-evidence-test-helpers.ts +122 -0
  204. package/templates/starter/e2e/browser-svg-export-evidence.spec.ts +79 -0
  205. package/templates/starter/e2e/browser-svg-export-evidence.ts +152 -0
  206. package/templates/starter/e2e/export-artifact-helpers.ts +70 -0
  207. package/templates/starter/e2e/product-observable-helpers.ts +8 -129
  208. package/templates/starter/e2e/svg-artifact-inspection.spec.ts +136 -0
  209. package/templates/starter/e2e/svg-artifact-inspection.ts +331 -0
  210. package/templates/starter/e2e/svg-download-test-fixtures.ts +34 -0
  211. package/templates/starter/e2e/toolcraft-delivery-catalog-reporter.ts +198 -15
  212. package/templates/starter/e2e/toolcraft-feature-verification-reporter.spec.ts +149 -0
  213. package/templates/starter/e2e/toolcraft-feature-verification-reporter.ts +223 -0
  214. package/templates/starter/package.json +2 -0
  215. package/templates/starter/scripts/check-toolcraft-docs.mjs +1 -0
  216. package/templates/starter/scripts/create-toolcraft-motion-reference-study.mjs +233 -0
  217. package/templates/starter/scripts/create-toolcraft-motion-reference-study.test.mjs +459 -0
  218. package/templates/starter/scripts/playwright-test-title-selection.d.mts +45 -0
  219. package/templates/starter/scripts/run-browser-performance-test-helpers.mjs +0 -27
  220. package/templates/starter/scripts/run-browser-performance.mjs +0 -6
  221. package/templates/starter/scripts/run-browser-performance.test.mjs +5 -13
  222. package/templates/starter/scripts/run-delivery-verification-test-helpers.mjs +0 -34
  223. package/templates/starter/scripts/run-delivery-verification.test.mjs +135 -31
  224. package/templates/starter/scripts/run-feature-verification.mjs +212 -0
  225. package/templates/starter/scripts/run-feature-verification.test.mjs +226 -0
  226. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.mjs +21 -8
  227. package/templates/starter/scripts/toolcraft-checkpoint-delivery-state.test.mjs +32 -92
  228. package/templates/starter/scripts/toolcraft-checkpoint-transaction.mjs +28 -6
  229. package/templates/starter/scripts/toolcraft-checkpoint-transaction.test.mjs +8 -63
  230. package/templates/starter/scripts/toolcraft-contract-manifest.json +1 -0
  231. package/templates/starter/scripts/toolcraft-delivery-anchor.mjs +28 -8
  232. package/templates/starter/scripts/toolcraft-delivery-anchor.test.mjs +50 -61
  233. package/templates/starter/scripts/toolcraft-delivery-architecture-inventory.mjs +0 -4
  234. package/templates/starter/scripts/toolcraft-delivery-architecture-policy.mjs +0 -1
  235. package/templates/starter/scripts/toolcraft-delivery-evidence.test.mjs +2 -3
  236. package/templates/starter/scripts/toolcraft-delivery-executor.mjs +5 -1
  237. package/templates/starter/scripts/toolcraft-delivery-executor.test.mjs +5 -12
  238. package/templates/starter/scripts/toolcraft-delivery-functional-context.d.mts +1 -48
  239. package/templates/starter/scripts/toolcraft-delivery-functional-context.mjs +2 -30
  240. package/templates/starter/scripts/toolcraft-delivery-functional-context.test.mjs +4 -166
  241. package/templates/starter/scripts/toolcraft-delivery-functional-initial.test.mjs +4 -20
  242. package/templates/starter/scripts/toolcraft-delivery-lifecycle.mjs +43 -192
  243. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-lifecycle.test.mjs +79 -440
  244. package/templates/starter/scripts/toolcraft-delivery-plan-authority.test.mjs +102 -297
  245. package/templates/starter/scripts/toolcraft-delivery-plan-construction.mjs +46 -97
  246. package/templates/starter/scripts/toolcraft-delivery-plan-test-helpers.mjs +125 -0
  247. package/templates/starter/scripts/toolcraft-delivery-plan-validation.test.mjs +58 -0
  248. package/templates/starter/scripts/toolcraft-delivery-plan.d.mts +19 -31
  249. package/templates/starter/scripts/toolcraft-delivery-plan.mjs +254 -252
  250. package/templates/starter/scripts/toolcraft-delivery-plan.test.mjs +29 -457
  251. package/templates/starter/scripts/toolcraft-delivery-receipt-performance.test.mjs +1 -1
  252. package/templates/starter/scripts/toolcraft-delivery-receipt-strictness.test.mjs +3 -72
  253. package/templates/starter/scripts/toolcraft-delivery-receipt-test-helpers.mjs +7 -36
  254. package/templates/starter/scripts/toolcraft-delivery-receipt.d.mts +3 -5
  255. package/templates/starter/scripts/toolcraft-delivery-receipt.mjs +15 -31
  256. package/templates/starter/scripts/toolcraft-delivery-receipt.test.mjs +28 -20
  257. package/templates/starter/scripts/toolcraft-delivery-receipt.types.test.mts +22 -30
  258. package/templates/starter/scripts/toolcraft-feature-verification-plan.d.mts +20 -0
  259. package/templates/starter/scripts/toolcraft-feature-verification-plan.mjs +146 -0
  260. package/templates/starter/scripts/toolcraft-feature-verification-plan.test.mjs +96 -0
  261. package/templates/starter/scripts/toolcraft-functional-proof-model.d.mts +3 -18
  262. package/templates/starter/scripts/toolcraft-functional-proof-model.mjs +39 -127
  263. package/templates/starter/scripts/toolcraft-functional-proof-model.test.mjs +25 -362
  264. package/templates/starter/scripts/toolcraft-functional-proof-model.types.test.mts +6 -83
  265. package/templates/starter/scripts/toolcraft-functional-proof-primitives.d.mts +11 -0
  266. package/templates/starter/scripts/toolcraft-functional-proof-primitives.mjs +61 -0
  267. package/templates/starter/scripts/toolcraft-functional-proof-primitives.test.mjs +43 -0
  268. package/templates/starter/scripts/toolcraft-integrity-policy.mjs +13 -0
  269. package/templates/starter/scripts/toolcraft-integrity-test-utils.mjs +1 -1
  270. package/templates/starter/scripts/toolcraft-layer-evidence-facade.test.mjs +58 -22
  271. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.mjs +111 -0
  272. package/templates/starter/scripts/toolcraft-motion-reference-analysis-protocol.test.mjs +116 -0
  273. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.d.mts +37 -0
  274. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.mjs +308 -0
  275. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.test.mjs +420 -0
  276. package/templates/starter/scripts/toolcraft-motion-reference-artifacts.types.test.mts +50 -0
  277. package/templates/starter/scripts/toolcraft-motion-reference-command-options.mjs +195 -0
  278. package/templates/starter/scripts/toolcraft-motion-reference-command-options.test.mjs +224 -0
  279. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.mjs +122 -0
  280. package/templates/starter/scripts/toolcraft-motion-reference-contact-sheet.test.mjs +153 -0
  281. package/templates/starter/scripts/toolcraft-motion-reference-evidence-assembly.mjs +270 -0
  282. package/templates/starter/scripts/toolcraft-motion-reference-evidence.test.mjs +432 -0
  283. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.mjs +275 -0
  284. package/templates/starter/scripts/toolcraft-motion-reference-ffmpeg-output.test.mjs +294 -0
  285. package/templates/starter/scripts/toolcraft-motion-reference-group-inventory.mjs +148 -0
  286. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.mjs +101 -0
  287. package/templates/starter/scripts/toolcraft-motion-reference-image-filter-graph.test.mjs +124 -0
  288. package/templates/starter/scripts/toolcraft-motion-reference-image-source.mjs +259 -0
  289. package/templates/starter/scripts/toolcraft-motion-reference-image-source.test.mjs +338 -0
  290. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.mjs +96 -0
  291. package/templates/starter/scripts/toolcraft-motion-reference-image-timing.test.mjs +81 -0
  292. package/templates/starter/scripts/toolcraft-motion-reference-lock-recovery.test.mjs +144 -0
  293. package/templates/starter/scripts/toolcraft-motion-reference-media-source.mjs +165 -0
  294. package/templates/starter/scripts/toolcraft-motion-reference-media-source.test.mjs +299 -0
  295. package/templates/starter/scripts/toolcraft-motion-reference-publication-discovery.test.mjs +142 -0
  296. package/templates/starter/scripts/toolcraft-motion-reference-publication-isolation.test.mjs +234 -0
  297. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-schema.mjs +122 -0
  298. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.mjs +89 -0
  299. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal-store.test.mjs +74 -0
  300. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.mjs +264 -0
  301. package/templates/starter/scripts/toolcraft-motion-reference-publication-journal.test.mjs +377 -0
  302. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.mjs +254 -0
  303. package/templates/starter/scripts/toolcraft-motion-reference-publication-lease.test.mjs +130 -0
  304. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.mjs +128 -0
  305. package/templates/starter/scripts/toolcraft-motion-reference-publication-staging.test.mjs +209 -0
  306. package/templates/starter/scripts/toolcraft-motion-reference-publication.fixtures.mjs +88 -0
  307. package/templates/starter/scripts/toolcraft-motion-reference-publication.mjs +249 -0
  308. package/templates/starter/scripts/toolcraft-motion-reference-publication.test.mjs +433 -0
  309. package/templates/starter/scripts/toolcraft-motion-reference-review-output.mjs +38 -0
  310. package/templates/starter/scripts/toolcraft-motion-reference-review-output.test.mjs +29 -0
  311. package/templates/starter/scripts/toolcraft-motion-reference-root-safety.test.mjs +84 -0
  312. package/templates/starter/scripts/toolcraft-motion-reference-roots.mjs +83 -0
  313. package/templates/starter/scripts/toolcraft-motion-reference-sampling.mjs +283 -0
  314. package/templates/starter/scripts/toolcraft-motion-reference-sampling.test.mjs +480 -0
  315. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.mjs +39 -0
  316. package/templates/starter/scripts/toolcraft-motion-reference-stage-registry.test.mjs +59 -0
  317. package/templates/starter/scripts/toolcraft-motion-reference-stage.mjs +71 -0
  318. package/templates/starter/scripts/toolcraft-motion-reference-stage.test.mjs +61 -0
  319. package/templates/starter/scripts/toolcraft-motion-review-numeric.mjs +74 -0
  320. package/templates/starter/scripts/toolcraft-motion-review-numeric.test.mjs +65 -0
  321. package/templates/starter/scripts/toolcraft-motion-review-partitioning.mjs +268 -0
  322. package/templates/starter/scripts/toolcraft-motion-review-partitioning.test.mjs +329 -0
  323. package/templates/starter/scripts/toolcraft-motion-review-protected-units.mjs +120 -0
  324. package/templates/starter/scripts/toolcraft-motion-review-protected-units.test.mjs +111 -0
  325. package/templates/starter/scripts/toolcraft-performance-escalation-policy.test.mjs +77 -345
  326. package/templates/starter/scripts/toolcraft-performance-receipt-validation.test.mjs +19 -21
  327. package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +85 -115
  328. package/templates/starter/scripts/toolcraft-product-boundary-module-policy.mjs +101 -0
  329. package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +0 -72
  330. package/templates/starter/scripts/toolcraft-product-control-bindings.mjs +182 -0
  331. package/templates/starter/scripts/toolcraft-product-control-boundary.mjs +146 -0
  332. package/templates/starter/scripts/toolcraft-product-control-boundary.test.mjs +186 -0
  333. package/templates/starter/scripts/toolcraft-product-export-boundary.mjs +16 -18
  334. package/templates/starter/scripts/toolcraft-product-export-boundary.test.mjs +200 -0
  335. package/templates/starter/scripts/toolcraft-product-observable-facade.test.mjs +46 -1
  336. package/templates/starter/scripts/toolcraft-receipt-boundary.test.mjs +0 -1
  337. package/templates/starter/scripts/toolcraft-source-inventory.d.mts +5 -0
  338. package/templates/starter/scripts/toolcraft-source-inventory.mjs +25 -14
  339. package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +48 -0
  340. package/templates/starter/scripts/toolcraft-source-ownership.mjs +0 -1
  341. package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +30 -5
  342. package/templates/starter/scripts/toolcraft-typescript-source-evidence-structure.test.mjs +20 -0
  343. package/templates/starter/scripts/toolcraft-typescript-source-evidence.mjs +1 -0
  344. package/templates/starter/scripts/toolcraft-unavailable-resource-evidence-facade.test.mjs +2 -0
  345. package/templates/starter/scripts/toolcraft-verification-receipt-test-helpers.mjs +5 -26
  346. package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +0 -7
  347. package/templates/starter/scripts/toolcraft-verification-receipt.mjs +3 -47
  348. package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +6 -87
  349. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +19 -0
  350. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +107 -0
  351. package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +114 -0
  352. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +13 -2
  353. package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +110 -0
  354. package/templates/starter/src/app/acceptance/artifact-export-intent.ts +161 -0
  355. package/templates/starter/src/app/acceptance/canvas-coverage.ts +1 -0
  356. package/templates/starter/src/app/acceptance/color-bank-labels.ts +11 -15
  357. package/templates/starter/src/app/acceptance/color-row-grouping.ts +33 -0
  358. package/templates/starter/src/app/acceptance/conditions.ts +1 -1
  359. package/templates/starter/src/app/acceptance/control-acceptance-context.ts +2 -2
  360. package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +6 -31
  361. package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +24 -5
  362. package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +4 -16
  363. package/templates/starter/src/app/acceptance/control-applicability-cases.test.ts +321 -0
  364. package/templates/starter/src/app/acceptance/control-applicability-cases.ts +290 -0
  365. package/templates/starter/src/app/acceptance/control-applicability.ts +332 -0
  366. package/templates/starter/src/app/acceptance/control-component-rules.ts +0 -10
  367. package/templates/starter/src/app/acceptance/control-labels.ts +30 -1
  368. package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +20 -9
  369. package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +4 -6
  370. package/templates/starter/src/app/acceptance/control-layout-model.ts +4 -4
  371. package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +21 -10
  372. package/templates/starter/src/app/acceptance/control-parts.ts +8 -0
  373. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.test.ts +215 -0
  374. package/templates/starter/src/app/acceptance/control-section-entity-cohesion.ts +132 -0
  375. package/templates/starter/src/app/acceptance/control-section-inventory.test.ts +87 -0
  376. package/templates/starter/src/app/acceptance/control-section-inventory.ts +74 -44
  377. package/templates/starter/src/app/acceptance/custom-controls.ts +11 -3
  378. package/templates/starter/src/app/acceptance/export-artifact-coverage.ts +25 -17
  379. package/templates/starter/src/app/acceptance/feature-verification-selection.test.ts +295 -0
  380. package/templates/starter/src/app/acceptance/feature-verification-selection.ts +161 -0
  381. package/templates/starter/src/app/acceptance/infinity-canvas.ts +10 -0
  382. package/templates/starter/src/app/acceptance/inline-layout.ts +64 -9
  383. package/templates/starter/src/app/acceptance/interaction-ownership-intent.ts +19 -1
  384. package/templates/starter/src/app/acceptance/interaction-ownership.ts +18 -2
  385. package/templates/starter/src/app/acceptance/media-upload.ts +5 -1
  386. package/templates/starter/src/app/acceptance/motion-reference-evidence-validation.mjs +65 -0
  387. package/templates/starter/src/app/acceptance/motion-reference-evidence-windows.mjs +301 -0
  388. package/templates/starter/src/app/acceptance/motion-reference-evidence.d.mts +11 -0
  389. package/templates/starter/src/app/acceptance/motion-reference-evidence.mjs +145 -0
  390. package/templates/starter/src/app/acceptance/motion-reference-study-behaviors.ts +162 -0
  391. package/templates/starter/src/app/acceptance/motion-reference-study-coverage.ts +206 -0
  392. package/templates/starter/src/app/acceptance/motion-reference-study-identity.ts +129 -0
  393. package/templates/starter/src/app/acceptance/motion-reference-study-partitions.ts +186 -0
  394. package/templates/starter/src/app/acceptance/motion-reference-study.ts +90 -0
  395. package/templates/starter/src/app/acceptance/orientation-gizmo.ts +18 -11
  396. package/templates/starter/src/app/acceptance/output-background-rules.ts +2 -2
  397. package/templates/starter/src/app/acceptance/output-export-actions.test.ts +9 -1
  398. package/templates/starter/src/app/acceptance/output-export-actions.ts +14 -22
  399. package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +22 -10
  400. package/templates/starter/src/app/acceptance/output-export-model.ts +58 -11
  401. package/templates/starter/src/app/acceptance/output-export.ts +25 -10
  402. package/templates/starter/src/app/acceptance/output-video-export-rules.ts +99 -0
  403. package/templates/starter/src/app/acceptance/reference-study-types.ts +167 -17
  404. package/templates/starter/src/app/acceptance/runtime-coverage.ts +6 -1
  405. package/templates/starter/src/app/acceptance/selection-scope.test.ts +200 -0
  406. package/templates/starter/src/app/acceptance/selection-scope.ts +151 -0
  407. package/templates/starter/src/app/acceptance/transfer-mode-types.ts +114 -0
  408. package/templates/starter/src/app/acceptance/types.ts +65 -125
  409. package/templates/starter/src/app/acceptance/validate-coverage.ts +33 -5
  410. package/templates/starter/src/app/starter-acceptance-data.ts +1 -0
  411. package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +3 -0
  412. package/templates/starter/src/app/starter-acceptance.artifact-export-intent.test.ts +312 -0
  413. package/templates/starter/src/app/starter-acceptance.background-export.test.ts +35 -0
  414. package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +18 -1
  415. package/templates/starter/src/app/starter-acceptance.color-row-grouping.test.ts +118 -0
  416. package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +66 -1
  417. package/templates/starter/src/app/starter-acceptance.contract-fixtures.test.ts +41 -0
  418. package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +113 -16
  419. package/templates/starter/src/app/starter-acceptance.control-applicability.test.ts +225 -0
  420. package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +1 -0
  421. package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +78 -3
  422. package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +77 -1
  423. package/templates/starter/src/app/starter-acceptance.control-order.test.ts +58 -3
  424. package/templates/starter/src/app/starter-acceptance.control-state.test.ts +0 -111
  425. package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +3 -1
  426. package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +1 -1
  427. package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +1 -1
  428. package/templates/starter/src/app/starter-acceptance.export-artifact.test.ts +74 -3
  429. package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +26 -0
  430. package/templates/starter/src/app/{starter-acceptance.image-video-export-settings.test.ts → starter-acceptance.image-export-settings.test.ts} +39 -9
  431. package/templates/starter/src/app/starter-acceptance.interaction-ownership.test.ts +31 -3
  432. package/templates/starter/src/app/starter-acceptance.layers.test.ts +2 -1
  433. package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +11 -1
  434. package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +56 -0
  435. package/templates/starter/src/app/starter-acceptance.motion-reference-evidence.test.ts +17 -0
  436. package/templates/starter/src/app/starter-acceptance.motion-reference-identity.test.ts +163 -0
  437. package/templates/starter/src/app/starter-acceptance.motion-reference-mapping.test.ts +133 -0
  438. package/templates/starter/src/app/starter-acceptance.motion-reference-ownership.test.ts +121 -0
  439. package/templates/starter/src/app/starter-acceptance.motion-reference-partitions.test.ts +210 -0
  440. package/templates/starter/src/app/starter-acceptance.motion-reference-test-utils.ts +313 -0
  441. package/templates/starter/src/app/starter-acceptance.output-export-intent.test.ts +458 -0
  442. package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +4 -0
  443. package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +116 -104
  444. package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +29 -0
  445. package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +123 -2
  446. package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +2 -0
  447. package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +8 -0
  448. package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +7 -0
  449. package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +3 -1
  450. package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +35 -24
  451. package/templates/starter/src/app/starter-acceptance.section-size.test.ts +72 -0
  452. package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +5 -0
  453. package/templates/starter/src/app/starter-acceptance.ts +45 -10
  454. package/templates/starter/src/app/starter-acceptance.video-export-settings.test.ts +338 -0
  455. package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +34 -236
  456. package/templates/starter/src/app/starter-acceptance.view-interaction.test.ts +12 -0
  457. package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +122 -6
  458. package/templates/starter/src/app/starter-acceptance.worklog.test.ts +152 -16
  459. package/templates/starter/src/app/starter-performance.gates.test.ts +20 -18
  460. package/templates/starter/src/app/starter-performance.lifecycle.test.ts +22 -6
  461. package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +5 -2
  462. package/templates/starter/src/routes/index.tsx +1 -0
  463. package/templates/starter/tsconfig.json +1 -0
  464. package/templates/ui/components/composites/tabs.tsx +2 -2
  465. package/templates/ui/components/controls/collection-actions/collection-item-groups.test.tsx +38 -0
  466. package/templates/ui/components/controls/collection-actions/collection-item-groups.tsx +36 -0
  467. package/templates/ui/components/controls/collection-actions/index.ts +2 -0
  468. package/templates/ui/components/controls/file-drop/file-drop-collection-control.tsx +137 -0
  469. package/templates/ui/components/controls/file-drop/file-drop-control.test.tsx +189 -0
  470. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +81 -88
  471. package/templates/ui/components/controls/file-drop/file-drop-presentation.tsx +131 -9
  472. package/templates/ui/components/controls/file-drop/file-drop-types.ts +36 -22
  473. package/templates/ui/components/controls/file-drop/index.ts +1 -0
  474. package/templates/ui/components/controls/index.ts +3 -0
  475. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +1 -1
  476. package/templates/ui/components/controls/range-slider/range-slider-value.test.ts +14 -0
  477. package/templates/ui/components/controls/range-slider/range-slider-value.ts +3 -2
  478. package/templates/starter/scripts/toolcraft-browser-impact-selection.mjs +0 -26
  479. package/templates/starter/scripts/toolcraft-delivery-framework-refresh.test.mjs +0 -141
  480. package/templates/starter/scripts/toolcraft-delivery-functional-changed.test.mjs +0 -468
  481. package/templates/starter/scripts/toolcraft-delivery-functional-model-lifecycle.test.mjs +0 -254
  482. package/templates/starter/scripts/toolcraft-delivery-functional-semantic-regression.test.mjs +0 -135
  483. package/templates/starter/scripts/toolcraft-delivery-performance-iteration-durability.test.mjs +0 -329
  484. package/templates/starter/scripts/toolcraft-delivery-plan-errors.test.mjs +0 -430
  485. package/templates/starter/scripts/toolcraft-delivery-plan-functional-model.test.mjs +0 -358
  486. package/templates/starter/scripts/toolcraft-functional-proof-regression-fixtures.mjs +0 -298
  487. package/templates/starter/scripts/toolcraft-verification-impact-inventory.d.mts +0 -62
  488. package/templates/starter/scripts/toolcraft-verification-impact-inventory.mjs +0 -344
  489. package/templates/starter/scripts/toolcraft-verification-impact-inventory.test.mjs +0 -204
  490. package/templates/starter/scripts/toolcraft-verification-impact-performance-candidates.test.mjs +0 -210
  491. package/templates/starter/scripts/toolcraft-verification-impact-resolution.mjs +0 -344
  492. package/templates/starter/scripts/toolcraft-verification-impact-resolution.test.mjs +0 -270
  493. package/templates/starter/scripts/toolcraft-verification-impact-semantic-resolution.test.mjs +0 -449
  494. package/templates/starter/scripts/toolcraft-verification-impact-support-resolution.test.mjs +0 -195
  495. package/templates/starter/scripts/toolcraft-verification-impact.d.mts +0 -132
  496. package/templates/starter/scripts/toolcraft-verification-impact.mjs +0 -169
  497. package/templates/starter/scripts/toolcraft-verification-impact.test.mjs +0 -300
  498. package/templates/starter/scripts/toolcraft-verification-input-roles.mjs +0 -197
  499. package/templates/starter/scripts/toolcraft-verification-input-roles.test.mjs +0 -225
  500. package/templates/starter/src/app/acceptance/condition-exclusivity.test.ts +0 -60
  501. package/templates/starter/src/app/acceptance/condition-exclusivity.ts +0 -221
  502. package/templates/starter/src/app/acceptance/video-reference-study.ts +0 -217
  503. package/templates/starter/src/app/starter-verification-impact.json +0 -15
@@ -1,5 +1,3 @@
1
- import path from "node:path";
2
-
3
1
  import ts from "typescript";
4
2
 
5
3
  import {
@@ -8,9 +6,10 @@ import {
8
6
  } from "./toolcraft-integrity-policy.mjs";
9
7
  import {
10
8
  createToolcraftProductExportInspector,
11
- getToolcraftProductExportModuleKind,
12
9
  isForbiddenToolcraftRuntimeExport,
13
10
  } from "./toolcraft-product-export-boundary.mjs";
11
+ import { createToolcraftProductControlInspector } from "./toolcraft-product-control-boundary.mjs";
12
+ import { getToolcraftSensitiveModuleKind } from "./toolcraft-product-boundary-module-policy.mjs";
14
13
  import { inspectToolcraftProductStyleNode } from "./toolcraft-product-style-boundary.mjs";
15
14
 
16
15
  const runtimeSurfaceNames = new Set(runtimeSurfaceComponentNames);
@@ -23,88 +22,9 @@ const runtimeModelPresentationInternalNames = new Set([
23
22
  "useToolcraftModelRenderHost",
24
23
  ]);
25
24
 
26
- function toPosixPath(value) {
27
- return value.split(path.sep).join("/");
28
- }
29
-
30
- function resolveSpecifierPath(sourceFilePath, moduleSpecifier, rootDir) {
31
- if (moduleSpecifier.startsWith("@/") || moduleSpecifier.startsWith("#/")) {
32
- return toPosixPath(path.resolve(rootDir, "src", moduleSpecifier.slice(2)));
33
- }
34
- if (moduleSpecifier.startsWith("/")) {
35
- return toPosixPath(path.resolve(rootDir, moduleSpecifier.slice(1)));
36
- }
37
- if (moduleSpecifier.startsWith(".")) {
38
- return toPosixPath(path.resolve(path.dirname(sourceFilePath), moduleSpecifier));
39
- }
40
- return null;
41
- }
42
-
43
- function getSensitiveModuleKind(sourceFilePath, moduleSpecifier, rootDir) {
44
- const normalizedSpecifier = moduleSpecifier.replaceAll("\\", "/");
45
- const resolvedSpecifier = resolveSpecifierPath(
46
- sourceFilePath,
47
- normalizedSpecifier,
48
- rootDir,
49
- );
50
- const exportModuleKind = getToolcraftProductExportModuleKind(
51
- normalizedSpecifier,
52
- resolvedSpecifier,
53
- );
54
- if (exportModuleKind) return exportModuleKind;
55
-
56
- if (
57
- /^@repo\/toolcraft-runtime\/react\/model-rendering(?:\/|$)/u.test(
58
- normalizedSpecifier,
59
- ) ||
60
- /^[#@]\/toolcraft\/runtime\/react\/model-rendering(?:\/|$)/u.test(
61
- normalizedSpecifier,
62
- ) ||
63
- resolvedSpecifier?.includes("/src/toolcraft/runtime/react/model-rendering")
64
- ) {
65
- return "runtime-model-presentation";
66
- }
67
-
68
- if (
69
- /^three\/(?:addons|examples\/jsm)\/loaders(?:\/|$)/u.test(
70
- normalizedSpecifier,
71
- ) ||
72
- /^@gltf-transform(?:\/|$)/u.test(normalizedSpecifier) ||
73
- /^@repo\/toolcraft-runtime\/model-import(?:\/|$)/u.test(
74
- normalizedSpecifier,
75
- ) ||
76
- /^[#@]\/toolcraft\/runtime\/model-import(?:\/|$)/u.test(
77
- normalizedSpecifier,
78
- ) ||
79
- resolvedSpecifier?.includes("/src/toolcraft/runtime/model-import")
80
- ) {
81
- return "runtime-model-import";
82
- }
83
-
84
- if (
85
- /^@repo\/toolcraft-runtime\/react(?:\/|$)/u.test(normalizedSpecifier) ||
86
- /^[#@]\/toolcraft\/runtime\/react(?:\/|$)/u.test(normalizedSpecifier) ||
87
- resolvedSpecifier?.includes("/src/toolcraft/runtime/react")
88
- ) {
89
- return "runtime-react";
90
- }
91
-
92
- if (
93
- /^@repo\/ui(?:\/controls(?:\/|$)|$)/u.test(normalizedSpecifier) ||
94
- /^[#@]\/toolcraft\/ui(?:\/components\/controls(?:\/|$)|\/controls(?:\/|$)|$)/u.test(
95
- normalizedSpecifier,
96
- ) ||
97
- resolvedSpecifier?.includes("/src/toolcraft/ui/components/controls") ||
98
- /\/src\/toolcraft\/ui$/u.test(resolvedSpecifier ?? "")
99
- ) {
100
- return "ui-controls";
101
- }
102
-
103
- return null;
104
- }
105
-
106
25
  function isForbiddenNamedExport(moduleKind, importedName) {
107
- if (isForbiddenToolcraftRuntimeExport(moduleKind, importedName)) return true;
26
+ if (moduleKind === "ui-control-implementation") return true;
27
+ if (isForbiddenToolcraftRuntimeExport(moduleKind)) return true;
108
28
  if (
109
29
  moduleKind === "runtime-model-import" ||
110
30
  moduleKind === "runtime-model-presentation"
@@ -117,6 +37,42 @@ function isForbiddenNamedExport(moduleKind, importedName) {
117
37
  importedName !== "createControlHistoryGroupId");
118
38
  }
119
39
 
40
+ function getImportViolationKind(moduleKind, importedName) {
41
+ switch (moduleKind) {
42
+ case "runtime-export-mechanics":
43
+ return "runtime-export-ownership";
44
+ case "runtime-model-presentation":
45
+ return "runtime-model-presentation-ownership";
46
+ case "runtime-react":
47
+ return runtimeModelPresentationInternalNames.has(importedName)
48
+ ? "runtime-model-presentation-ownership"
49
+ : "runtime-surface";
50
+ case "runtime-model-import":
51
+ return "runtime-model-import-ownership";
52
+ case "ui-control-implementation":
53
+ return "built-in-control-implementation";
54
+ default:
55
+ return "built-in-control";
56
+ }
57
+ }
58
+
59
+ function getViolationMessage(kind, subject, moduleSpecifier) {
60
+ switch (kind) {
61
+ case "runtime-export-ownership":
62
+ return `Product source must not own artifact encoding, recording, or download mechanics${subject} from ${moduleSpecifier}. Declare exportRenderer for image/video or svgExportRenderer for SVG and let runtime export actions create and download the artifact.`;
63
+ case "runtime-surface":
64
+ return `Product source must not import or re-export host-owned runtime surface${subject} from ${moduleSpecifier}. Use ToolcraftAppComposition, schema, canvasContent, controlRenderers, onPanelAction, and runtime commands.`;
65
+ case "runtime-model-presentation-ownership":
66
+ return `Product source must not import raw model render hosts or standard model canvas internals${subject} from ${moduleSpecifier}. Declare modelPresentation and use useToolcraftModelPresentationConsumer for visible custom model output.`;
67
+ case "runtime-model-import-ownership":
68
+ return `Product source must not import or re-export model loaders, topology/repair infrastructure, or runtime model-import internals${subject} from ${moduleSpecifier}. Declare a model fileDrop in schema and use the runtime-owned import, analysis, repair, persistence, preview, and export pipeline.`;
69
+ case "built-in-control-implementation":
70
+ return `Product source must not import or re-export a deep control implementation${subject} from ${moduleSpecifier}. Use the public schema control instead of copying or composing its private mechanics.`;
71
+ default:
72
+ return `Product source must not import or re-export built-in control${subject} from ${moduleSpecifier}. Declare it through schema or justify a true custom controlRenderer.`;
73
+ }
74
+ }
75
+
120
76
  function createViolation({
121
77
  getNodeLocation,
122
78
  importedName,
@@ -127,26 +83,17 @@ function createViolation({
127
83
  sourceFile,
128
84
  }) {
129
85
  const subject = importedName ? ` ${importedName}` : "";
130
- const message =
131
- kind === "runtime-export-ownership"
132
- ? `Product source must not own artifact encoding, recording, or download mechanics${subject} from ${moduleSpecifier}. Declare exportRenderer and let runtime export actions encode and download the artifact.`
133
- : kind === "runtime-surface"
134
- ? `Product source must not import or re-export host-owned runtime surface${subject} from ${moduleSpecifier}. Use ToolcraftAppComposition, schema, canvasContent, controlRenderers, onPanelAction, and runtime commands.`
135
- : kind === "runtime-model-presentation-ownership"
136
- ? `Product source must not import raw model render hosts or standard model canvas internals${subject} from ${moduleSpecifier}. Declare modelPresentation and use useToolcraftModelPresentationConsumer for visible custom model output.`
137
- : kind === "runtime-model-import-ownership"
138
- ? `Product source must not import or re-export model loaders, topology/repair infrastructure, or runtime model-import internals${subject} from ${moduleSpecifier}. Declare a model fileDrop in schema and use the runtime-owned import, analysis, repair, persistence, preview, and export pipeline.`
139
- : `Product source must not import or re-export built-in control${subject} from ${moduleSpecifier}. Declare it through schema or justify a true custom controlRenderer.`;
140
86
  return {
141
87
  ...getNodeLocation(sourceFile, node),
142
88
  kind,
143
- message,
89
+ message: getViolationMessage(kind, subject, moduleSpecifier),
144
90
  repoPath,
145
91
  };
146
92
  }
147
93
 
148
94
  export function inspectToolcraftProductSource({
149
95
  absolutePath,
96
+ checker,
150
97
  getNodeLocation,
151
98
  repoPath,
152
99
  resolveStaticString,
@@ -159,6 +106,13 @@ export function inspectToolcraftProductSource({
159
106
  repoPath,
160
107
  sourceFile,
161
108
  });
109
+ const inspectControls = createToolcraftProductControlInspector({
110
+ checker,
111
+ getNodeLocation,
112
+ repoPath,
113
+ resolveStaticString,
114
+ sourceFile,
115
+ });
162
116
 
163
117
  function report(node, moduleSpecifier, moduleKind, importedName) {
164
118
  if (importedName && !isForbiddenNamedExport(moduleKind, importedName)) {
@@ -168,19 +122,7 @@ export function inspectToolcraftProductSource({
168
122
  createViolation({
169
123
  getNodeLocation,
170
124
  importedName,
171
- kind:
172
- moduleKind === "runtime-export-api" ||
173
- moduleKind === "runtime-export-mechanics"
174
- ? "runtime-export-ownership"
175
- : moduleKind === "runtime-model-presentation"
176
- ? "runtime-model-presentation-ownership"
177
- : moduleKind === "runtime-react"
178
- ? runtimeModelPresentationInternalNames.has(importedName)
179
- ? "runtime-model-presentation-ownership"
180
- : "runtime-surface"
181
- : moduleKind === "runtime-model-import"
182
- ? "runtime-model-import-ownership"
183
- : "built-in-control",
125
+ kind: getImportViolationKind(moduleKind, importedName),
184
126
  moduleSpecifier,
185
127
  node,
186
128
  repoPath,
@@ -190,7 +132,25 @@ export function inspectToolcraftProductSource({
190
132
  }
191
133
 
192
134
  function getModuleKind(moduleSpecifier) {
193
- return getSensitiveModuleKind(absolutePath, moduleSpecifier, rootDir);
135
+ return getToolcraftSensitiveModuleKind({
136
+ moduleSpecifier,
137
+ rootDir,
138
+ sourceFilePath: absolutePath,
139
+ });
140
+ }
141
+
142
+ function inspectModuleSpecifier(node, moduleSpecifier) {
143
+ const moduleKind = getModuleKind(moduleSpecifier);
144
+ if (!moduleKind) return null;
145
+ if (moduleKind === "ui-control-implementation") {
146
+ report(node, moduleSpecifier, moduleKind);
147
+ return null;
148
+ }
149
+ if (isForbiddenToolcraftRuntimeExport(moduleKind)) {
150
+ report(node, moduleSpecifier, moduleKind);
151
+ return null;
152
+ }
153
+ return moduleKind;
194
154
  }
195
155
 
196
156
  function visit(node) {
@@ -202,6 +162,7 @@ export function inspectToolcraftProductSource({
202
162
  sourceFile,
203
163
  }),
204
164
  ...inspectExportMechanics(node),
165
+ ...inspectControls.inspectNode(node),
205
166
  );
206
167
 
207
168
  if (
@@ -209,7 +170,7 @@ export function inspectToolcraftProductSource({
209
170
  ts.isStringLiteralLike(node.moduleSpecifier)
210
171
  ) {
211
172
  const moduleSpecifier = node.moduleSpecifier.text;
212
- const moduleKind = getModuleKind(moduleSpecifier);
173
+ const moduleKind = inspectModuleSpecifier(node, moduleSpecifier);
213
174
  const importClause = node.importClause;
214
175
 
215
176
  if (moduleKind && importClause && !importClause.isTypeOnly) {
@@ -238,7 +199,7 @@ export function inspectToolcraftProductSource({
238
199
  ts.isStringLiteralLike(node.moduleSpecifier)
239
200
  ) {
240
201
  const moduleSpecifier = node.moduleSpecifier.text;
241
- const moduleKind = getModuleKind(moduleSpecifier);
202
+ const moduleKind = inspectModuleSpecifier(node, moduleSpecifier);
242
203
 
243
204
  if (moduleKind && !node.isTypeOnly) {
244
205
  if (!node.exportClause || ts.isNamespaceExport(node.exportClause)) {
@@ -260,14 +221,23 @@ export function inspectToolcraftProductSource({
260
221
 
261
222
  if (
262
223
  ts.isImportEqualsDeclaration(node) &&
263
- !node.isTypeOnly &&
264
224
  ts.isExternalModuleReference(node.moduleReference) &&
265
225
  node.moduleReference.expression &&
266
226
  ts.isStringLiteralLike(node.moduleReference.expression)
267
227
  ) {
268
228
  const moduleSpecifier = node.moduleReference.expression.text;
269
- const moduleKind = getModuleKind(moduleSpecifier);
270
- if (moduleKind) report(node, moduleSpecifier, moduleKind);
229
+ const moduleKind = inspectModuleSpecifier(node, moduleSpecifier);
230
+ if (moduleKind && !node.isTypeOnly) {
231
+ report(node, moduleSpecifier, moduleKind);
232
+ }
233
+ }
234
+
235
+ if (
236
+ ts.isImportTypeNode(node) &&
237
+ ts.isLiteralTypeNode(node.argument) &&
238
+ ts.isStringLiteralLike(node.argument.literal)
239
+ ) {
240
+ inspectModuleSpecifier(node, node.argument.literal.text);
271
241
  }
272
242
 
273
243
  if (
@@ -288,7 +258,7 @@ export function inspectToolcraftProductSource({
288
258
  ts.forEachChild(node, visit);
289
259
  return;
290
260
  }
291
- const moduleKind = getModuleKind(moduleSpecifier);
261
+ const moduleKind = inspectModuleSpecifier(node, moduleSpecifier);
292
262
  if (moduleKind) report(node, moduleSpecifier, moduleKind);
293
263
  }
294
264
 
@@ -0,0 +1,101 @@
1
+ import path from "node:path";
2
+
3
+ import {
4
+ getToolcraftProductExportModuleKind,
5
+ } from "./toolcraft-product-export-boundary.mjs";
6
+ import {
7
+ isToolcraftPrivateControlImplementationModule,
8
+ } from "./toolcraft-product-control-boundary.mjs";
9
+
10
+ function toPosixPath(value) {
11
+ return value.split(path.sep).join("/");
12
+ }
13
+
14
+ function resolveSpecifierPath(sourceFilePath, moduleSpecifier, rootDir) {
15
+ if (moduleSpecifier.startsWith("@/") || moduleSpecifier.startsWith("#/")) {
16
+ return toPosixPath(path.resolve(rootDir, "src", moduleSpecifier.slice(2)));
17
+ }
18
+ if (moduleSpecifier.startsWith("/")) {
19
+ return toPosixPath(path.resolve(rootDir, moduleSpecifier.slice(1)));
20
+ }
21
+ if (moduleSpecifier.startsWith(".")) {
22
+ return toPosixPath(path.resolve(path.dirname(sourceFilePath), moduleSpecifier));
23
+ }
24
+ return null;
25
+ }
26
+
27
+ export function getToolcraftSensitiveModuleKind({
28
+ moduleSpecifier,
29
+ rootDir,
30
+ sourceFilePath,
31
+ }) {
32
+ const normalizedSpecifier = moduleSpecifier.replaceAll("\\", "/");
33
+ const resolvedSpecifier = resolveSpecifierPath(
34
+ sourceFilePath,
35
+ normalizedSpecifier,
36
+ rootDir,
37
+ );
38
+ const exportModuleKind = getToolcraftProductExportModuleKind(
39
+ normalizedSpecifier,
40
+ resolvedSpecifier,
41
+ );
42
+ if (exportModuleKind) return exportModuleKind;
43
+
44
+ if (
45
+ isToolcraftPrivateControlImplementationModule({
46
+ moduleSpecifier: normalizedSpecifier,
47
+ resolvedSpecifier,
48
+ })
49
+ ) {
50
+ return "ui-control-implementation";
51
+ }
52
+
53
+ if (
54
+ /^@repo\/toolcraft-runtime\/react\/model-rendering(?:\/|$)/u.test(
55
+ normalizedSpecifier,
56
+ ) ||
57
+ /^[#@]\/toolcraft\/runtime\/react\/model-rendering(?:\/|$)/u.test(
58
+ normalizedSpecifier,
59
+ ) ||
60
+ resolvedSpecifier?.includes("/src/toolcraft/runtime/react/model-rendering")
61
+ ) {
62
+ return "runtime-model-presentation";
63
+ }
64
+
65
+ if (
66
+ /^three\/(?:addons|examples\/jsm)\/loaders(?:\/|$)/u.test(
67
+ normalizedSpecifier,
68
+ ) ||
69
+ /^@gltf-transform(?:\/|$)/u.test(normalizedSpecifier) ||
70
+ /^@repo\/toolcraft-runtime\/model-import(?:\/|$)/u.test(
71
+ normalizedSpecifier,
72
+ ) ||
73
+ /^[#@]\/toolcraft\/runtime\/model-import(?:\/|$)/u.test(
74
+ normalizedSpecifier,
75
+ ) ||
76
+ resolvedSpecifier?.includes("/src/toolcraft/runtime/model-import")
77
+ ) {
78
+ return "runtime-model-import";
79
+ }
80
+
81
+ if (
82
+ /^@repo\/toolcraft-runtime\/react(?:\/|$)/u.test(normalizedSpecifier) ||
83
+ /^[#@]\/toolcraft\/runtime\/react(?:\/|$)/u.test(normalizedSpecifier) ||
84
+ resolvedSpecifier?.includes("/src/toolcraft/runtime/react")
85
+ ) {
86
+ return "runtime-react";
87
+ }
88
+
89
+ if (
90
+ /^@repo\/ui(?:\/controls(?:\/|$)|$)/u.test(normalizedSpecifier) ||
91
+ /^[#@]\/toolcraft\/ui(?:\/components\/controls(?:\/|$)|\/controls(?:\/|$)|$)/u.test(
92
+ normalizedSpecifier,
93
+ ) ||
94
+ resolvedSpecifier?.includes("/src/toolcraft/ui/components/controls") ||
95
+ /\/src\/toolcraft\/ui$/u.test(resolvedSpecifier ?? "")
96
+ ) {
97
+ return "ui-controls";
98
+ }
99
+
100
+ return null;
101
+ }
@@ -75,32 +75,6 @@ test("checks Vite root-absolute imports against the same product boundary", asyn
75
75
  );
76
76
  });
77
77
 
78
- test("finds built-in controls through re-exports, aliases, namespaces, and dynamic imports", async (context) => {
79
- const rootDir = await createFixture(context, {
80
- "src/features/control-bridge.ts": `
81
- export { SliderControl as ProductSlider } from "@repo/ui/controls";
82
- export { Color as ProductColor } from "@/toolcraft/ui";
83
- `,
84
- "src/features/dynamic.ts": `
85
- export async function loadControls() {
86
- return import("@/toolcraft/ui/components/controls/slider");
87
- }
88
- `,
89
- "src/features/namespace.ts": `
90
- import * as Controls from "@repo/ui";
91
- export const Slider = Controls.Slider;
92
- `,
93
- });
94
-
95
- const result = await evaluateToolcraftProductBoundary({ rootDir });
96
-
97
- assert.equal(result.violations.length, 4);
98
- assert.equal(
99
- result.violations.every((violation) => violation.kind === "built-in-control"),
100
- true,
101
- );
102
- });
103
-
104
78
  test("keeps model import, topology, and repair infrastructure runtime-owned", async (context) => {
105
79
  const rootDir = await createFixture(context, {
106
80
  "src/features/direct-loaders.ts": `
@@ -143,52 +117,6 @@ test("keeps model import, topology, and repair infrastructure runtime-owned", as
143
117
  );
144
118
  });
145
119
 
146
- test("keeps artifact encoding and download mechanics runtime-owned", async (context) => {
147
- const rootDir = await createFixture(context, {
148
- "src/features/export-mechanics.ts": `
149
- import { createToolcraftPngExportCanvas } from "@/toolcraft/runtime";
150
- import { Output } from "mediabunny";
151
- export function exportArtifact(canvas: HTMLCanvasElement) {
152
- const recorder = new MediaRecorder(canvas.captureStream());
153
- const encoder = new VideoEncoder({ error() {}, output() {} });
154
- canvas.toBlob(() => undefined);
155
- canvas.toDataURL();
156
- URL.createObjectURL(new Blob());
157
- void createToolcraftPngExportCanvas;
158
- void Output;
159
- void recorder;
160
- void encoder;
161
- }
162
- `,
163
- "src/features/safe-renderer.ts": `
164
- export const renderFrame = ({ context }) => context.fillRect(0, 0, 1, 1);
165
- `,
166
- "src/features/shadowed-globals.ts": `
167
- export function localNames(MediaRecorder, VideoEncoder, URL) {
168
- void new MediaRecorder();
169
- void new VideoEncoder();
170
- URL.createObjectURL();
171
- }
172
- `,
173
- });
174
-
175
- const result = await evaluateToolcraftProductBoundary({ rootDir });
176
-
177
- assert.equal(result.violations.length, 8);
178
- assert.equal(
179
- result.violations.every(
180
- (violation) => violation.kind === "runtime-export-ownership",
181
- ),
182
- true,
183
- );
184
- assert.equal(
185
- result.violations.some((violation) =>
186
- violation.repoPath.endsWith("shadowed-globals.ts"),
187
- ),
188
- false,
189
- );
190
- });
191
-
192
120
  test("ignores tests but checks a product bridge imported by production", async (context) => {
193
121
  const rootDir = await createFixture(context, {
194
122
  "src/features/bridge.ts": `
@@ -0,0 +1,182 @@
1
+ import ts from "typescript";
2
+
3
+ const workspaceUiPrimitiveModulePattern =
4
+ /^@repo\/ui(?:$|\/(?:src\/)?(?:components\/)?primitives(?:\/|$))/u;
5
+
6
+ function isToolcraftPublicUiPrimitiveModule(moduleSpecifier) {
7
+ const normalizedSpecifier = moduleSpecifier.replaceAll("\\", "/");
8
+
9
+ return (
10
+ workspaceUiPrimitiveModulePattern.test(normalizedSpecifier) ||
11
+ /^[#@]\/toolcraft\/ui$/u.test(normalizedSpecifier) ||
12
+ /^[#@]\/toolcraft\/ui\/primitives(?:\/|$)/u.test(normalizedSpecifier) ||
13
+ /^[#@]\/toolcraft\/ui\/components\/primitives(?:\/|$)/u.test(
14
+ normalizedSpecifier,
15
+ )
16
+ );
17
+ }
18
+
19
+ function unwrapExpression(node) {
20
+ let current = node;
21
+
22
+ while (
23
+ ts.isAwaitExpression(current) ||
24
+ ts.isParenthesizedExpression(current) ||
25
+ ts.isAsExpression(current) ||
26
+ ts.isTypeAssertionExpression(current) ||
27
+ ts.isSatisfiesExpression(current) ||
28
+ ts.isNonNullExpression(current)
29
+ ) {
30
+ current = current.expression;
31
+ }
32
+
33
+ return current;
34
+ }
35
+
36
+ function getImportModuleSpecifier(declaration) {
37
+ if (ts.isImportSpecifier(declaration)) {
38
+ const importDeclaration = declaration.parent.parent.parent;
39
+ return ts.isImportDeclaration(importDeclaration) &&
40
+ ts.isStringLiteralLike(importDeclaration.moduleSpecifier)
41
+ ? importDeclaration.moduleSpecifier.text
42
+ : null;
43
+ }
44
+
45
+ if (ts.isNamespaceImport(declaration)) {
46
+ const importDeclaration = declaration.parent.parent;
47
+ return ts.isImportDeclaration(importDeclaration) &&
48
+ ts.isStringLiteralLike(importDeclaration.moduleSpecifier)
49
+ ? importDeclaration.moduleSpecifier.text
50
+ : null;
51
+ }
52
+
53
+ if (ts.isImportClause(declaration)) {
54
+ const importDeclaration = declaration.parent;
55
+ return ts.isImportDeclaration(importDeclaration) &&
56
+ ts.isStringLiteralLike(importDeclaration.moduleSpecifier)
57
+ ? importDeclaration.moduleSpecifier.text
58
+ : null;
59
+ }
60
+
61
+ return null;
62
+ }
63
+
64
+ export function createToolcraftUiInputBindingTracker({
65
+ checker,
66
+ resolveStaticString,
67
+ }) {
68
+ const bindingKinds = new Map();
69
+ const resolvingSymbols = new Set();
70
+
71
+ function classifyExpression(expression) {
72
+ const current = unwrapExpression(expression);
73
+
74
+ if (ts.isIdentifier(current)) {
75
+ const symbol = checker.getSymbolAtLocation(current);
76
+ return symbol ? classifySymbol(symbol) : null;
77
+ }
78
+
79
+ if (
80
+ ts.isPropertyAccessExpression(current) &&
81
+ current.name.text === "Input" &&
82
+ classifyExpression(current.expression) === "namespace"
83
+ ) {
84
+ return "input";
85
+ }
86
+
87
+ if (
88
+ ts.isCallExpression(current) &&
89
+ current.arguments.length > 0 &&
90
+ (current.expression.kind === ts.SyntaxKind.ImportKeyword ||
91
+ (ts.isIdentifier(current.expression) &&
92
+ current.expression.text === "require"))
93
+ ) {
94
+ const moduleSpecifier = resolveStaticString(current.arguments[0]);
95
+ return moduleSpecifier &&
96
+ isToolcraftPublicUiPrimitiveModule(moduleSpecifier)
97
+ ? "namespace"
98
+ : null;
99
+ }
100
+
101
+ return null;
102
+ }
103
+
104
+ function classifyDeclaration(declaration) {
105
+ if (ts.isImportSpecifier(declaration)) {
106
+ const importedName = declaration.propertyName?.text ?? declaration.name.text;
107
+ const moduleSpecifier = getImportModuleSpecifier(declaration);
108
+ return importedName === "Input" &&
109
+ moduleSpecifier &&
110
+ isToolcraftPublicUiPrimitiveModule(moduleSpecifier)
111
+ ? "input"
112
+ : null;
113
+ }
114
+
115
+ if (ts.isNamespaceImport(declaration)) {
116
+ const moduleSpecifier = getImportModuleSpecifier(declaration);
117
+ return moduleSpecifier &&
118
+ isToolcraftPublicUiPrimitiveModule(moduleSpecifier)
119
+ ? "namespace"
120
+ : null;
121
+ }
122
+
123
+ if (ts.isImportClause(declaration)) {
124
+ const moduleSpecifier = getImportModuleSpecifier(declaration);
125
+ return moduleSpecifier &&
126
+ isToolcraftPublicUiPrimitiveModule(moduleSpecifier) &&
127
+ /(?:^|\/)input(?:\.[cm]?[jt]sx?)?$/iu.test(moduleSpecifier)
128
+ ? "input"
129
+ : null;
130
+ }
131
+
132
+ if (
133
+ ts.isImportEqualsDeclaration(declaration) &&
134
+ ts.isExternalModuleReference(declaration.moduleReference) &&
135
+ declaration.moduleReference.expression &&
136
+ ts.isStringLiteralLike(declaration.moduleReference.expression) &&
137
+ isToolcraftPublicUiPrimitiveModule(declaration.moduleReference.expression.text)
138
+ ) {
139
+ return "namespace";
140
+ }
141
+
142
+ if (ts.isVariableDeclaration(declaration) && declaration.initializer) {
143
+ return classifyExpression(declaration.initializer);
144
+ }
145
+
146
+ if (
147
+ ts.isBindingElement(declaration) &&
148
+ !declaration.dotDotDotToken &&
149
+ (declaration.propertyName?.getText() ?? declaration.name.getText()) ===
150
+ "Input"
151
+ ) {
152
+ const variableDeclaration = declaration.parent.parent;
153
+ return ts.isVariableDeclaration(variableDeclaration) &&
154
+ variableDeclaration.initializer &&
155
+ classifyExpression(variableDeclaration.initializer) === "namespace"
156
+ ? "input"
157
+ : null;
158
+ }
159
+
160
+ return null;
161
+ }
162
+
163
+ function classifySymbol(symbol) {
164
+ if (bindingKinds.has(symbol)) return bindingKinds.get(symbol);
165
+ if (resolvingSymbols.has(symbol)) return null;
166
+
167
+ resolvingSymbols.add(symbol);
168
+ const bindingKind =
169
+ symbol.declarations
170
+ ?.map(classifyDeclaration)
171
+ .find((candidate) => candidate !== null) ?? null;
172
+ resolvingSymbols.delete(symbol);
173
+ bindingKinds.set(symbol, bindingKind);
174
+ return bindingKind;
175
+ }
176
+
177
+ function isTrackedInputTag(tagName) {
178
+ return classifyExpression(tagName) === "input";
179
+ }
180
+
181
+ return { isTrackedInputTag };
182
+ }