semantifold 0.1.1 → 0.3.0

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 (399) hide show
  1. package/README.md +42 -10
  2. package/build/index.d.ts +32 -3
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +99 -4
  5. package/build/src/acceptance.d.ts +32 -0
  6. package/build/src/acceptance.d.ts.map +1 -0
  7. package/build/src/acceptance.js +358 -0
  8. package/build/src/array.d.ts +7 -0
  9. package/build/src/array.d.ts.map +1 -0
  10. package/build/src/array.js +18 -0
  11. package/build/src/artifact-path.d.ts +13 -0
  12. package/build/src/artifact-path.d.ts.map +1 -0
  13. package/build/src/artifact-path.js +30 -0
  14. package/build/src/artifacts.d.ts +7 -0
  15. package/build/src/artifacts.d.ts.map +1 -0
  16. package/build/src/artifacts.js +389 -0
  17. package/build/src/backends/c-runtime.d.ts +3 -0
  18. package/build/src/backends/c-runtime.d.ts.map +1 -0
  19. package/build/src/backends/c-runtime.js +151 -0
  20. package/build/src/backends/c-validation.d.ts +12 -0
  21. package/build/src/backends/c-validation.d.ts.map +1 -0
  22. package/build/src/backends/c-validation.js +85 -0
  23. package/build/src/backends/c.d.ts +31 -0
  24. package/build/src/backends/c.d.ts.map +1 -0
  25. package/build/src/backends/c.js +308 -0
  26. package/build/src/backends/cpp-runtime.d.ts +3 -0
  27. package/build/src/backends/cpp-runtime.d.ts.map +1 -0
  28. package/build/src/backends/cpp-runtime.js +99 -0
  29. package/build/src/backends/cpp-validation.d.ts +9 -0
  30. package/build/src/backends/cpp-validation.d.ts.map +1 -0
  31. package/build/src/backends/cpp-validation.js +74 -0
  32. package/build/src/backends/cpp.d.ts +16 -0
  33. package/build/src/backends/cpp.d.ts.map +1 -0
  34. package/build/src/backends/cpp.js +285 -0
  35. package/build/src/backends/csharp.d.ts +20 -0
  36. package/build/src/backends/csharp.d.ts.map +1 -0
  37. package/build/src/backends/csharp.js +259 -0
  38. package/build/src/backends/go.d.ts +20 -0
  39. package/build/src/backends/go.d.ts.map +1 -0
  40. package/build/src/backends/go.js +374 -0
  41. package/build/src/backends/identifiers.d.ts +12 -0
  42. package/build/src/backends/identifiers.d.ts.map +1 -1
  43. package/build/src/backends/identifiers.js +79 -2
  44. package/build/src/backends/index.d.ts.map +1 -1
  45. package/build/src/backends/index.js +27 -37
  46. package/build/src/backends/native-validation.d.ts +9 -0
  47. package/build/src/backends/native-validation.d.ts.map +1 -0
  48. package/build/src/backends/native-validation.js +59 -0
  49. package/build/src/backends/ordered-expressions.d.ts +74 -0
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -0
  51. package/build/src/backends/ordered-expressions.js +159 -0
  52. package/build/src/backends/python.d.ts +8 -0
  53. package/build/src/backends/python.d.ts.map +1 -0
  54. package/build/src/backends/python.js +162 -0
  55. package/build/src/backends/scalars.d.ts.map +1 -1
  56. package/build/src/backends/scalars.js +8 -2
  57. package/build/src/backends/shared.d.ts.map +1 -1
  58. package/build/src/backends/shared.js +67 -19
  59. package/build/src/binary-mapping.d.ts +32 -0
  60. package/build/src/binary-mapping.d.ts.map +1 -0
  61. package/build/src/binary-mapping.js +285 -0
  62. package/build/src/diagnostic.d.ts +36 -4
  63. package/build/src/diagnostic.d.ts.map +1 -1
  64. package/build/src/diagnostic.js +42 -3
  65. package/build/src/frontends/c-parser.d.ts +20 -0
  66. package/build/src/frontends/c-parser.d.ts.map +1 -0
  67. package/build/src/frontends/c-parser.js +14 -0
  68. package/build/src/frontends/c.d.ts +220 -0
  69. package/build/src/frontends/c.d.ts.map +1 -0
  70. package/build/src/frontends/c.js +750 -0
  71. package/build/src/frontends/cpp-parser.d.ts +11 -0
  72. package/build/src/frontends/cpp-parser.d.ts.map +1 -0
  73. package/build/src/frontends/cpp-parser.js +15 -0
  74. package/build/src/frontends/cpp.d.ts +227 -0
  75. package/build/src/frontends/cpp.d.ts.map +1 -0
  76. package/build/src/frontends/cpp.js +784 -0
  77. package/build/src/frontends/csharp.d.ts +14 -0
  78. package/build/src/frontends/csharp.d.ts.map +1 -0
  79. package/build/src/frontends/csharp.js +708 -0
  80. package/build/src/frontends/go.d.ts +15 -0
  81. package/build/src/frontends/go.d.ts.map +1 -0
  82. package/build/src/frontends/go.js +712 -0
  83. package/build/src/frontends/index.d.ts.map +1 -1
  84. package/build/src/frontends/index.js +5 -23
  85. package/build/src/frontends/python.d.ts +14 -0
  86. package/build/src/frontends/python.d.ts.map +1 -0
  87. package/build/src/frontends/python.js +615 -0
  88. package/build/src/frontends/scalars.d.ts.map +1 -1
  89. package/build/src/frontends/scalars.js +21 -1
  90. package/build/src/language-registry.d.ts +113 -0
  91. package/build/src/language-registry.d.ts.map +1 -0
  92. package/build/src/language-registry.js +421 -0
  93. package/build/src/mapping.js +3 -2
  94. package/build/src/semantic/location.d.ts +7 -0
  95. package/build/src/semantic/location.d.ts.map +1 -1
  96. package/build/src/semantic/location.js +10 -1
  97. package/build/src/semantic/provenance.js +3 -3
  98. package/build/src/semantic/types.d.ts +399 -2
  99. package/build/src/semantic/types.d.ts.map +1 -1
  100. package/build/src/semantic/types.js +110 -2
  101. package/build/src/subprocess.d.ts +38 -0
  102. package/build/src/subprocess.d.ts.map +1 -0
  103. package/build/src/subprocess.js +233 -0
  104. package/build/src/timeout.d.ts +8 -0
  105. package/build/src/timeout.d.ts.map +1 -0
  106. package/build/src/timeout.js +11 -0
  107. package/build/src/toolchains.d.ts +107 -0
  108. package/build/src/toolchains.d.ts.map +1 -0
  109. package/build/src/toolchains.js +417 -0
  110. package/docs/architecture.md +23 -5
  111. package/docs/c.md +60 -0
  112. package/docs/cpp.md +61 -0
  113. package/docs/goals.md +4 -2
  114. package/docs/language-support.md +46 -6
  115. package/docs/parser-qualification.md +219 -0
  116. package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
  117. package/docs/source-maps.md +38 -5
  118. package/docs/standard-library-portability.md +190 -0
  119. package/docs/testing.md +131 -3
  120. package/index.js +109 -4
  121. package/node_modules/node-addon-api/LICENSE.md +9 -0
  122. package/node_modules/node-addon-api/README.md +95 -0
  123. package/node_modules/node-addon-api/common.gypi +21 -0
  124. package/node_modules/node-addon-api/except.gypi +25 -0
  125. package/node_modules/node-addon-api/index.js +14 -0
  126. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  127. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  128. package/node_modules/node-addon-api/napi.h +3463 -0
  129. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  130. package/node_modules/node-addon-api/node_api.gyp +9 -0
  131. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  132. package/node_modules/node-addon-api/nothing.c +0 -0
  133. package/node_modules/node-addon-api/package-support.json +21 -0
  134. package/node_modules/node-addon-api/package.json +481 -0
  135. package/node_modules/node-addon-api/tools/README.md +73 -0
  136. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  137. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  138. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  139. package/node_modules/node-gyp-build/LICENSE +21 -0
  140. package/node_modules/node-gyp-build/README.md +58 -0
  141. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  142. package/node_modules/node-gyp-build/bin.js +84 -0
  143. package/node_modules/node-gyp-build/build-test.js +19 -0
  144. package/node_modules/node-gyp-build/index.js +6 -0
  145. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  146. package/node_modules/node-gyp-build/optional.js +7 -0
  147. package/node_modules/node-gyp-build/package.json +43 -0
  148. package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
  149. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
  150. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
  151. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
  152. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
  153. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
  154. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
  155. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  156. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  157. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  158. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  159. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  160. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  161. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  162. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  163. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
  164. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
  165. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  166. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
  167. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  168. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  169. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
  170. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
  171. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
  172. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
  173. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
  174. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
  175. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
  176. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
  177. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  178. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  179. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  180. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  181. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  182. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  183. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  184. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  185. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  186. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  187. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  188. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  189. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  190. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  191. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  192. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  193. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  194. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  195. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  196. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  197. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  198. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  199. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  200. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  236. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  237. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
  238. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  239. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
  240. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  241. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  242. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  243. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
  244. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
  245. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
  246. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  247. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  248. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
  249. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
  250. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
  251. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
  252. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
  253. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
  254. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
  255. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
  256. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
  257. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
  258. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
  259. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
  260. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
  261. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
  262. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
  263. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
  264. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
  265. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
  266. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
  267. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
  268. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
  269. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
  270. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
  271. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
  272. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
  273. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
  274. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
  275. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
  276. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
  277. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
  278. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
  279. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
  280. package/node_modules/tree-sitter/LICENSE +21 -0
  281. package/node_modules/tree-sitter/README.md +128 -0
  282. package/node_modules/tree-sitter/binding.gyp +88 -0
  283. package/node_modules/tree-sitter/index.js +950 -0
  284. package/node_modules/tree-sitter/package.json +76 -0
  285. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  286. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  287. package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  288. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  289. package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  290. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  291. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  292. package/node_modules/tree-sitter/src/binding.cc +35 -0
  293. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  294. package/node_modules/tree-sitter/src/conversions.h +22 -0
  295. package/node_modules/tree-sitter/src/language.cc +105 -0
  296. package/node_modules/tree-sitter/src/language.h +17 -0
  297. package/node_modules/tree-sitter/src/logger.cc +70 -0
  298. package/node_modules/tree-sitter/src/logger.h +19 -0
  299. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  300. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  301. package/node_modules/tree-sitter/src/node.cc +1088 -0
  302. package/node_modules/tree-sitter/src/node.h +30 -0
  303. package/node_modules/tree-sitter/src/parser.cc +332 -0
  304. package/node_modules/tree-sitter/src/parser.h +35 -0
  305. package/node_modules/tree-sitter/src/query.cc +425 -0
  306. package/node_modules/tree-sitter/src/query.h +40 -0
  307. package/node_modules/tree-sitter/src/tree.cc +316 -0
  308. package/node_modules/tree-sitter/src/tree.h +45 -0
  309. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  310. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  311. package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
  312. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  313. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  314. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  315. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  316. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  317. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  318. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  319. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  320. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  321. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  322. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  323. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  324. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  325. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  326. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  327. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  328. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  329. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
  330. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  331. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  332. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
  333. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
  334. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  335. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  336. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
  337. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  338. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  339. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  340. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  341. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  342. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
  343. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  344. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  345. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  346. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  347. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  348. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  349. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  350. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  351. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  352. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  353. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  354. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  355. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  356. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
  357. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  358. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
  359. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  360. package/package.json +24 -6
  361. package/src/acceptance.js +380 -0
  362. package/src/array.js +19 -0
  363. package/src/artifact-path.js +34 -0
  364. package/src/artifacts.js +420 -0
  365. package/src/backends/c-runtime.js +151 -0
  366. package/src/backends/c-validation.js +83 -0
  367. package/src/backends/c.js +308 -0
  368. package/src/backends/cpp-runtime.js +99 -0
  369. package/src/backends/cpp-validation.js +70 -0
  370. package/src/backends/cpp.js +285 -0
  371. package/src/backends/csharp.js +270 -0
  372. package/src/backends/go.js +383 -0
  373. package/src/backends/identifiers.js +80 -1
  374. package/src/backends/index.js +23 -32
  375. package/src/backends/native-validation.js +64 -0
  376. package/src/backends/ordered-expressions.js +161 -0
  377. package/src/backends/python.js +175 -0
  378. package/src/backends/scalars.js +8 -1
  379. package/src/backends/shared.js +64 -17
  380. package/src/binary-mapping.js +305 -0
  381. package/src/diagnostic.js +34 -2
  382. package/src/frontends/c-parser.js +17 -0
  383. package/src/frontends/c.js +780 -0
  384. package/src/frontends/cpp-parser.js +18 -0
  385. package/src/frontends/cpp.js +816 -0
  386. package/src/frontends/csharp.js +759 -0
  387. package/src/frontends/go.js +770 -0
  388. package/src/frontends/index.js +5 -20
  389. package/src/frontends/python.js +689 -0
  390. package/src/frontends/scalars.js +20 -0
  391. package/src/language-registry.js +454 -0
  392. package/src/mapping.js +2 -1
  393. package/src/semantic/location.js +10 -0
  394. package/src/semantic/provenance.js +2 -2
  395. package/src/semantic/types.js +124 -1
  396. package/src/subprocess.js +232 -0
  397. package/src/timeout.js +12 -0
  398. package/src/toolchains.js +448 -0
  399. package/tsconfig.json +1 -0
