@greenpandastudios/aug-cli 0.19.0 → 0.21.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 +9 -6
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/bin/aug.mjs +12 -2
- package/docs/about.md +27 -0
- package/docs/api/crypto.md +103 -69
- package/docs/api/io.md +35 -33
- package/docs/api/json.md +3 -3
- package/docs/api/memory.md +23 -19
- package/docs/api/time.md +10 -9
- package/docs/api/web.md +33 -38
- package/docs/assets/benchmarks/execution.svg +774 -637
- package/docs/assets/benchmarks/http.svg +278 -249
- package/docs/assets/benchmarks/improvements.svg +66 -66
- package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
- package/docs/assets/benchmarks/kernels.svg +1 -0
- package/docs/assets/benchmarks/memory.svg +153 -153
- package/docs/benchmark-results.json +227089 -90363
- package/docs/compatibility.md +8 -8
- package/docs/contributing-benchmarks.md +68 -0
- package/docs/dev-containers.md +88 -0
- package/docs/dgx-consumers.json +122 -0
- package/docs/dgx-gyms.json +784 -0
- package/docs/dgx-kernels.json +1170 -0
- package/docs/dgx-performance.json +227849 -0
- package/docs/dgx-spark.md +64 -0
- package/docs/diagnostics.md +15 -5
- package/docs/docker.md +173 -12
- package/docs/editor.md +35 -0
- package/docs/example-projects.json +238 -24
- package/docs/examples/approved-design/counters.md +34 -126
- package/docs/examples/approved-design/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/approved-design/domain/app.md +13 -77
- package/docs/examples/approved-design/domain/export.md +5 -19
- package/docs/examples/approved-design/domain/models.md +4 -23
- package/docs/examples/approved-design/domain/numbers.md +24 -114
- package/docs/examples/approved-design/index.md +16 -7
- package/docs/examples/approved-design/main.md +19 -96
- package/docs/examples/benchmark/index.md +6 -5
- package/docs/examples/benchmark/main.md +7 -35
- package/docs/examples/calls-benchmark/index.md +36 -0
- package/docs/examples/calls-benchmark/main.md +78 -0
- package/docs/examples/calls-benchmark/operations.md +60 -0
- package/docs/examples/cli-args/index.md +6 -5
- package/docs/examples/cli-args/main.md +6 -31
- package/docs/examples/collections/index.md +6 -5
- package/docs/examples/collections/main.md +7 -35
- package/docs/examples/collections-benchmark/index.md +6 -5
- package/docs/examples/collections-benchmark/main.md +7 -35
- package/docs/examples/cpu-benchmark/index.md +6 -5
- package/docs/examples/cpu-benchmark/main.md +5 -24
- package/docs/examples/developer-workflow/calculator.md +39 -186
- package/docs/examples/developer-workflow/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/developer-workflow/index.md +16 -7
- package/docs/examples/developer-workflow/logging/console.md +10 -56
- package/docs/examples/developer-workflow/logging/export.md +4 -14
- package/docs/examples/developer-workflow/logging/logger.md +7 -43
- package/docs/examples/developer-workflow/main.md +17 -69
- package/docs/examples/drop/index.md +6 -5
- package/docs/examples/drop/main.md +7 -27
- package/docs/examples/drop/resource.md +7 -30
- package/docs/examples/errors/errors.md +7 -27
- package/docs/examples/errors/index.md +6 -5
- package/docs/examples/errors/main.md +7 -28
- package/docs/examples/errors-benchmark/index.md +36 -0
- package/docs/examples/errors-benchmark/main.md +92 -0
- package/docs/examples/errors-benchmark/operations.md +65 -0
- package/docs/examples/ffi/index.md +6 -5
- package/docs/examples/ffi/main.md +6 -20
- package/docs/examples/ffi/native.md +8 -34
- package/docs/examples/float-benchmark/index.md +35 -0
- package/docs/examples/float-benchmark/main.md +75 -0
- package/docs/examples/generic-di/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/generic-di/index.md +6 -5
- package/docs/examples/generic-di/main.md +9 -39
- package/docs/examples/generic-di/types.md +23 -92
- package/docs/examples/generics/index.md +6 -5
- package/docs/examples/generics/main.md +10 -47
- package/docs/examples/generics/types.md +25 -100
- package/docs/examples/hello/app/export.md +4 -12
- package/docs/examples/hello/app/greeter.md +13 -91
- package/docs/examples/hello/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/hello/index.md +17 -6
- package/docs/examples/hello/logging/console.md +10 -54
- package/docs/examples/hello/logging/export.md +4 -14
- package/docs/examples/hello/logging/logger.md +7 -45
- package/docs/examples/hello/main.md +9 -39
- package/docs/examples/http-benchmark/index.md +6 -5
- package/docs/examples/http-benchmark/main.md +6 -20
- package/docs/examples/http-benchmark/routes.md +9 -31
- package/docs/examples/index.md +63 -29
- package/docs/examples/interceptors/app.md +20 -139
- package/docs/examples/interceptors/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/interceptors/index.md +6 -5
- package/docs/examples/interceptors/interceptors.md +24 -148
- package/docs/examples/interceptors/logging.md +13 -76
- package/docs/examples/interceptors/main.md +10 -65
- package/docs/examples/json-benchmark/data.md +4 -20
- package/docs/examples/json-benchmark/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/json-benchmark/index.md +7 -5
- package/docs/examples/json-benchmark/main-yaml.md +20 -0
- package/docs/examples/json-benchmark/main.md +10 -49
- package/docs/examples/list-benchmark/index.md +35 -0
- package/docs/examples/list-benchmark/main.md +78 -0
- package/docs/examples/map-churn-benchmark/index.md +35 -0
- package/docs/examples/map-churn-benchmark/main.md +106 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
- package/docs/examples/native-blake3/hashing.md +93 -0
- package/docs/examples/native-blake3/index.md +38 -0
- package/docs/examples/native-blake3/main.md +73 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
- package/docs/examples/native-pytorch/index.md +38 -0
- package/docs/examples/native-pytorch/main.md +73 -0
- package/docs/examples/native-pytorch/tensors.md +123 -0
- package/docs/examples/native-sqlite/database.md +116 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
- package/docs/examples/native-sqlite/index.md +38 -0
- package/docs/examples/native-sqlite/main.md +73 -0
- package/docs/examples/native-zlib/compression.md +99 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
- package/docs/examples/native-zlib/index.md +38 -0
- package/docs/examples/native-zlib/main.md +78 -0
- package/docs/examples/new-syntax/console.md +10 -52
- package/docs/examples/new-syntax/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/new-syntax/greeter.md +13 -71
- package/docs/examples/new-syntax/index.md +6 -5
- package/docs/examples/new-syntax/logger.md +7 -43
- package/docs/examples/new-syntax/main.md +10 -53
- package/docs/examples/new-syntax/math.md +6 -24
- package/docs/examples/oidc-login/client/contracts.md +10 -61
- package/docs/examples/oidc-login/client/endpoints.md +32 -154
- package/docs/examples/oidc-login/client/export.md +5 -23
- package/docs/examples/oidc-login/client/login.md +234 -344
- package/docs/examples/oidc-login/client/logout.md +38 -143
- package/docs/examples/oidc-login/client/protocol.md +183 -304
- package/docs/examples/oidc-login/client/session.md +41 -149
- package/docs/examples/oidc-login/client/views.md +13 -58
- package/docs/examples/oidc-login/common/export.md +6 -26
- package/docs/examples/oidc-login/common/headers.md +42 -72
- package/docs/examples/oidc-login/common/keys.md +40 -164
- package/docs/examples/oidc-login/common/settings.md +24 -40
- package/docs/examples/oidc-login/common/views.md +7 -28
- package/docs/examples/oidc-login/dependencies/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.md +205 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +267 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.md +415 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.md +271 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +89 -0
- package/docs/examples/oidc-login/index.md +8 -7
- package/docs/examples/oidc-login/main-yaml.md +7 -0
- package/docs/examples/oidc-login/main.md +26 -153
- package/docs/examples/oidc-login/provider/authorization.md +232 -275
- package/docs/examples/oidc-login/provider/contracts.md +24 -146
- package/docs/examples/oidc-login/provider/credentials.md +24 -57
- package/docs/examples/oidc-login/provider/discovery.md +48 -122
- package/docs/examples/oidc-login/provider/export.md +11 -37
- package/docs/examples/oidc-login/provider/token.md +159 -237
- package/docs/examples/oidc-login/provider/userinfo.md +47 -102
- package/docs/examples/oidc-login/provider/views.md +13 -53
- package/docs/examples/ownership/counter.md +17 -63
- package/docs/examples/ownership/index.md +6 -5
- package/docs/examples/ownership/main.md +7 -30
- package/docs/examples/ownership-transfer/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/ownership-transfer/index.md +6 -5
- package/docs/examples/ownership-transfer/main.md +10 -52
- package/docs/examples/ownership-transfer/resource.md +15 -67
- package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +12 -50
- package/docs/examples/packages-app/index.md +7 -6
- package/docs/examples/packages-app/main.md +7 -25
- package/docs/examples/packages-math/aug-package-json.md +1 -1
- package/docs/examples/packages-math/index.md +7 -6
- package/docs/examples/packages-math/src/arithmetic.md +12 -50
- package/docs/examples/packages-math/src/export.md +4 -12
- package/docs/examples/records-benchmark/data.md +55 -0
- package/docs/examples/records-benchmark/index.md +36 -0
- package/docs/examples/records-benchmark/main.md +85 -0
- package/docs/examples/startup-benchmark/index.md +6 -5
- package/docs/examples/startup-benchmark/main.md +5 -17
- package/docs/examples/strings-benchmark/index.md +35 -0
- package/docs/examples/strings-benchmark/main.md +76 -0
- package/docs/examples/tasks-benchmark/index.md +36 -0
- package/docs/examples/tasks-benchmark/main.md +89 -0
- package/docs/examples/tasks-benchmark/operations.md +58 -0
- package/docs/examples/visibility/counter.md +19 -67
- package/docs/examples/visibility/index.md +6 -5
- package/docs/examples/visibility/main.md +7 -31
- package/docs/examples/weather-api/forecasts.md +168 -0
- package/docs/examples/weather-api/index.md +42 -0
- package/docs/examples/weather-api/main-yaml.md +21 -0
- package/docs/examples/weather-api/main.md +65 -0
- package/docs/examples.json +10 -0
- package/docs/getting-started.md +105 -2
- package/docs/grammar.md +7 -5
- package/docs/guides/change-a-module.md +64 -0
- package/docs/guides/index.md +27 -0
- package/docs/gym-results.json +784 -0
- package/docs/implementation-map.md +6 -0
- package/docs/index.md +51 -29
- package/docs/kernel-results.json +1170 -0
- package/docs/language-conformance.md +7 -1
- package/docs/language-constructs.md +30 -22
- package/docs/language-design-audit.md +1 -1
- package/docs/learn/data-and-errors.md +77 -0
- package/docs/learn/index.md +30 -0
- package/docs/learn/modules-and-dependencies.md +73 -0
- package/docs/learn/state-and-tests.md +71 -0
- package/docs/learn/values-and-functions.md +62 -0
- package/docs/lesson-failures.json +8 -0
- package/docs/maintaining-docs.md +16 -4
- package/docs/native-implementation.md +276 -0
- package/docs/native-interop-llvm-plan.md +342 -0
- package/docs/native-package-examples.md +684 -0
- package/docs/native-packages.md +179 -0
- package/docs/packages.md +72 -126
- package/docs/performance.md +61 -68
- package/docs/production-readiness.md +16 -5
- package/docs/public/downloads/approved-design.zip +0 -0
- package/docs/public/downloads/benchmark.zip +0 -0
- package/docs/public/downloads/calls-benchmark.zip +0 -0
- package/docs/public/downloads/cli-args.zip +0 -0
- package/docs/public/downloads/collections-benchmark.zip +0 -0
- package/docs/public/downloads/collections.zip +0 -0
- package/docs/public/downloads/cpu-benchmark.zip +0 -0
- package/docs/public/downloads/developer-workflow.zip +0 -0
- package/docs/public/downloads/drop.zip +0 -0
- package/docs/public/downloads/errors-benchmark.zip +0 -0
- package/docs/public/downloads/errors.zip +0 -0
- package/docs/public/downloads/ffi.zip +0 -0
- package/docs/public/downloads/float-benchmark.zip +0 -0
- package/docs/public/downloads/generic-di.zip +0 -0
- package/docs/public/downloads/generics.zip +0 -0
- package/docs/public/downloads/hello.zip +0 -0
- package/docs/public/downloads/http-benchmark.zip +0 -0
- package/docs/public/downloads/interceptors.zip +0 -0
- package/docs/public/downloads/json-benchmark.zip +0 -0
- package/docs/public/downloads/list-benchmark.zip +0 -0
- package/docs/public/downloads/map-churn-benchmark.zip +0 -0
- package/docs/public/downloads/native-blake3.zip +0 -0
- package/docs/public/downloads/native-pytorch.zip +0 -0
- package/docs/public/downloads/native-sqlite.zip +0 -0
- package/docs/public/downloads/native-zlib.zip +0 -0
- package/docs/public/downloads/new-syntax.zip +0 -0
- package/docs/public/downloads/oidc-login.zip +0 -0
- package/docs/public/downloads/ownership-transfer.zip +0 -0
- package/docs/public/downloads/ownership.zip +0 -0
- package/docs/public/downloads/packages-app.zip +0 -0
- package/docs/public/downloads/packages-math.zip +0 -0
- package/docs/public/downloads/records-benchmark.zip +0 -0
- package/docs/public/downloads/startup-benchmark.zip +0 -0
- package/docs/public/downloads/strings-benchmark.zip +0 -0
- package/docs/public/downloads/tasks-benchmark.zip +0 -0
- package/docs/public/downloads/visibility.zip +0 -0
- package/docs/public/downloads/weather-api.zip +0 -0
- package/docs/qualification-results.md +66 -0
- package/docs/reference.md +47 -17
- package/docs/releasing.md +105 -16
- package/docs/research/code-to-natural-language.md +108 -0
- package/docs/research/ecosystem-workflow.md +41 -0
- package/docs/research/libtorch-native-qualification.md +115 -0
- package/docs/research/native-interop-llvm.md +197 -0
- package/docs/research/qualification-methods.md +15 -0
- package/docs/research/wiki-editorial-design.md +71 -0
- package/docs/roadmap.md +2 -1
- package/docs/safety-gyms.md +41 -0
- package/docs/specifications.md +27 -11
- package/docs/testing.md +19 -5
- package/docs/tooling.md +36 -22
- package/docs/weather-api.md +65 -0
- package/docs/web-library-gaps.md +1 -1
- package/docs/web.md +54 -18
- package/docs/writing-docs.md +49 -0
- package/examples/{hello/.aug-spec/august/0.19.0 → approved-design/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/approved-design/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/approved-design/.aug-spec/manifest.json +3 -3
- package/examples/approved-design/counters.aug +5 -4
- package/examples/approved-design/counters.aug.md +25 -132
- package/examples/approved-design/domain/app.aug +2 -1
- package/examples/approved-design/domain/app.aug.md +10 -80
- package/examples/approved-design/domain/export.aug +1 -0
- package/examples/approved-design/domain/export.aug.md +4 -20
- package/examples/approved-design/domain/models.aug +1 -0
- package/examples/approved-design/domain/models.aug.md +3 -25
- package/examples/approved-design/domain/numbers.aug +3 -2
- package/examples/approved-design/domain/numbers.aug.md +19 -116
- package/examples/approved-design/main.aug +1 -0
- package/examples/approved-design/main.aug.md +12 -95
- package/examples/benchmark/.aug-spec/manifest.json +1 -1
- package/examples/benchmark/main.aug +1 -0
- package/examples/benchmark/main.aug.md +6 -36
- package/examples/cli-args/.aug-spec/manifest.json +1 -1
- package/examples/cli-args/main.aug +1 -0
- package/examples/cli-args/main.aug.md +5 -32
- package/examples/collections/.aug-spec/manifest.json +1 -1
- package/examples/collections/main.aug +1 -0
- package/examples/collections/main.aug.md +6 -36
- package/examples/{generic-di/.aug-spec/august/0.19.0 → developer-workflow/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/developer-workflow/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
- package/examples/developer-workflow/calculator.aug +3 -2
- package/examples/developer-workflow/calculator.aug.md +28 -189
- package/examples/developer-workflow/logging/console.aug +2 -1
- package/examples/developer-workflow/logging/console.aug.md +7 -57
- package/examples/developer-workflow/logging/export.aug +1 -0
- package/examples/developer-workflow/logging/export.aug.md +3 -15
- package/examples/developer-workflow/logging/logger.aug +1 -0
- package/examples/developer-workflow/logging/logger.aug.md +6 -46
- package/examples/developer-workflow/main.aug +1 -0
- package/examples/developer-workflow/main.aug.md +10 -68
- package/examples/drop/.aug-spec/manifest.json +1 -1
- package/examples/drop/main.aug +1 -0
- package/examples/drop/main.aug.md +6 -28
- package/examples/drop/resource.aug +1 -0
- package/examples/drop/resource.aug.md +6 -34
- package/examples/errors/.aug-spec/manifest.json +1 -1
- package/examples/errors/errors.aug +2 -1
- package/examples/errors/errors.aug.md +4 -27
- package/examples/errors/main.aug +1 -0
- package/examples/errors/main.aug.md +6 -29
- package/examples/ffi/.aug-spec/manifest.json +1 -1
- package/examples/ffi/main.aug +1 -0
- package/examples/ffi/main.aug.md +5 -21
- package/examples/ffi/native.aug +2 -1
- package/examples/ffi/native.aug.md +5 -35
- package/examples/{approved-design/.aug-spec/august/0.19.0 → generic-di/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/generic-di/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/generic-di/.aug-spec/manifest.json +3 -3
- package/examples/generic-di/main.aug +1 -0
- package/examples/generic-di/main.aug.md +8 -40
- package/examples/generic-di/types.aug +3 -2
- package/examples/generic-di/types.aug.md +18 -97
- package/examples/generics/.aug-spec/manifest.json +1 -1
- package/examples/generics/main.aug +1 -0
- package/examples/generics/main.aug.md +9 -48
- package/examples/generics/types.aug +4 -3
- package/examples/generics/types.aug.md +18 -104
- package/examples/{developer-workflow/.aug-spec/august/0.19.0 → hello/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/hello/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/hello/.aug-spec/manifest.json +3 -3
- package/examples/hello/app/export.aug +1 -0
- package/examples/hello/app/export.aug.md +3 -13
- package/examples/hello/app/greeter.aug +2 -1
- package/examples/hello/app/greeter.aug.md +10 -94
- package/examples/hello/logging/console.aug +2 -1
- package/examples/hello/logging/console.aug.md +7 -55
- package/examples/hello/logging/export.aug +1 -0
- package/examples/hello/logging/export.aug.md +3 -15
- package/examples/hello/logging/logger.aug +1 -0
- package/examples/hello/logging/logger.aug.md +6 -48
- package/examples/hello/main.aug +1 -0
- package/examples/hello/main.aug.md +8 -40
- package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/interceptors/.aug-spec/manifest.json +3 -3
- package/examples/interceptors/app.aug +3 -2
- package/examples/interceptors/app.aug.md +15 -141
- package/examples/interceptors/interceptors.aug +3 -2
- package/examples/interceptors/interceptors.aug.md +19 -152
- package/examples/interceptors/logging.aug +2 -1
- package/examples/interceptors/logging.aug.md +10 -79
- package/examples/interceptors/main.aug +1 -0
- package/examples/interceptors/main.aug.md +9 -66
- package/examples/native-blake3/.aug-spec/manifest.json +16 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
- package/examples/native-blake3/AGENTS.md +5 -0
- package/examples/native-blake3/aug.lock.json +253 -0
- package/examples/native-blake3/hashing.aug +11 -0
- package/examples/native-blake3/hashing.aug.md +25 -0
- package/examples/native-blake3/main.aug +8 -0
- package/examples/native-blake3/main.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
- package/examples/native-pytorch/AGENTS.md +5 -0
- package/examples/native-pytorch/aug.lock.json +309 -0
- package/examples/native-pytorch/main.aug +8 -0
- package/examples/native-pytorch/main.aug.md +13 -0
- package/examples/native-pytorch/tensors.aug +23 -0
- package/examples/native-pytorch/tensors.aug.md +35 -0
- package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
- package/examples/native-sqlite/AGENTS.md +5 -0
- package/examples/native-sqlite/aug.lock.json +236 -0
- package/examples/native-sqlite/database.aug +15 -0
- package/examples/native-sqlite/database.aug.md +27 -0
- package/examples/native-sqlite/main.aug +8 -0
- package/examples/native-sqlite/main.aug.md +13 -0
- package/examples/native-zlib/.aug-spec/manifest.json +16 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
- package/examples/native-zlib/AGENTS.md +5 -0
- package/examples/native-zlib/aug.lock.json +236 -0
- package/examples/native-zlib/compression.aug +15 -0
- package/examples/native-zlib/compression.aug.md +27 -0
- package/examples/native-zlib/main.aug +10 -0
- package/examples/native-zlib/main.aug.md +13 -0
- package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/new-syntax/.aug-spec/manifest.json +3 -3
- package/examples/new-syntax/console.aug +2 -1
- package/examples/new-syntax/console.aug.md +7 -53
- package/examples/new-syntax/greeter.aug +2 -1
- package/examples/new-syntax/greeter.aug.md +10 -74
- package/examples/new-syntax/logger.aug +1 -0
- package/examples/new-syntax/logger.aug.md +6 -46
- package/examples/new-syntax/main.aug +1 -0
- package/examples/new-syntax/main.aug.md +9 -54
- package/examples/new-syntax/math.aug +2 -1
- package/examples/new-syntax/math.aug.md +3 -24
- package/examples/oidc-login/.aug-spec/manifest.json +13 -13
- package/examples/oidc-login/.aug-spec/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +17 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +125 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/contracts.aug +12 -11
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.aug.md +244 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/jose.aug +6 -5
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +30 -0
- package/examples/oidc-login/aug.lock.json +100 -0
- package/examples/oidc-login/client/contracts.aug +1 -0
- package/examples/oidc-login/client/contracts.aug.md +9 -66
- package/examples/oidc-login/client/endpoints.aug +6 -5
- package/examples/oidc-login/client/endpoints.aug.md +13 -145
- package/examples/oidc-login/client/export.aug +1 -0
- package/examples/oidc-login/client/export.aug.md +4 -24
- package/examples/oidc-login/client/login.aug +7 -6
- package/examples/oidc-login/client/login.aug.md +25 -303
- package/examples/oidc-login/client/logout.aug +5 -4
- package/examples/oidc-login/client/logout.aug.md +13 -135
- package/examples/oidc-login/client/protocol.aug +7 -6
- package/examples/oidc-login/client/protocol.aug.md +36 -283
- package/examples/oidc-login/client/session.aug +5 -4
- package/examples/oidc-login/client/session.aug.md +12 -139
- package/examples/oidc-login/client/views.aug +3 -2
- package/examples/oidc-login/client/views.aug.md +8 -57
- package/examples/oidc-login/common/export.aug +1 -0
- package/examples/oidc-login/common/export.aug.md +5 -27
- package/examples/oidc-login/common/headers.aug +4 -3
- package/examples/oidc-login/common/headers.aug.md +9 -67
- package/examples/oidc-login/common/keys.aug +6 -5
- package/examples/oidc-login/common/keys.aug.md +29 -165
- package/examples/oidc-login/common/settings.aug +2 -1
- package/examples/oidc-login/common/settings.aug.md +5 -39
- package/examples/oidc-login/common/views.aug +2 -1
- package/examples/oidc-login/common/views.aug.md +4 -28
- package/examples/oidc-login/main.aug +6 -16
- package/examples/oidc-login/main.aug.md +17 -146
- package/examples/oidc-login/main.yaml +7 -0
- package/examples/oidc-login/provider/authorization.aug +7 -6
- package/examples/oidc-login/provider/authorization.aug.md +23 -238
- package/examples/oidc-login/provider/contracts.aug +1 -0
- package/examples/oidc-login/provider/contracts.aug.md +23 -158
- package/examples/oidc-login/provider/credentials.aug +3 -2
- package/examples/oidc-login/provider/credentials.aug.md +9 -53
- package/examples/oidc-login/provider/discovery.aug +4 -3
- package/examples/oidc-login/provider/discovery.aug.md +11 -118
- package/examples/oidc-login/provider/export.aug +1 -0
- package/examples/oidc-login/provider/export.aug.md +6 -34
- package/examples/oidc-login/provider/token.aug +6 -5
- package/examples/oidc-login/provider/token.aug.md +16 -204
- package/examples/oidc-login/provider/userinfo.aug +4 -3
- package/examples/oidc-login/provider/userinfo.aug.md +10 -92
- package/examples/oidc-login/provider/views.aug +3 -2
- package/examples/oidc-login/provider/views.aug.md +8 -52
- package/examples/ownership/.aug-spec/manifest.json +1 -1
- package/examples/ownership/counter.aug +3 -2
- package/examples/ownership/counter.aug.md +12 -66
- package/examples/ownership/main.aug +1 -0
- package/examples/ownership/main.aug.md +6 -31
- package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
- package/examples/ownership-transfer/main.aug +1 -0
- package/examples/ownership-transfer/main.aug.md +9 -53
- package/examples/ownership-transfer/resource.aug +2 -1
- package/examples/ownership-transfer/resource.aug.md +12 -71
- package/examples/packages/app/.aug-spec/manifest.json +1 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +2 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +9 -51
- package/examples/packages/app/main.aug +1 -0
- package/examples/packages/app/main.aug.md +6 -26
- package/examples/packages/math/.aug-spec/manifest.json +1 -1
- package/examples/packages/math/aug-package.json +1 -1
- package/examples/packages/math/src/arithmetic.aug +2 -1
- package/examples/packages/math/src/arithmetic.aug.md +9 -51
- package/examples/packages/math/src/export.aug +1 -0
- package/examples/packages/math/src/export.aug.md +3 -13
- package/examples/visibility/.aug-spec/manifest.json +1 -1
- package/examples/visibility/counter.aug +4 -3
- package/examples/visibility/counter.aug.md +12 -68
- package/examples/visibility/main.aug +1 -0
- package/examples/visibility/main.aug.md +6 -32
- package/examples/weather-api/.aug-spec/manifest.json +8 -0
- package/examples/weather-api/AGENTS.md +17 -0
- package/examples/weather-api/README.md +19 -0
- package/examples/weather-api/forecasts.aug +47 -0
- package/examples/weather-api/forecasts.aug.md +32 -0
- package/examples/weather-api/main.aug +4 -0
- package/examples/weather-api/main.aug.md +15 -0
- package/examples/weather-api/main.yaml +5 -0
- package/examples/weather-api/weather.http +5 -0
- package/native/compiler-packs.json +43 -0
- package/package.json +4 -4
- package/runtime/aug_http.c +48 -21
- package/runtime/aug_http_ir.c +30 -0
- package/runtime/aug_http_ir.h +18 -0
- package/runtime/aug_ir.c +209 -0
- package/runtime/aug_ir.h +89 -0
- package/runtime/aug_json.c +6 -1
- package/runtime/aug_runtime.c +82 -16
- package/runtime/aug_runtime.h +16 -2
- package/runtime/aug_tasks.c +38 -7
- package/runtime/aug_values.c +12 -6
- package/scripts/bootstrap-native.mjs +184 -106
- package/scripts/native-setup.mjs +98 -0
- package/scripts/native-toolchain.mjs +28 -0
- package/src/ast.js +1 -1
- package/src/builtins.js +1 -1
- package/src/checker.js +369 -100
- package/src/cli.js +198 -26
- package/src/codegen.js +32 -7
- package/src/compiler-packs.js +66 -0
- package/src/config.js +3 -3
- package/src/contracts.js +10 -0
- package/src/editor.js +86 -22
- package/src/fixes.js +90 -2
- package/src/formatter.js +23 -10
- package/src/git-http.js +137 -0
- package/src/git-packages.js +118 -0
- package/src/help.js +33 -24
- package/src/http-contracts.js +14 -0
- package/src/http-policies.js +5 -5
- package/src/ir-types.js +5 -0
- package/src/ir-verify.js +277 -0
- package/src/ir.js +962 -0
- package/src/libraries.js +1 -1
- package/src/llvm-debug.js +101 -0
- package/src/llvm-native.js +152 -0
- package/src/llvm-platform.js +20 -0
- package/src/llvm.js +781 -0
- package/src/lsp.js +14 -5
- package/src/native-artifacts.js +207 -0
- package/src/native-bindings.js +189 -0
- package/src/native-contracts.js +295 -0
- package/src/native-declarations.js +68 -0
- package/src/native-facts.js +63 -0
- package/src/native.js +19 -13
- package/src/navigation.js +4 -2
- package/src/openapi.js +5 -4
- package/src/package-locking.js +88 -0
- package/src/package-manager.js +267 -68
- package/src/parser.js +32 -6
- package/src/policies.js +3 -3
- package/src/project-init.js +78 -4
- package/src/project.js +11 -9
- package/src/runtime-abi.js +23 -0
- package/src/runtime-adapters.js +18 -0
- package/src/schemas.js +24 -17
- package/src/semantic.js +54 -5
- package/src/snippets.js +60 -0
- package/src/spec-hints.js +56 -0
- package/src/spec-tree.js +241 -0
- package/src/spec.js +669 -305
- package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +0 -925
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +0 -434
- package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +0 -374
- package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +0 -150
- package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +0 -532
- package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +0 -791
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +0 -266
- package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +0 -55
- package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +0 -250
- package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +0 -96
- package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +0 -420
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/memory → packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/store.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/json → packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/web → packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/time → packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFileSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { release } from 'node:os';
|
|
5
|
+
/** The public native ABI never exposes August runtime layouts. */
|
|
6
|
+
export const nativeProfile = 'aug-native-abi-1';
|
|
7
|
+
const digest = /^[0-9a-f]{64}$/;
|
|
8
|
+
const identifier = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
9
|
+
const moduleName = /^[A-Za-z][A-Za-z0-9_]*(?:\/[A-Za-z][A-Za-z0-9_]*)*$/;
|
|
10
|
+
const fail = (message) => { throw new Error('NATIVE_ABI: ' + message); };
|
|
11
|
+
const object = (value, label) => {
|
|
12
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
13
|
+
fail(label + ' must be an object');
|
|
14
|
+
return value;
|
|
15
|
+
};
|
|
16
|
+
const fields = (value, allowed, label) => {
|
|
17
|
+
for (const key of Object.keys(value))
|
|
18
|
+
if (!allowed.includes(key))
|
|
19
|
+
fail(`${label} contains unsupported field ${key}`);
|
|
20
|
+
};
|
|
21
|
+
const string = (value, label) => {
|
|
22
|
+
if (typeof value !== 'string' || !value || value.includes('\0'))
|
|
23
|
+
fail(label + ' must be a nonempty string');
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
const array = (value, label) => {
|
|
27
|
+
if (!Array.isArray(value) || value.length > 10000)
|
|
28
|
+
fail(label + ' must be an array of at most 10,000 entries');
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
31
|
+
const strings = (value, label) => array(value, label).map(item => string(item, label));
|
|
32
|
+
const positive = (value, label) => { if (!Number.isSafeInteger(value) || Number(value) <= 0)
|
|
33
|
+
fail(label + ' must be a positive safe integer'); };
|
|
34
|
+
const hash = (value, label) => { if (typeof value !== 'string' || !digest.test(value))
|
|
35
|
+
fail(label + ' must be a lowercase SHA-256 digest'); };
|
|
36
|
+
const symbol = (value, label) => { if (typeof value !== 'string' || !identifier.test(value))
|
|
37
|
+
fail(label + ' must be a C identifier'); };
|
|
38
|
+
const https = (value, label) => {
|
|
39
|
+
let url;
|
|
40
|
+
try {
|
|
41
|
+
url = new URL(string(value, label));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
fail(label + ' must be an HTTPS URL');
|
|
45
|
+
}
|
|
46
|
+
if (url.protocol !== 'https:' || url.username || url.password || url.hash)
|
|
47
|
+
fail(label + ' must be an HTTPS URL without credentials or a fragment');
|
|
48
|
+
};
|
|
49
|
+
/** Artifact paths are portable and cannot name a file outside their archive. */
|
|
50
|
+
export function nativePath(value) {
|
|
51
|
+
const path = string(value, 'relative artifact path');
|
|
52
|
+
if (isAbsolute(path) || path.includes('\\') || path.split('/').some(part => !part || part === '.' || part === '..' || part.startsWith('.')) || /[:\r\n]/.test(path))
|
|
53
|
+
fail('Expected a relative artifact path without traversal: ' + path);
|
|
54
|
+
return path;
|
|
55
|
+
}
|
|
56
|
+
/** Source installation validates metadata; it does not run a native build recipe. */
|
|
57
|
+
export function validateNativeManifest(value) {
|
|
58
|
+
const native = object(value, 'native metadata');
|
|
59
|
+
fields(native, ['profile', 'bindings', 'bindingsSha256', 'upstream', 'artifacts', 'sourceBuild'], 'native metadata');
|
|
60
|
+
if (native.profile !== nativeProfile)
|
|
61
|
+
fail('Unsupported native profile ' + native.profile);
|
|
62
|
+
nativePath(native.bindings);
|
|
63
|
+
if (native.bindings !== 'native.abi.json')
|
|
64
|
+
fail('Bindings must be declared in native.abi.json at the package root');
|
|
65
|
+
hash(native.bindingsSha256, 'bindingsSha256');
|
|
66
|
+
const upstream = object(native.upstream, 'upstream');
|
|
67
|
+
fields(upstream, ['repository', 'version', 'sourceRevision'], 'upstream');
|
|
68
|
+
https(upstream.repository, 'upstream.repository');
|
|
69
|
+
string(upstream.version, 'upstream.version');
|
|
70
|
+
if (!/^[0-9a-f]{40,64}$/.test(upstream.sourceRevision ?? ''))
|
|
71
|
+
fail('upstream.sourceRevision must pin a full source revision or archive digest');
|
|
72
|
+
const artifacts = array(native.artifacts, 'artifacts');
|
|
73
|
+
if (!artifacts.length)
|
|
74
|
+
fail('At least one prebuilt artifact is required');
|
|
75
|
+
const ids = new Set(), selections = new Set();
|
|
76
|
+
for (const entry of artifacts) {
|
|
77
|
+
const artifact = object(entry, 'artifact');
|
|
78
|
+
fields(artifact, ['id', 'target', 'url', 'sha256', 'maximumDownloadBytes', 'maximumUnpackedBytes', 'link', 'runtime', 'components', 'fileManifest', 'provenance', 'notices'], 'artifact');
|
|
79
|
+
string(artifact.id, 'artifact.id');
|
|
80
|
+
if (ids.has(artifact.id))
|
|
81
|
+
fail('Duplicate artifact id ' + artifact.id);
|
|
82
|
+
ids.add(artifact.id);
|
|
83
|
+
const target = object(artifact.target, 'artifact.target');
|
|
84
|
+
fields(target, ['triple', 'os', 'arch', 'minimumOS', 'minimumLibc', 'cpuBaseline', 'libc', 'cxxRuntime', 'cxxABI', 'features'], 'artifact.target');
|
|
85
|
+
const expected = nativeTarget(string(target.triple, 'target.triple'));
|
|
86
|
+
if (expected.os !== target.os || expected.arch !== target.arch || expected.libc !== target.libc)
|
|
87
|
+
fail('Target triple does not match its OS, architecture, or libc');
|
|
88
|
+
string(target.cpuBaseline, 'target.cpuBaseline');
|
|
89
|
+
if (target.os === 'macos' && (!/^\d+\.\d+(?:\.\d+)?$/.test(target.minimumOS ?? '')))
|
|
90
|
+
fail('macOS artifacts declare minimumOS');
|
|
91
|
+
if (target.os === 'linux' && target.libc === 'glibc' && !/^\d+\.\d+(?:\.\d+)?$/.test(target.minimumLibc ?? ''))
|
|
92
|
+
fail('GNU/Linux artifacts declare minimumLibc');
|
|
93
|
+
if (target.minimumLibc !== undefined && (target.os !== 'linux' || target.libc !== 'glibc'))
|
|
94
|
+
fail('minimumLibc belongs to GNU/Linux artifacts');
|
|
95
|
+
for (const key of ['cxxRuntime', 'cxxABI'])
|
|
96
|
+
if (target[key] !== undefined)
|
|
97
|
+
string(target[key], key);
|
|
98
|
+
if (target.features !== undefined)
|
|
99
|
+
strings(target.features, 'target.features');
|
|
100
|
+
const selection = JSON.stringify([target.triple, target.minimumOS ?? '', target.minimumLibc ?? '', target.features ?? []]);
|
|
101
|
+
if (selections.has(selection))
|
|
102
|
+
fail('Ambiguous artifact selection for ' + target.triple);
|
|
103
|
+
selections.add(selection);
|
|
104
|
+
https(artifact.url, 'artifact.url');
|
|
105
|
+
hash(artifact.sha256, 'artifact.sha256');
|
|
106
|
+
positive(artifact.maximumDownloadBytes, 'maximumDownloadBytes');
|
|
107
|
+
positive(artifact.maximumUnpackedBytes, 'maximumUnpackedBytes');
|
|
108
|
+
const link = object(artifact.link, 'link');
|
|
109
|
+
fields(link, ['kind', 'libraries'], 'link');
|
|
110
|
+
if (!['dynamic', 'static'].includes(link.kind))
|
|
111
|
+
fail('link.kind must be dynamic or static');
|
|
112
|
+
if (!array(link.libraries, 'link.libraries').length)
|
|
113
|
+
fail('An artifact must supply link libraries');
|
|
114
|
+
link.libraries.forEach(nativePath);
|
|
115
|
+
const runtime = object(artifact.runtime, 'runtime');
|
|
116
|
+
fields(runtime, ['files', 'relocation', 'closureManifest'], 'runtime');
|
|
117
|
+
array(runtime.files, 'runtime.files').forEach(nativePath);
|
|
118
|
+
if (runtime.relocation !== 'loader-relative')
|
|
119
|
+
fail('Runtime libraries must use loader-relative relocation');
|
|
120
|
+
if (runtime.closureManifest !== undefined)
|
|
121
|
+
nativePath(runtime.closureManifest);
|
|
122
|
+
for (const component of array(artifact.components, 'components')) {
|
|
123
|
+
const c = object(component, 'component');
|
|
124
|
+
fields(c, ['id', 'version', 'compatibilityKey', 'linkage', 'required'], 'component');
|
|
125
|
+
for (const key of ['id', 'version', 'compatibilityKey'])
|
|
126
|
+
string(c[key], key);
|
|
127
|
+
if (!['static', 'dynamic'].includes(c.linkage) || typeof c.required !== 'boolean')
|
|
128
|
+
fail('Invalid component linkage/required');
|
|
129
|
+
}
|
|
130
|
+
for (const key of ['fileManifest', 'provenance', 'notices'])
|
|
131
|
+
nativePath(artifact[key]);
|
|
132
|
+
}
|
|
133
|
+
if (native.sourceBuild !== undefined) {
|
|
134
|
+
const build = object(native.sourceBuild, 'sourceBuild');
|
|
135
|
+
fields(build, ['recipe', 'inputs', 'tools', 'automatic'], 'sourceBuild');
|
|
136
|
+
nativePath(build.recipe);
|
|
137
|
+
nativePath(build.inputs);
|
|
138
|
+
strings(build.tools, 'sourceBuild.tools');
|
|
139
|
+
if (build.automatic !== false)
|
|
140
|
+
fail('Native source builds must be explicitly requested; automatic must be false');
|
|
141
|
+
}
|
|
142
|
+
return native;
|
|
143
|
+
}
|
|
144
|
+
function view(value, result) {
|
|
145
|
+
const v = object(value, 'native view');
|
|
146
|
+
fields(v, ['kind', 'resource', 'ownership', 'release', 'releaseLength', 'minimum', 'maximum', ...(result ? [] : ['name'])], 'native view');
|
|
147
|
+
if (!['void', 'i64', 'i32', 'f64', 'bool', 'utf8', 'bytes', 'f64-list', 'utf8-list', 'resource'].includes(v.kind))
|
|
148
|
+
fail('Unsupported native kind ' + v.kind);
|
|
149
|
+
if (v.kind === 'void' && !result)
|
|
150
|
+
fail('void is only a result');
|
|
151
|
+
if (v.kind === 'resource') {
|
|
152
|
+
string(v.resource, 'resource identity');
|
|
153
|
+
if (!result && !['read', 'borrow', 'consume'].includes(v.ownership))
|
|
154
|
+
fail('A resource input requires read, borrow, or consume ownership');
|
|
155
|
+
if (result && v.ownership !== undefined)
|
|
156
|
+
fail('Resource results always transfer ownership; do not declare an input loan');
|
|
157
|
+
}
|
|
158
|
+
else if (v.resource !== undefined || v.ownership !== undefined)
|
|
159
|
+
fail('Resource ownership is only valid on resources');
|
|
160
|
+
if (result && ['utf8', 'bytes', 'f64-list', 'utf8-list'].includes(v.kind) && !v.release)
|
|
161
|
+
fail('Allocated native results require a matching release symbol');
|
|
162
|
+
if (result && v.kind === 'utf8-list')
|
|
163
|
+
fail('utf8-list outputs are not in this ABI profile');
|
|
164
|
+
if (v.release !== undefined)
|
|
165
|
+
symbol(v.release, 'result.release');
|
|
166
|
+
if ((v.release !== undefined || v.releaseLength !== undefined) && (!result || !['utf8', 'bytes', 'f64-list'].includes(v.kind)))
|
|
167
|
+
fail('Release metadata belongs only to allocated buffer results');
|
|
168
|
+
if (v.releaseLength !== undefined && typeof v.releaseLength !== 'boolean')
|
|
169
|
+
fail('releaseLength must be boolean');
|
|
170
|
+
if ((v.minimum !== undefined || v.maximum !== undefined) && !['i64', 'i32'].includes(v.kind))
|
|
171
|
+
fail('Integer bounds require i64 or i32');
|
|
172
|
+
for (const key of ['minimum', 'maximum'])
|
|
173
|
+
if (v[key] !== undefined && !Number.isSafeInteger(v[key]))
|
|
174
|
+
fail(key + ' must be a safe integer');
|
|
175
|
+
if (v.minimum !== undefined && v.maximum !== undefined && v.minimum > v.maximum)
|
|
176
|
+
fail('Empty native integer range');
|
|
177
|
+
return v;
|
|
178
|
+
}
|
|
179
|
+
export function validateNativeDescriptor(value) {
|
|
180
|
+
const descriptor = object(value, 'binding descriptor');
|
|
181
|
+
fields(descriptor, ['format', 'profile', 'resources', 'functions'], 'binding descriptor');
|
|
182
|
+
if (descriptor.format !== 1 || descriptor.profile !== nativeProfile)
|
|
183
|
+
fail('Unsupported binding descriptor version/profile');
|
|
184
|
+
const ids = new Set();
|
|
185
|
+
for (const entry of array(descriptor.resources, 'resources')) {
|
|
186
|
+
const r = object(entry, 'resource');
|
|
187
|
+
fields(r, ['module', 'name', 'release'], 'resource');
|
|
188
|
+
if (!moduleName.test(r.module ?? ''))
|
|
189
|
+
fail('Resource module must be a source-relative module path');
|
|
190
|
+
symbol(r.name, 'resource.name');
|
|
191
|
+
symbol(r.release, 'resource.release');
|
|
192
|
+
const id = r.module + '.' + r.name;
|
|
193
|
+
if (ids.has(id))
|
|
194
|
+
fail('Duplicate native resource ' + id);
|
|
195
|
+
ids.add(id);
|
|
196
|
+
}
|
|
197
|
+
const resources = new Set(ids);
|
|
198
|
+
ids.clear();
|
|
199
|
+
for (const entry of array(descriptor.functions, 'functions')) {
|
|
200
|
+
const fn = object(entry, 'function');
|
|
201
|
+
fields(fn, ['module', 'name', 'symbol', 'params', 'result', 'error', 'callingConvention', 'status', 'uses', 'changes', 'thread', 'retainsInputs'], 'function');
|
|
202
|
+
if (!moduleName.test(fn.module ?? ''))
|
|
203
|
+
fail('Function module must be a source-relative module path');
|
|
204
|
+
symbol(fn.name, 'function.name');
|
|
205
|
+
symbol(fn.symbol, 'function.symbol');
|
|
206
|
+
const id = fn.module + '.' + fn.name;
|
|
207
|
+
if (ids.has(id))
|
|
208
|
+
fail('Duplicate native function ' + id);
|
|
209
|
+
ids.add(id);
|
|
210
|
+
const names = new Set();
|
|
211
|
+
for (const p of array(fn.params, 'function.params')) {
|
|
212
|
+
view(p, false);
|
|
213
|
+
if (p.kind === 'resource' && !resources.has(p.resource))
|
|
214
|
+
fail('Unknown resource identity ' + p.resource);
|
|
215
|
+
symbol(p.name, 'parameter.name');
|
|
216
|
+
if (names.has(p.name))
|
|
217
|
+
fail('Duplicate parameter ' + p.name);
|
|
218
|
+
names.add(p.name);
|
|
219
|
+
}
|
|
220
|
+
const result = view(fn.result, true);
|
|
221
|
+
if (result.kind === 'resource' && !resources.has(result.resource))
|
|
222
|
+
fail('Unknown result resource identity ' + result.resource);
|
|
223
|
+
if (fn.callingConvention !== 'C' || !['i32', 'direct'].includes(fn.status) || fn.thread !== 'caller' || fn.retainsInputs !== false)
|
|
224
|
+
fail('Only C calls on the caller thread with call-duration loans are supported');
|
|
225
|
+
if (fn.error !== undefined) {
|
|
226
|
+
string(fn.error, 'function.error');
|
|
227
|
+
const dot = fn.error.lastIndexOf('.');
|
|
228
|
+
if (!moduleName.test(fn.error.slice(0, dot)) || !identifier.test(fn.error.slice(dot + 1)))
|
|
229
|
+
fail('Native checked errors require a module-qualified declaration identity');
|
|
230
|
+
}
|
|
231
|
+
if (fn.status === 'i32' && !fn.error)
|
|
232
|
+
fail('Status-returning native calls require a checked error type');
|
|
233
|
+
if (fn.status === 'direct' && (fn.error || result.kind === 'resource' || ['utf8', 'bytes', 'f64-list', 'utf8-list'].includes(result.kind)))
|
|
234
|
+
fail('Direct native calls support scalar results only');
|
|
235
|
+
strings(fn.uses, 'function.uses');
|
|
236
|
+
strings(fn.changes, 'function.changes');
|
|
237
|
+
}
|
|
238
|
+
return descriptor;
|
|
239
|
+
}
|
|
240
|
+
export function readNativeDescriptor(directory, native) {
|
|
241
|
+
const root = realpathSync(directory), file = realpathSync(resolve(root, native.bindings));
|
|
242
|
+
if (relative(root, file).split(sep).includes('..'))
|
|
243
|
+
fail('Binding descriptor escapes its package');
|
|
244
|
+
const bytes = readFileSync(file);
|
|
245
|
+
if (createHash('sha256').update(bytes).digest('hex') !== native.bindingsSha256)
|
|
246
|
+
throw new Error('NATIVE_INTEGRITY: binding descriptor differs from bindingsSha256 in ' + directory);
|
|
247
|
+
return validateNativeDescriptor(JSON.parse(bytes.toString('utf8')));
|
|
248
|
+
}
|
|
249
|
+
/** A target is a deployment identity, not an assumption that the host can build it. */
|
|
250
|
+
export function nativeTarget(triple, minimumOS) {
|
|
251
|
+
triple ??= process.platform === 'darwin' ? (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-apple-darwin' : process.platform === 'linux' ? (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-unknown-linux-gnu' : (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-pc-windows-msvc';
|
|
252
|
+
const match = /^(aarch64|x86_64)-(apple-darwin|unknown-linux-(gnu|musl)|pc-windows-msvc)$/.exec(triple);
|
|
253
|
+
if (!match)
|
|
254
|
+
throw new Error('NATIVE_TARGET: Unsupported target ' + triple);
|
|
255
|
+
const os = match[2] === 'apple-darwin' ? 'macos' : match[2].startsWith('unknown-linux') ? 'linux' : 'windows';
|
|
256
|
+
const arch = match[1] === 'aarch64' ? 'arm64' : 'x64';
|
|
257
|
+
return { triple, os, arch, cpuBaseline: arch === 'arm64' ? 'armv8-a' : 'x86-64', libc: os === 'macos' ? 'libSystem' : os === 'windows' ? 'ucrt' : match[3] === 'musl' ? 'musl' : 'glibc', ...(os === 'macos' ? { minimumOS: minimumOS ?? '14.0' } : {}) };
|
|
258
|
+
}
|
|
259
|
+
export function nativeHostTarget() {
|
|
260
|
+
// Darwin 23/24 are macOS 14/15. Apple's 2025 numbering change maps Darwin 25 to macOS 26.
|
|
261
|
+
const darwin = Number(release().split('.')[0]), macos = darwin >= 25 ? darwin + 1 : darwin - 9;
|
|
262
|
+
const target = nativeTarget(undefined, process.platform === 'darwin' ? `${macos}.0` : undefined);
|
|
263
|
+
if (process.platform === 'linux') {
|
|
264
|
+
const header = process.report.getReport()?.header;
|
|
265
|
+
if (header?.glibcVersionRuntime)
|
|
266
|
+
target.minimumLibc = header.glibcVersionRuntime;
|
|
267
|
+
else {
|
|
268
|
+
target.libc = 'musl';
|
|
269
|
+
target.triple = target.triple.replace(/-gnu$/, '-musl');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return target;
|
|
273
|
+
}
|
|
274
|
+
const versionAtLeast = (actual, required) => {
|
|
275
|
+
const a = actual.split('.').map(Number), b = required.split('.').map(Number);
|
|
276
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
277
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0))
|
|
278
|
+
return (a[i] ?? 0) > (b[i] ?? 0);
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
281
|
+
};
|
|
282
|
+
export function selectNativeArtifact(artifacts, target) {
|
|
283
|
+
const matching = artifacts.filter(a => a.target.triple === target.triple && a.target.libc === target.libc &&
|
|
284
|
+
a.target.cpuBaseline === target.cpuBaseline && (!a.target.cxxRuntime ||
|
|
285
|
+
a.target.os === 'macos' && a.target.cxxRuntime === 'system-libc++' && a.target.cxxABI === 'apple-libc++' ||
|
|
286
|
+
a.target.os === 'linux' && a.target.cxxRuntime === 'bundled-libstdc++' && a.target.cxxABI === 'itanium-cxx11') &&
|
|
287
|
+
(!a.target.minimumLibc || !!target.minimumLibc && versionAtLeast(target.minimumLibc, a.target.minimumLibc)) &&
|
|
288
|
+
(!a.target.minimumOS || !!target.minimumOS && versionAtLeast(target.minimumOS, a.target.minimumOS)));
|
|
289
|
+
if (matching.length !== 1) {
|
|
290
|
+
const floors = artifacts.filter(a => a.target.triple === target.triple).map(a => a.target.minimumOS ?? a.target.minimumLibc).filter(Boolean);
|
|
291
|
+
const runtime = target.os === 'linux' ? 'glibc' : 'macOS', actual = target.os === 'linux' ? target.minimumLibc : target.minimumOS;
|
|
292
|
+
throw new Error('NATIVE_TARGET: ' + (matching.length ? 'Ambiguous prebuilt artifacts' : floors.length ? `This package requires ${runtime} ${floors.join(' or ')}+ and its declared C++ ABI; requested ${actual ?? 'unknown'}.` : 'No compatible prebuilt artifact for ' + target.triple) + ` Supported artifacts: ${artifacts.map(a => a.id + ' (' + a.target.triple + ')').join(', ')}. No source build was started.`);
|
|
293
|
+
}
|
|
294
|
+
return matching[0];
|
|
295
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { readNativeDescriptor } from "./native-contracts.js";
|
|
3
|
+
/** Resolve descriptors against exact source declarations, never unqualified spellings. */
|
|
4
|
+
export function nativeDeclarations(project) {
|
|
5
|
+
const result = { functions: new Map(), resources: new Map(), providers: new Map(), providerMetadata: new Map(), providerDescriptors: new Map(), errors: new Map(), diagnostics: [] };
|
|
6
|
+
const issue = (span, message) => result.diagnostics.push({ ...span, code: 'NATIVE_ABI', message });
|
|
7
|
+
const sources = [];
|
|
8
|
+
const symbols = new Map();
|
|
9
|
+
if (project.library?.native)
|
|
10
|
+
sources.push({ directory: project.root, sourceRoot: project.sourceRoot, native: project.library.native, identity: project.library.name + '@' + project.library.version });
|
|
11
|
+
for (const scope of project.packages.scopes.values()) {
|
|
12
|
+
// readPackage already verified the descriptor hash; retain that source identity.
|
|
13
|
+
const native = scope.native;
|
|
14
|
+
if (native)
|
|
15
|
+
sources.push({ directory: scope.directory, sourceRoot: scope.sourceRoot, native, identity: scope.name + '@' + scope.version });
|
|
16
|
+
}
|
|
17
|
+
for (const source of sources) {
|
|
18
|
+
result.providerMetadata.set(source.identity, source.native);
|
|
19
|
+
result.providerDescriptors.set(source.identity, resolve(source.directory, source.native.bindings));
|
|
20
|
+
let descriptor;
|
|
21
|
+
try {
|
|
22
|
+
descriptor = readNativeDescriptor(source.directory, source.native);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
issue({ file: resolve(source.directory, source.native.bindings), start: 0, end: 0, line: 1, column: 1 }, error instanceof Error ? error.message : String(error));
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
for (const name of [...descriptor.resources.map(r => r.release), ...descriptor.functions.flatMap(f => [f.symbol, ...(f.result.release ? [f.result.release] : [])])]) {
|
|
29
|
+
const provider = symbols.get(name);
|
|
30
|
+
if (provider && provider !== source.identity)
|
|
31
|
+
issue({ file: resolve(source.directory, source.native.bindings), start: 0, end: 0, line: 1, column: 1 }, `Native symbol ${name} has ambiguous providers ${provider} and ${source.identity}`);
|
|
32
|
+
else
|
|
33
|
+
symbols.set(name, source.identity);
|
|
34
|
+
}
|
|
35
|
+
for (const resource of descriptor.resources) {
|
|
36
|
+
const file = resolve(source.sourceRoot, resource.module + '.aug');
|
|
37
|
+
const def = project.scopes.get(file)?.get(resource.name);
|
|
38
|
+
if (!def || def.file !== file || def.node.kind !== 'resource') {
|
|
39
|
+
issue({ file, start: 0, end: 0, line: 1, column: 1 }, 'Native descriptor has no matching resource declaration ' + resource.module + '.' + resource.name);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
result.resources.set(def.node, resource);
|
|
43
|
+
result.providers.set(def.node, source.identity);
|
|
44
|
+
}
|
|
45
|
+
for (const fn of descriptor.functions) {
|
|
46
|
+
const file = resolve(source.sourceRoot, fn.module + '.aug');
|
|
47
|
+
const def = project.scopes.get(file)?.get(fn.name);
|
|
48
|
+
if (!def || def.file !== file || def.node.kind !== 'function' || !def.node.externC || def.node.valueAbi) {
|
|
49
|
+
issue({ file, start: 0, end: 0, line: 1, column: 1 }, 'Native descriptor has no matching extern C declaration ' + fn.module + '.' + fn.name);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
result.functions.set(def.node, fn);
|
|
53
|
+
result.providers.set(def.node, source.identity);
|
|
54
|
+
if (fn.error) {
|
|
55
|
+
const dot = fn.error.lastIndexOf('.'), errorFile = resolve(source.sourceRoot, fn.error.slice(0, dot) + '.aug');
|
|
56
|
+
const error = project.scopes.get(errorFile)?.get(fn.error.slice(dot + 1));
|
|
57
|
+
if (!error || error.file !== errorFile || error.node.kind !== 'class')
|
|
58
|
+
issue(def.node.span, 'Native descriptor has no matching checked error declaration ' + fn.error);
|
|
59
|
+
else
|
|
60
|
+
result.errors.set(def.node, error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const def of project.definitions.values())
|
|
65
|
+
if (def.node.kind === 'resource' && !result.resources.has(def.node))
|
|
66
|
+
issue(def.node.span, 'extern C resource requires a release identity in its package native.abi.json');
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Keep checked binding facts separate from promises made by foreign code. */
|
|
2
|
+
export function nativeFact(checked, node) {
|
|
3
|
+
const provider = checked.native.providers.get(node), manifest = provider && checked.native.providerMetadata.get(provider);
|
|
4
|
+
if (!provider || !manifest)
|
|
5
|
+
return;
|
|
6
|
+
const common = { provider, profile: manifest.profile, descriptor: manifest.bindings, descriptorSha256: manifest.bindingsSha256,
|
|
7
|
+
upstream: manifest.upstream, supportedTargets: manifest.artifacts.map(artifact => artifact.target) };
|
|
8
|
+
if (node.kind === 'resource') {
|
|
9
|
+
const contract = checked.native.resources.get(node);
|
|
10
|
+
return contract ? { ...common, kind: 'resource', contract, cleanup: 'scope-exit' } : undefined;
|
|
11
|
+
}
|
|
12
|
+
const contract = checked.native.functions.get(node);
|
|
13
|
+
return contract ? { ...common, kind: 'function', contract,
|
|
14
|
+
compilerChecks: ['provider identity', 'descriptor digest', 'August signature', 'ownership at August call sites'],
|
|
15
|
+
nativeAuthorPromises: ['inputs are not retained', 'boundary entry stays on the caller thread', 'foreign threads do not enter August', 'C ABI boundary does not unwind into August'] } : undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Resolve only standalone calls. Member dispatch is not claimed as complete. */
|
|
18
|
+
export function nativeDependencies(checked, method) {
|
|
19
|
+
const found = new Map(), seen = new Set();
|
|
20
|
+
const visit = (current) => {
|
|
21
|
+
if (seen.has(current))
|
|
22
|
+
return;
|
|
23
|
+
seen.add(current);
|
|
24
|
+
const fact = nativeFact(checked, current);
|
|
25
|
+
if (fact?.kind === 'function') {
|
|
26
|
+
found.set(current, fact);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const walk = (value) => {
|
|
30
|
+
if (!value || typeof value !== 'object')
|
|
31
|
+
return;
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
value.forEach(walk);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const call = value;
|
|
37
|
+
if (call.kind === 'call' && call.callee?.kind === 'name' && call.span) {
|
|
38
|
+
const target = checked.project.scopes.get(call.span.file)?.get(call.callee.name);
|
|
39
|
+
if (target?.node.kind === 'function')
|
|
40
|
+
visit(target.node);
|
|
41
|
+
}
|
|
42
|
+
for (const [key, child] of Object.entries(value))
|
|
43
|
+
if (!['span', 'nameSpan', 'sourceSpan'].includes(key))
|
|
44
|
+
walk(child);
|
|
45
|
+
};
|
|
46
|
+
walk(current.body);
|
|
47
|
+
};
|
|
48
|
+
visit(method);
|
|
49
|
+
return [...found.values()].sort((a, b) => (a.provider + '/' + a.contract.symbol).localeCompare(b.provider + '/' + b.contract.symbol, 'en'));
|
|
50
|
+
}
|
|
51
|
+
export function nativeDescription(fact, contractLink) {
|
|
52
|
+
const quote = (text) => '`' + text + '`';
|
|
53
|
+
const targets = fact.supportedTargets.map(target => target.os + ' ' + target.arch + (target.minimumOS ? ' ' + target.minimumOS + '+' : '') + (target.minimumLibc ? ' glibc ' + target.minimumLibc + '+' : '') + (target.cxxABI ? ' ' + target.cxxABI : '')).join(', ');
|
|
54
|
+
const origin = `Native implementation: ${quote(fact.provider)}, ${quote(fact.upstream.version)}. Supported targets: ${targets}. Binding contract: ${contractLink ?? quote(fact.descriptor)} (SHA-256 ${quote(fact.descriptorSha256)}).`;
|
|
55
|
+
if (fact.kind === 'resource')
|
|
56
|
+
return `${origin} An owned value releases its opaque handle through ${quote(fact.contract.release)} when its scope ends, including error and return paths.`;
|
|
57
|
+
const contract = fact.contract;
|
|
58
|
+
const loans = contract.params.filter(param => param.kind === 'resource').map(param => quote(param.name) + (param.ownership === 'consume' ? ' transfers ownership' : param.ownership === 'borrow' ? ' lends mutable access for this call' : ' lends read access for this call'));
|
|
59
|
+
const result = contract.result.kind === 'resource' ? 'The caller owns the returned handle.' : contract.result.release ?
|
|
60
|
+
`August copies the returned buffer, then calls ${quote(contract.result.release)} to release it.` : '';
|
|
61
|
+
return `${origin} It calls ${quote(contract.symbol)} through the C ABI on the caller thread; a blocking native call blocks that thread. ${loans.length ? loans.join('; ') + '. ' : ''}${result ? result + ' ' : ''}` +
|
|
62
|
+
'The compiler checks the provider, descriptor digest, signature and ownership at August call sites. The native author promises not to retain inputs, enter August from foreign threads, or unwind across the C boundary; internal native workers may run. The compiler does not prove those promises.';
|
|
63
|
+
}
|
package/src/native.js
CHANGED
|
@@ -6,6 +6,8 @@ import { createHash } from 'node:crypto';
|
|
|
6
6
|
import { loadConfig } from "./config.js";
|
|
7
7
|
import { generateOpenApi } from "./openapi.js";
|
|
8
8
|
import { nativeHome } from '../scripts/native-home.mjs';
|
|
9
|
+
import { nativeRequirements } from '../scripts/native-setup.mjs';
|
|
10
|
+
import { cCompiler, compilerHelp } from '../scripts/native-toolchain.mjs';
|
|
9
11
|
export function compileNative(root, generated, options = {}) {
|
|
10
12
|
const config = loadConfig(root).config;
|
|
11
13
|
const buildDir = join(root, '.aug-build', ...(options.testIndex === undefined ? [] : ['tests']));
|
|
@@ -27,38 +29,38 @@ export function compileNative(root, generated, options = {}) {
|
|
|
27
29
|
copyFileSync(join(runtimeDir, 'aug_values.c'), valuesPath);
|
|
28
30
|
const outputName = options.testIndex === undefined ? options.output ?? config.output ?? basename(root) : name;
|
|
29
31
|
const output = isAbsolute(outputName) ? outputName : join(buildDir, outputName);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
33
|
+
const cc = cCompiler();
|
|
32
34
|
const release = options.release ?? config.optimization === 'release';
|
|
33
35
|
const args = [release ? '-O2' : '-O0', '-g', '-std=c11', '-D_POSIX_C_SOURCE=200809L', '-Wall', '-Wextra',
|
|
34
36
|
'-pthread',
|
|
35
37
|
cPath, runtimePath, valuesPath, ...config.library_paths.map(path => `-L${resolve(root, path)}`), ...config.libraries.map(name => `-l${name}`), '-o', output];
|
|
36
|
-
const
|
|
38
|
+
const needs = nativeRequirements(generated), web = needs.web;
|
|
37
39
|
if (web)
|
|
38
40
|
args.push('-DAUG_HTTP_RUNTIME');
|
|
39
|
-
if (
|
|
41
|
+
if (needs.html) {
|
|
40
42
|
const htmlSource = join(buildDir, 'aug_html.c');
|
|
41
43
|
copyFileSync(join(runtimeDir, 'aug_html.c'), htmlSource);
|
|
42
44
|
args.push(htmlSource);
|
|
43
45
|
}
|
|
44
|
-
if (
|
|
46
|
+
if (needs.time) {
|
|
45
47
|
const timeSource = join(buildDir, 'aug_time.c');
|
|
46
48
|
copyFileSync(join(runtimeDir, 'aug_time.c'), timeSource);
|
|
47
49
|
args.push(timeSource);
|
|
48
50
|
}
|
|
49
|
-
if (
|
|
51
|
+
if (needs.tasks) {
|
|
50
52
|
const taskSource = join(buildDir, 'aug_tasks.c');
|
|
51
53
|
copyFileSync(join(runtimeDir, 'aug_tasks.c'), taskSource);
|
|
52
54
|
const minicoro = join(nativeRoot, 'sources', 'minicoro');
|
|
53
55
|
if (!existsSync(join(minicoro, 'minicoro.h')))
|
|
54
|
-
throw new Error('Task
|
|
56
|
+
throw new Error('Task dependencies are missing. Run aug run to prepare them automatically, or use aug-native --extract-only --only minicoro to prewarm the cache.');
|
|
55
57
|
args.push(taskSource, '-I' + minicoro, process.platform === 'darwin' ? '-D_DARWIN_C_SOURCE' : '-D_DEFAULT_SOURCE');
|
|
56
58
|
}
|
|
57
|
-
if (
|
|
59
|
+
if (needs.crypto) {
|
|
58
60
|
const prefix = join(nativeRoot, 'prefix');
|
|
59
61
|
const manifestPath = join(prefix, 'aug-native-manifest.json');
|
|
60
62
|
if (!existsSync(manifestPath))
|
|
61
|
-
throw new Error('Native libraries are not ready. Run
|
|
63
|
+
throw new Error('Native libraries are not ready. Run aug run to prepare them automatically, or use aug-native to prewarm the cache.');
|
|
62
64
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
63
65
|
if (manifest.platform !== process.platform || manifest.architecture !== process.arch)
|
|
64
66
|
throw new Error(`Native dependencies target ${manifest.platform}/${manifest.architecture}; this compiler runs on ${process.platform}/${process.arch}. Build dependencies on this host.`);
|
|
@@ -74,12 +76,12 @@ export function compileNative(root, generated, options = {}) {
|
|
|
74
76
|
args.push('-framework', 'CoreFoundation', '-framework', 'SystemConfiguration');
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
|
-
if (
|
|
79
|
+
if (needs.json) {
|
|
78
80
|
const jsonSource = join(buildDir, 'aug_json.c');
|
|
79
81
|
copyFileSync(join(runtimeDir, 'aug_json.c'), jsonSource);
|
|
80
82
|
const yyjson = join(nativeRoot, 'sources', 'yyjson', 'src');
|
|
81
83
|
if (!existsSync(join(yyjson, 'yyjson.c')))
|
|
82
|
-
throw new Error('JSON
|
|
84
|
+
throw new Error('JSON dependencies are missing. Run aug run to prepare them automatically, or use aug-native --extract-only --only yyjson to prewarm the cache.');
|
|
83
85
|
args.push(jsonSource, join(yyjson, 'yyjson.c'), '-I' + yyjson);
|
|
84
86
|
}
|
|
85
87
|
const sdk = '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk';
|
|
@@ -87,8 +89,12 @@ export function compileNative(root, generated, options = {}) {
|
|
|
87
89
|
args.unshift('-isysroot', sdk);
|
|
88
90
|
const compile = spawnSync(cc, args, { encoding: 'utf8', cwd: root });
|
|
89
91
|
if (compile.error)
|
|
90
|
-
throw compile.error;
|
|
91
|
-
const
|
|
92
|
+
throw new Error(`Cannot compile the program with ${cc}: ${compile.error.message}.\n${compilerHelp()}`);
|
|
93
|
+
const detail = (compile.stderr || compile.stdout || (compile.signal ? `Compiler stopped by ${compile.signal}` : 'C compiler failed')).trim();
|
|
94
|
+
const error = compile.status === 0 ? '' : `Native compilation failed with ${cc}.\n${detail}\n` +
|
|
95
|
+
(/cannot find -l|library not found|file not found|No such file/.test(detail) ?
|
|
96
|
+
'Check main.yaml libraries/library_paths and the named header or library. On Linux, HTTP also needs zlib development headers.\n' : '') +
|
|
97
|
+
`Generated C: ${cPath}\nIf this is valid August code without external C declarations, please report it with this compiler output.`;
|
|
92
98
|
const diagnostics = [];
|
|
93
99
|
for (const match of error.matchAll(/^(.+\.aug):(\d+):(\d+):\s*(?:fatal )?error:\s*(.+)$/gm))
|
|
94
100
|
diagnostics.push({ file: match[1], line: Number(match[2]), column: Number(match[3]), code: 'NATIVE', message: match[4] });
|
package/src/navigation.js
CHANGED
|
@@ -2,6 +2,7 @@ import { statSync } from 'node:fs';
|
|
|
2
2
|
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
3
|
import { lex } from "./lexer.js";
|
|
4
4
|
import { libraryChild } from "./libraries.js";
|
|
5
|
+
import { isGitSource, sourceAlias } from "./git-packages.js";
|
|
5
6
|
function definitionTarget(def) {
|
|
6
7
|
const span = def.node.kind === 'interceptor' ? def.node.nameSpan : def.node.span;
|
|
7
8
|
return { name: def.name, file: def.file, line: span.line,
|
|
@@ -41,7 +42,8 @@ function importPathTarget(project, importer, from, name, segment) {
|
|
|
41
42
|
return exportTarget(project, folder, name, segment < from.length - 1 ? from[segment + 1] : undefined);
|
|
42
43
|
}
|
|
43
44
|
const owner = importer.package ? project.packages.scopes.get(importer.package) : undefined;
|
|
44
|
-
const
|
|
45
|
+
const alias = isGitSource(from[0]) ? sourceAlias(from[0]) : from[0];
|
|
46
|
+
const dependency = owner ? project.packages.scopes.get(owner.dependencies[alias]) : project.packages.roots.get(alias);
|
|
45
47
|
if (dependency) {
|
|
46
48
|
const folder = join(dependency.sourceRoot, ...from.slice(1, segment + 1));
|
|
47
49
|
return exportTarget(project, folder, name, segment < from.length - 1 ? from[segment + 1] : undefined);
|
|
@@ -128,7 +130,7 @@ export function definitionAt(project, fileName, offset) {
|
|
|
128
130
|
entry.span.end <= item.span.end);
|
|
129
131
|
const fromIndex = declarationTokens.findIndex(entry => entry.kind === 'from');
|
|
130
132
|
const sourceTokens = declarationTokens.slice(fromIndex + 1)
|
|
131
|
-
.filter(entry => entry.kind === 'identifier');
|
|
133
|
+
.filter(entry => entry.kind === 'identifier' || entry.kind === 'string');
|
|
132
134
|
const segments = item.kind === 'import' ? item.from : [item.from];
|
|
133
135
|
const selected = token.kind === 'from' ? segments.length - 1 :
|
|
134
136
|
sourceTokens.findIndex((entry) => entry === token);
|
package/src/openapi.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { callableResult } from "./contracts.js";
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
2
3
|
import { schemaType } from "./schemas.js";
|
|
3
4
|
import { callableDocumentation } from "./documentation.js";
|
|
@@ -81,7 +82,7 @@ export function generateOpenApi(checked) {
|
|
|
81
82
|
result.push({ status: fn.endpoint?.status ?? 200, type: primitive('void') });
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
84
|
-
const type = checked.expressionTypes.get(expr) ??
|
|
85
|
+
const type = checked.expressionTypes.get(expr) ?? callableResult(checked, fn);
|
|
85
86
|
if (expr.kind === 'call' && expr.callee.kind === 'name' && type.name === 'HttpResponse') {
|
|
86
87
|
if (expr.callee.name !== 'HttpResponse') {
|
|
87
88
|
const def = project.scopes.get(fn.span.file)?.get(expr.callee.name);
|
|
@@ -125,8 +126,8 @@ export function generateOpenApi(checked) {
|
|
|
125
126
|
}
|
|
126
127
|
result.push({ status: fn.endpoint?.status ?? 200, type });
|
|
127
128
|
});
|
|
128
|
-
if (!result.length && fn.
|
|
129
|
-
result.push({ status: fn.endpoint?.status ?? 200, type:
|
|
129
|
+
if (!result.length && callableResult(checked, fn).name !== 'HttpResponse')
|
|
130
|
+
result.push({ status: fn.endpoint?.status ?? 200, type: callableResult(checked, fn) });
|
|
130
131
|
return result;
|
|
131
132
|
};
|
|
132
133
|
const served = new Map();
|
|
@@ -152,7 +153,7 @@ export function generateOpenApi(checked) {
|
|
|
152
153
|
current.schema = { oneOf: [current.schema, value] };
|
|
153
154
|
};
|
|
154
155
|
if (endpoint.streams) {
|
|
155
|
-
const item =
|
|
156
|
+
const item = callableResult(checked, fn), sse = item.name === 'ServerEvent';
|
|
156
157
|
const itemSchema = sse ? { type: 'object', required: ['data'], properties: { data: { type: 'string', contentMediaType: 'application/json', contentSchema: schema(item.args[0], fn.span) }, id: { type: 'string' }, event: { type: 'string' }, retry: { type: 'integer', minimum: 0 } } } : schema(item, fn.span);
|
|
157
158
|
responses[endpoint.status] = { description: 'Streaming response', content: { [sse ? 'text/event-stream' : item.name === 'Html' ? 'text/html' : 'application/octet-stream']: { itemSchema } } };
|
|
158
159
|
}
|