@typecad/cuttlefish 1.0.0-alpha.13 → 1.0.0-alpha.15

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 (343) hide show
  1. package/README.md +82 -79
  2. package/assets/editor-extensions/typecad-debug/README.md +141 -0
  3. package/assets/editor-extensions/typecad-debug/out/extension.js +347 -0
  4. package/assets/editor-extensions/typecad-debug/out/extension.js.map +1 -0
  5. package/assets/editor-extensions/typecad-debug/package.json +76 -0
  6. package/assets/editor-extensions/typecad-ui/LICENSE +27 -0
  7. package/assets/editor-extensions/typecad-ui/README.md +52 -0
  8. package/assets/editor-extensions/typecad-ui/file-icon-dark.png +0 -0
  9. package/assets/editor-extensions/typecad-ui/file-icon-light.png +0 -0
  10. package/assets/editor-extensions/typecad-ui/icon.png +0 -0
  11. package/assets/editor-extensions/typecad-ui/language-configuration.json +43 -0
  12. package/assets/editor-extensions/typecad-ui/package.json +54 -0
  13. package/assets/editor-extensions/typecad-ui/snippets/typecad-ui.json +80 -0
  14. package/assets/editor-extensions/typecad-ui/syntaxes/markdown-ui.json +45 -0
  15. package/assets/editor-extensions/typecad-ui/syntaxes/typecad-ui.tmLanguage.json +1269 -0
  16. package/dist/api/config.d.ts +30 -27
  17. package/dist/api/schema/types.d.ts +20 -3
  18. package/dist/api/shared/async-runtime-static.d.ts +1 -1
  19. package/dist/api/shared/async-runtime-static.js +5 -5
  20. package/dist/api/shared/async-types.d.ts +3 -2
  21. package/dist/api/shared/board-catalog.d.ts +2 -0
  22. package/dist/api/shared/board-catalog.js +6 -0
  23. package/dist/api/shared/board-resolver.d.ts +4 -7
  24. package/dist/api/shared/board-resolver.js +2 -1
  25. package/dist/api/shared/coop-scheduler.d.ts +1 -1
  26. package/dist/api/shared/coop-scheduler.js +1 -1
  27. package/dist/api/shared/cpp-type-ir.d.ts +1 -1
  28. package/dist/api/shared/cpp-type-ir.js +1 -1
  29. package/dist/api/shared/display-profile.d.ts +1 -1
  30. package/dist/api/shared/display-profile.js +3 -5
  31. package/dist/api/shared/framework-manifest-registry.d.ts +1 -1
  32. package/dist/api/shared/framework-manifest-registry.js +0 -1
  33. package/dist/api/shared/framework-manifest.d.ts +65 -507
  34. package/dist/api/shared/framework-manifest.js +6 -11
  35. package/dist/api/shared/hal-op-ir.d.ts +294 -685
  36. package/dist/api/shared/hal-op-ir.js +31 -65
  37. package/dist/api/shared/index.d.ts +0 -4
  38. package/dist/api/shared/index.js +1 -7
  39. package/dist/api/shared/ir-core.d.ts +6 -0
  40. package/dist/api/shared/ir-declarations.d.ts +4 -0
  41. package/dist/api/shared/ir.d.ts +1 -3
  42. package/dist/api/shared/platform-strategy.d.ts +14 -37
  43. package/dist/api/shared/polyfill-helper-registry.js +0 -5
  44. package/dist/api/shared/polyfill-types.js +0 -27
  45. package/dist/api/shared/promise-runtime.js +3 -3
  46. package/dist/api/shared/spdx-licenses.d.ts +12 -10
  47. package/dist/api/shared/spdx-licenses.js +1 -1
  48. package/dist/api/shared/toolchain-types.d.ts +1 -1
  49. package/dist/api/shared/toolchain-types.js +3 -3
  50. package/dist/api/shared/types.d.ts +0 -3
  51. package/dist/api/shared/validate-framework-manifest.js +13 -33
  52. package/dist/board-catalog/dts-reader.d.ts +220 -0
  53. package/dist/board-catalog/dts-reader.js +1052 -0
  54. package/dist/board-catalog/index.d.ts +11 -0
  55. package/dist/board-catalog/index.js +12 -0
  56. package/dist/board-catalog/pinconfig.d.ts +48 -0
  57. package/dist/board-catalog/pinconfig.js +263 -0
  58. package/dist/board-catalog/sdk.d.ts +82 -0
  59. package/dist/board-catalog/sdk.js +180 -0
  60. package/dist/board-catalog/store.d.ts +196 -0
  61. package/dist/board-catalog/store.js +363 -0
  62. package/dist/board-catalog/types.d.ts +233 -0
  63. package/dist/board-catalog/types.js +7 -0
  64. package/dist/board-catalog/walker.d.ts +112 -0
  65. package/dist/board-catalog/walker.js +1101 -0
  66. package/dist/cli-utils.d.ts +2 -2
  67. package/dist/cli-utils.js +5 -5
  68. package/dist/cli.js +227 -244
  69. package/dist/config-loader.d.ts +14 -19
  70. package/dist/config-loader.js +242 -78
  71. package/dist/config-schema.d.ts +19 -227
  72. package/dist/config-schema.js +9 -8
  73. package/dist/contract/board-generator.d.ts +4 -4
  74. package/dist/contract/board-generator.js +16 -5
  75. package/dist/contract/contract-parser.d.ts +36 -127
  76. package/dist/contract/contract-parser.js +76 -0
  77. package/dist/contract/index.d.ts +1 -1
  78. package/dist/contract/index.js +70 -21
  79. package/dist/create/active-board-catalog.d.ts +9 -0
  80. package/dist/create/active-board-catalog.js +94 -0
  81. package/dist/create/board-catalog.generated.d.ts +96 -0
  82. package/dist/create/board-catalog.generated.js +128737 -0
  83. package/dist/create/board-search.d.ts +23 -0
  84. package/dist/create/board-search.js +88 -0
  85. package/dist/create/editor-integration.d.ts +32 -0
  86. package/dist/create/editor-integration.js +257 -0
  87. package/dist/create/eslint-rules-template.d.ts +2 -2
  88. package/dist/create/framework-catalog.d.ts +48 -8
  89. package/dist/create/framework-catalog.js +58 -44
  90. package/dist/create/index.d.ts +8 -13
  91. package/dist/create/index.js +5 -9
  92. package/dist/create/mcu-target.d.ts +39 -0
  93. package/dist/create/mcu-target.js +80 -0
  94. package/dist/create/pack-targets.d.ts +19 -0
  95. package/dist/create/pack-targets.js +56 -0
  96. package/dist/create/{init-scaffold.d.ts → scaffold.d.ts} +8 -11
  97. package/dist/create/{init-scaffold.js → scaffold.js} +28 -87
  98. package/dist/create/templates.d.ts +51 -0
  99. package/dist/create/{init-templates.js → templates.js} +135 -116
  100. package/dist/create/wizard.d.ts +19 -0
  101. package/dist/create/wizard.js +314 -0
  102. package/dist/debug/preprocessor.d.ts +5 -0
  103. package/dist/debug/preprocessor.js +31 -7
  104. package/dist/diagnostics/diagnostics-report.d.ts +1 -1
  105. package/dist/diagnostics/diagnostics-report.js +3 -11
  106. package/dist/diagnostics/json-schema.d.ts +1 -1
  107. package/dist/diagnostics/md-writer.js +2 -2
  108. package/dist/diagnostics/mermaid-builder.d.ts +1 -1
  109. package/dist/diagnostics/mermaid-builder.js +1 -1
  110. package/dist/emit/cpp-emitter.js +4 -1
  111. package/dist/emit/emitters/class-emitter.js +32 -4
  112. package/dist/emit/emitters/emitter-context.d.ts +11 -0
  113. package/dist/emit/emitters/entrypoint-synthesizer.js +1 -1
  114. package/dist/emit/emitters/function-emitter-impl.js +33 -17
  115. package/dist/emit/emitters/output-finalizer.d.ts +7 -0
  116. package/dist/emit/emitters/output-finalizer.js +31 -23
  117. package/dist/emit/emitters/setup.js +147 -63
  118. package/dist/emit/emitters/top-level-prep.js +1 -1
  119. package/dist/emit/emitters/type-decl-emitter.js +13 -8
  120. package/dist/emit/emitters/ui-emitter.js +1 -1
  121. package/dist/emit/expression-renderer.d.ts +3 -3
  122. package/dist/emit/expression-renderer.js +17 -7
  123. package/dist/emit/route-hal-op.js +17 -48
  124. package/dist/emit/snprintf-helpers.d.ts +1 -3
  125. package/dist/emit/snprintf-helpers.js +1 -39
  126. package/dist/emit/statement-renderer.d.ts +0 -4
  127. package/dist/emit/statement-renderer.js +54 -45
  128. package/dist/emit/utils/async-state-machine.d.ts +16 -9
  129. package/dist/emit/utils/async-state-machine.js +56 -54
  130. package/dist/emit/utils/comment-helpers.d.ts +0 -8
  131. package/dist/emit/utils/comment-helpers.js +1 -1
  132. package/dist/emit/utils/cpp-helpers.d.ts +2 -2
  133. package/dist/emit/utils/cpp-helpers.js +2 -2
  134. package/dist/emit/utils/hal-op-cpp-type.js +4 -6
  135. package/dist/emit/utils/index.d.ts +3 -3
  136. package/dist/emit/utils/index.js +3 -3
  137. package/dist/emit/utils/type-inference.d.ts +1 -29
  138. package/dist/emit/utils/type-inference.js +0 -75
  139. package/dist/framework-package.d.ts +3 -0
  140. package/dist/framework-package.js +23 -6
  141. package/dist/framework-registry.d.ts +5 -5
  142. package/dist/frameworks/native/graphics/terminal-preview.d.ts +5 -0
  143. package/dist/frameworks/native/graphics/terminal-preview.js +33 -0
  144. package/dist/frameworks/native/index.d.ts +3 -0
  145. package/dist/frameworks/native/index.js +15 -0
  146. package/dist/frameworks/native/native-compile.d.ts +17 -0
  147. package/dist/frameworks/native/native-compile.js +170 -0
  148. package/dist/frameworks/native/native-config.d.ts +41 -0
  149. package/dist/frameworks/native/native-config.js +7 -0
  150. package/dist/frameworks/native/strategy.d.ts +97 -0
  151. package/dist/frameworks/native/strategy.js +664 -0
  152. package/dist/ir/board-resolver.d.ts +18 -23
  153. package/dist/ir/board-resolver.js +43 -401
  154. package/dist/ir/build-ir-state.d.ts +3 -0
  155. package/dist/ir/build-ir-state.js +42 -0
  156. package/dist/ir/build-ir.d.ts +1 -1
  157. package/dist/ir/build-ir.js +64 -45
  158. package/dist/ir/declaration-builders.js +1 -0
  159. package/dist/ir/expression-to-ir.js +17 -10
  160. package/dist/ir/hal/hal-emitter.d.ts +0 -2
  161. package/dist/ir/hal/hal-emitter.js +92 -41
  162. package/dist/ir/hal/hal-parser.d.ts +5 -5
  163. package/dist/ir/hal/hal-parser.js +128 -36
  164. package/dist/ir/hal/hal-plugins.d.ts +0 -1
  165. package/dist/ir/hal/hal-plugins.js +425 -716
  166. package/dist/ir/heap-analysis.js +2 -41
  167. package/dist/ir/identifier-collector.js +32 -20
  168. package/dist/ir/network-validation.js +7 -11
  169. package/dist/ir/ownership-analysis.js +75 -13
  170. package/dist/ir/peripheral-usage.d.ts +8 -2
  171. package/dist/ir/peripheral-usage.js +78 -149
  172. package/dist/ir/peripheral-validation.js +23 -3
  173. package/dist/ir/pin-capability-validation.d.ts +12 -0
  174. package/dist/ir/pin-capability-validation.js +61 -97
  175. package/dist/ir/pin-mode-validation.js +5 -5
  176. package/dist/ir/program-analysis.d.ts +8 -15
  177. package/dist/ir/program-analysis.js +140 -323
  178. package/dist/ir/pulldown-validation.js +11 -4
  179. package/dist/ir/resource-analysis.js +15 -3
  180. package/dist/ir/statement-to-ir.js +0 -6
  181. package/dist/ir/timing-validation.js +1 -1
  182. package/dist/ir/transformers/array-methods.js +11 -5
  183. package/dist/ir/transformers/call-statement.js +20 -87
  184. package/dist/ir/transformers/callback-context-registry.d.ts +1 -1
  185. package/dist/ir/transformers/callback-context-registry.js +8 -16
  186. package/dist/ir/transformers/control-flow.js +0 -13
  187. package/dist/ir/transformers/expressions.js +10 -9
  188. package/dist/ir/transformers/hal-call-resolver.d.ts +2 -2
  189. package/dist/ir/transformers/hal-call-resolver.js +24 -10
  190. package/dist/ir/transformers/hal-emit-helpers.d.ts +2 -2
  191. package/dist/ir/transformers/hal-emit-helpers.js +2 -2
  192. package/dist/ir/transformers/namespace-methods.js +1 -1
  193. package/dist/ir/transformers/ui-callback-lowering.d.ts +0 -2
  194. package/dist/ir/transformers/ui-callback-lowering.js +0 -24
  195. package/dist/ir/transformers/variables.js +338 -42
  196. package/dist/ir/try-catch-validation.js +4 -3
  197. package/dist/ir/type-resolution.js +15 -4
  198. package/dist/ir/validation-orchestrator.js +0 -9
  199. package/dist/libdef/cpp-to-decl.d.ts +0 -9
  200. package/dist/libdef/cpp-to-decl.js +0 -72
  201. package/dist/libdef/registry.d.ts +0 -1
  202. package/dist/libdef/registry.js +1 -24
  203. package/dist/library/catalog.d.ts +35 -0
  204. package/dist/library/catalog.js +67 -0
  205. package/dist/library/cli.d.ts +2 -0
  206. package/dist/library/cli.js +168 -0
  207. package/dist/library/init.d.ts +25 -0
  208. package/dist/library/init.js +397 -0
  209. package/dist/library/install.d.ts +9 -0
  210. package/dist/library/install.js +80 -0
  211. package/dist/library/registry-search.d.ts +34 -0
  212. package/dist/library/registry-search.js +50 -0
  213. package/dist/library/validate.d.ts +17 -0
  214. package/dist/library/validate.js +175 -0
  215. package/dist/library-packages.d.ts +95 -0
  216. package/dist/library-packages.js +275 -0
  217. package/dist/mapping/peripheral-names.js +9 -4
  218. package/dist/mapping/source-map.d.ts +3 -4
  219. package/dist/mapping/source-map.js +12 -18
  220. package/dist/orchestrator/graph-builder.d.ts +3 -3
  221. package/dist/orchestrator/graph-builder.js +29 -12
  222. package/dist/orchestrator/type-checker.d.ts +3 -3
  223. package/dist/orchestrator/type-checker.js +3 -3
  224. package/dist/platform/async-runtime.js +1 -1
  225. package/dist/platform/coop-scheduler-runtime.js +2 -2
  226. package/dist/platform/generic-debug-codegen.d.ts +36 -0
  227. package/dist/platform/generic-debug-codegen.js +185 -0
  228. package/dist/platform/generic-strategy.d.ts +3 -4
  229. package/dist/platform/generic-strategy.js +5 -80
  230. package/dist/platform/index.js +1 -1
  231. package/dist/platform/registry.d.ts +2 -2
  232. package/dist/platform/registry.js +2 -2
  233. package/dist/preview/client.js +17 -3
  234. package/dist/safety/asil-decorators.d.ts +32 -0
  235. package/dist/safety/asil-decorators.js +32 -0
  236. package/dist/safety/authoring.d.ts +85 -0
  237. package/dist/safety/authoring.js +61 -0
  238. package/dist/safety/engine.d.ts +3 -0
  239. package/dist/safety/engine.js +83 -0
  240. package/dist/safety/hal/ops.d.ts +48 -0
  241. package/dist/safety/hal/ops.js +46 -0
  242. package/dist/safety/iso26262/analyze.d.ts +13 -0
  243. package/dist/safety/iso26262/analyze.js +29 -0
  244. package/dist/safety/iso26262/asil.d.ts +10 -0
  245. package/dist/safety/iso26262/asil.js +22 -0
  246. package/dist/safety/iso26262/collect.d.ts +14 -0
  247. package/dist/safety/iso26262/collect.js +137 -0
  248. package/dist/safety/iso26262/goto-checker.d.ts +10 -0
  249. package/dist/safety/iso26262/goto-checker.js +72 -0
  250. package/dist/safety/iso26262/heap-checker.d.ts +7 -0
  251. package/dist/safety/iso26262/heap-checker.js +57 -0
  252. package/dist/safety/iso26262/init-checker.d.ts +13 -0
  253. package/dist/safety/iso26262/init-checker.js +127 -0
  254. package/dist/safety/iso26262/loop-checker.d.ts +7 -0
  255. package/dist/safety/iso26262/loop-checker.js +86 -0
  256. package/dist/safety/iso26262/recursion-checker.d.ts +9 -0
  257. package/dist/safety/iso26262/recursion-checker.js +134 -0
  258. package/dist/safety/iso26262/sidecar-writer.d.ts +25 -0
  259. package/dist/safety/iso26262/sidecar-writer.js +13 -0
  260. package/dist/safety/passes/pinMode-intercept.d.ts +3 -0
  261. package/dist/safety/passes/pinMode-intercept.js +60 -0
  262. package/dist/safety/runtime/mode-table.d.ts +5 -0
  263. package/dist/safety/runtime/mode-table.js +55 -0
  264. package/dist/safety/runtime/polyfills.d.ts +6 -0
  265. package/dist/safety/runtime/polyfills.js +12 -0
  266. package/dist/safety/runtime/result-struct.d.ts +11 -0
  267. package/dist/safety/runtime/result-struct.js +98 -0
  268. package/dist/safety/runtime/safe-int.d.ts +33 -0
  269. package/dist/safety/runtime/safe-int.js +170 -0
  270. package/dist/safety/runtime/safe-traits.d.ts +4 -0
  271. package/dist/safety/runtime/safe-traits.js +95 -0
  272. package/dist/safety/runtime/safe-variable.d.ts +39 -0
  273. package/dist/safety/runtime/safe-variable.js +226 -0
  274. package/dist/safety/runtime/vote.d.ts +8 -0
  275. package/dist/safety/runtime/vote.js +92 -0
  276. package/dist/safety/runtime/write-verify.d.ts +8 -0
  277. package/dist/safety/runtime/write-verify.js +71 -0
  278. package/dist/safety/safe-int-types.d.ts +45 -0
  279. package/dist/safety/safe-int-types.js +25 -0
  280. package/dist/safety/safe-variable-types.d.ts +29 -0
  281. package/dist/safety/safe-variable-types.js +19 -0
  282. package/dist/safety/safety-bridge.d.ts +5 -6
  283. package/dist/safety/safety-bridge.js +15 -28
  284. package/dist/safety/sidecar-bridge.d.ts +1 -3
  285. package/dist/safety/sidecar-bridge.js +3 -20
  286. package/dist/safety/specifiers.d.ts +6 -0
  287. package/dist/safety/specifiers.js +14 -0
  288. package/dist/safety-hook.d.ts +8 -7
  289. package/dist/safety-hook.js +12 -13
  290. package/dist/testing.d.ts +5 -6
  291. package/dist/testing.js +5 -5
  292. package/dist/transpile/resolution.d.ts +1 -1
  293. package/dist/transpile/resolution.js +18 -9
  294. package/dist/transpile/test-pins.d.ts +18 -0
  295. package/dist/transpile/test-pins.js +142 -0
  296. package/dist/transpile.d.ts +1 -2
  297. package/dist/transpile.js +90 -29
  298. package/dist/types.d.ts +45 -26
  299. package/dist/ui-hook.d.ts +1 -1
  300. package/dist/utils/cli.d.ts +2 -2
  301. package/dist/utils/cli.js +160 -157
  302. package/dist/utils/fs.d.ts +3 -4
  303. package/dist/utils/fs.js +4 -5
  304. package/dist/utils/strings.d.ts +0 -1
  305. package/dist/utils/strings.js +0 -8
  306. package/dist/utils/ui.d.ts +5 -2
  307. package/dist/utils/ui.js +13 -3
  308. package/package.json +158 -149
  309. package/dist/add-preset.d.ts +0 -4
  310. package/dist/add-preset.js +0 -74
  311. package/dist/api/shared/async-symbol-detector.d.ts +0 -11
  312. package/dist/api/shared/async-symbol-detector.js +0 -140
  313. package/dist/api/shared/native-display-op-resolver.d.ts +0 -10
  314. package/dist/api/shared/native-display-op-resolver.js +0 -64
  315. package/dist/create/board-checklist.d.ts +0 -2
  316. package/dist/create/board-checklist.js +0 -52
  317. package/dist/create/board-codegen.d.ts +0 -9
  318. package/dist/create/board-codegen.js +0 -238
  319. package/dist/create/board-generators.d.ts +0 -12
  320. package/dist/create/board-generators.js +0 -651
  321. package/dist/create/board-spec.d.ts +0 -637
  322. package/dist/create/board-spec.js +0 -214
  323. package/dist/create/init-templates.d.ts +0 -28
  324. package/dist/create/init-wizard.d.ts +0 -8
  325. package/dist/create/init-wizard.js +0 -182
  326. package/dist/install/framework-catalog.d.ts +0 -53
  327. package/dist/install/framework-catalog.js +0 -107
  328. package/dist/install/handle-install.d.ts +0 -35
  329. package/dist/install/handle-install.js +0 -177
  330. package/dist/install/index.d.ts +0 -4
  331. package/dist/install/index.js +0 -3
  332. package/dist/ir/pin-state-tracking.d.ts +0 -58
  333. package/dist/ir/pin-state-tracking.js +0 -182
  334. package/dist/ir/pwm-timer-sharing.d.ts +0 -4
  335. package/dist/ir/pwm-timer-sharing.js +0 -94
  336. package/dist/ir/timer0-pwm-timing-conflict.d.ts +0 -4
  337. package/dist/ir/timer0-pwm-timing-conflict.js +0 -72
  338. package/dist/libdef/component-decls.d.ts +0 -2
  339. package/dist/libdef/component-decls.js +0 -6
  340. package/dist/libdef/component-discovery.d.ts +0 -43
  341. package/dist/libdef/component-discovery.js +0 -83
  342. package/dist/theme-tokens.d.ts +0 -22
  343. package/dist/theme-tokens.js +0 -172
