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.
- package/README.md +42 -10
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +32 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +358 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +79 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -37
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +8 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +67 -19
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +21 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +421 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +38 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +233 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +107 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +417 -0
- package/docs/architecture.md +23 -5
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +46 -6
- package/docs/parser-qualification.md +219 -0
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +38 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +131 -3
- package/index.js +109 -4
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +24 -6
- package/src/acceptance.js +380 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +80 -1
- package/src/backends/index.js +23 -32
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +8 -1
- package/src/backends/shared.js +64 -17
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +20 -0
- package/src/language-registry.js +454 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +232 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +448 -0
- 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
|
+
}
|