@typecad/cuttlefish 0.1.0-alpha.1

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 (377) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/api/board-types.d.ts +1 -0
  4. package/dist/api/board-types.js +4 -0
  5. package/dist/api/capabilities.d.ts +12 -0
  6. package/dist/api/capabilities.js +1 -0
  7. package/dist/api/config.d.ts +120 -0
  8. package/dist/api/config.js +7 -0
  9. package/dist/api/index.d.ts +5 -0
  10. package/dist/api/index.js +2 -0
  11. package/dist/api/schema/builder.d.ts +14 -0
  12. package/dist/api/schema/builder.js +15 -0
  13. package/dist/api/schema/index.d.ts +2 -0
  14. package/dist/api/schema/index.js +1 -0
  15. package/dist/api/schema/types.d.ts +257 -0
  16. package/dist/api/schema/types.js +4 -0
  17. package/dist/api/shared/async-runtime-static.d.ts +8 -0
  18. package/dist/api/shared/async-runtime-static.js +201 -0
  19. package/dist/api/shared/async-types.d.ts +42 -0
  20. package/dist/api/shared/async-types.js +8 -0
  21. package/dist/api/shared/board-resolver.d.ts +12 -0
  22. package/dist/api/shared/board-resolver.js +7 -0
  23. package/dist/api/shared/cpp-type-ir.d.ts +229 -0
  24. package/dist/api/shared/cpp-type-ir.js +672 -0
  25. package/dist/api/shared/display-adapter.d.ts +12 -0
  26. package/dist/api/shared/display-adapter.js +145 -0
  27. package/dist/api/shared/display-adapters/eink-mono.d.ts +2 -0
  28. package/dist/api/shared/display-adapters/eink-mono.js +53 -0
  29. package/dist/api/shared/display-adapters/sdl.d.ts +2 -0
  30. package/dist/api/shared/display-adapters/sdl.js +452 -0
  31. package/dist/api/shared/display-adapters/ssd1309.d.ts +2 -0
  32. package/dist/api/shared/display-adapters/ssd1309.js +136 -0
  33. package/dist/api/shared/display-adapters/st7796.d.ts +2 -0
  34. package/dist/api/shared/display-adapters/st7796.js +132 -0
  35. package/dist/api/shared/display-capabilities.d.ts +45 -0
  36. package/dist/api/shared/display-capabilities.js +54 -0
  37. package/dist/api/shared/display-op-ir.d.ts +62 -0
  38. package/dist/api/shared/display-op-ir.js +19 -0
  39. package/dist/api/shared/display-profile.d.ts +265 -0
  40. package/dist/api/shared/display-profile.js +338 -0
  41. package/dist/api/shared/graphics-strategy.d.ts +29 -0
  42. package/dist/api/shared/graphics-strategy.js +11 -0
  43. package/dist/api/shared/hal-op-ir.d.ts +393 -0
  44. package/dist/api/shared/hal-op-ir.js +18 -0
  45. package/dist/api/shared/index.d.ts +26 -0
  46. package/dist/api/shared/index.js +21 -0
  47. package/dist/api/shared/ir-core.d.ts +363 -0
  48. package/dist/api/shared/ir-core.js +8 -0
  49. package/dist/api/shared/ir-declarations.d.ts +201 -0
  50. package/dist/api/shared/ir-declarations.js +26 -0
  51. package/dist/api/shared/ir.d.ts +85 -0
  52. package/dist/api/shared/ir.js +13 -0
  53. package/dist/api/shared/platform-strategy.d.ts +402 -0
  54. package/dist/api/shared/platform-strategy.js +14 -0
  55. package/dist/api/shared/polyfill-helper-registry.d.ts +11 -0
  56. package/dist/api/shared/polyfill-helper-registry.js +86 -0
  57. package/dist/api/shared/polyfill-types.d.ts +33 -0
  58. package/dist/api/shared/polyfill-types.js +76 -0
  59. package/dist/api/shared/promise-runtime.d.ts +10 -0
  60. package/dist/api/shared/promise-runtime.js +244 -0
  61. package/dist/api/shared/snprintf-types.d.ts +29 -0
  62. package/dist/api/shared/snprintf-types.js +8 -0
  63. package/dist/api/shared/string-method-registry.d.ts +53 -0
  64. package/dist/api/shared/string-method-registry.js +168 -0
  65. package/dist/api/shared/toolchain-types.d.ts +63 -0
  66. package/dist/api/shared/toolchain-types.js +71 -0
  67. package/dist/api/shared/types.d.ts +50 -0
  68. package/dist/api/shared/types.js +6 -0
  69. package/dist/ast/parse.d.ts +2 -0
  70. package/dist/ast/parse.js +4 -0
  71. package/dist/cache.d.ts +26 -0
  72. package/dist/cache.js +95 -0
  73. package/dist/cli-utils.d.ts +37 -0
  74. package/dist/cli-utils.js +250 -0
  75. package/dist/cli.d.ts +2 -0
  76. package/dist/cli.js +635 -0
  77. package/dist/config-loader.d.ts +78 -0
  78. package/dist/config-loader.js +508 -0
  79. package/dist/config-schema.d.ts +233 -0
  80. package/dist/config-schema.js +83 -0
  81. package/dist/create/board-checklist.d.ts +2 -0
  82. package/dist/create/board-checklist.js +52 -0
  83. package/dist/create/board-codegen.d.ts +9 -0
  84. package/dist/create/board-codegen.js +238 -0
  85. package/dist/create/board-generators.d.ts +12 -0
  86. package/dist/create/board-generators.js +652 -0
  87. package/dist/create/board-spec.d.ts +640 -0
  88. package/dist/create/board-spec.js +215 -0
  89. package/dist/create/eslint-rules-template.d.ts +2 -0
  90. package/dist/create/eslint-rules-template.js +672 -0
  91. package/dist/create/index.d.ts +11 -0
  92. package/dist/create/index.js +8 -0
  93. package/dist/create/init-scaffold.d.ts +27 -0
  94. package/dist/create/init-scaffold.js +150 -0
  95. package/dist/create/init-templates.d.ts +24 -0
  96. package/dist/create/init-templates.js +379 -0
  97. package/dist/create/init-wizard.d.ts +8 -0
  98. package/dist/create/init-wizard.js +168 -0
  99. package/dist/debug/breakpoint-loader.d.ts +24 -0
  100. package/dist/debug/breakpoint-loader.js +137 -0
  101. package/dist/debug/index.d.ts +3 -0
  102. package/dist/debug/index.js +7 -0
  103. package/dist/debug/preprocessor.d.ts +9 -0
  104. package/dist/debug/preprocessor.js +214 -0
  105. package/dist/debug/types.d.ts +32 -0
  106. package/dist/debug/types.js +6 -0
  107. package/dist/diagnostics/diagnostics-report.d.ts +51 -0
  108. package/dist/diagnostics/diagnostics-report.js +333 -0
  109. package/dist/diagnostics/json-schema.d.ts +138 -0
  110. package/dist/diagnostics/json-schema.js +27 -0
  111. package/dist/diagnostics/md-writer.d.ts +10 -0
  112. package/dist/diagnostics/md-writer.js +336 -0
  113. package/dist/diagnostics/mermaid-builder.d.ts +65 -0
  114. package/dist/diagnostics/mermaid-builder.js +681 -0
  115. package/dist/emit/cpp-emitter.d.ts +6 -0
  116. package/dist/emit/cpp-emitter.js +48 -0
  117. package/dist/emit/emitters/class-emitter.d.ts +2 -0
  118. package/dist/emit/emitters/class-emitter.js +523 -0
  119. package/dist/emit/emitters/emitter-context.d.ts +174 -0
  120. package/dist/emit/emitters/emitter-context.js +1 -0
  121. package/dist/emit/emitters/entrypoint-synthesizer.d.ts +2 -0
  122. package/dist/emit/emitters/entrypoint-synthesizer.js +175 -0
  123. package/dist/emit/emitters/function-emitter-impl.d.ts +19 -0
  124. package/dist/emit/emitters/function-emitter-impl.js +428 -0
  125. package/dist/emit/emitters/line-appender.d.ts +15 -0
  126. package/dist/emit/emitters/line-appender.js +344 -0
  127. package/dist/emit/emitters/namespace-emitter.d.ts +2 -0
  128. package/dist/emit/emitters/namespace-emitter.js +324 -0
  129. package/dist/emit/emitters/output-finalizer.d.ts +4 -0
  130. package/dist/emit/emitters/output-finalizer.js +267 -0
  131. package/dist/emit/emitters/setup.d.ts +3 -0
  132. package/dist/emit/emitters/setup.js +851 -0
  133. package/dist/emit/emitters/top-level-prep.d.ts +2 -0
  134. package/dist/emit/emitters/top-level-prep.js +706 -0
  135. package/dist/emit/emitters/type-decl-emitter.d.ts +2 -0
  136. package/dist/emit/emitters/type-decl-emitter.js +251 -0
  137. package/dist/emit/emitters/ui-emitter.d.ts +21 -0
  138. package/dist/emit/emitters/ui-emitter.js +564 -0
  139. package/dist/emit/enum-emitter.d.ts +1 -0
  140. package/dist/emit/enum-emitter.js +1 -0
  141. package/dist/emit/expression-renderer.d.ts +283 -0
  142. package/dist/emit/expression-renderer.js +1477 -0
  143. package/dist/emit/native-helpers-emitter.d.ts +11 -0
  144. package/dist/emit/native-helpers-emitter.js +34 -0
  145. package/dist/emit/route-hal-op.d.ts +5 -0
  146. package/dist/emit/route-hal-op.js +13 -0
  147. package/dist/emit/snprintf-helpers.d.ts +17 -0
  148. package/dist/emit/snprintf-helpers.js +462 -0
  149. package/dist/emit/statement-renderer.d.ts +189 -0
  150. package/dist/emit/statement-renderer.js +948 -0
  151. package/dist/emit/utils/async-state-machine.d.ts +42 -0
  152. package/dist/emit/utils/async-state-machine.js +343 -0
  153. package/dist/emit/utils/comment-helpers.d.ts +20 -0
  154. package/dist/emit/utils/comment-helpers.js +31 -0
  155. package/dist/emit/utils/cpp-helpers.d.ts +47 -0
  156. package/dist/emit/utils/cpp-helpers.js +85 -0
  157. package/dist/emit/utils/include-resolver.d.ts +58 -0
  158. package/dist/emit/utils/include-resolver.js +155 -0
  159. package/dist/emit/utils/index.d.ts +8 -0
  160. package/dist/emit/utils/index.js +12 -0
  161. package/dist/emit/utils/type-inference.d.ts +159 -0
  162. package/dist/emit/utils/type-inference.js +559 -0
  163. package/dist/eslint-check.d.ts +10 -0
  164. package/dist/eslint-check.js +102 -0
  165. package/dist/framework-package.d.ts +10 -0
  166. package/dist/framework-package.js +58 -0
  167. package/dist/framework-registry.d.ts +39 -0
  168. package/dist/framework-registry.js +30 -0
  169. package/dist/incremental-cache.d.ts +116 -0
  170. package/dist/incremental-cache.js +335 -0
  171. package/dist/ir/adc-range-validation.d.ts +11 -0
  172. package/dist/ir/adc-range-validation.js +250 -0
  173. package/dist/ir/ast-node-utils.d.ts +8 -0
  174. package/dist/ir/ast-node-utils.js +32 -0
  175. package/dist/ir/board-pin-utils.d.ts +13 -0
  176. package/dist/ir/board-pin-utils.js +65 -0
  177. package/dist/ir/board-resolver.d.ts +36 -0
  178. package/dist/ir/board-resolver.js +437 -0
  179. package/dist/ir/build-ir-state.d.ts +167 -0
  180. package/dist/ir/build-ir-state.js +306 -0
  181. package/dist/ir/build-ir.d.ts +2 -0
  182. package/dist/ir/build-ir.js +808 -0
  183. package/dist/ir/call-graph.d.ts +35 -0
  184. package/dist/ir/call-graph.js +194 -0
  185. package/dist/ir/compile-time-only.d.ts +2 -0
  186. package/dist/ir/compile-time-only.js +16 -0
  187. package/dist/ir/declaration-builders.d.ts +9 -0
  188. package/dist/ir/declaration-builders.js +608 -0
  189. package/dist/ir/entry-points.d.ts +30 -0
  190. package/dist/ir/entry-points.js +191 -0
  191. package/dist/ir/expression-to-ir.d.ts +5 -0
  192. package/dist/ir/expression-to-ir.js +2249 -0
  193. package/dist/ir/extract-property-chain.d.ts +10 -0
  194. package/dist/ir/extract-property-chain.js +30 -0
  195. package/dist/ir/feature-prescan.d.ts +3 -0
  196. package/dist/ir/feature-prescan.js +43 -0
  197. package/dist/ir/feature-registry.d.ts +30 -0
  198. package/dist/ir/feature-registry.js +816 -0
  199. package/dist/ir/filter.d.ts +7 -0
  200. package/dist/ir/filter.js +85 -0
  201. package/dist/ir/function-builder.d.ts +19 -0
  202. package/dist/ir/function-builder.js +670 -0
  203. package/dist/ir/hal/hal-emitter.d.ts +62 -0
  204. package/dist/ir/hal/hal-emitter.js +735 -0
  205. package/dist/ir/hal/hal-parser.d.ts +61 -0
  206. package/dist/ir/hal/hal-parser.js +473 -0
  207. package/dist/ir/hal/hal-plugins.d.ts +34 -0
  208. package/dist/ir/hal/hal-plugins.js +706 -0
  209. package/dist/ir/hal-resolver.d.ts +5 -0
  210. package/dist/ir/hal-resolver.js +5 -0
  211. package/dist/ir/heap-analysis.d.ts +8 -0
  212. package/dist/ir/heap-analysis.js +350 -0
  213. package/dist/ir/heap-array-validation.d.ts +24 -0
  214. package/dist/ir/heap-array-validation.js +29 -0
  215. package/dist/ir/identifier-collector.d.ts +18 -0
  216. package/dist/ir/identifier-collector.js +439 -0
  217. package/dist/ir/interrupt-analysis.d.ts +39 -0
  218. package/dist/ir/interrupt-analysis.js +467 -0
  219. package/dist/ir/memory-budget-validation.d.ts +10 -0
  220. package/dist/ir/memory-budget-validation.js +86 -0
  221. package/dist/ir/namespace-builder.d.ts +7 -0
  222. package/dist/ir/namespace-builder.js +152 -0
  223. package/dist/ir/ownership-analysis.d.ts +9 -0
  224. package/dist/ir/ownership-analysis.js +1207 -0
  225. package/dist/ir/peripheral-ownership.d.ts +3 -0
  226. package/dist/ir/peripheral-ownership.js +152 -0
  227. package/dist/ir/peripheral-symbols.d.ts +7 -0
  228. package/dist/ir/peripheral-symbols.js +57 -0
  229. package/dist/ir/peripheral-usage.d.ts +54 -0
  230. package/dist/ir/peripheral-usage.js +691 -0
  231. package/dist/ir/peripheral-validation.d.ts +8 -0
  232. package/dist/ir/peripheral-validation.js +77 -0
  233. package/dist/ir/pin-alias-conflict.d.ts +4 -0
  234. package/dist/ir/pin-alias-conflict.js +34 -0
  235. package/dist/ir/pin-capability-validation.d.ts +6 -0
  236. package/dist/ir/pin-capability-validation.js +413 -0
  237. package/dist/ir/pin-mode-validation.d.ts +10 -0
  238. package/dist/ir/pin-mode-validation.js +301 -0
  239. package/dist/ir/pin-safety.d.ts +11 -0
  240. package/dist/ir/pin-safety.js +58 -0
  241. package/dist/ir/program-analysis.d.ts +44 -0
  242. package/dist/ir/program-analysis.js +589 -0
  243. package/dist/ir/pulldown-validation.d.ts +7 -0
  244. package/dist/ir/pulldown-validation.js +49 -0
  245. package/dist/ir/pwm-timer-sharing.d.ts +4 -0
  246. package/dist/ir/pwm-timer-sharing.js +93 -0
  247. package/dist/ir/reachability.d.ts +68 -0
  248. package/dist/ir/reachability.js +224 -0
  249. package/dist/ir/register-decorators.d.ts +6 -0
  250. package/dist/ir/register-decorators.js +49 -0
  251. package/dist/ir/render-expr.d.ts +4 -0
  252. package/dist/ir/render-expr.js +127 -0
  253. package/dist/ir/resource-analysis.d.ts +19 -0
  254. package/dist/ir/resource-analysis.js +153 -0
  255. package/dist/ir/statement-to-ir.d.ts +23 -0
  256. package/dist/ir/statement-to-ir.js +349 -0
  257. package/dist/ir/symbol-table.d.ts +68 -0
  258. package/dist/ir/symbol-table.js +179 -0
  259. package/dist/ir/symbol-types.d.ts +56 -0
  260. package/dist/ir/symbol-types.js +107 -0
  261. package/dist/ir/timer0-pwm-timing-conflict.d.ts +4 -0
  262. package/dist/ir/timer0-pwm-timing-conflict.js +71 -0
  263. package/dist/ir/timing-validation.d.ts +7 -0
  264. package/dist/ir/timing-validation.js +95 -0
  265. package/dist/ir/transformers/array-methods.d.ts +8 -0
  266. package/dist/ir/transformers/array-methods.js +493 -0
  267. package/dist/ir/transformers/call-statement.d.ts +5 -0
  268. package/dist/ir/transformers/call-statement.js +758 -0
  269. package/dist/ir/transformers/callback-context-registry.d.ts +20 -0
  270. package/dist/ir/transformers/callback-context-registry.js +55 -0
  271. package/dist/ir/transformers/canvas-lowering.d.ts +42 -0
  272. package/dist/ir/transformers/canvas-lowering.js +249 -0
  273. package/dist/ir/transformers/control-flow.d.ts +8 -0
  274. package/dist/ir/transformers/control-flow.js +508 -0
  275. package/dist/ir/transformers/expressions.d.ts +7 -0
  276. package/dist/ir/transformers/expressions.js +406 -0
  277. package/dist/ir/transformers/hal-call-resolver.d.ts +29 -0
  278. package/dist/ir/transformers/hal-call-resolver.js +274 -0
  279. package/dist/ir/transformers/hal-emit-helpers.d.ts +14 -0
  280. package/dist/ir/transformers/hal-emit-helpers.js +63 -0
  281. package/dist/ir/transformers/namespace-methods.d.ts +20 -0
  282. package/dist/ir/transformers/namespace-methods.js +110 -0
  283. package/dist/ir/transformers/register-assignment.d.ts +5 -0
  284. package/dist/ir/transformers/register-assignment.js +56 -0
  285. package/dist/ir/transformers/ui-call-resolver.d.ts +149 -0
  286. package/dist/ir/transformers/ui-call-resolver.js +1136 -0
  287. package/dist/ir/transformers/ui-callback-lowering.d.ts +62 -0
  288. package/dist/ir/transformers/ui-callback-lowering.js +623 -0
  289. package/dist/ir/transformers/ui-mount.d.ts +20 -0
  290. package/dist/ir/transformers/ui-mount.js +35 -0
  291. package/dist/ir/transformers/ui-reactive.d.ts +68 -0
  292. package/dist/ir/transformers/ui-reactive.js +129 -0
  293. package/dist/ir/transformers/variables.d.ts +14 -0
  294. package/dist/ir/transformers/variables.js +1045 -0
  295. package/dist/ir/try-catch-validation.d.ts +26 -0
  296. package/dist/ir/try-catch-validation.js +128 -0
  297. package/dist/ir/type-resolution.d.ts +31 -0
  298. package/dist/ir/type-resolution.js +977 -0
  299. package/dist/ir/ui-element-auto-wire.d.ts +50 -0
  300. package/dist/ir/ui-element-auto-wire.js +218 -0
  301. package/dist/ir/unit-suspicion-validation.d.ts +12 -0
  302. package/dist/ir/unit-suspicion-validation.js +296 -0
  303. package/dist/ir/utils/walk-ir.d.ts +6 -0
  304. package/dist/ir/utils/walk-ir.js +162 -0
  305. package/dist/ir/validation-orchestrator.d.ts +4 -0
  306. package/dist/ir/validation-orchestrator.js +45 -0
  307. package/dist/libdef/base-class-resolver.d.ts +23 -0
  308. package/dist/libdef/base-class-resolver.js +50 -0
  309. package/dist/libdef/cpp-to-decl.d.ts +34 -0
  310. package/dist/libdef/cpp-to-decl.js +584 -0
  311. package/dist/libdef/header-parser.d.ts +53 -0
  312. package/dist/libdef/header-parser.js +269 -0
  313. package/dist/libdef/registry.d.ts +10 -0
  314. package/dist/libdef/registry.js +142 -0
  315. package/dist/mapping/peripheral-names.d.ts +23 -0
  316. package/dist/mapping/peripheral-names.js +63 -0
  317. package/dist/mapping/source-map.d.ts +46 -0
  318. package/dist/mapping/source-map.js +207 -0
  319. package/dist/orchestrator/dts-generator.d.ts +17 -0
  320. package/dist/orchestrator/dts-generator.js +83 -0
  321. package/dist/orchestrator/graph-builder.d.ts +18 -0
  322. package/dist/orchestrator/graph-builder.js +218 -0
  323. package/dist/orchestrator/semantic-facts-verifier.d.ts +38 -0
  324. package/dist/orchestrator/semantic-facts-verifier.js +121 -0
  325. package/dist/orchestrator/semantic-facts.d.ts +141 -0
  326. package/dist/orchestrator/semantic-facts.js +652 -0
  327. package/dist/orchestrator/type-checker.d.ts +39 -0
  328. package/dist/orchestrator/type-checker.js +760 -0
  329. package/dist/platform/async-runtime.d.ts +8 -0
  330. package/dist/platform/async-runtime.js +26 -0
  331. package/dist/platform/generic-strategy.d.ts +101 -0
  332. package/dist/platform/generic-strategy.js +289 -0
  333. package/dist/platform/index.d.ts +4 -0
  334. package/dist/platform/index.js +9 -0
  335. package/dist/platform/registry.d.ts +21 -0
  336. package/dist/platform/registry.js +42 -0
  337. package/dist/platform/toolchain.d.ts +4 -0
  338. package/dist/platform/toolchain.js +43 -0
  339. package/dist/preview/client.d.ts +1 -0
  340. package/dist/preview/client.js +137 -0
  341. package/dist/preview/server.d.ts +5 -0
  342. package/dist/preview/server.js +199 -0
  343. package/dist/profiler/index.d.ts +28 -0
  344. package/dist/profiler/index.js +28 -0
  345. package/dist/profiler/profiler.d.ts +95 -0
  346. package/dist/profiler/profiler.js +338 -0
  347. package/dist/profiler/types.d.ts +87 -0
  348. package/dist/profiler/types.js +12 -0
  349. package/dist/stores/display-profile-store.d.ts +16 -0
  350. package/dist/stores/display-profile-store.js +48 -0
  351. package/dist/stores/theme-store.d.ts +13 -0
  352. package/dist/stores/theme-store.js +30 -0
  353. package/dist/testing.d.ts +45 -0
  354. package/dist/testing.js +47 -0
  355. package/dist/transpile/resolution.d.ts +29 -0
  356. package/dist/transpile/resolution.js +282 -0
  357. package/dist/transpile.d.ts +3 -0
  358. package/dist/transpile.js +722 -0
  359. package/dist/types.d.ts +217 -0
  360. package/dist/types.js +1 -0
  361. package/dist/ui/ui-bridge.d.ts +4 -0
  362. package/dist/ui/ui-bridge.js +34 -0
  363. package/dist/ui-hook.d.ts +84 -0
  364. package/dist/ui-hook.js +45 -0
  365. package/dist/utils/cli.d.ts +3 -0
  366. package/dist/utils/cli.js +463 -0
  367. package/dist/utils/fs.d.ts +4 -0
  368. package/dist/utils/fs.js +23 -0
  369. package/dist/utils/logger.d.ts +2 -0
  370. package/dist/utils/logger.js +8 -0
  371. package/dist/utils/strings.d.ts +35 -0
  372. package/dist/utils/strings.js +142 -0
  373. package/dist/utils/ui.d.ts +66 -0
  374. package/dist/utils/ui.js +149 -0
  375. package/dist/watch.d.ts +35 -0
  376. package/dist/watch.js +111 -0
  377. package/package.json +127 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Source location span for mapping generated code back to TypeScript.