@@ -4,7 +4,7 @@ import { createRequire } from "node:module";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import ts from "typescript";
6
6
  import { parseSource } from "../../ast/parse.js";
7
- import { requiredIncludes, getCurrentBoardConstants, mcuPinForwardMap, mcuPinReverseMap, halInstances, topLevelAliasReceivers } from "../build-ir-state.js";
7
+ import { requiredIncludes, getCurrentBoardConstants, mcuPinForwardMap, mcuPinReverseMap, halInstances, topLevelAliasReceivers, pinAliasMap } from "../build-ir-state.js";
8
8
  import { mapPeripheralName } from "../../mapping/peripheral-names.js";
9
9
  import { escapeCppStringLiteral } from "../../utils/strings.js";
10
10
  const require = createRequire(import.meta.url);
@@ -167,6 +167,18 @@ export function loadHALModules(force = false) {
167
167
  let instanceName;
168
168
  let includes;
169
169
  const defaultFields = new Map();
170
+ const fieldDefaults = new Map();
171
+ for (const member of stmt.members) {
172
+ // Instance property initializers with literal values (`private
173
+ // readonly _spiHz: number = 1000000;`) are static facts — the
174
+ // default a method body sees when construction didn't override.
175
+ if (ts.isPropertyDeclaration(member) && ts.isIdentifier(member.name) && member.initializer) {
176
+ const init = member.initializer;
177
+ if (ts.isNumericLiteral(init) || ts.isStringLiteral(init)) {
178
+ fieldDefaults.set(member.name.text, init.text);
179
+ }
180
+ }
181
+ }
170
182
  for (const member of stmt.members) {
171
183
  if (ts.isPropertyDeclaration(member) &&
172
184
  member.modifiers?.some(m => m.kind === ts.SyntaxKind.StaticKeyword) &&
@@ -186,7 +198,7 @@ export function loadHALModules(force = false) {
186
198
  }
187
199
  }
188
200
  }
189
- halClassRegistry.set(className, { ctorFieldMap, ctorDefaults, methods });
201
+ halClassRegistry.set(className, { ctorFieldMap, ctorDefaults, fieldDefaults, methods });
190
202
  if (instanceName) {
191
203
  halSingletons.set(instanceName, { className, fieldValues: defaultFields, includes });
192
204
  }
@@ -210,21 +222,79 @@ export function loadHALModules(force = false) {
210
222
  export function getCtorIncludes(className) {
211
223
  return halCtorIncludes.get(className) ?? [];
212
224
  }
213
- /** Map an HttpClass factory method name to its HTTP verb, or null. */
214
- export function httpFactoryVerb(methodName) {
215
- switch (methodName) {
216
- case "get": return "GET";
217
- case "post": return "POST";
218
- case "put": return "PUT";
219
- case "del": return "DELETE";
220
- case "head": return "HEAD";
221
- case "patch": return "PATCH";
222
- default: return null;
223
- }
224
- }
225
225
  /** Render an Http factory URL argument as C++ expression text (string
226
226
  * literals quoted, identifiers/member accesses verbatim), or null when the
227
227
  * argument shape can't be resolved at compile time. */
228
+ /** Capture `new Request(method, url, opts?)` construction facts into
229
+ * fieldValues (method token/string → verb, URL as C++ text, opts with
230
+ * class-default sentinels so send()'s setter calls always resolve).
231
+ * Returns null when the arg shapes don't resolve. */
232
+ /** Top-level `const NAME = "literal"` lookup, or null. One pass over the
233
+ * file's statements — cheap and cached by the TS compiler. */
234
+ function topLevelStringConst(sourceFile, name) {
235
+ for (const stmt of sourceFile.statements) {
236
+ if (!ts.isVariableStatement(stmt))
237
+ continue;
238
+ for (const decl of stmt.declarationList.declarations) {
239
+ if (ts.isIdentifier(decl.name) && decl.name.text === name
240
+ && decl.initializer && ts.isStringLiteral(decl.initializer)) {
241
+ return decl.initializer.text;
242
+ }
243
+ }
244
+ }
245
+ return null;
246
+ }
247
+ export function requestCtorFields(ctorArgs, sourceFile) {
248
+ if (!ctorArgs || ctorArgs.length < 2)
249
+ return null;
250
+ const fieldValues = new Map();
251
+ const methodArg = ctorArgs[0];
252
+ if (ts.isStringLiteral(methodArg)) {
253
+ fieldValues.set("_method", methodArg.text.toUpperCase());
254
+ }
255
+ else if (ts.isPropertyAccessExpression(methodArg) && methodArg.expression.getText() === "Request") {
256
+ fieldValues.set("_method", methodArg.name.text);
257
+ }
258
+ else {
259
+ return null;
260
+ }
261
+ const urlText = httpUrlArgText(ctorArgs[1]);
262
+ if (!urlText)
263
+ return null;
264
+ fieldValues.set("_url", urlText);
265
+ fieldValues.set("_timeoutMs", "10000");
266
+ fieldValues.set("_body", '""');
267
+ fieldValues.set("_json", "false");
268
+ fieldValues.set("_insecure", "false");
269
+ fieldValues.set("_caCert", '""');
270
+ const opts = ctorArgs[2];
271
+ if (opts && ts.isObjectLiteralExpression(opts)) {
272
+ for (const prop of opts.properties) {
273
+ if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name))
274
+ continue;
275
+ const name = prop.name.text;
276
+ if (name === "timeoutMs" && ts.isNumericLiteral(prop.initializer)) {
277
+ fieldValues.set("_timeoutMs", prop.initializer.text.replace(/_/g, ""));
278
+ }
279
+ else if (name === "body" || name === "caCert") {
280
+ // Literal, or an identifier resolving to a top-level string const
281
+ // (the PEM-as-const pattern the hardware suite uses).
282
+ if (ts.isStringLiteral(prop.initializer)) {
283
+ fieldValues.set("_" + name, JSON.stringify(prop.initializer.text));
284
+ }
285
+ else if (ts.isIdentifier(prop.initializer) && sourceFile) {
286
+ const lit = topLevelStringConst(sourceFile, prop.initializer.text);
287
+ if (lit !== null)
288
+ fieldValues.set("_" + name, JSON.stringify(lit));
289
+ }
290
+ }
291
+ else if (name === "json" || name === "insecure") {
292
+ fieldValues.set("_" + name, prop.initializer.kind === ts.SyntaxKind.TrueKeyword ? "true" : "false");
293
+ }
294
+ }
295
+ }
296
+ return fieldValues;
297
+ }
228
298
  export function httpUrlArgText(arg) {
229
299
  if (ts.isStringLiteral(arg) || ts.isNoSubstitutionTemplateLiteral(arg))
230
300
  return JSON.stringify(arg.text);
@@ -242,7 +312,7 @@ export function resolveHALReceiver(receiver) {
242
312
  const inst = halInstances.get(receiver.text);
243
313
  if (inst)
244
314
  return inst;
245
- // Metadata-driven singleton resolution (e.g., ADC, EEPROM, WDT)
315
+ // Metadata-driven singleton resolution (e.g., ADC, WDT)
246
316
  const singleton = halSingletons.get(receiver.text);
247
317
  if (singleton) {
248
318
  if (singleton.includes) {
@@ -265,13 +335,35 @@ export function resolveHALReceiver(receiver) {
265
335
  if (mappedName) {
266
336
  const canonical = name.toUpperCase();
267
337
  if (canonical.startsWith("UART"))
268
- return { className: "SerialPort", fieldValues: new Map([["_port", mappedName]]) };
338
+ return {
339
+ className: "UART",
340
+ fieldValues: new Map([["_port", mappedName], ["_bus", mappedName], ["_baud", "115200"], ["_rxBufferBytes", "64"]]),
341
+ };
342
+ if (canonical.startsWith("USB"))
343
+ return { className: "USBConsole", fieldValues: new Map([["_port", mappedName]]) };
269
344
  if (canonical.startsWith("I2C"))
270
345
  return { className: "I2CBus", fieldValues: new Map([["_bus", mappedName]]) };
271
346
  if (canonical.startsWith("SPI"))
272
347
  return { className: "SPIBus", fieldValues: new Map([["_bus", mappedName]]) };
273
348
  }
274
- // Bare pin resolution (D0, A0, etc.) — enriched with MCU port name
349
+ // Board-module pin constant (LED, BUTTON, D0, A0, connector labels,
350
+ // datasheet-named pins — anything the generated board manifest maps
351
+ // through pins.aliases.*). Checked BEFORE the legacy Arduino D/A
352
+ // arithmetic below: the alias carries the board's actual wiring, which
353
+ // the Arduino-style offset math cannot know (the XIAO's D0 is
354
+ // gpio0.2, not Arduino pin 0).
355
+ const aliasNum = pinAliasMap.get(name);
356
+ if (getCurrentBoardConstants() && aliasNum !== undefined) {
357
+ const portName = mcuPinReverseMap.get(aliasNum);
358
+ const fields = new Map([["_pin", aliasNum]]);
359
+ if (portName)
360
+ fields.set("_port", portName);
361
+ const inst = { className: "Pin", fieldValues: fields };
362
+ halInstances.set(name, inst);
363
+ return inst;
364
+ }
365
+ // Legacy Arduino-style D/A fallback (no board manifest — the old
366
+ // package-less path or bare-silicon configs).
275
367
  const dMatch = name.match(/^D(\d+)$/);
276
368
  if (dMatch) {
277
369
  const arduinoPin = dMatch[1];
@@ -323,11 +415,18 @@ export function resolveHALReceiver(receiver) {
323
415
  const returnClassName = methodName === "asOutput" ? "OutputPin" : "InputPin";
324
416
  return { className: returnClassName, fieldValues: new Map(innerInstance.fieldValues) };
325
417
  }
326
- // Specialized handling for device() factory pattern (I2CBus/SPIBus -> I2CDevice/SPIDevice)
418
+ // Specialized handling for device() factory pattern (I2CBus/SPIBus -> I2CTarget/SPITarget)
327
419
  // This allows propagating the address/CS pin from the call argument to the new instance.
328
420
  if (methodName === "device" && (innerInstance.className === "I2CBus" || innerInstance.className === "SPIBus") && receiver.arguments.length > 0) {
329
- const returnClassName = innerInstance.className === "SPIBus" ? "SPIDevice" : "I2CDevice";
421
+ const isSpi = innerInstance.className === "SPIBus";
422
+ const returnClassName = isSpi ? "SPITarget" : "I2CTarget";
330
423
  const fieldValues = new Map(innerInstance.fieldValues);
424
+ // The targets' __default_fields channel does not reach factory-made
425
+ // instances; carry the class defaults so `this._hz`/`this._mode`
426
+ // resolve in the inlined method bodies.
427
+ fieldValues.set("_hz", isSpi ? "1000000" : "0");
428
+ if (isSpi)
429
+ fieldValues.set("_mode", "0");
331
430
  const arg = receiver.arguments[0];
332
431
  let argVal = null;
333
432
  if (ts.isNumericLiteral(arg))
@@ -360,22 +459,6 @@ export function resolveHALReceiver(receiver) {
360
459
  return { className: "ToneChain", fieldValues };
361
460
  }
362
461
  }
363
- // Specialized handling for Http factory chaining
364
- // (Http.get(url).header(...).send()): the factory records the HTTP
365
- // verb and URL into the HttpRequest instance so send() can resolve
366
- // this._method / this._url.
367
- if (innerInstance.className === "HttpClass") {
368
- const verb = httpFactoryVerb(methodName);
369
- if (verb && receiver.arguments.length > 0) {
370
- const urlText = httpUrlArgText(receiver.arguments[0]);
371
- if (urlText) {
372
- return {
373
- className: "HttpRequest",
374
- fieldValues: new Map([["_method", verb], ["_url", urlText]]),
375
- };
376
- }
377
- }
378
- }
379
462
  // Specialized handling for BLE factory chaining
380
463
  // (Ble.server(name).characteristic(uuid,type,perms).onRead(handler)):
381
464
  // server() creates a BleServer. The characteristic index is taken from a
@@ -431,6 +514,11 @@ export function resolveHALReceiver(receiver) {
431
514
  // Inline new expression: new Pin(x).method()
432
515
  if (ts.isNewExpression(receiver) && ts.isIdentifier(receiver.expression)) {
433
516
  const className = receiver.expression.text;
517
+ if (className === "Request") {
518
+ const reqFields = requestCtorFields(receiver.arguments, receiver.getSourceFile());
519
+ if (reqFields)
520
+ return { className, fieldValues: reqFields };
521
+ }
434
522
  const classEntry = halClassRegistry.get(className);
435
523
  if (!classEntry)
436
524
  return null;
@@ -474,8 +562,12 @@ export function resolveHALReceiver(receiver) {
474
562
  }
475
563
  // I2C/SPI device factory: bus → device with address/cs from args
476
564
  if (entry.method === "device" && (resolvedInst.className === "I2CBus" || resolvedInst.className === "SPIBus")) {
477
- const returnClassName = resolvedInst.className === "SPIBus" ? "SPIDevice" : "I2CDevice";
565
+ const isSpi = resolvedInst.className === "SPIBus";
566
+ const returnClassName = isSpi ? "SPITarget" : "I2CTarget";
478
567
  const fieldValues = new Map(resolvedInst.fieldValues);
568
+ fieldValues.set("_hz", isSpi ? "1000000" : "0");
569
+ if (isSpi)
570
+ fieldValues.set("_mode", "0");
479
571
  const fieldName = resolvedInst.className === "SPIBus" ? "_cs" : "_address";
480
572
  if (entry.args && entry.args.length > 0) {
481
573
  // Resolve identifier args (e.g. D10 → 10) via halInstances.
@@ -2,7 +2,6 @@ import ts from "typescript";
2
2
  import { HALOpIR } from "../../api/index.js";
3
3
  import { HALInstance } from "./hal-parser.js";
4
4
  import type { ExpressionIR } from "../../api/index.js";
5
- /** Resolve a single argument from a semantic call's AST node list. */
6
5
  export declare function resolveSemanticArg(args: readonly ts.Expression[], idx: number, instance: HALInstance, paramNames: string[], callArgTexts: string[], paramDefaults: Map<string, string> | undefined): string | null;
7
6
  /** Resolve a numeric argument, returning its numeric value or null. */
8
7
  export declare function resolveNumericArg(args: readonly ts.Expression[], idx: number, instance: HALInstance, paramNames: string[], callArgTexts: string[], paramDefaults: Map<string, string> | undefined): number | null;