@scriptc/compiler 0.4.8 → 0.4.9

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 (536) hide show
  1. package/ambient/node-fallback/buffer.d.ts +2 -0
  2. package/ambient/node-fallback/child_process.d.ts +9 -3
  3. package/ambient/node-fallback/dns-promises.d.ts +25 -0
  4. package/ambient/node-fallback/dns.d.ts +29 -0
  5. package/ambient/node-fallback/test.d.ts +7 -0
  6. package/ambient/scriptc-node-fallback.d.ts +145 -2
  7. package/ambient/scriptc-overrides.d.ts +22 -13
  8. package/dist/backend/build-cache.d.ts +1 -1
  9. package/dist/backend/build-cache.js +1 -1
  10. package/dist/backend/build-cache.js.map +1 -1
  11. package/dist/backend/cache-root.d.ts +7 -0
  12. package/dist/backend/cache-root.js +27 -0
  13. package/dist/backend/cache-root.js.map +1 -1
  14. package/dist/backend/executable-features.js +5 -1
  15. package/dist/backend/executable-features.js.map +1 -1
  16. package/dist/backend/link-plan.js +7 -1
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/bytes-loop-versions.d.ts +12 -1
  19. package/dist/backend/llvm/bytes-loop-versions.js +107 -30
  20. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  21. package/dist/backend/llvm/bytes-loop-versions.test.js +96 -0
  22. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  23. package/dist/backend/llvm/checked-value-lifetimes.js +1 -0
  24. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  25. package/dist/backend/llvm/classes.d.ts +16 -5
  26. package/dist/backend/llvm/classes.js +34 -6
  27. package/dist/backend/llvm/classes.js.map +1 -1
  28. package/dist/backend/llvm/classes.test.js +21 -2
  29. package/dist/backend/llvm/classes.test.js.map +1 -1
  30. package/dist/backend/llvm/common.d.ts +9 -0
  31. package/dist/backend/llvm/common.js +9 -0
  32. package/dist/backend/llvm/common.js.map +1 -1
  33. package/dist/backend/llvm/cpu-dispatch.d.ts +36 -2
  34. package/dist/backend/llvm/cpu-dispatch.js +96 -2
  35. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  36. package/dist/backend/llvm/dense-array-access.d.ts +5 -2
  37. package/dist/backend/llvm/dense-array-access.js +16 -12
  38. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  39. package/dist/backend/llvm/dense-array-access.test.js +3 -1
  40. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  41. package/dist/backend/llvm/dyn.d.ts +24 -0
  42. package/dist/backend/llvm/dyn.js +117 -3
  43. package/dist/backend/llvm/dyn.js.map +1 -1
  44. package/dist/backend/llvm/emit-function.js +6 -0
  45. package/dist/backend/llvm/emit-function.js.map +1 -1
  46. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  47. package/dist/backend/llvm/emit-journal.js.map +1 -1
  48. package/dist/backend/llvm/emit-module.js +48 -5
  49. package/dist/backend/llvm/emit-module.js.map +1 -1
  50. package/dist/backend/llvm/emit-module.test.js +41 -0
  51. package/dist/backend/llvm/emit-module.test.js.map +1 -1
  52. package/dist/backend/llvm/emit-statements.js +11 -0
  53. package/dist/backend/llvm/emit-statements.js.map +1 -1
  54. package/dist/backend/llvm/emitter.d.ts +87 -7
  55. package/dist/backend/llvm/emitter.js +136 -15
  56. package/dist/backend/llvm/emitter.js.map +1 -1
  57. package/dist/backend/llvm/expr-async.js +28 -6
  58. package/dist/backend/llvm/expr-async.js.map +1 -1
  59. package/dist/backend/llvm/expr-containers.js +19 -5
  60. package/dist/backend/llvm/expr-containers.js.map +1 -1
  61. package/dist/backend/llvm/expr-dynamic.js +29 -1
  62. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  63. package/dist/backend/llvm/expr-primitives.js +104 -6
  64. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  65. package/dist/backend/llvm/expr-records.js +15 -1
  66. package/dist/backend/llvm/expr-records.js.map +1 -1
  67. package/dist/backend/llvm/expr-stream-bridges.js +53 -5
  68. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  69. package/dist/backend/llvm/inline-arrays.js +1 -1
  70. package/dist/backend/llvm/inline-arrays.js.map +1 -1
  71. package/dist/backend/llvm/js-ic.js +126 -2
  72. package/dist/backend/llvm/js-ic.js.map +1 -1
  73. package/dist/backend/llvm/lanes.d.ts +38 -0
  74. package/dist/backend/llvm/lanes.js +778 -0
  75. package/dist/backend/llvm/lanes.js.map +1 -0
  76. package/dist/backend/llvm/lanes.test.d.ts +1 -0
  77. package/dist/backend/llvm/lanes.test.js +402 -0
  78. package/dist/backend/llvm/lanes.test.js.map +1 -0
  79. package/dist/backend/llvm/lib-dispatch.js +9 -4
  80. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/lib-network.js +20 -0
  82. package/dist/backend/llvm/lib-network.js.map +1 -1
  83. package/dist/backend/llvm/lib-shared.js +27 -0
  84. package/dist/backend/llvm/lib-shared.js.map +1 -1
  85. package/dist/backend/llvm/lib-test.js +11 -0
  86. package/dist/backend/llvm/lib-test.js.map +1 -1
  87. package/dist/backend/llvm/local-array-reads.js +2 -2
  88. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  89. package/dist/backend/llvm/map-number-lookup.js +8 -2
  90. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  91. package/dist/backend/llvm/nullable-unions.js +5 -2
  92. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  93. package/dist/backend/llvm/publish.d.ts +3 -0
  94. package/dist/backend/llvm/publish.js +2 -2
  95. package/dist/backend/llvm/publish.js.map +1 -1
  96. package/dist/backend/llvm/reference-writes.js +1 -0
  97. package/dist/backend/llvm/reference-writes.js.map +1 -1
  98. package/dist/backend/llvm/region-groups.js +43 -4
  99. package/dist/backend/llvm/region-groups.js.map +1 -1
  100. package/dist/backend/llvm/region-groups.test.js +79 -0
  101. package/dist/backend/llvm/region-groups.test.js.map +1 -1
  102. package/dist/backend/llvm/runtime-registries.test.js +32 -1
  103. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  104. package/dist/backend/llvm/shapes.js +10 -1
  105. package/dist/backend/llvm/shapes.js.map +1 -1
  106. package/dist/backend/llvm/string-reads.d.ts +1 -1
  107. package/dist/backend/llvm/string-reads.js +1 -1
  108. package/dist/backend/llvm/string-reads.js.map +1 -1
  109. package/dist/backend/llvm/unwind-abi.js +24 -2
  110. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  111. package/dist/backend/llvm/unwind-abi.test.js +38 -0
  112. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  113. package/dist/backend/llvm/walkers.d.ts +3 -0
  114. package/dist/backend/llvm/walkers.js +20 -2
  115. package/dist/backend/llvm/walkers.js.map +1 -1
  116. package/dist/backend/native/contracts.d.ts +15 -3
  117. package/dist/backend/native/executable.js +19 -5
  118. package/dist/backend/native/executable.js.map +1 -1
  119. package/dist/backend/native-codegen-core.d.ts +20 -0
  120. package/dist/backend/native-codegen-core.js +15 -0
  121. package/dist/backend/native-codegen-core.js.map +1 -1
  122. package/dist/backend/native-codegen.d.ts +5 -0
  123. package/dist/backend/native-codegen.js +62 -8
  124. package/dist/backend/native-codegen.js.map +1 -1
  125. package/dist/backend/native-codegen.test.js +48 -8
  126. package/dist/backend/native-codegen.test.js.map +1 -1
  127. package/dist/backend/native-link-info-core.d.ts +27 -3
  128. package/dist/backend/native-link-info-core.js.map +1 -1
  129. package/dist/backend/native-link-info.test.js +17 -1
  130. package/dist/backend/native-link-info.test.js.map +1 -1
  131. package/dist/backend/native-toolchain.d.ts +1 -1
  132. package/dist/backend/native-toolchain.js +1 -1
  133. package/dist/backend/native-toolchain.js.map +1 -1
  134. package/dist/backend/native-toolchain.test.js +14 -1
  135. package/dist/backend/native-toolchain.test.js.map +1 -1
  136. package/dist/backend/runtime-pack-core.d.ts +9 -3
  137. package/dist/backend/runtime-pack-core.js +6 -1
  138. package/dist/backend/runtime-pack-core.js.map +1 -1
  139. package/dist/backend/runtime-pack.test.js +32 -1
  140. package/dist/backend/runtime-pack.test.js.map +1 -1
  141. package/dist/backend/targets.d.ts +9 -1
  142. package/dist/backend/targets.js +11 -2
  143. package/dist/backend/targets.js.map +1 -1
  144. package/dist/backend/targets.test.js +6 -0
  145. package/dist/backend/targets.test.js.map +1 -1
  146. package/dist/cli/command.js +15 -1
  147. package/dist/cli/command.js.map +1 -1
  148. package/dist/cli/host.d.ts +6 -0
  149. package/dist/cli/mcp.d.ts +72 -0
  150. package/dist/cli/mcp.js +601 -0
  151. package/dist/cli/mcp.js.map +1 -0
  152. package/dist/cli/mcp.test.d.ts +1 -0
  153. package/dist/cli/mcp.test.js +380 -0
  154. package/dist/cli/mcp.test.js.map +1 -0
  155. package/dist/cli/output-options.d.ts +1 -0
  156. package/dist/cli/output-options.js +3 -0
  157. package/dist/cli/output-options.js.map +1 -1
  158. package/dist/cli/usage.d.ts +51 -1
  159. package/dist/cli/usage.js +709 -186
  160. package/dist/cli/usage.js.map +1 -1
  161. package/dist/compat/fetch-profile.js +9 -4
  162. package/dist/compat/fetch-profile.js.map +1 -1
  163. package/dist/compile-types.d.ts +17 -0
  164. package/dist/coverage/report.d.ts +5 -9
  165. package/dist/coverage/report.js.map +1 -1
  166. package/dist/executable/executable-cache.d.ts +17 -3
  167. package/dist/executable/executable-cache.js +17 -3
  168. package/dist/executable/executable-cache.js.map +1 -1
  169. package/dist/executable/prepare.js +87 -10
  170. package/dist/executable/prepare.js.map +1 -1
  171. package/dist/frontend/analysis.js +3 -2
  172. package/dist/frontend/analysis.js.map +1 -1
  173. package/dist/frontend/canon-map.js +13 -8
  174. package/dist/frontend/canon-map.js.map +1 -1
  175. package/dist/frontend/decl-projection.d.ts +18 -0
  176. package/dist/frontend/decl-projection.js +90 -22
  177. package/dist/frontend/decl-projection.js.map +1 -1
  178. package/dist/frontend/decl-projection.test.js +47 -1
  179. package/dist/frontend/decl-projection.test.js.map +1 -1
  180. package/dist/frontend/default-library.d.ts +10 -0
  181. package/dist/frontend/default-library.js +43 -0
  182. package/dist/frontend/default-library.js.map +1 -0
  183. package/dist/frontend/fork-target.js +54 -9
  184. package/dist/frontend/fork-target.js.map +1 -1
  185. package/dist/frontend/fork-target.test.js +82 -0
  186. package/dist/frontend/fork-target.test.js.map +1 -1
  187. package/dist/frontend/inferred-js-diagnostics.test.js +73 -0
  188. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  189. package/dist/frontend/lowering/abstract-equality.d.ts +2 -1
  190. package/dist/frontend/lowering/abstract-equality.js +7 -1
  191. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  192. package/dist/frontend/lowering/array-values.js +2 -2
  193. package/dist/frontend/lowering/array-values.js.map +1 -1
  194. package/dist/frontend/lowering/assertion-members.js +52 -2
  195. package/dist/frontend/lowering/assertion-members.js.map +1 -1
  196. package/dist/frontend/lowering/builtin-namespaces.d.ts +5 -0
  197. package/dist/frontend/lowering/builtin-namespaces.js +19 -12
  198. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  199. package/dist/frontend/lowering/builtins/callable-aliases.js +42 -6
  200. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  201. package/dist/frontend/lowering/builtins/child-process.d.ts +12 -11
  202. package/dist/frontend/lowering/builtins/child-process.js +235 -38
  203. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/compression.d.ts +6 -1
  205. package/dist/frontend/lowering/builtins/compression.js +3 -3
  206. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/constants.js +2 -2
  208. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/crypto.d.ts +3 -1
  210. package/dist/frontend/lowering/builtins/crypto.js +9 -1
  211. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/dates.js +26 -6
  213. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  214. package/dist/frontend/lowering/builtins/environment.d.ts +13 -1
  215. package/dist/frontend/lowering/builtins/environment.js +15 -4
  216. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/module-bindings.d.ts +33 -0
  218. package/dist/frontend/lowering/builtins/module-bindings.js +213 -11
  219. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-resolution.d.ts +9 -2
  221. package/dist/frontend/lowering/builtins/module-resolution.js +187 -19
  222. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/performance.js +1 -1
  224. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/process.js +40 -2
  226. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  227. package/dist/frontend/lowering/builtins/promises.js +33 -0
  228. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  229. package/dist/frontend/lowering/builtins/readline.d.ts +9 -5
  230. package/dist/frontend/lowering/builtins/readline.js +184 -75
  231. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  232. package/dist/frontend/lowering/builtins/url.d.ts +4 -0
  233. package/dist/frontend/lowering/builtins/url.js +6 -0
  234. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  235. package/dist/frontend/lowering/call-arguments.js +15 -0
  236. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  237. package/dist/frontend/lowering/callable-properties.d.ts +34 -0
  238. package/dist/frontend/lowering/callable-properties.js +210 -0
  239. package/dist/frontend/lowering/callable-properties.js.map +1 -0
  240. package/dist/frontend/lowering/cjs-inline-require.d.ts +16 -0
  241. package/dist/frontend/lowering/cjs-inline-require.js +105 -0
  242. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  243. package/dist/frontend/lowering/cjs-inline-require.test.d.ts +1 -0
  244. package/dist/frontend/lowering/cjs-inline-require.test.js +61 -0
  245. package/dist/frontend/lowering/cjs-inline-require.test.js.map +1 -0
  246. package/dist/frontend/lowering/class-dynamic-dispatch.js +82 -2
  247. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  248. package/dist/frontend/lowering/class-protocols.d.ts +57 -4
  249. package/dist/frontend/lowering/class-protocols.js +597 -30
  250. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  251. package/dist/frontend/lowering/class-unions.js +2 -2
  252. package/dist/frontend/lowering/class-unions.js.map +1 -1
  253. package/dist/frontend/lowering/coercions/function-adapters.d.ts +12 -0
  254. package/dist/frontend/lowering/coercions/function-adapters.js +62 -0
  255. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  256. package/dist/frontend/lowering/coercions/structural-plans.js +56 -1
  257. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  258. package/dist/frontend/lowering/coercions/structural.js +9 -4
  259. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  260. package/dist/frontend/lowering/collection-ingestion.d.ts +9 -0
  261. package/dist/frontend/lowering/collection-ingestion.js +115 -41
  262. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  263. package/dist/frontend/lowering/containers/array-callbacks.js +16 -0
  264. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  265. package/dist/frontend/lowering/containers/bytes.js +66 -10
  266. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  267. package/dist/frontend/lowering/containers/collection-methods.js +61 -5
  268. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  269. package/dist/frontend/lowering/containers/filter-predicates.js +11 -0
  270. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  271. package/dist/frontend/lowering/containers/indexed-objects.d.ts +15 -0
  272. package/dist/frontend/lowering/containers/indexed-objects.js +213 -30
  273. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  274. package/dist/frontend/lowering/error-name-order.d.ts +16 -0
  275. package/dist/frontend/lowering/error-name-order.js +61 -0
  276. package/dist/frontend/lowering/error-name-order.js.map +1 -1
  277. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +17 -0
  278. package/dist/frontend/lowering/expressions/asserted-receiver.js +123 -1
  279. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -1
  280. package/dist/frontend/lowering/expressions/binary.js +147 -20
  281. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  282. package/dist/frontend/lowering/expressions/element-access.js +63 -14
  283. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  284. package/dist/frontend/lowering/expressions/erased-delete.d.ts +59 -0
  285. package/dist/frontend/lowering/expressions/erased-delete.js +247 -0
  286. package/dist/frontend/lowering/expressions/erased-delete.js.map +1 -0
  287. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +10 -0
  288. package/dist/frontend/lowering/expressions/hosted-narrowing.js +48 -1
  289. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  290. package/dist/frontend/lowering/expressions/identifiers.js +20 -0
  291. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/narrowing.d.ts +7 -2
  293. package/dist/frontend/lowering/expressions/narrowing.js +77 -45
  294. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/object-literals.js +62 -19
  296. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/optional-chains.js +19 -0
  298. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/property-access.d.ts +7 -7
  300. package/dist/frontend/lowering/expressions/property-access.js +247 -48
  301. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  302. package/dist/frontend/lowering/expressions/relational.d.ts +1 -0
  303. package/dist/frontend/lowering/expressions/relational.js +18 -8
  304. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  305. package/dist/frontend/lowering/expressions/union-fields.js +11 -5
  306. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  307. package/dist/frontend/lowering/expressions/updates.js +121 -11
  308. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  309. package/dist/frontend/lowering/function-context.d.ts +10 -0
  310. package/dist/frontend/lowering/function-context.js +36 -0
  311. package/dist/frontend/lowering/function-context.js.map +1 -1
  312. package/dist/frontend/lowering/function-returns.js +8 -8
  313. package/dist/frontend/lowering/function-returns.js.map +1 -1
  314. package/dist/frontend/lowering/handle-properties.d.ts +62 -3
  315. package/dist/frontend/lowering/handle-properties.js +674 -26
  316. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  317. package/dist/frontend/lowering/handle-properties.test.js +95 -2
  318. package/dist/frontend/lowering/handle-properties.test.js.map +1 -1
  319. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  320. package/dist/frontend/lowering/lower-builtin-values.js +44 -0
  321. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  322. package/dist/frontend/lowering/lower-calls.js +328 -136
  323. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  324. package/dist/frontend/lowering/lower-classes.js +82 -17
  325. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  326. package/dist/frontend/lowering/lower-event-emitter.js +113 -9
  327. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  328. package/dist/frontend/lowering/lower-expando.d.ts +13 -21
  329. package/dist/frontend/lowering/lower-expando.js +90 -126
  330. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  331. package/dist/frontend/lowering/lower-exprs.js +2 -2
  332. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  333. package/dist/frontend/lowering/lower-functions.js +65 -0
  334. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  335. package/dist/frontend/lowering/lower-inspect.js +471 -0
  336. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  337. package/dist/frontend/lowering/lower-modules.js +36 -10
  338. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  339. package/dist/frontend/lowering/lower-node-island.js +28 -0
  340. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  341. package/dist/frontend/lowering/lower-server.d.ts +53 -7
  342. package/dist/frontend/lowering/lower-server.js +213 -42
  343. package/dist/frontend/lowering/lower-server.js.map +1 -1
  344. package/dist/frontend/lowering/lower-stdlib.js +50 -7
  345. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  346. package/dist/frontend/lowering/lower-stmts.d.ts +24 -0
  347. package/dist/frontend/lowering/lower-stmts.js +463 -220
  348. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  349. package/dist/frontend/lowering/lower-stream.js +2 -2
  350. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  351. package/dist/frontend/lowering/lower-test.js +71 -2
  352. package/dist/frontend/lowering/lower-test.js.map +1 -1
  353. package/dist/frontend/lowering/lowerer.d.ts +81 -10
  354. package/dist/frontend/lowering/lowerer.js +319 -72
  355. package/dist/frontend/lowering/lowerer.js.map +1 -1
  356. package/dist/frontend/lowering/new-target.js +10 -2
  357. package/dist/frontend/lowering/new-target.js.map +1 -1
  358. package/dist/frontend/lowering/nullish-empty-pattern.js +3 -3
  359. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -1
  360. package/dist/frontend/lowering/partial-assertions.js +30 -5
  361. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  362. package/dist/frontend/lowering/primitive-throws.js +91 -1
  363. package/dist/frontend/lowering/primitive-throws.js.map +1 -1
  364. package/dist/frontend/lowering/primitive-wrappers.d.ts +9 -0
  365. package/dist/frontend/lowering/primitive-wrappers.js +2 -2
  366. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  367. package/dist/frontend/lowering/promise-executor-adapter.js +5 -2
  368. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
  369. package/dist/frontend/lowering/record-links.js +7 -2
  370. package/dist/frontend/lowering/record-links.js.map +1 -1
  371. package/dist/frontend/lowering/surfaces.d.ts +4 -0
  372. package/dist/frontend/lowering/surfaces.js +118 -2
  373. package/dist/frontend/lowering/surfaces.js.map +1 -1
  374. package/dist/frontend/lowering/surfaces.test.d.ts +1 -0
  375. package/dist/frontend/lowering/surfaces.test.js +31 -0
  376. package/dist/frontend/lowering/surfaces.test.js.map +1 -0
  377. package/dist/frontend/mock-shapes.js +3 -3
  378. package/dist/frontend/mock-shapes.js.map +1 -1
  379. package/dist/frontend/npm-static-ladder.d.ts +21 -0
  380. package/dist/frontend/npm-static-ladder.js +2 -0
  381. package/dist/frontend/npm-static-ladder.js.map +1 -0
  382. package/dist/frontend/npm-static-ladder.test.d.ts +1 -0
  383. package/dist/frontend/npm-static-ladder.test.js +138 -0
  384. package/dist/frontend/npm-static-ladder.test.js.map +1 -0
  385. package/dist/frontend/npm-static-status.d.ts +15 -0
  386. package/dist/frontend/npm-static-status.js +2 -0
  387. package/dist/frontend/npm-static-status.js.map +1 -0
  388. package/dist/frontend/package-shims.js +1 -1
  389. package/dist/frontend/package-shims.js.map +1 -1
  390. package/dist/frontend/pipeline.d.ts +1 -1
  391. package/dist/frontend/pipeline.js +222 -25
  392. package/dist/frontend/pipeline.js.map +1 -1
  393. package/dist/frontend/program-analysis.d.ts +4 -0
  394. package/dist/frontend/program-analysis.js +6 -0
  395. package/dist/frontend/program-analysis.js.map +1 -1
  396. package/dist/frontend/program.js +258 -32
  397. package/dist/frontend/program.js.map +1 -1
  398. package/dist/frontend/program.test.js +30 -0
  399. package/dist/frontend/program.test.js.map +1 -1
  400. package/dist/frontend/resolve.js +29 -5
  401. package/dist/frontend/resolve.js.map +1 -1
  402. package/dist/frontend/resolve.test.js +40 -0
  403. package/dist/frontend/resolve.test.js.map +1 -1
  404. package/dist/frontend/services.d.ts +8 -0
  405. package/dist/frontend/services.js +7 -0
  406. package/dist/frontend/services.js.map +1 -1
  407. package/dist/frontend/ts7/checker.d.ts +7 -0
  408. package/dist/frontend/ts7/checker.js +12 -0
  409. package/dist/frontend/ts7/checker.js.map +1 -1
  410. package/dist/frontend/ts7/checker.test.js +1 -0
  411. package/dist/frontend/ts7/checker.test.js.map +1 -1
  412. package/dist/frontend/ts7/program-host.d.ts +39 -2
  413. package/dist/frontend/ts7/program-host.js +62 -8
  414. package/dist/frontend/ts7/program-host.js.map +1 -1
  415. package/dist/frontend/ts7/program-host.test.js +33 -0
  416. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  417. package/dist/frontend/ts7/session-cache.d.ts +5 -1
  418. package/dist/frontend/ts7/session-cache.js +7 -1
  419. package/dist/frontend/ts7/session-cache.js.map +1 -1
  420. package/dist/frontend/ts7/session-cache.test.js +37 -0
  421. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  422. package/dist/frontend/ts7/session.js +19 -1
  423. package/dist/frontend/ts7/session.js.map +1 -1
  424. package/dist/frontend/ts7/source-parser.d.ts +17 -2
  425. package/dist/frontend/ts7/source-parser.js +61 -2
  426. package/dist/frontend/ts7/source-parser.js.map +1 -1
  427. package/dist/frontend/ts7/source-parser.test.js +55 -2
  428. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  429. package/dist/frontend/tsc-codes.d.ts +3 -2
  430. package/dist/frontend/tsc-codes.js +129 -22
  431. package/dist/frontend/tsc-codes.js.map +1 -1
  432. package/dist/frontend/type-mapper.d.ts +5 -11
  433. package/dist/frontend/type-mapper.js +380 -70
  434. package/dist/frontend/type-mapper.js.map +1 -1
  435. package/dist/index.d.ts +1 -1
  436. package/dist/index.js +67 -7
  437. package/dist/index.js.map +1 -1
  438. package/dist/ir/builtin-effects.js +29 -0
  439. package/dist/ir/builtin-effects.js.map +1 -1
  440. package/dist/ir/builtin-signatures.d.ts +1 -1
  441. package/dist/ir/builtin-signatures.js +72 -6
  442. package/dist/ir/builtin-signatures.js.map +1 -1
  443. package/dist/ir/codec.generated.d.ts +1 -1
  444. package/dist/ir/codec.generated.js +321 -263
  445. package/dist/ir/codec.generated.js.map +1 -1
  446. package/dist/ir/constant-length-clones.d.ts +26 -0
  447. package/dist/ir/constant-length-clones.js +589 -0
  448. package/dist/ir/constant-length-clones.js.map +1 -0
  449. package/dist/ir/constant-length-clones.test.d.ts +1 -0
  450. package/dist/ir/constant-length-clones.test.js +292 -0
  451. package/dist/ir/constant-length-clones.test.js.map +1 -0
  452. package/dist/ir/constant-tables.d.ts +10 -5
  453. package/dist/ir/constant-tables.js +83 -17
  454. package/dist/ir/constant-tables.js.map +1 -1
  455. package/dist/ir/constant-tables.test.js +58 -1
  456. package/dist/ir/constant-tables.test.js.map +1 -1
  457. package/dist/ir/fields.generated.js +5 -2
  458. package/dist/ir/fields.generated.js.map +1 -1
  459. package/dist/ir/function-references.js +2 -0
  460. package/dist/ir/function-references.js.map +1 -1
  461. package/dist/ir/function-references.test.js +13 -0
  462. package/dist/ir/function-references.test.js.map +1 -1
  463. package/dist/ir/integer-loops.js +1 -0
  464. package/dist/ir/integer-loops.js.map +1 -1
  465. package/dist/ir/integer-loops.test.js +16 -0
  466. package/dist/ir/integer-loops.test.js.map +1 -1
  467. package/dist/ir/ir.d.ts +50 -6
  468. package/dist/ir/ir.js +44 -2
  469. package/dist/ir/ir.js.map +1 -1
  470. package/dist/ir/ir.test.js +83 -1
  471. package/dist/ir/ir.test.js.map +1 -1
  472. package/dist/ir/js-groups.js +5 -1
  473. package/dist/ir/js-groups.js.map +1 -1
  474. package/dist/ir/js-ic.d.ts +20 -0
  475. package/dist/ir/js-ic.js +81 -4
  476. package/dist/ir/js-ic.js.map +1 -1
  477. package/dist/ir/js-ic.test.js +8 -1
  478. package/dist/ir/js-ic.test.js.map +1 -1
  479. package/dist/ir/lane-plans.d.ts +86 -0
  480. package/dist/ir/lane-plans.js +589 -0
  481. package/dist/ir/lane-plans.js.map +1 -0
  482. package/dist/ir/lane-plans.test.d.ts +1 -0
  483. package/dist/ir/lane-plans.test.js +549 -0
  484. package/dist/ir/lane-plans.test.js.map +1 -0
  485. package/dist/ir/runtime-features.d.ts +68 -10
  486. package/dist/ir/runtime-features.js +285 -17
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/runtime-features.test.js +190 -1
  489. package/dist/ir/runtime-features.test.js.map +1 -1
  490. package/dist/ir/validate.js +61 -24
  491. package/dist/ir/validate.js.map +1 -1
  492. package/dist/native/cache.d.ts +5 -0
  493. package/dist/native/cache.js +23 -1
  494. package/dist/native/cache.js.map +1 -1
  495. package/dist/native/cache.test.js +29 -1
  496. package/dist/native/cache.test.js.map +1 -1
  497. package/dist/native/cli.js +4 -2
  498. package/dist/native/cli.js.map +1 -1
  499. package/dist/native/compiler.d.ts +11 -3
  500. package/dist/native/compiler.js +102 -16
  501. package/dist/native/compiler.js.map +1 -1
  502. package/dist/native/compiler.test.js +244 -2
  503. package/dist/native/compiler.test.js.map +1 -1
  504. package/dist/native/prepare.d.ts +14 -1
  505. package/dist/native/prepare.js +79 -29
  506. package/dist/native/prepare.js.map +1 -1
  507. package/dist/native/sanitizer.test.js +3 -0
  508. package/dist/native/sanitizer.test.js.map +1 -1
  509. package/dist/native/unchanged.d.ts +80 -0
  510. package/dist/native/unchanged.js +301 -0
  511. package/dist/native/unchanged.js.map +1 -0
  512. package/dist/native/unchanged.test.d.ts +1 -0
  513. package/dist/native/unchanged.test.js +249 -0
  514. package/dist/native/unchanged.test.js.map +1 -0
  515. package/dist/node-islands/boundary.d.ts +16 -0
  516. package/dist/node-islands/boundary.js +70 -7
  517. package/dist/node-islands/boundary.js.map +1 -1
  518. package/dist/node-islands/boundary.test.js +59 -14
  519. package/dist/node-islands/boundary.test.js.map +1 -1
  520. package/dist/node-islands/detect.js +203 -47
  521. package/dist/node-islands/detect.js.map +1 -1
  522. package/dist/node-islands/detect.test.js +45 -0
  523. package/dist/node-islands/detect.test.js.map +1 -1
  524. package/dist/node-islands/growth.js +4 -16
  525. package/dist/node-islands/growth.js.map +1 -1
  526. package/dist/node-islands/modules.d.ts +3 -0
  527. package/dist/node-islands/modules.js +143 -12
  528. package/dist/node-islands/modules.js.map +1 -1
  529. package/dist/node-islands/modules.test.js +125 -0
  530. package/dist/node-islands/modules.test.js.map +1 -1
  531. package/dist/node-islands/report.d.ts +1 -1
  532. package/dist/node-islands/report.js +2 -1
  533. package/dist/node-islands/report.js.map +1 -1
  534. package/package.json +20 -20
  535. package/shims/undici/core/request.ts +7 -1
  536. package/surface-manifest.json +380 -2