3
+ */
4
+ export interface SourceSpan {
5
+ filePath: string;
6
+ startOffset: number;
7
+ endOffset: number;
8
+ startLine: number;
9
+ startColumn: number;
10
+ endLine: number;
11
+ endColumn: number;
12
+ }
13
+ /**
14
+ * Diagnostic severity levels.
15
+ */
16
+ export type DiagnosticSeverity = "info" | "warning" | "error";
17
+ /**
18
+ * Diagnostic message from transpilation or emit.
19
+ */
20
+ export interface Diagnostic {
21
+ severity: DiagnosticSeverity;
22
+ message: string;
23
+ /** Actionable fix suggestion, shown as a distinct code block in CLI output. */
24
+ hint?: string;
25
+ line?: number;
26
+ column?: number;
27
+ code?: string;
28
+ source?: string;
29
+ /** Text of the source line for display context. */
30
+ sourceLine?: string;
31
+ }
32
+ /**
33
+ * Target profile for code generation.
34
+ * Frameworks register their own profile names (e.g. "arduino", "stm32", "native").
35
+ */
36
+ export type TargetProfile = "generic" | (string & {});
37
+ /**
38
+ * Platform-specific context for code generation.
39
+ * Frameworks add their own context via the index signature.
40
+ */
41
+ export interface PlatformContext {
42
+ console?: {
43
+ baudRate?: number;
44
+ };
45
+ /** Target architecture identifier (e.g., 'avr', 'esp32'). Populated from board config. */
46
+ architecture?: string;
47
+ /** Framework-specific data. Each framework reads its own key. */
48
+ frameworkData?: Record<string, unknown>;
49
+ [key: string]: unknown;
50
+ }
@@ -0,0 +1,6 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Shared types for TypeCAD platform infrastructure
3
+ //
4
+ // These types are used by both the CLI and framework packages.
5
+ // ---------------------------------------------------------------------------
6
+ export {};
@@ -0,0 +1,2 @@
1
+ import ts from "typescript";
2
+ export declare function parseSource(fileName: string, sourceText: string): ts.SourceFile;
@@ -0,0 +1,4 @@
1
+ import ts from "typescript";
2
+ export function parseSource(fileName, sourceText) {
3
+ return ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
4
+ }
@@ -0,0 +1,26 @@
1
+ import ts from "typescript";
2
+ export declare class TranspileCache {
3
+ private readonly npmPackageCache;
4
+ private readonly packageJsonCache;
5
+ private readonly sourceFileCache;
6
+ private readonly fileExistsCache;
7
+ private readonly fileContentCache;
8
+ clear(): void;
9
+ getCachedNpmPackage(fromFile: string, packageName: string): string | undefined;
10
+ setCachedNpmPackage(fromFile: string, packageName: string, packageDir: string | undefined): void;
11
+ getCachedPackageJson(packageDir: string): Record<string, unknown> | null | undefined;
12
+ setCachedPackageJson(packageDir: string, content: Record<string, unknown> | null): void;
13
+ getOrParseSourceFile(filePath: string, sourceText: string): ts.SourceFile;
14
+ cachedFileExists(filePath: string): boolean;
15
+ cachedIsFile(filePath: string): boolean;
16
+ getOrReadFile(filePath: string): string;
17
+ }
18
+ export declare function clearCaches(): void;
19
+ export declare function getCachedNpmPackage(fromFile: string, packageName: string): string | undefined;
20
+ export declare function setCachedNpmPackage(fromFile: string, packageName: string, packageDir: string | undefined): void;
21
+ export declare function getCachedPackageJson(packageDir: string): Record<string, unknown> | null | undefined;
22
+ export declare function setCachedPackageJson(packageDir: string, content: Record<string, unknown> | null): void;
23
+ export declare function getOrParseSourceFile(filePath: string, sourceText: string): ts.SourceFile;
24
+ export declare function cachedFileExists(filePath: string): boolean;
25
+ export declare function cachedIsFile(filePath: string): boolean;
26
+ export declare function getOrReadFile(filePath: string): string;
package/dist/cache.js ADDED
@@ -0,0 +1,95 @@
1
+ import ts from "typescript";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { clearAllProfileCaches } from "./platform/registry.js";
5
+ export class TranspileCache {
6
+ constructor() {
7
+ this.npmPackageCache = new Map();
8
+ this.packageJsonCache = new Map();
9
+ this.sourceFileCache = new Map();
10
+ this.fileExistsCache = new Map();
11
+ this.fileContentCache = new Map();
12
+ }
13
+ clear() {
14
+ this.npmPackageCache.clear();
15
+ this.packageJsonCache.clear();
16
+ this.sourceFileCache.clear();
17
+ this.fileExistsCache.clear();
18
+ this.fileContentCache.clear();
19
+ clearAllProfileCaches();
20
+ }
21
+ getCachedNpmPackage(fromFile, packageName) {
22
+ return this.npmPackageCache.get(`${fromFile}|${packageName}`);
23
+ }
24
+ setCachedNpmPackage(fromFile, packageName, packageDir) {
25
+ this.npmPackageCache.set(`${fromFile}|${packageName}`, packageDir);
26
+ }
27
+ getCachedPackageJson(packageDir) {
28
+ return this.packageJsonCache.get(packageDir);
29
+ }
30
+ setCachedPackageJson(packageDir, content) {
31
+ this.packageJsonCache.set(packageDir, content);
32
+ }
33
+ getOrParseSourceFile(filePath, sourceText) {
34
+ const cached = this.sourceFileCache.get(filePath);
35
+ if (cached)
36
+ return cached;
37
+ const extension = path.extname(filePath).toLowerCase();
38
+ const source = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, extension === ".tsx" ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
39
+ this.sourceFileCache.set(filePath, source);
40
+ return source;
41
+ }
42
+ cachedFileExists(filePath) {
43
+ const cached = this.fileExistsCache.get(filePath);
44
+ if (cached !== undefined)
45
+ return cached;
46
+ const exists = fs.existsSync(filePath);
47
+ this.fileExistsCache.set(filePath, exists);
48
+ return exists;
49
+ }
50
+ cachedIsFile(filePath) {
51
+ const cacheKey = `file:${filePath}`;
52
+ const cached = this.fileExistsCache.get(cacheKey);
53
+ if (cached !== undefined)
54
+ return cached;
55
+ const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();
56
+ this.fileExistsCache.set(cacheKey, exists);
57
+ return exists;
58
+ }
59
+ getOrReadFile(filePath) {
60
+ const cached = this.fileContentCache.get(filePath);
61
+ if (cached !== undefined)
62
+ return cached;
63
+ const content = fs.readFileSync(filePath, "utf8");
64
+ this.fileContentCache.set(filePath, content);
65
+ return content;
66
+ }
67
+ }
68
+ const defaultCache = new TranspileCache();
69
+ export function clearCaches() {
70
+ defaultCache.clear();
71
+ }
72
+ export function getCachedNpmPackage(fromFile, packageName) {
73
+ return defaultCache.getCachedNpmPackage(fromFile, packageName);
74
+ }
75
+ export function setCachedNpmPackage(fromFile, packageName, packageDir) {
76
+ defaultCache.setCachedNpmPackage(fromFile, packageName, packageDir);
77
+ }
78
+ export function getCachedPackageJson(packageDir) {
79
+ return defaultCache.getCachedPackageJson(packageDir);
80
+ }
81
+ export function setCachedPackageJson(packageDir, content) {
82
+ defaultCache.setCachedPackageJson(packageDir, content);
83
+ }
84
+ export function getOrParseSourceFile(filePath, sourceText) {
85
+ return defaultCache.getOrParseSourceFile(filePath, sourceText);
86
+ }
87
+ export function cachedFileExists(filePath) {
88
+ return defaultCache.cachedFileExists(filePath);
89
+ }
90
+ export function cachedIsFile(filePath) {
91
+ return defaultCache.cachedIsFile(filePath);
92
+ }
93
+ export function getOrReadFile(filePath) {
94
+ return defaultCache.getOrReadFile(filePath);
95
+ }
@@ -0,0 +1,37 @@
1
+ import type { CompileResult, Diagnostic } from "./api/shared/index.js";
2
+ export declare function runExpectTests(options: {
3
+ port?: string;
4
+ buildTarget?: string;
5
+ baud?: number;
6
+ expectFile?: string;
7
+ }): number;
8
+ export declare function assertTypeScriptInput(filePath: string): void;
9
+ export declare function printDiagnostics(diagnostics: Array<Diagnostic | {
10
+ severity: string;
11
+ message: string;
12
+ hint?: string;
13
+ line?: number;
14
+ column?: number;
15
+ code?: string;
16
+ sourceLine?: string;
17
+ }>): void;
18
+ /**
19
+ * Print compiler (g++/native) errors mapped back to the TypeScript source
20
+ * that generated them.
21
+ *
22
+ * The mapped TypeScript errors are the PRIMARY output — shown in the same
23
+ * rich style as `printDiagnostics` (file:line:col + source line + caret).
24
+ * Errors that cannot be mapped (e.g. generated runtime shims/polyfills with
25
+ * no TS origin) are shown afterwards as a demoted, gray C++ fallback so no
26
+ * information is lost.
27
+ *
28
+ * Resolution strategy:
29
+ * - If `buildDir` is supplied (native mode), build a per-file source-map
30
+ * index over every `*.thcppmap.json` in the dir and map each error via
31
+ * its own translation unit's map.
32
+ * - Otherwise fall back to the single-map Arduino sketch path so non-native
33
+ * frameworks keep their existing behavior.
34
+ */
35
+ export declare function printMappedCompileErrors(compileResult: CompileResult, originalSourceMapPath?: string, sketchPath?: string, buildDir?: string): {
36
+ printed: boolean;
37
+ };
@@ -0,0 +1,250 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { spawnSync } from "node:child_process";
4
+ import { createRequire } from "node:module";
5
+ import { fileURLToPath } from "node:url";
6
+ import chalk from "chalk";
7
+ import { buildSourceMapIndex, mapCppErrorToTs, mapCppLocationToTs, readSourceMap, resolveSourceMapForSketch, } from "./mapping/source-map.js";
8
+ const require = createRequire(import.meta.url);
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ function resolveExpectCliPath() {
11
+ try {
12
+ return require.resolve("@typecad/expect/dist/host/cli.js");
13
+ }
14
+ catch {
15
+ const monorepoPath = path.resolve(__dirname, "..", "..", "expect", "dist", "host", "cli.js");
16
+ if (fs.existsSync(monorepoPath))
17
+ return monorepoPath;
18
+ const nmPath = path.resolve(__dirname, "..", "node_modules", "@typecad", "expect", "dist", "host", "cli.js");
19
+ if (fs.existsSync(nmPath))
20
+ return nmPath;
21
+ return "cuttlefish-test";
22
+ }
23
+ }
24
+ export function runExpectTests(options) {
25
+ const expectCliPath = resolveExpectCliPath();
26
+ const args = [expectCliPath];
27
+ if (options.port)
28
+ args.push("--port", options.port);
29
+ if (options.buildTarget)
30
+ args.push("--build-target", options.buildTarget);
31
+ if (options.baud)
32
+ args.push("--baud", String(options.baud));
33
+ if (options.expectFile)
34
+ args.push(path.resolve(process.cwd(), options.expectFile));
35
+ const result = spawnSync(process.execPath, args, {
36
+ encoding: "utf8",
37
+ cwd: process.cwd(),
38
+ timeout: 0,
39
+ stdio: "inherit",
40
+ });
41
+ return result.status ?? 1;
42
+ }
43
+ export function assertTypeScriptInput(filePath) {
44
+ const extension = path.extname(filePath).toLowerCase();
45
+ if (extension !== ".ts" && extension !== ".tsx" && extension !== ".ui") {
46
+ throw new Error(`Expected a .ts, .tsx, or .ui file, received '${extension || "<no extension>"}'.`);
47
+ }
48
+ }
49
+ export function printDiagnostics(diagnostics) {
50
+ for (const diagnostic of diagnostics) {
51
+ const position = diagnostic.line && diagnostic.column ? chalk.gray(`(${diagnostic.line},${diagnostic.column})`) : "";
52
+ const code = diagnostic.code ? chalk.gray(` [${diagnostic.code}]`) : "";
53
+ let severityLabel;
54
+ let hintColor;
55
+ if (diagnostic.severity === "error") {
56
+ severityLabel = chalk.red.bold("error");
57
+ hintColor = chalk.red;
58
+ }
59
+ else if (diagnostic.severity === "warning") {
60
+ severityLabel = chalk.yellow.bold("warning");
61
+ hintColor = chalk.yellow;
62
+ }
63
+ else {
64
+ severityLabel = chalk.cyan.bold(diagnostic.severity);
65
+ hintColor = chalk.cyan;
66
+ }
67
+ const location = position ? ` ${position}` : "";
68
+ const header = `${severityLabel}${code}${location}: ${chalk.white(diagnostic.message)}`;
69
+ if (diagnostic.severity === "error") {
70
+ console.error(header);
71
+ }
72
+ else {
73
+ console.warn(header);
74
+ }
75
+ if (diagnostic.sourceLine && diagnostic.column != null) {
76
+ const col = diagnostic.column;
77
+ const prefix = " ";
78
+ const sourceOutput = prefix + diagnostic.sourceLine;
79
+ if (diagnostic.severity === "error") {
80
+ console.error(sourceOutput);
81
+ }
82
+ else {
83
+ console.warn(sourceOutput);
84
+ }
85
+ const caret = prefix + " ".repeat(Math.max(0, col - 1)) + "^";
86
+ if (diagnostic.severity === "error") {
87
+ console.error(chalk.gray(caret));
88
+ }
89
+ else {
90
+ console.warn(chalk.gray(caret));
91
+ }
92
+ }
93
+ if (diagnostic.hint) {
94
+ const hintLines = diagnostic.hint.split("\n");
95
+ for (const hintLine of hintLines) {
96
+ const formatted = hintColor(` \u21b3 ${hintLine}`);
97
+ if (diagnostic.severity === "error") {
98
+ console.error(formatted);
99
+ }
100
+ else {
101
+ console.warn(formatted);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Print compiler (g++/native) errors mapped back to the TypeScript source
109
+ * that generated them.
110
+ *
111
+ * The mapped TypeScript errors are the PRIMARY output — shown in the same
112
+ * rich style as `printDiagnostics` (file:line:col + source line + caret).
113
+ * Errors that cannot be mapped (e.g. generated runtime shims/polyfills with
114
+ * no TS origin) are shown afterwards as a demoted, gray C++ fallback so no
115
+ * information is lost.
116
+ *
117
+ * Resolution strategy:
118
+ * - If `buildDir` is supplied (native mode), build a per-file source-map
119
+ * index over every `*.thcppmap.json` in the dir and map each error via
120
+ * its own translation unit's map.
121
+ * - Otherwise fall back to the single-map Arduino sketch path so non-native
122
+ * frameworks keep their existing behavior.
123
+ */
124
+ export function printMappedCompileErrors(compileResult, originalSourceMapPath, sketchPath, buildDir) {
125
+ if (compileResult.errors.length === 0) {
126
+ return { printed: false };
127
+ }
128
+ // Build the source-map index (native: per-file maps; otherwise single map).
129
+ let index;
130
+ if (buildDir) {
131
+ index = buildSourceMapIndex(buildDir);
132
+ if (index.size === 0)
133
+ index = undefined;
134
+ }
135
+ let singleMap;
136
+ if (!index) {
137
+ let sourceMapPath = originalSourceMapPath;
138
+ if (sketchPath && !sourceMapPath) {
139
+ sourceMapPath = resolveSourceMapForSketch(sketchPath, originalSourceMapPath);
140
+ }
141
+ singleMap = sourceMapPath ? readSourceMap(sourceMapPath) : undefined;
142
+ }
143
+ const mapped = [];
144
+ const unmapped = [];
145
+ for (const error of compileResult.errors) {
146
+ const mappedDiag = index
147
+ ? mapCppErrorToTs(index, error)
148
+ : singleMap
149
+ ? mapCppLocationToTs(singleMap, error.line, error.column, error.message, error.filePath)
150
+ : undefined;
151
+ const span = mappedDiag?.mappedTsSpan;
152
+ if (span) {
153
+ mapped.push({
154
+ error,
155
+ tsFile: span.filePath,
156
+ tsLine: span.startLine,
157
+ tsColumn: span.startColumn,
158
+ sourceLine: readSourceLine(span.filePath, span.startLine),
159
+ nodeKind: mappedDiag?.nodeKind,
160
+ symbolName: mappedDiag?.symbolName,
161
+ });
162
+ }
163
+ else {
164
+ unmapped.push(error);
165
+ }
166
+ }
167
+ // Primary: mapped TypeScript errors (rich format, mirrors printDiagnostics).
168
+ for (const item of mapped) {
169
+ printMappedTsError(item.error, item.tsFile, item.tsLine, item.tsColumn, item.sourceLine, item.nodeKind, item.symbolName);
170
+ }
171
+ // Demoted fallback: raw C++ errors with no TS origin.
172
+ if (unmapped.length > 0) {
173
+ if (mapped.length > 0) {
174
+ console.error("");
175
+ }
176
+ console.error(chalk.gray(`Unmapped (generated-code) ${unmapped.length === 1 ? "error" : "errors"}:`));
177
+ for (const error of unmapped) {
178
+ const rel = relativeForDisplay(error.filePath);
179
+ const line = chalk.gray(` \u21b3 (generated C++) ${rel}(${error.line},${error.column}): ${error.severity}: ${error.message}`);
180
+ if (error.severity === "error") {
181
+ console.error(line);
182
+ }
183
+ else {
184
+ console.warn(line);
185
+ }
186
+ }
187
+ }
188
+ return { printed: mapped.length > 0 || unmapped.length > 0 };
189
+ }
190
+ /** Read a single 1-based source line for caret display; returns undefined on failure. */
191
+ function readSourceLine(filePath, line) {
192
+ try {
193
+ const content = fs.readFileSync(filePath, "utf8");
194
+ return content.split(/\r?\n/)[line - 1];
195
+ }
196
+ catch {
197
+ return undefined;
198
+ }
199
+ }
200
+ /** Make a path relative to cwd for display, falling back to the original. */
201
+ function relativeForDisplay(filePath) {
202
+ try {
203
+ const rel = path.relative(process.cwd(), filePath);
204
+ return rel && !rel.startsWith("..") ? rel : filePath;
205
+ }
206
+ catch {
207
+ return filePath;
208
+ }
209
+ }
210
+ /** Print one mapped error in the rich printDiagnostics style. */
211
+ function printMappedTsError(error, tsFile, tsLine, tsColumn, sourceLine, nodeKind, symbolName) {
212
+ const rel = relativeForDisplay(tsFile);
213
+ const position = chalk.gray(`(${tsLine},${tsColumn})`);
214
+ let severityLabel;
215
+ if (error.severity === "error") {
216
+ severityLabel = chalk.red.bold("error");
217
+ }
218
+ else if (error.severity === "warning") {
219
+ severityLabel = chalk.yellow.bold("warning");
220
+ }
221
+ else {
222
+ severityLabel = chalk.cyan.bold(String(error.severity));
223
+ }
224
+ const origin = symbolName ? chalk.gray(` [${nodeKind ?? "generated"}: ${symbolName}]`) : nodeKind ? chalk.gray(` [${nodeKind}]`) : "";
225
+ const header = `${chalk.cyan(rel)} ${position} ${severityLabel}${origin}: ${chalk.white(error.message)}`;
226
+ if (error.severity === "error") {
227
+ console.error(header);
228
+ }
229
+ else {
230
+ console.warn(header);
231
+ }
232
+ if (sourceLine) {
233
+ const prefix = " ";
234
+ const col = tsColumn;
235
+ const sourceOutput = prefix + sourceLine;
236
+ if (error.severity === "error") {
237
+ console.error(sourceOutput);
238
+ }
239
+ else {
240
+ console.warn(sourceOutput);
241
+ }
242
+ const caret = prefix + " ".repeat(Math.max(0, col - 1)) + "^";
243
+ if (error.severity === "error") {
244
+ console.error(chalk.gray(caret));
245
+ }
246
+ else {
247
+ console.warn(chalk.gray(caret));
248
+ }
249
+ }
250
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};