@@ -0,0 +1,448 @@
1
+ // @ts-check
2
+
3
+ import {constants as fsConstants} from "node:fs"
4
+ import {access, realpath, stat} from "node:fs/promises"
5
+ import path from "node:path"
6
+ import {isDenseArray} from "./array.js"
7
+ import {SemantifoldDiagnostic} from "./diagnostic.js"
8
+ import {exceededOwnedDeadline, executeFileWithDeadline} from "./subprocess.js"
9
+ import {isSupportedTimeoutMs, maximumTimeoutMs} from "./timeout.js"
10
+
11
+ const defaultTimeoutMs = 10_000
12
+
13
+ export const canonicalToolchains = deepFreeze({
14
+ php: definition("php", "SEMANTIFOLD_PHP", ["--version"], /^PHP 8\./u),
15
+ ruby: definition("ruby", "SEMANTIFOLD_RUBY", ["--version"], /^ruby 3\./u),
16
+ node: definition("node", "SEMANTIFOLD_NODE", ["--version"], /^v24\./u),
17
+ tsc: definition("tsc", "SEMANTIFOLD_TSC", ["--version"], /^Version 7\./u),
18
+ javac: definition("javac", "SEMANTIFOLD_JAVAC", ["-version"], /^javac (?:1[7-9]|2[0-9])\./u),
19
+ java: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^(?:openjdk|java) version "(?:1[7-9]|2[0-9])\./u),
20
+ python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u),
21
+ dotnet: definition("dotnet", "SEMANTIFOLD_DOTNET", ["--version"], /^10\./u),
22
+ go: definition("go", "SEMANTIFOLD_GO", ["version"], /^go version go1\.26\.\d+ linux\/amd64$/u),
23
+ clangpp: definition("clang++", "SEMANTIFOLD_CLANGPP", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
24
+ clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u)
25
+ })
26
+
27
+ /**
28
+ * Discovers one repository-declared canonical toolchain.
29
+ * @param {keyof typeof canonicalToolchains} id - Canonical toolchain ID.
30
+ * @param {{environment?: Readonly<Record<string, string | undefined>>, override?: string, timeoutMs?: number}} [options] - Discovery options.
31
+ * @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Exact executable and version.
32
+ */
33
+ export async function discoverCanonicalToolchain(id, options = {}) {
34
+ if (typeof id != "string" || id.length == 0) {
35
+ invalidToolchain("Canonical toolchain ID must be a non-empty primitive string.", "toolchain")
36
+ }
37
+ if (!isPlainObject(options)) invalidToolchain("Canonical toolchain options must be an object.", id)
38
+ const definition = Object.hasOwn(canonicalToolchains, id)
39
+ ? canonicalToolchains[/** @type {keyof typeof canonicalToolchains} */ (id)]
40
+ : undefined
41
+
42
+ if (!definition) invalidToolchain(`Unknown canonical toolchain '${id}'.`, id)
43
+ const configurationEnvironment = options.environment === undefined
44
+ ? undefined
45
+ : snapshotEnvironment(options.environment, id)
46
+ const environment = configurationEnvironment ?? defaultEnvironment()
47
+ const configured = options.override === undefined
48
+ ? configurationEnvironment === undefined
49
+ ? process.env[definition.overrideEnvironmentVariable]
50
+ : configurationEnvironment[definition.overrideEnvironmentVariable]
51
+ : options.override
52
+
53
+ return discoverToolchain({
54
+ canonicalCommand: definition.canonicalCommand,
55
+ environment,
56
+ id,
57
+ override: configured,
58
+ supportedVersion: definition.supportedVersion,
59
+ timeoutMs: options.timeoutMs,
60
+ versionArguments: definition.versionArguments
61
+ })
62
+ }
63
+
64
+ /**
65
+ * Resolves and versions one configured or canonical executable without invoking a shell.
66
+ * @param {object} input - Discovery request.
67
+ * @param {string} input.canonicalCommand - Canonical PATH command.
68
+ * @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit discovery environment.
69
+ * @param {string} input.id - Toolchain ID.
70
+ * @param {string} [input.override] - Configured absolute executable path.
71
+ * @param {RegExp} [input.supportedVersion] - Full captured-output version policy.
72
+ * @param {number} [input.timeoutMs] - Version command timeout.
73
+ * @param {string[]} input.versionArguments - Exact version argument array.
74
+ * @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Discovered tool.
75
+ */
76
+ export async function discoverToolchain(input) {
77
+ if (!isPlainObject(input)) invalidToolchain("Toolchain discovery requires a request object.", "toolchain")
78
+ const versionArgumentCandidate = input.versionArguments
79
+ const versionArguments = isDenseArray(versionArgumentCandidate) ? [...versionArgumentCandidate] : undefined
80
+ const candidate = {
81
+ canonicalCommand: input.canonicalCommand,
82
+ environment: input.environment === undefined ? defaultEnvironment() : input.environment,
83
+ id: input.id,
84
+ override: input.override,
85
+ supportedVersion: input.supportedVersion,
86
+ timeoutMs: input.timeoutMs === undefined ? defaultTimeoutMs : input.timeoutMs,
87
+ versionArguments
88
+ }
89
+
90
+ validateDiscovery(candidate)
91
+ const canonicalCommand = /** @type {string} */ (candidate.canonicalCommand)
92
+ const environment = /** @type {Readonly<Record<string, string | undefined>>} */ (candidate.environment)
93
+ const id = /** @type {string} */ (candidate.id)
94
+ const override = /** @type {string | undefined} */ (candidate.override)
95
+ const supportedVersion = candidate.supportedVersion instanceof RegExp
96
+ ? new RegExp(candidate.supportedVersion.source, candidate.supportedVersion.flags)
97
+ : undefined
98
+ const timeoutMs = /** @type {number} */ (candidate.timeoutMs)
99
+ const validatedVersionArguments = /** @type {string[]} */ (candidate.versionArguments)
100
+ const normalizedEnvironment = deterministicEnvironment(environment)
101
+ const {executable, source} = override === undefined
102
+ ? await resolveCanonical(id, canonicalCommand, normalizedEnvironment.PATH ?? "")
103
+ : {executable: await resolveOverride(id, override, canonicalCommand), source: /** @type {const} */ ("override")}
104
+ /** @type {{stdout: string, stderr: string}} */
105
+ let result
106
+
107
+ try {
108
+ result = await executeFileWithDeadline({
109
+ arguments: validatedVersionArguments,
110
+ environment: normalizedEnvironment,
111
+ executable,
112
+ maxBuffer: 1024 * 1024,
113
+ timeoutMs
114
+ })
115
+ } catch (error) {
116
+ const processError = processErrorFields(error)
117
+ const timedOut = exceededOwnedDeadline(error)
118
+
119
+ throw new SemantifoldDiagnostic({
120
+ ...processError,
121
+ cause: error instanceof Error ? error : undefined,
122
+ code: timedOut ? "TOOL_VERSION_TIMEOUT" : "TOOL_VERSION_FAILURE",
123
+ command: canonicalCommand,
124
+ executable,
125
+ language: id,
126
+ message: timedOut
127
+ ? `Version command for '${executable}' exceeded ${timeoutMs}ms.`
128
+ : `Version command for '${executable}' failed.`,
129
+ stderr: processError.stderr,
130
+ stdout: processError.stdout
131
+ })
132
+ }
133
+
134
+ const {stderr, stdout} = result
135
+ const versionOutput = [stdout, stderr].filter((value) => value.length > 0).join("\n").trim()
136
+ const version = versionOutput.split(/\r?\n/u)[0] ?? ""
137
+
138
+ if (version.length == 0) {
139
+ throw new SemantifoldDiagnostic({
140
+ code: "TOOL_VERSION_FAILURE",
141
+ command: canonicalCommand,
142
+ executable,
143
+ language: id,
144
+ message: `Version command for '${executable}' returned no version output.`,
145
+ stderr,
146
+ stdout
147
+ })
148
+ }
149
+ if (supportedVersion && !supportedVersion.test(versionOutput)) {
150
+ throw new SemantifoldDiagnostic({
151
+ code: "TOOL_UNSUPPORTED_VERSION",
152
+ command: canonicalCommand,
153
+ executable,
154
+ language: id,
155
+ message: `Executable '${executable}' reported unsupported version '${version}'.`,
156
+ stderr,
157
+ stdout,
158
+ version
159
+ })
160
+ }
161
+
162
+ return deepFreeze({
163
+ command: canonicalCommand,
164
+ executable,
165
+ id,
166
+ source,
167
+ version,
168
+ versionArguments: validatedVersionArguments,
169
+ versionOutput
170
+ })
171
+ }
172
+
173
+ /**
174
+ * Builds one canonical immutable toolchain declaration.
175
+ * @param {string} canonicalCommand - PATH command.
176
+ * @param {string} overrideEnvironmentVariable - Configured override variable.
177
+ * @param {string[]} versionArguments - Exact version arguments.
178
+ * @param {RegExp} supportedVersion - Supported version output.
179
+ * @returns {{canonicalCommand: string, overrideEnvironmentVariable: string, supportedVersion: RegExp, versionArguments: string[]}} Declaration.
180
+ */
181
+ function definition(canonicalCommand, overrideEnvironmentVariable, versionArguments, supportedVersion) {
182
+ return {canonicalCommand, overrideEnvironmentVariable, supportedVersion, versionArguments}
183
+ }
184
+
185
+ /**
186
+ * Validates tool discovery before filesystem or process access.
187
+ * @param {{
188
+ * canonicalCommand: unknown,
189
+ * environment: unknown,
190
+ * id: unknown,
191
+ * override: unknown,
192
+ * supportedVersion: unknown,
193
+ * timeoutMs: unknown,
194
+ * versionArguments: unknown
195
+ * }} input - Candidate discovery fields.
196
+ * @returns {void}
197
+ */
198
+ function validateDiscovery(input) {
199
+ if (typeof input.id != "string" || input.id.length == 0 ||
200
+ typeof input.canonicalCommand != "string" || input.canonicalCommand.length == 0 ||
201
+ input.canonicalCommand.includes("/") || input.canonicalCommand.includes("\\") || input.canonicalCommand.includes("\0") ||
202
+ !isDenseArray(input.versionArguments) || !input.versionArguments.every(validArgument) ||
203
+ !isEnvironment(input.environment) || !isSupportedTimeoutMs(input.timeoutMs) ||
204
+ (input.override !== undefined && (typeof input.override != "string" || !path.isAbsolute(input.override) || input.override.includes("\0"))) ||
205
+ (input.supportedVersion !== undefined && (!(input.supportedVersion instanceof RegExp) || input.supportedVersion.global || input.supportedVersion.sticky))) {
206
+ invalidToolchain(`Toolchain discovery requires a canonical basename, absolute override, argument array, environment, and timeout from 1 through ${maximumTimeoutMs}ms.`,
207
+ typeof input.id == "string" ? input.id : "toolchain")
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Resolves one unambiguous canonical command from an explicit PATH.
213
+ * @param {string} id - Toolchain ID.
214
+ * @param {string} command - Canonical command.
215
+ * @param {string} pathValue - Explicit PATH.
216
+ * @returns {Promise<{executable: string, source: "canonical"}>} Exact executable.
217
+ */
218
+ async function resolveCanonical(id, command, pathValue) {
219
+ const matches = new Map()
220
+
221
+ for (const directory of pathValue.split(path.delimiter)) {
222
+ if (directory.length == 0 || !path.isAbsolute(directory)) continue
223
+ const candidate = path.join(directory, command)
224
+
225
+ try {
226
+ const exact = await resolveExecutableFile(candidate)
227
+
228
+ if (exact != undefined) matches.set(exact, exact)
229
+ } catch {
230
+ // A PATH candidate is absent or non-executable; discovery continues deterministically.
231
+ }
232
+ }
233
+
234
+ if (matches.size == 0) {
235
+ throw new SemantifoldDiagnostic({
236
+ code: "TOOL_NOT_FOUND",
237
+ command,
238
+ language: id,
239
+ message: `Canonical command '${command}' was not found as an executable on PATH.`
240
+ })
241
+ }
242
+ if (matches.size > 1) {
243
+ throw new SemantifoldDiagnostic({
244
+ code: "TOOL_AMBIGUOUS",
245
+ command,
246
+ language: id,
247
+ message: `Canonical command '${command}' resolves to multiple executables: ${[...matches.keys()].join(", ")}.`
248
+ })
249
+ }
250
+
251
+ return {executable: /** @type {string} */ ([...matches.keys()][0]), source: /** @type {const} */ ("canonical")}
252
+ }
253
+
254
+ /**
255
+ * Resolves one configured absolute executable.
256
+ * @param {string} id - Toolchain ID.
257
+ * @param {string} override - Absolute override.
258
+ * @param {string} command - Canonical command.
259
+ * @returns {Promise<string>} Exact executable path.
260
+ */
261
+ async function resolveOverride(id, override, command) {
262
+ /** @type {Error | undefined} */
263
+ let cause
264
+
265
+ try {
266
+ const exact = await resolveExecutableFile(override)
267
+
268
+ if (exact != undefined) return exact
269
+ } catch (error) {
270
+ cause = error instanceof Error ? error : undefined
271
+ }
272
+
273
+ throw new SemantifoldDiagnostic({
274
+ cause,
275
+ code: "TOOL_NOT_FOUND",
276
+ command,
277
+ executable: override,
278
+ language: id,
279
+ message: `Configured executable '${override}' is missing or not executable.`
280
+ })
281
+ }
282
+
283
+ /**
284
+ * Resolves one candidate to an executable regular file.
285
+ * @param {string} candidate - Candidate path.
286
+ * @returns {Promise<string | undefined>} Exact regular executable, if the file type is valid.
287
+ */
288
+ async function resolveExecutableFile(candidate) {
289
+ const exact = await realpath(candidate)
290
+ const status = await stat(exact)
291
+
292
+ if (!status.isFile()) return undefined
293
+ await access(exact, fsConstants.X_OK)
294
+
295
+ return exact
296
+ }
297
+
298
+ /**
299
+ * Produces the minimal deterministic process environment.
300
+ * @param {Readonly<Record<string, string | undefined>>} environment - Explicit inputs.
301
+ * @returns {Readonly<Record<string, string>>} Normalized environment.
302
+ */
303
+ export function deterministicEnvironment(environment = defaultEnvironment()) {
304
+ const entries = environmentEntries(environment)
305
+
306
+ if (entries == undefined) invalidToolchain("Process environment must be a plain own-property data record of string or undefined values.", "environment")
307
+ /** @type {Record<string, string>} */
308
+ const normalized = Object.create(null)
309
+
310
+ for (const [key, value] of entries) {
311
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key) || key.includes("\0") || (value !== undefined && value.includes("\0"))) {
312
+ invalidToolchain("Process environment contains an invalid key or value.", "environment")
313
+ }
314
+ if (value !== undefined) normalized[key] = value
315
+ }
316
+ normalized.LANG = "C.UTF-8"
317
+ normalized.LC_ALL = "C.UTF-8"
318
+ normalized.TZ = "UTC"
319
+ normalized.PATH ??= "/usr/local/bin:/usr/bin:/bin"
320
+
321
+ return Object.freeze(normalized)
322
+ }
323
+
324
+ /**
325
+ * Retains only executable lookup from the ambient environment.
326
+ * @returns {Readonly<Record<string, string | undefined>>} Minimal default environment.
327
+ */
328
+ function defaultEnvironment() {
329
+ return {PATH: process.env.PATH}
330
+ }
331
+
332
+ /**
333
+ * Narrows stable fields from a version subprocess rejection.
334
+ * @param {unknown} error - Process rejection.
335
+ * @returns {{exitCode: number | undefined, signal: string | undefined, stderr: string, stdout: string}} Stable fields.
336
+ */
337
+ function processErrorFields(error) {
338
+ if (!error || typeof error != "object") return {exitCode: undefined, signal: undefined, stderr: "", stdout: ""}
339
+ const value = /** @type {Record<string, unknown>} */ (error)
340
+
341
+ return {
342
+ exitCode: typeof value.code == "number" ? value.code : undefined,
343
+ signal: typeof value.signal == "string" ? value.signal : undefined,
344
+ stderr: typeof value.stderr == "string" ? value.stderr : "",
345
+ stdout: typeof value.stdout == "string" ? value.stdout : ""
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Checks one shell-free argument.
351
+ * @param {unknown} value - Candidate argument.
352
+ * @returns {value is string} Whether the argument is safe to pass directly.
353
+ */
354
+ function validArgument(value) {
355
+ return typeof value == "string" && !value.includes("\0")
356
+ }
357
+
358
+ /**
359
+ * Checks explicit process-environment values.
360
+ * @param {unknown} value - Candidate environment.
361
+ * @returns {value is Readonly<Record<string, string | undefined>>} Whether entries are strings or undefined.
362
+ */
363
+ function isEnvironment(value) {
364
+ return environmentEntries(value) != undefined
365
+ }
366
+
367
+ /**
368
+ * Detaches an explicit environment before canonical override lookup can yield.
369
+ * @param {unknown} value - Candidate environment record.
370
+ * @param {string} id - Toolchain identity.
371
+ * @returns {Readonly<Record<string, string | undefined>>} Owned environment data.
372
+ */
373
+ function snapshotEnvironment(value, id) {
374
+ const entries = environmentEntries(value)
375
+
376
+ if (entries == undefined) {
377
+ invalidToolchain("Canonical toolchain environment must be a plain own-property data record of string or undefined values.", id)
378
+ }
379
+ /** @type {Record<string, string | undefined>} */
380
+ const snapshot = Object.create(null)
381
+
382
+ for (const [key, entry] of entries) snapshot[key] = entry
383
+
384
+ return Object.freeze(snapshot)
385
+ }
386
+
387
+ /**
388
+ * Reads only enumerable own data properties from an ordinary or null-prototype record.
389
+ * @param {unknown} value - Candidate environment record.
390
+ * @returns {[string, string | undefined][] | undefined} Detached entries when valid.
391
+ */
392
+ function environmentEntries(value) {
393
+ if (typeof value != "object" || value == null || Array.isArray(value)) return undefined
394
+
395
+ try {
396
+ const prototype = Object.getPrototypeOf(value)
397
+
398
+ if (prototype !== Object.prototype && prototype !== null) return undefined
399
+ /** @type {[string, string | undefined][]} */
400
+ const entries = []
401
+
402
+ for (const key of Reflect.ownKeys(value)) {
403
+ if (typeof key != "string") return undefined
404
+ const descriptor = Object.getOwnPropertyDescriptor(value, key)
405
+
406
+ if (descriptor == undefined || !descriptor.enumerable || !("value" in descriptor) ||
407
+ (descriptor.value !== undefined && typeof descriptor.value != "string")) return undefined
408
+ entries.push([key, descriptor.value])
409
+ }
410
+
411
+ return entries
412
+ } catch {
413
+ return undefined
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Checks for an ordinary string-keyed object.
419
+ * @param {unknown} value - Candidate value.
420
+ * @returns {value is Record<string, unknown>} Whether the value is a plain object.
421
+ */
422
+ function isPlainObject(value) {
423
+ return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype
424
+ }
425
+
426
+ /**
427
+ * Throws a normalized discovery-configuration diagnostic.
428
+ * @param {string} message - Failure detail.
429
+ * @param {string} id - Toolchain identity.
430
+ * @returns {never} Always throws.
431
+ */
432
+ function invalidToolchain(message, id) {
433
+ throw new SemantifoldDiagnostic({code: "INVALID_TOOLCHAIN", language: id, message})
434
+ }
435
+
436
+ /**
437
+ * Deeply freezes canonical declarations and discovery results.
438
+ * @template T
439
+ * @param {T} value - Toolchain-owned value.
440
+ * @returns {T} Frozen value.
441
+ */
442
+ function deepFreeze(value) {
443
+ if (!value || typeof value != "object" || Object.isFrozen(value)) return value
444
+
445
+ for (const nested of Object.values(value)) deepFreeze(nested)
446
+
447
+ return Object.freeze(value)
448
+ }
package/tsconfig.json CHANGED
@@ -10,6 +10,7 @@
10
10
  "target": "ES2024",
11
11
  "moduleResolution": "nodenext",
12
12
  "module": "nodenext",
13
+ "types": ["node"],
13
14
  "strict": true
14
15
  },
15
16
  "include": ["index.js", "src/**/*"]