@@ -0,0 +1,301 @@
1
+ import { readdirSync, statSync } from "node:fs";
2
+ import { delimiter, join, resolve } from "node:path";
3
+ import { profileBlocksPath, recordProfileBlocksPath, } from "../backend/native-profile.js";
4
+ import { toolchainEnvironmentCachePolicy, toolchainEnvironmentFingerprint, } from "../backend/toolchain-environment.js";
5
+ import { frontendInputsStillMatch, validFrontendInputSnapshot, } from "../frontend/input-tracker.js";
6
+ import { contentDigest, fileDigest, NATIVE_STRING_BYTES } from "./cache.js";
7
+ import { identity, stillMatches, validIdentity } from "./executable-cache.js";
8
+ import { nativeFileIdentity } from "./file-identity.js";
9
+ import { nativeFrontendCacheKey } from "./prepare.js";
10
+ /** Highest number of input probes a record may list; a larger one is a miss,
11
+ * which only costs a rebuild. */
12
+ const MAX_PROBES = 200_000;
13
+ function validRecord(value) {
14
+ if (value === null || typeof value !== "object")
15
+ return false;
16
+ const record = value;
17
+ return (record.schema === "scriptc.native-unchanged.v1" &&
18
+ validFrontendInputSnapshot(record.probes) &&
19
+ record.probes.probes.length <= MAX_PROBES &&
20
+ record.output !== undefined &&
21
+ validIdentity(record.output) &&
22
+ record.translationUnit !== undefined &&
23
+ validIdentity(record.translationUnit) &&
24
+ (record.ir === null || (record.ir !== undefined && validIdentity(record.ir))) &&
25
+ Array.isArray(record.beside) &&
26
+ record.beside.every(validIdentity) &&
27
+ Array.isArray(record.packInputs) &&
28
+ record.packInputs.every(validIdentity));
29
+ }
30
+ /** The files a record names, for one existence and identity check. */
31
+ function recordedFiles(record) {
32
+ return [
33
+ record.output,
34
+ record.translationUnit,
35
+ ...(record.ir === null ? [] : [record.ir]),
36
+ ...record.beside,
37
+ ...record.packInputs,
38
+ ];
39
+ }
40
+ /** The identity of the program `command` runs: the linker, the dSYM tool.
41
+ * Null when the command cannot be resolved. */
42
+ function commandIdentity(command) {
43
+ try {
44
+ if (command.includes("/") || command.includes("\\"))
45
+ return nativeFileIdentity(resolve(command));
46
+ for (const directory of (process.env["PATH"] ?? "/usr/bin:/bin").split(delimiter)) {
47
+ const candidate = join(directory || process.cwd(), command);
48
+ try {
49
+ if (statSync(candidate).isFile())
50
+ return nativeFileIdentity(candidate);
51
+ }
52
+ catch {
53
+ /* Try the next PATH entry. */
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /** The digest of a file whose bytes are a build input (a profile, an FFI
63
+ * object): these are replaced in place, so an identity alone would let a
64
+ * rewritten input pass as unchanged. Null when the file cannot be read. */
65
+ function inputDigest(path) {
66
+ try {
67
+ return fileDigest(resolve(path));
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ /** The identity of a file the build may not have: null when it does not
74
+ * exist, so that creating it changes the key. */
75
+ function optionalIdentity(path) {
76
+ try {
77
+ return nativeFileIdentity(path);
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ /** The key of an unchanged build: the frontend cache's inputs (the sources
84
+ * and configuration themselves are proved by the recorded probes, not by the
85
+ * key), the backend tools that produced the kept output, and the files whose
86
+ * bytes determine the code generated — a profile the options name only by
87
+ * path, with the block-count file beside it, and the objects an FFI manifest
88
+ * links. Null when an input cannot be read, when provenance rewriting makes
89
+ * the sources a build product, when the build writes a block-count file (that
90
+ * file comes from the helper, and a kept output would leave it unwritten),
91
+ * when the manifest names a system library or a framework whose file the
92
+ * linker resolves, when the toolchain supplies linker arguments (which the
93
+ * linker resolves against its own search paths), when `SCRIPTC_LINKER` or
94
+ * `SCRIPTC_LLVM_HELPER` selects a wrapper that may bring inputs of its own,
95
+ * when a mutable toolchain variable names files the fingerprint hashes only
96
+ * by spelling, or when it is sanitized (its runtime is compiled from sources
97
+ * outside the pack, which the key does not observe). */
98
+ export function unchangedBuildKey(inputs) {
99
+ const { entry, options, ffi, ffiBytes, toolchain, output, translationUnitPath } = inputs;
100
+ if (recordProfileBlocksPath(process.env) !== undefined)
101
+ return null;
102
+ if (options.sanitize === true)
103
+ return null;
104
+ // `-l<name>` and `-framework <name>` resolve through the linker's search
105
+ // paths, and the key names the manifest's names, not the files they resolve
106
+ // to: the file can be replaced in place and a kept executable would still be
107
+ // the earlier link. The complete-artifact cache refuses that link for the
108
+ // same reason.
109
+ if (ffi !== null && (ffi.systemLibraries.length > 0 || (ffi.frameworks?.length ?? 0) > 0))
110
+ return null;
111
+ // The toolchain's linker arguments are opaque here: a `-l` name, a `-L`
112
+ // directory or a driver name such as `cc` makes the linker resolve archives
113
+ // through search paths the key does not observe, so an archive replaced in
114
+ // place would leave a kept executable from the earlier link. The
115
+ // complete-artifact cache refuses a link that supplies them for the same
116
+ // reason.
117
+ if (toolchain.linkerArgs.length > 0)
118
+ return null;
119
+ // A caller-selected linker or code-generation helper may be a wrapper that
120
+ // brings inputs of its own — the key names the wrapper's file, its arguments
121
+ // and the environment's spelling, not the archives, libraries or plugin
122
+ // files the wrapper reads. The complete-artifact cache and the linker job
123
+ // cache refuse a build that names either one, for the same reason.
124
+ if (process.env["SCRIPTC_LINKER"] !== undefined ||
125
+ process.env["SCRIPTC_LLVM_HELPER"] !== undefined)
126
+ return null;
127
+ // The mutable toolchain variables name files and directories that can change
128
+ // behind a stable spelling — search paths, SDKs, config files, include
129
+ // paths — while the fingerprint only hashes the spelling. The
130
+ // complete-artifact cache refuses those too, through this same policy.
131
+ if (!toolchainEnvironmentCachePolicy().completeArtifacts)
132
+ return null;
133
+ const frontend = nativeFrontendCacheKey(entry, options, ffi, toolchain);
134
+ if (frontend === null)
135
+ return null;
136
+ try {
137
+ const debug = options.optimization === "dev" && options.strip !== true;
138
+ return contentDigest(JSON.stringify({
139
+ schema: 1,
140
+ frontend,
141
+ output: resolve(output),
142
+ translationUnit: resolve(translationUnitPath),
143
+ // The tools that produced the kept output. The compiler, checker and
144
+ // evaluator are covered by the frontend key's implementation identity.
145
+ helper: [
146
+ nativeFileIdentity(toolchain.helperExecutable),
147
+ nativeFileIdentity(join(toolchain.helperPackageRoot, "package.json")),
148
+ ],
149
+ // The pack's manifest selects the artifacts a link consumes; its
150
+ // package.json names the pack.
151
+ runtimePack: [
152
+ nativeFileIdentity(join(toolchain.runtimePackRoot, "package.json")),
153
+ optionalIdentity(join(toolchain.runtimePackRoot, "runtime-pack.json")),
154
+ ],
155
+ linker: [toolchain.linker, toolchain.linkerArgs, commandIdentity(toolchain.linker)],
156
+ dsymutil: debug ? commandIdentity(toolchain.dsymutil) : null,
157
+ environment: toolchainEnvironmentFingerprint(),
158
+ profile: options.profileUse === undefined
159
+ ? null
160
+ : [
161
+ inputDigest(options.profileUse),
162
+ inputDigest(profileBlocksPath(resolve(options.profileUse))),
163
+ ],
164
+ libraries: ffi === null ? null : ffi.libraries.map((path) => [path, inputDigest(path)]),
165
+ ffi: ffiBytes,
166
+ cwd: process.cwd(),
167
+ path: process.env["PATH"] ?? null,
168
+ }));
169
+ }
170
+ catch {
171
+ return null;
172
+ }
173
+ }
174
+ /** The record of an unchanged build under `key`, when the executable and the
175
+ * files beside it are still the ones that build wrote and every input the
176
+ * frontend observed still matches. */
177
+ export function readUnchangedBuild(cache, key, exclusions) {
178
+ if (cache === null)
179
+ return null;
180
+ try {
181
+ const bytes = cache.read("unchanged", key, NATIVE_STRING_BYTES);
182
+ if (bytes === null)
183
+ return null;
184
+ const record = JSON.parse(bytes.toString("utf8"));
185
+ if (!validRecord(record))
186
+ return null;
187
+ if (!frontendInputsStillMatch(record.probes, exclusions))
188
+ return null;
189
+ return stillMatches(recordedFiles(record)) ? record : null;
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ }
195
+ /** Highest number of files a recorded beside directory may hold; a larger one
196
+ * is not recorded, which only costs a rebuild. */
197
+ const MAX_BESIDE_FILES = 4096;
198
+ /** The identities a beside path contributes: the file itself, or, for a
199
+ * directory — a Darwin `.dSYM` bundle — its identity and the identity of every
200
+ * file in it. Tools that edit a build's debug information rewrite the DWARF
201
+ * file in place, which leaves the bundle directory's own identity unchanged;
202
+ * recording only the directory would let a kept executable stand beside debug
203
+ * information of an older build. */
204
+ function besideIdentities(path) {
205
+ try {
206
+ if (!statSync(path).isDirectory())
207
+ return [identity(path)];
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ const identities = [];
213
+ const walk = (directory) => {
214
+ let names;
215
+ try {
216
+ names = readdirSync(directory);
217
+ identities.push(identity(directory));
218
+ }
219
+ catch {
220
+ return false;
221
+ }
222
+ for (const name of names) {
223
+ if (identities.length >= MAX_BESIDE_FILES)
224
+ return false;
225
+ const child = join(directory, name);
226
+ let isDirectory;
227
+ try {
228
+ isDirectory = statSync(child).isDirectory();
229
+ }
230
+ catch {
231
+ return false;
232
+ }
233
+ if (isDirectory) {
234
+ if (!walk(child))
235
+ return false;
236
+ continue;
237
+ }
238
+ try {
239
+ identities.push(identity(child));
240
+ }
241
+ catch {
242
+ return false;
243
+ }
244
+ }
245
+ return true;
246
+ };
247
+ return walk(path) ? identities : null;
248
+ }
249
+ /** Record a completed build, so the next build of the same key keeps its
250
+ * output. The inputs are checked again first: a source edited while the
251
+ * build ran is not unchanged, and the record must not claim it is. */
252
+ export function recordUnchangedBuild(cache, key, exclusions, build) {
253
+ if (cache === null)
254
+ return;
255
+ try {
256
+ if (!frontendInputsStillMatch(build.probes, exclusions))
257
+ return;
258
+ const file = (path) => {
259
+ try {
260
+ return identity(path);
261
+ }
262
+ catch {
263
+ return null;
264
+ }
265
+ };
266
+ const output = file(build.output);
267
+ const translationUnit = file(build.translationUnitPath);
268
+ const ir = build.irPath === null ? null : file(build.irPath);
269
+ if (output === null || translationUnit === null || (build.irPath !== null && ir === null))
270
+ return;
271
+ const beside = [];
272
+ for (const path of build.beside) {
273
+ const installed = besideIdentities(path);
274
+ if (installed === null)
275
+ return;
276
+ beside.push(...installed);
277
+ }
278
+ const packInputs = [];
279
+ for (const path of build.packInputs) {
280
+ const input = file(path);
281
+ if (input === null)
282
+ return;
283
+ packInputs.push(input);
284
+ }
285
+ const record = {
286
+ schema: "scriptc.native-unchanged.v1",
287
+ probes: build.probes,
288
+ output,
289
+ translationUnit,
290
+ ir,
291
+ beside,
292
+ packInputs,
293
+ ...(build.profileMatch === undefined ? {} : { profileMatch: build.profileMatch }),
294
+ };
295
+ cache.write("unchanged", key, JSON.stringify(record));
296
+ }
297
+ catch {
298
+ /* An unavailable cache only prevents reuse. */
299
+ }
300
+ }
301
+ //# sourceMappingURL=unchanged.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unchanged.js","sourceRoot":"","sources":["../../src/native/unchanged.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,249 @@
1
+ import { chmodSync, mkdirSync, mkdtempSync, rmSync, statSync, utimesSync, writeFileSync, } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { afterEach, expect, test } from "vitest";
5
+ import { RECORD_PROFILE_BLOCKS_ENV, profileBlocksPath } from "../backend/native-profile.js";
6
+ import { LINUX_X64_GNU_TARGET } from "../backend/targets.js";
7
+ import { NativeCache } from "./cache.js";
8
+ import { readUnchangedBuild, recordUnchangedBuild, unchangedBuildKey, } from "./unchanged.js";
9
+ const probes = { version: 1, stable: true, probes: [] };
10
+ const roots = [];
11
+ afterEach(() => {
12
+ for (const root of roots.splice(0))
13
+ rmSync(root, { recursive: true, force: true });
14
+ });
15
+ /** A directory the test removes afterwards. */
16
+ function temporary() {
17
+ const root = mkdtempSync(join(tmpdir(), "scriptc-native-unchanged-"));
18
+ roots.push(root);
19
+ return root;
20
+ }
21
+ /** The records of a build that wrote an executable, its LLVM text and the
22
+ * files beside them. */
23
+ function build(directory, beside, packInputs = []) {
24
+ const output = join(directory, "program");
25
+ writeFileSync(output, "executable");
26
+ const translationUnitPath = join(directory, "entry.ll");
27
+ writeFileSync(translationUnitPath, "; llvm");
28
+ const cache = new NativeCache(join(directory, "cache"));
29
+ recordUnchangedBuild(cache, "key", {}, {
30
+ probes,
31
+ output,
32
+ translationUnitPath,
33
+ irPath: null,
34
+ beside,
35
+ packInputs,
36
+ });
37
+ return { cache, output, translationUnitPath };
38
+ }
39
+ test("a rewritten file inside a .dSYM bundle is not the recorded one", () => {
40
+ const directory = temporary();
41
+ const bundle = join(directory, "program.dSYM");
42
+ const dwarf = join(bundle, "Contents/Resources/DWARF/program");
43
+ mkdirSync(join(bundle, "Contents/Resources/DWARF"), { recursive: true });
44
+ writeFileSync(dwarf, "first symbols");
45
+ const { cache } = build(directory, [bundle]);
46
+ expect(readUnchangedBuild(cache, "key", {})).not.toBeNull();
47
+ // A tool that edits the debug information rewrites the DWARF file in
48
+ // place: the bundle directory's own identity does not change.
49
+ const time = statSync(dwarf).mtime;
50
+ writeFileSync(dwarf, "other symbols");
51
+ utimesSync(dwarf, time, time);
52
+ expect(readUnchangedBuild(cache, "key", {})).toBeNull();
53
+ });
54
+ test("a removed file in a .dSYM bundle is not the recorded one", () => {
55
+ const directory = temporary();
56
+ const bundle = join(directory, "program.dSYM");
57
+ const dwarf = join(bundle, "Contents/Resources/DWARF/program");
58
+ mkdirSync(join(bundle, "Contents/Resources/DWARF"), { recursive: true });
59
+ writeFileSync(dwarf, "symbols");
60
+ const { cache } = build(directory, [bundle]);
61
+ expect(readUnchangedBuild(cache, "key", {})).not.toBeNull();
62
+ rmSync(dwarf);
63
+ expect(readUnchangedBuild(cache, "key", {})).toBeNull();
64
+ });
65
+ test("a runtime pack artifact replaced in place is not the one the build linked", () => {
66
+ const directory = temporary();
67
+ const archive = join(directory, "libruntime.a");
68
+ writeFileSync(archive, "first archive");
69
+ const { cache } = build(directory, [], [archive]);
70
+ expect(readUnchangedBuild(cache, "key", {})).not.toBeNull();
71
+ // Same size, same modification time: only the file's other fields tell it
72
+ // was written again.
73
+ const time = statSync(archive).mtime;
74
+ writeFileSync(archive, "other archive");
75
+ utimesSync(archive, time, time);
76
+ expect(readUnchangedBuild(cache, "key", {})).toBeNull();
77
+ });
78
+ function toolchain(directory) {
79
+ const tool = (name) => {
80
+ const path = join(directory, name);
81
+ writeFileSync(path, "#!/bin/sh\n");
82
+ chmodSync(path, 0o755);
83
+ return path;
84
+ };
85
+ const helperPackageRoot = join(directory, "helper");
86
+ mkdirSync(helperPackageRoot);
87
+ writeFileSync(join(helperPackageRoot, "package.json"), '{"name":"helper","version":"0.0.0"}');
88
+ const runtimePackRoot = join(directory, "pack");
89
+ mkdirSync(runtimePackRoot);
90
+ writeFileSync(join(runtimePackRoot, "package.json"), '{"name":"pack","version":"0.0.0"}');
91
+ return {
92
+ compilerVersion: "0.0.0",
93
+ target: LINUX_X64_GNU_TARGET,
94
+ helper: LINUX_X64_GNU_TARGET.helper,
95
+ ts7Executable: tool("ts7"),
96
+ helperExecutable: tool("codegen"),
97
+ helperPackageRoot,
98
+ runtimePackRoot,
99
+ linker: tool("clang"),
100
+ linkerArgs: [],
101
+ dsymutil: tool("dsymutil"),
102
+ };
103
+ }
104
+ /** A profile build's inputs, in a directory of their own. */
105
+ function profileBuild() {
106
+ const directory = temporary();
107
+ const entry = join(directory, "entry.ts");
108
+ writeFileSync(entry, "export const value = 1;\n");
109
+ const profileUse = join(directory, "app.profdata");
110
+ writeFileSync(profileUse, "indexed profile");
111
+ return {
112
+ entry,
113
+ options: {
114
+ outDir: directory,
115
+ outPath: join(directory, "program"),
116
+ backend: "llvm",
117
+ optimization: "speed",
118
+ profileUse,
119
+ },
120
+ ffi: null,
121
+ ffiBytes: null,
122
+ toolchain: toolchain(directory),
123
+ output: join(directory, "program"),
124
+ translationUnitPath: join(directory, "entry.ll"),
125
+ };
126
+ }
127
+ test.skipIf(process.platform === "win32")("a changed block-count file beside a profile is another build", () => {
128
+ const inputs = profileBuild();
129
+ const withoutBlocks = unchangedBuildKey(inputs);
130
+ expect(withoutBlocks).not.toBeNull();
131
+ const blocks = profileBlocksPath(inputs.options.profileUse);
132
+ writeFileSync(blocks, "first counts");
133
+ const withBlocks = unchangedBuildKey(inputs);
134
+ expect(withBlocks).not.toBe(withoutBlocks);
135
+ writeFileSync(blocks, "other counts");
136
+ expect(unchangedBuildKey(inputs)).not.toBe(withBlocks);
137
+ });
138
+ test.skipIf(process.platform === "win32")("a build that writes block counts keeps nothing for a later build", () => {
139
+ const inputs = profileBuild();
140
+ expect(unchangedBuildKey(inputs)).not.toBeNull();
141
+ const recorded = process.env[RECORD_PROFILE_BLOCKS_ENV];
142
+ try {
143
+ process.env[RECORD_PROFILE_BLOCKS_ENV] = join(dirname(inputs.output), "counts.txt");
144
+ // A kept output never runs the helper, and the helper is what writes
145
+ // the file the build asked for.
146
+ expect(unchangedBuildKey(inputs)).toBeNull();
147
+ }
148
+ finally {
149
+ if (recorded === undefined)
150
+ delete process.env[RECORD_PROFILE_BLOCKS_ENV];
151
+ else
152
+ process.env[RECORD_PROFILE_BLOCKS_ENV] = recorded;
153
+ }
154
+ });
155
+ test.skipIf(process.platform === "win32")("a manifest's system library or framework keeps nothing: the linker resolves the file, and the key names only the name", () => {
156
+ const inputs = profileBuild();
157
+ expect(unchangedBuildKey(inputs)).not.toBeNull();
158
+ const base = { ffiFormat: 1, functions: [], libraries: [] };
159
+ expect(unchangedBuildKey({
160
+ ...inputs,
161
+ ffi: { ...base, systemLibraries: ["example"] },
162
+ ffiBytes: "digest",
163
+ })).toBeNull();
164
+ expect(unchangedBuildKey({
165
+ ...inputs,
166
+ ffi: { ...base, systemLibraries: [], frameworks: ["Example"] },
167
+ ffiBytes: "digest",
168
+ })).toBeNull();
169
+ // A manifest that names library files only keeps its record: the key
170
+ // digests each file.
171
+ expect(unchangedBuildKey({
172
+ ...inputs,
173
+ ffi: { ...base, systemLibraries: [] },
174
+ ffiBytes: "digest",
175
+ })).not.toBeNull();
176
+ });
177
+ test.skipIf(process.platform === "win32")("a toolchain's linker arguments keep nothing: the linker resolves the archives they name", () => {
178
+ const inputs = profileBuild();
179
+ expect(unchangedBuildKey(inputs)).not.toBeNull();
180
+ expect(unchangedBuildKey({
181
+ ...inputs,
182
+ toolchain: {
183
+ ...inputs.toolchain,
184
+ linkerArgs: ["-L", "/opt/sdk/lib", "-lexample"],
185
+ },
186
+ })).toBeNull();
187
+ });
188
+ test.skipIf(process.platform === "win32")("a caller-selected linker or helper keeps nothing: a wrapper may bring inputs of its own", () => {
189
+ const inputs = profileBuild();
190
+ expect(unchangedBuildKey(inputs)).not.toBeNull();
191
+ const names = ["SCRIPTC_LINKER", "SCRIPTC_LLVM_HELPER"];
192
+ const recorded = {};
193
+ for (const name of names)
194
+ recorded[name] = process.env[name];
195
+ try {
196
+ for (const name of names) {
197
+ process.env[name] = `/tmp/wrapper-${name}`;
198
+ expect(unchangedBuildKey(inputs)).toBeNull();
199
+ delete process.env[name];
200
+ }
201
+ }
202
+ finally {
203
+ for (const name of names) {
204
+ const value = recorded[name];
205
+ if (value === undefined)
206
+ delete process.env[name];
207
+ else
208
+ process.env[name] = value;
209
+ }
210
+ }
211
+ });
212
+ test.skipIf(process.platform === "win32")("a variable that names mutable link inputs keeps nothing, and a value-hashed one stays keyed", () => {
213
+ const inputs = profileBuild();
214
+ const base = unchangedBuildKey(inputs);
215
+ expect(base).not.toBeNull();
216
+ const names = ["LIBRARY_PATH", "SDKROOT", "LDFLAGS"];
217
+ const recorded = {};
218
+ for (const name of names)
219
+ recorded[name] = process.env[name];
220
+ try {
221
+ process.env["LIBRARY_PATH"] = "/opt/sdk/lib";
222
+ expect(unchangedBuildKey(inputs)).toBeNull();
223
+ delete process.env["LIBRARY_PATH"];
224
+ process.env["SDKROOT"] = "/opt/sdk";
225
+ expect(unchangedBuildKey(inputs)).toBeNull();
226
+ delete process.env["SDKROOT"];
227
+ // The fingerprint hashes this one's value, so the key changes and the
228
+ // record stays available, as it does for the executable cache.
229
+ process.env["LDFLAGS"] = "-L/opt/sdk/lib";
230
+ const withLdflags = unchangedBuildKey(inputs);
231
+ expect(withLdflags).not.toBeNull();
232
+ expect(withLdflags).not.toBe(base);
233
+ }
234
+ finally {
235
+ for (const name of names) {
236
+ const value = recorded[name];
237
+ if (value === undefined)
238
+ delete process.env[name];
239
+ else
240
+ process.env[name] = value;
241
+ }
242
+ }
243
+ });
244
+ test.skipIf(process.platform === "win32")("a sanitized build keeps nothing: its runtime is compiled from sources the key does not name", () => {
245
+ const inputs = profileBuild();
246
+ expect(unchangedBuildKey(inputs)).not.toBeNull();
247
+ expect(unchangedBuildKey({ ...inputs, options: { ...inputs.options, sanitize: true } })).toBeNull();
248
+ });
249
+ //# sourceMappingURL=unchanged.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unchanged.test.js","sourceRoot":"","sources":["../../src/native/unchanged.test.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,16 @@ export interface IslandModule {
24
24
  * detected by the pre-scan under `--node-islands=auto`. */
25
25
  decision: "marked" | "auto";
26
26
  }
27
+ /** The islands a build installed outside node_modules (a linked or hoisted
28
+ * workspace member), by directory, and the answer already given for each
29
+ * file. The memo lives on the set it describes, and an island set with no
30
+ * linked member never fills it. */
31
+ export interface IslandDirIdentity {
32
+ byDir: Map<string, IslandPackage>;
33
+ answered: Map<string, IslandPackage | null>;
34
+ /** Whether `byDir` has been built from the set's packages. */
35
+ built: boolean;
36
+ }
27
37
  /** The program's island packages, by package name, and island modules, by
28
38
  * absolute file path. */
29
39
  export interface NodeIslandSet {
@@ -37,7 +47,12 @@ export interface NodeIslandSet {
37
47
  /** islandModuleOfFile's answers by file spelling (same lifetime as
38
48
  * packagesOfFile). */
39
49
  modulesOfFile?: Map<string, IslandModule | null>;
50
+ /** The directory index for islands installed outside node_modules, and
51
+ * the answers already given from it (see `IslandDirIdentity`). */
52
+ linked: IslandDirIdentity;
40
53
  }
54
+ /** An island set with the boundary's directory index in place. */
55
+ export declare function nodeIslandSet(packages: ReadonlyMap<string, IslandPackage>, modules: ReadonlyMap<string, IslandModule>): NodeIslandSet;
41
56
  /** The island module at `file`, or null. */
42
57
  export declare function islandModuleOfFile(islands: NodeIslandSet, file: string): IslandModule | null;
43
58
  /** Whether `file` (a path as the checker spells it, or its real path) is a
@@ -70,4 +85,5 @@ export declare function crossingOf(islands: NodeIslandSet, type: ts.Type, checke
70
85
  export declare function setActiveNodeIslands(islands: NodeIslandSet | null): void;
71
86
  export declare function activeNodeIslands(): NodeIslandSet | null;
72
87
  export declare function setFrontendIslands(names: ReadonlySet<string>): void;
88
+ export declare function recordFrontendIslandReads(into: Set<string> | null): void;
73
89
  export declare function isFrontendIsland(pkg: string): boolean;