@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,88 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/** Serialize writers while allowing independent projects to share immutable cached Git objects. */
|
|
4
|
+
export function withPackageLock(path, action) {
|
|
5
|
+
const deadline = Date.now() + 30000;
|
|
6
|
+
while (true) {
|
|
7
|
+
try {
|
|
8
|
+
mkdirSync(path);
|
|
9
|
+
break;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'EEXIST')
|
|
13
|
+
throw error;
|
|
14
|
+
let stale = false;
|
|
15
|
+
try {
|
|
16
|
+
const pid = Number(readFileSync(join(path, 'pid'), 'utf8'));
|
|
17
|
+
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
18
|
+
throw new Error('Invalid lock owner');
|
|
19
|
+
try {
|
|
20
|
+
process.kill(pid, 0);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
stale = !!error && typeof error === 'object' && 'code' in error && error.code === 'ESRCH';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
stale = existsSync(path) && Date.now() - statSync(path).mtimeMs > 180000;
|
|
28
|
+
}
|
|
29
|
+
if (stale) {
|
|
30
|
+
rmSync(path, { recursive: true, force: true });
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (Date.now() >= deadline)
|
|
34
|
+
throw new Error('Another August package installation is still running. Let it finish, then retry. Lock: ' + path);
|
|
35
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
writeFileSync(join(path, 'pid'), String(process.pid));
|
|
40
|
+
return action();
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
rmSync(path, { recursive: true, force: true });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Network-backed installs keep the writer lock until the asynchronous action completes. */
|
|
47
|
+
export async function withPackageLockAsync(path, action) {
|
|
48
|
+
const deadline = Date.now() + 30000;
|
|
49
|
+
while (true) {
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(path);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'EEXIST')
|
|
56
|
+
throw error;
|
|
57
|
+
let stale = false;
|
|
58
|
+
try {
|
|
59
|
+
const pid = Number(readFileSync(join(path, 'pid'), 'utf8'));
|
|
60
|
+
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
61
|
+
throw new Error('Invalid lock owner');
|
|
62
|
+
try {
|
|
63
|
+
process.kill(pid, 0);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
stale = !!e && typeof e === 'object' && 'code' in e && e.code === 'ESRCH';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
stale = existsSync(path) && Date.now() - statSync(path).mtimeMs > 180000;
|
|
71
|
+
}
|
|
72
|
+
if (stale) {
|
|
73
|
+
rmSync(path, { recursive: true, force: true });
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (Date.now() >= deadline)
|
|
77
|
+
throw new Error('Another August installation is still running. Lock: ' + path);
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
writeFileSync(join(path, 'pid'), String(process.pid));
|
|
83
|
+
return await action();
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
rmSync(path, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
package/src/package-manager.js
CHANGED
|
@@ -2,9 +2,26 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
4
|
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { x as extractArchive } from 'tar';
|
|
5
6
|
import { loadConfig } from "./config.js";
|
|
7
|
+
import { parse } from "./parser.js";
|
|
8
|
+
import { isGitSource, materializeGit, sourceAlias } from "./git-packages.js";
|
|
9
|
+
import { agentInstructions } from "./project-init.js";
|
|
10
|
+
import { withPackageLock } from "./package-locking.js";
|
|
11
|
+
import { validateNativeManifest, readNativeDescriptor } from "./native-contracts.js";
|
|
6
12
|
export const compilerVersion = () => JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
7
13
|
export const packageAlias = (name) => /^[a-z][a-z0-9_]*$/.test(name) && name !== 'august';
|
|
14
|
+
/** Repository imports declare their dependencies beside the code that uses them. */
|
|
15
|
+
export function packageSpecifications(sourceRoot, declared, overrides = new Map()) {
|
|
16
|
+
const specifications = { ...declared };
|
|
17
|
+
for (const path of sourcePaths(sourceRoot)) {
|
|
18
|
+
const file = parse(path, overrides.get(path) ?? readFileSync(path, 'utf8')).file;
|
|
19
|
+
for (const item of file.items)
|
|
20
|
+
if (item.kind === 'import' && isGitSource(item.from[0]))
|
|
21
|
+
specifications[sourceAlias(item.from[0])] = item.from[0];
|
|
22
|
+
}
|
|
23
|
+
return ordered(specifications);
|
|
24
|
+
}
|
|
8
25
|
const version = /^\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?$/;
|
|
9
26
|
const npmName = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
|
|
10
27
|
const json = (file) => JSON.parse(readFileSync(file, 'utf8'));
|
|
@@ -38,8 +55,11 @@ export function sourcePaths(root) {
|
|
|
38
55
|
if (entry.name.startsWith('.') || ['node_modules', 'dist'].includes(entry.name))
|
|
39
56
|
continue;
|
|
40
57
|
const file = join(root, entry.name);
|
|
41
|
-
if (entry.isSymbolicLink())
|
|
42
|
-
|
|
58
|
+
if (entry.isSymbolicLink()) {
|
|
59
|
+
if (entry.name.endsWith('.aug'))
|
|
60
|
+
throw new Error(`Package source cannot contain a symbolic link: ${file}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
43
63
|
if (entry.isDirectory())
|
|
44
64
|
result.push(...sourcePaths(file));
|
|
45
65
|
else if (entry.isFile() && entry.name.endsWith('.aug'))
|
|
@@ -48,10 +68,19 @@ export function sourcePaths(root) {
|
|
|
48
68
|
return result;
|
|
49
69
|
}
|
|
50
70
|
export function readPackage(directory) {
|
|
51
|
-
const manifest = json(join(directory, 'aug-package.json'))
|
|
52
|
-
|
|
71
|
+
const manifest = existsSync(join(directory, 'aug-package.json')) ? json(join(directory, 'aug-package.json')) : {
|
|
72
|
+
format: 1, name: 'aug-' + sourceAlias(realpathSync(directory)), version: '0.0.0', compiler: compilerVersion(),
|
|
73
|
+
source: existsSync(join(directory, 'export.aug')) ? '.' : 'src', dependencies: {}
|
|
74
|
+
};
|
|
75
|
+
if (![1, 2].includes(manifest.format) || !npmName.test(manifest.name ?? '') || !version.test(manifest.version ?? '') ||
|
|
53
76
|
manifest.compiler !== compilerVersion())
|
|
54
77
|
throw new Error(`Invalid August package or compiler mismatch in ${directory}; expected compiler ${compilerVersion()}`);
|
|
78
|
+
if (manifest.format === 1 && manifest.native !== undefined)
|
|
79
|
+
throw new Error('Native packages require manifest format 2');
|
|
80
|
+
if (manifest.format === 2) {
|
|
81
|
+
manifest.native = validateNativeManifest(manifest.native);
|
|
82
|
+
readNativeDescriptor(directory, manifest.native);
|
|
83
|
+
}
|
|
55
84
|
if (typeof manifest.source !== 'string' || !manifest.source || isAbsolute(manifest.source))
|
|
56
85
|
throw new Error('Package source must be a relative folder');
|
|
57
86
|
const sourceRoot = realpathSync(resolve(directory, manifest.source));
|
|
@@ -64,12 +93,14 @@ export function readPackage(directory) {
|
|
|
64
93
|
throw new Error(`Invalid package dependency ${alias}`);
|
|
65
94
|
normalizeSpecifier(spec, directory, false);
|
|
66
95
|
}
|
|
67
|
-
const published = json(join(directory, 'package.json'));
|
|
68
|
-
if (published.name !== manifest.name || published.version !== manifest.version)
|
|
96
|
+
const published = existsSync(join(directory, 'package.json')) ? json(join(directory, 'package.json')) : undefined;
|
|
97
|
+
if (published && (published.name !== manifest.name || published.version !== manifest.version))
|
|
69
98
|
throw new Error('package.json and aug-package.json names/versions must match');
|
|
70
|
-
const
|
|
71
|
-
if (
|
|
72
|
-
throw new Error(
|
|
99
|
+
const configuration = loadConfig(directory);
|
|
100
|
+
if (configuration.diagnostics.length)
|
|
101
|
+
throw new Error(`Invalid package configuration in ${directory}: ${configuration.diagnostics.map(issue => issue.message).join('; ')}`);
|
|
102
|
+
manifest.dependencies = { ...configuration.config.packages, ...manifest.dependencies };
|
|
103
|
+
const declared = manifest.dependencies ?? {};
|
|
73
104
|
for (const alias of Object.keys(declared))
|
|
74
105
|
assertAlias(sourceRoot, alias);
|
|
75
106
|
return { manifest, sourceRoot };
|
|
@@ -81,6 +112,8 @@ function assertAlias(root, alias) {
|
|
|
81
112
|
throw new Error(`Package alias ${alias} conflicts with a local module`);
|
|
82
113
|
}
|
|
83
114
|
function normalizeSpecifier(spec, root, requirePath = true) {
|
|
115
|
+
if (isGitSource(spec))
|
|
116
|
+
return spec;
|
|
84
117
|
if (spec.startsWith('npm:')) {
|
|
85
118
|
const match = /^npm:((?:@[^/]+\/)?[^@]+)@(.+)$/.exec(spec);
|
|
86
119
|
if (!match || !npmName.test(match[1]) || !version.test(match[2]))
|
|
@@ -101,7 +134,7 @@ function normalizeSpecifier(spec, root, requirePath = true) {
|
|
|
101
134
|
}
|
|
102
135
|
function packageDigest(directory, sourceRoot) {
|
|
103
136
|
const hash = createHash('sha256');
|
|
104
|
-
for (const file of [join(directory, 'aug-package.json'), join(directory, 'package.json'), ...sourcePaths(sourceRoot)].sort()) {
|
|
137
|
+
for (const file of [join(directory, 'aug-package.json'), join(directory, 'package.json'), join(directory, 'native.abi.json'), join(directory, 'THIRD_PARTY_NOTICES.md'), ...sourcePaths(sourceRoot)].filter(existsSync).sort()) {
|
|
105
138
|
hash.update(relative(directory, file).replaceAll('\\', '/'));
|
|
106
139
|
hash.update('\0');
|
|
107
140
|
hash.update(readFileSync(file));
|
|
@@ -111,7 +144,7 @@ function packageDigest(directory, sourceRoot) {
|
|
|
111
144
|
}
|
|
112
145
|
/** Compilation reads only a verified installed snapshot. It never fetches dependencies. */
|
|
113
146
|
export function projectPackages(root, specifications, sourceFolder = root) {
|
|
114
|
-
const result = { roots: new Map(), scopes: new Map(), diagnostics: [] };
|
|
147
|
+
const result = { roots: new Map(), scopes: new Map(), diagnostics: [], specifications };
|
|
115
148
|
if (!Object.keys(specifications).length)
|
|
116
149
|
return result;
|
|
117
150
|
try {
|
|
@@ -130,10 +163,12 @@ export function projectPackages(root, specifications, sourceFolder = root) {
|
|
|
130
163
|
if (manifest.name !== entry.name || manifest.version !== entry.version || manifest.source !== entry.source ||
|
|
131
164
|
packageDigest(directory, sourceRoot) !== entry.digest)
|
|
132
165
|
throw new Error(`Installed ${entry.name} changed; run aug install`);
|
|
166
|
+
if (JSON.stringify(entry.native) !== JSON.stringify(manifest.native))
|
|
167
|
+
throw new Error(`NATIVE_LOCK: Native metadata for ${entry.name} differs from its verified source manifest; run aug install`);
|
|
133
168
|
if (result.scopes.has(entry.path))
|
|
134
169
|
throw new Error('Duplicate package lock path');
|
|
135
170
|
manifests.set(entry.path, manifest);
|
|
136
|
-
result.scopes.set(entry.path, { ...entry, directory, sourceRoot });
|
|
171
|
+
result.scopes.set(entry.path, { ...entry, native: manifest.native, directory, sourceRoot, specifications: manifest.dependencies ?? {} });
|
|
137
172
|
}
|
|
138
173
|
verifyIdentities(lock.packages);
|
|
139
174
|
for (const scope of result.scopes.values()) {
|
|
@@ -179,76 +214,212 @@ export function projectPackages(root, specifications, sourceFolder = root) {
|
|
|
179
214
|
}
|
|
180
215
|
function npm(args, cwd) {
|
|
181
216
|
const process = spawnSync('npm', args, { cwd, encoding: 'utf8', timeout: 120000 });
|
|
182
|
-
if (process.error
|
|
183
|
-
throw new Error(process.error
|
|
217
|
+
if (process.error)
|
|
218
|
+
throw new Error(`Cannot install August packages: ${'code' in process.error && process.error.code === 'ENOENT' ? 'npm is missing from PATH. Install Node.js 24 or newer, which includes npm.' : process.error.message}\nRetry aug run after fixing the package installer.`);
|
|
219
|
+
if (process.status !== 0)
|
|
220
|
+
throw new Error(`August package installation failed.\n${(process.stderr || process.stdout || `npm exited ${process.status}`).trim()}\nCheck the package versions and paths in main.yaml, your network connection, and npm registry configuration. Retry aug run; use aug install for an explicit installation.`);
|
|
184
221
|
return process.stdout;
|
|
185
222
|
}
|
|
186
|
-
|
|
223
|
+
/** Running an application prepares its declared packages; checking remains read-only. */
|
|
224
|
+
export function prepareRunPackages(root, offline = false, frozen = false) {
|
|
225
|
+
const loaded = loadConfig(root);
|
|
226
|
+
if (loaded.diagnostics.length)
|
|
227
|
+
return; // The checker renders the configuration's source diagnostics.
|
|
228
|
+
const library = isLibrary(root) ? readPackage(root) : undefined;
|
|
229
|
+
const specifications = packageSpecifications(library?.sourceRoot ?? root, library?.manifest.dependencies ?? loaded.config.packages);
|
|
230
|
+
const lockPath = join(root, 'aug.lock.json');
|
|
231
|
+
let lock;
|
|
232
|
+
if (existsSync(lockPath)) {
|
|
233
|
+
try {
|
|
234
|
+
lock = json(lockPath);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
throw new Error('aug.lock.json is unreadable. Restore it from version control or run aug install to recreate it.');
|
|
238
|
+
}
|
|
239
|
+
if (lock?.format !== 1 || !Array.isArray(lock.packages) || !lock.specifications || typeof lock.specifications !== 'object')
|
|
240
|
+
throw new Error('aug.lock.json has an unsupported structure. Run aug install to recreate it.');
|
|
241
|
+
}
|
|
242
|
+
const matching = lock?.compiler === compilerVersion() && sameSpecifications(lock.specifications, specifications);
|
|
243
|
+
if (!matching) {
|
|
244
|
+
if (!lock && !Object.keys(specifications).length)
|
|
245
|
+
return;
|
|
246
|
+
if (frozen)
|
|
247
|
+
throw new Error('PACKAGE_LOCK: Frozen run requires a matching aug.lock.json for the current imports, configuration and compiler. Run aug install before retrying.');
|
|
248
|
+
process.stderr.write('Installing August packages declared by imports and main.yaml…\n');
|
|
249
|
+
installPackages(root, false, offline);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const snapshot = resolve(root, '.aug-packages');
|
|
253
|
+
const missing = lock.packages.some(entry => {
|
|
254
|
+
if (typeof entry.path !== 'string' || isAbsolute(entry.path) || !inside(snapshot, resolve(snapshot, entry.path)))
|
|
255
|
+
throw new Error('Package lock contains a path outside its snapshot. Run aug install to recreate it.');
|
|
256
|
+
return !existsSync(resolve(snapshot, entry.path));
|
|
257
|
+
});
|
|
258
|
+
if (missing) {
|
|
259
|
+
process.stderr.write('Restoring August packages from aug.lock.json…\n');
|
|
260
|
+
installPackages(root, true, offline);
|
|
261
|
+
}
|
|
262
|
+
// projectPackages checks contents and integrity before compilation. Changed installed sources are never silently replaced.
|
|
263
|
+
}
|
|
264
|
+
export function installPackages(root, frozen = false, offline = false, update = false) {
|
|
265
|
+
return withPackageLock(join(root, '.aug-install.lock'), () => installLocked(root, frozen, offline, update));
|
|
266
|
+
}
|
|
267
|
+
function installLocked(root, frozen, offline, update) {
|
|
268
|
+
if (frozen && update)
|
|
269
|
+
throw new Error('--frozen and --update cannot be used together.');
|
|
187
270
|
const loaded = loadConfig(root);
|
|
188
271
|
if (loaded.diagnostics.length)
|
|
189
272
|
throw new Error(loaded.diagnostics.map(issue => issue.message).join('\n'));
|
|
190
|
-
const library =
|
|
191
|
-
|
|
192
|
-
preparePackage(root);
|
|
193
|
-
const specifications = ordered(library?.dependencies ?? loaded.config.packages);
|
|
273
|
+
const library = isLibrary(root) ? readPackage(root) : undefined;
|
|
274
|
+
const specifications = packageSpecifications(library?.sourceRoot ?? root, library?.manifest.dependencies ?? loaded.config.packages);
|
|
194
275
|
for (const alias of Object.keys(specifications))
|
|
195
|
-
assertAlias(library
|
|
276
|
+
assertAlias(library?.sourceRoot ?? root, alias);
|
|
196
277
|
const lockPath = join(root, 'aug.lock.json');
|
|
197
278
|
const previous = existsSync(lockPath) ? json(lockPath) : undefined;
|
|
198
|
-
const same = previous?.compiler === compilerVersion() && sameSpecifications(previous.specifications, specifications);
|
|
279
|
+
const same = !update && previous?.compiler === compilerVersion() && sameSpecifications(previous.specifications, specifications);
|
|
199
280
|
if (frozen && !same)
|
|
200
281
|
throw new Error('Frozen installation requires a matching aug.lock.json');
|
|
282
|
+
return installSourceGraph(root, specifications, frozen, offline, same ? previous : undefined);
|
|
283
|
+
}
|
|
284
|
+
const isLibrary = (root) => existsSync(join(root, 'aug-package.json')) ||
|
|
285
|
+
!existsSync(join(root, 'main.aug')) && (existsSync(join(root, 'export.aug')) || existsSync(join(root, 'src/export.aug')));
|
|
286
|
+
const selectedSource = (file) => file.endsWith('.aug') || ['aug-package.json', 'package.json', 'main.yaml', 'README.md', 'LICENSE', 'native.abi.json', 'THIRD_PARTY_NOTICES.md'].includes(file);
|
|
287
|
+
function copySource(origin, destination) {
|
|
288
|
+
let bytes = 0, count = 0;
|
|
289
|
+
const copy = (folder) => {
|
|
290
|
+
for (const entry of readdirSync(folder, { withFileTypes: true })) {
|
|
291
|
+
if (entry.name.startsWith('.') || ['node_modules', 'dist'].includes(entry.name))
|
|
292
|
+
continue;
|
|
293
|
+
const file = join(folder, entry.name), name = relative(origin, file);
|
|
294
|
+
if (entry.isDirectory())
|
|
295
|
+
copy(file);
|
|
296
|
+
else if (selectedSource(name)) {
|
|
297
|
+
if (!entry.isFile())
|
|
298
|
+
throw new Error('Package source must contain regular files: ' + name);
|
|
299
|
+
const data = readFileSync(file);
|
|
300
|
+
bytes += data.length;
|
|
301
|
+
if (++count > 10000 || bytes > 32 * 1024 * 1024)
|
|
302
|
+
throw new Error('Source package exceeds 10,000 files or 32 MiB.');
|
|
303
|
+
mkdirSync(dirname(join(destination, name)), { recursive: true });
|
|
304
|
+
writeFileSync(join(destination, name), data);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
copy(origin);
|
|
309
|
+
}
|
|
310
|
+
function unpackSource(archive, destination) {
|
|
311
|
+
let bytes = 0, count = 0;
|
|
312
|
+
const paths = new Set();
|
|
313
|
+
extractArchive({ file: archive, cwd: destination, strip: 1, sync: true, strict: true, filter: (path, entry) => {
|
|
314
|
+
if (!('type' in entry))
|
|
315
|
+
throw new Error('Expected an archive entry.');
|
|
316
|
+
const parts = path.split('/');
|
|
317
|
+
if (isAbsolute(path) || path.includes('\\') || parts.some(part => part === '..'))
|
|
318
|
+
throw new Error('Package archive contains a path outside its folder.');
|
|
319
|
+
const name = parts.slice(1).join('/');
|
|
320
|
+
if (entry.type === 'Directory')
|
|
321
|
+
return false;
|
|
322
|
+
if (!selectedSource(name))
|
|
323
|
+
return false;
|
|
324
|
+
if (entry.type !== 'File' || !name || parts[0] !== 'package' || parts.slice(1).some(part => !part || part.startsWith('.')))
|
|
325
|
+
throw new Error('Package archive source must be regular files inside package/.');
|
|
326
|
+
if (paths.has(name))
|
|
327
|
+
throw new Error('Package archive repeats a source file: ' + name);
|
|
328
|
+
paths.add(name);
|
|
329
|
+
bytes += entry.size;
|
|
330
|
+
if (++count > 10000 || bytes > 32 * 1024 * 1024)
|
|
331
|
+
throw new Error('Source package exceeds 10,000 files or 32 MiB.');
|
|
332
|
+
return true;
|
|
333
|
+
} });
|
|
334
|
+
}
|
|
335
|
+
/** Git libraries use the same checked source graph as registry libraries. No remote program is executed. */
|
|
336
|
+
function installSourceGraph(root, specifications, frozen, offline, previous) {
|
|
201
337
|
const stage = realpathSync(mkdtempSync(join(root, '.aug-install-')));
|
|
338
|
+
const packages = new Map(), visited = new Map();
|
|
339
|
+
const gitSources = new Map();
|
|
340
|
+
const registry = {};
|
|
341
|
+
const locked = new Map((previous?.git ?? []).map(source => [source.request, source]));
|
|
342
|
+
const visit = (spec, owner) => {
|
|
343
|
+
const normalized = normalizeSpecifier(spec, owner);
|
|
344
|
+
if (visited.has(normalized))
|
|
345
|
+
return visited.get(normalized);
|
|
346
|
+
if (visited.size >= 1000)
|
|
347
|
+
throw new Error('Package graph exceeds 1,000 source packages.');
|
|
348
|
+
const identity = normalized.startsWith('file:') ? 'file:' + relative(root, normalized.slice(5)).replaceAll('\\', '/') : normalized;
|
|
349
|
+
const path = 'packages/' + sourceAlias(identity), directory = join(stage, path);
|
|
350
|
+
visited.set(normalized, path);
|
|
351
|
+
mkdirSync(directory, { recursive: true });
|
|
352
|
+
let origin = directory;
|
|
353
|
+
let source;
|
|
354
|
+
if (isGitSource(normalized)) {
|
|
355
|
+
source = materializeGit(normalized, directory, offline, locked.get(normalized));
|
|
356
|
+
gitSources.set(normalized, source);
|
|
357
|
+
}
|
|
358
|
+
else if (normalized.startsWith('file:') && lstatSync(normalized.slice(5)).isDirectory()) {
|
|
359
|
+
origin = normalized.slice(5);
|
|
360
|
+
copySource(origin, directory);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
const transport = join(stage, 'transport', sourceAlias(normalized));
|
|
364
|
+
mkdirSync(transport, { recursive: true });
|
|
365
|
+
const request = normalized.startsWith('npm:') ? normalized.slice(4) : normalized.slice(5);
|
|
366
|
+
const packed = JSON.parse(npm(['pack', request, '--ignore-scripts', '--json', '--pack-destination', transport,
|
|
367
|
+
...(offline ? ['--offline'] : [])], transport))[0];
|
|
368
|
+
if (!packed?.filename || !/^sha512-[A-Za-z0-9+/=]+$/.test(packed.integrity ?? ''))
|
|
369
|
+
throw new Error('Package archive is missing its SHA-512 integrity.');
|
|
370
|
+
registry[normalized] = { integrity: packed.integrity, name: packed.name, version: packed.version };
|
|
371
|
+
const archive = join(transport, basename(packed.filename));
|
|
372
|
+
const actual = 'sha512-' + createHash('sha512').update(readFileSync(archive)).digest('base64');
|
|
373
|
+
if (actual !== packed.integrity)
|
|
374
|
+
throw new Error('Package archive integrity mismatch.');
|
|
375
|
+
if (frozen && JSON.stringify(previous?.npm?.[normalized]) !== JSON.stringify(registry[normalized]))
|
|
376
|
+
throw new Error('Frozen package archive changed. Publish a new version instead of replacing an archive.');
|
|
377
|
+
unpackSource(archive, directory);
|
|
378
|
+
}
|
|
379
|
+
if (!existsSync(join(directory, 'aug-package.json'))) {
|
|
380
|
+
const folder = existsSync(join(directory, 'export.aug')) ? '.' : 'src';
|
|
381
|
+
const published = existsSync(join(directory, 'package.json')) ? json(join(directory, 'package.json')) : undefined;
|
|
382
|
+
writeJson(join(directory, 'aug-package.json'), { format: 1,
|
|
383
|
+
name: published?.name ?? '@git/' + sourceAlias(source ? source.repository + '/' + source.folder : identity),
|
|
384
|
+
version: published?.version ?? (source ? '0.0.0-git.' + source.commit : '0.0.0'),
|
|
385
|
+
compiler: compilerVersion(), source: folder, dependencies: published?.dependencies ?? {} });
|
|
386
|
+
}
|
|
387
|
+
const manifest = json(join(directory, 'aug-package.json'));
|
|
388
|
+
// A Git folder owns its August manifest. npm metadata and lifecycle scripts have no role here.
|
|
389
|
+
const dependencies = packageSpecifications(resolve(directory, manifest.source), { ...loadConfig(directory).config.packages, ...manifest.dependencies });
|
|
390
|
+
manifest.dependencies = dependencies;
|
|
391
|
+
writeJson(join(directory, 'aug-package.json'), manifest);
|
|
392
|
+
writeJson(join(directory, 'package.json'), { name: manifest.name, version: manifest.version, private: true, dependencies });
|
|
393
|
+
const { sourceRoot } = readPackage(directory);
|
|
394
|
+
const entry = { path, name: manifest.name, version: manifest.version, source: manifest.source,
|
|
395
|
+
digest: packageDigest(directory, sourceRoot), dependencies: {}, ...(manifest.native ? { native: manifest.native } : {}) };
|
|
396
|
+
packages.set(path, entry);
|
|
397
|
+
for (const [alias, request] of Object.entries(dependencies)) {
|
|
398
|
+
entry.dependencies[alias] = visit(request, origin);
|
|
399
|
+
verifyReference(request, packages.get(entry.dependencies[alias]));
|
|
400
|
+
}
|
|
401
|
+
return path;
|
|
402
|
+
};
|
|
202
403
|
try {
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
if (
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
const visit = (directory) => {
|
|
214
|
-
const actual = realpathSync(directory);
|
|
215
|
-
if (!inside(stage, actual))
|
|
216
|
-
throw new Error('Package installer did not create a self-contained snapshot');
|
|
217
|
-
const path = relative(stage, actual).replaceAll('\\', '/');
|
|
218
|
-
if (packages.has(path))
|
|
219
|
-
return path;
|
|
220
|
-
const { manifest, sourceRoot } = readPackage(actual);
|
|
221
|
-
const entry = { path, name: manifest.name, version: manifest.version, source: manifest.source,
|
|
222
|
-
digest: packageDigest(actual, sourceRoot), dependencies: {} };
|
|
223
|
-
packages.set(path, entry);
|
|
224
|
-
for (const alias of Object.keys(manifest.dependencies ?? {})) {
|
|
225
|
-
let owner = actual;
|
|
226
|
-
while (inside(stage, owner) && !existsSync(join(owner, 'node_modules', alias, 'aug-package.json')))
|
|
227
|
-
owner = dirname(owner);
|
|
228
|
-
if (!inside(stage, owner))
|
|
229
|
-
throw new Error(`${manifest.name} is missing dependency ${alias}`);
|
|
230
|
-
entry.dependencies[alias] = visit(join(owner, 'node_modules', alias));
|
|
231
|
-
verifyReference(manifest.dependencies[alias], packages.get(entry.dependencies[alias]));
|
|
232
|
-
}
|
|
233
|
-
return path;
|
|
234
|
-
};
|
|
235
|
-
const roots = Object.fromEntries(Object.keys(specifications).map(alias => [alias, visit(join(stage, 'node_modules', alias))]));
|
|
236
|
-
const lock = { format: 1, compiler: compilerVersion(), specifications, roots,
|
|
237
|
-
packages: [...packages.values()].sort((a, b) => a.path.localeCompare(b.path)), npm: json(join(stage, 'package-lock.json')) };
|
|
238
|
-
verifyIdentities(lock.packages);
|
|
239
|
-
for (const [alias, path] of Object.entries(roots))
|
|
240
|
-
verifyReference(specifications[alias], packages.get(path));
|
|
241
|
-
if (frozen && JSON.stringify(lock.packages) !== JSON.stringify(previous.packages))
|
|
242
|
-
throw new Error('Frozen package contents changed; update the lock explicitly with aug install');
|
|
404
|
+
const roots = Object.fromEntries(Object.entries(specifications).map(([alias, request]) => [alias, visit(request, root)]));
|
|
405
|
+
verifyIdentities(packages.values());
|
|
406
|
+
const lock = { format: 1, compiler: compilerVersion(), specifications, roots, npm: registry,
|
|
407
|
+
git: [...gitSources.values()].sort((a, b) => a.request.localeCompare(b.request)),
|
|
408
|
+
packages: [...packages.values()].sort((a, b) => a.path.localeCompare(b.path)) };
|
|
409
|
+
if (previous?.native && JSON.stringify(lock.packages) === JSON.stringify(previous.packages))
|
|
410
|
+
lock.native = previous.native;
|
|
411
|
+
if (frozen && JSON.stringify(lock.packages) !== JSON.stringify(previous?.packages))
|
|
412
|
+
throw new Error('Frozen package contents changed; use aug install --update to choose new revisions.');
|
|
413
|
+
rmSync(join(stage, 'transport'), { recursive: true, force: true });
|
|
243
414
|
const cache = join(root, '.aug-packages'), backup = join(root, '.aug-packages-old');
|
|
244
415
|
if (existsSync(backup))
|
|
245
|
-
throw new Error('Previous package install backup exists; inspect .aug-packages-old before installing');
|
|
416
|
+
throw new Error('Previous package install backup exists; inspect .aug-packages-old before installing.');
|
|
246
417
|
if (existsSync(cache))
|
|
247
418
|
renameSync(cache, backup);
|
|
248
419
|
try {
|
|
249
420
|
renameSync(stage, cache);
|
|
250
|
-
writeJson(
|
|
251
|
-
renameSync(
|
|
421
|
+
writeJson(join(root, 'aug.lock.json.tmp'), lock);
|
|
422
|
+
renameSync(join(root, 'aug.lock.json.tmp'), join(root, 'aug.lock.json'));
|
|
252
423
|
}
|
|
253
424
|
catch (error) {
|
|
254
425
|
rmSync(cache, { recursive: true, force: true });
|
|
@@ -263,16 +434,18 @@ export function installPackages(root, frozen = false, offline = false) {
|
|
|
263
434
|
rmSync(stage, { recursive: true, force: true });
|
|
264
435
|
}
|
|
265
436
|
}
|
|
266
|
-
export function initPackage(directory, name) {
|
|
437
|
+
export function initPackage(directory, name, npmMetadata = false) {
|
|
267
438
|
if (!npmName.test(name))
|
|
268
439
|
throw new Error('Package name must be an npm name, for example @owner/aug-math');
|
|
269
440
|
if (existsSync(directory) && readdirSync(directory).length)
|
|
270
441
|
throw new Error('Package init requires a new or empty directory');
|
|
271
442
|
mkdirSync(join(directory, 'src'), { recursive: true });
|
|
443
|
+
writeFileSync(join(directory, 'AGENTS.md'), agentInstructions);
|
|
272
444
|
const manifest = { format: 1, name, version: '0.1.0', compiler: compilerVersion(), source: 'src', dependencies: {} };
|
|
273
445
|
writeJson(join(directory, 'aug-package.json'), manifest);
|
|
274
|
-
|
|
275
|
-
|
|
446
|
+
if (npmMetadata)
|
|
447
|
+
writeJson(join(directory, 'package.json'), { name, version: manifest.version, description: 'An August source library',
|
|
448
|
+
files: ['src', '.aug-spec', 'aug-package.json', 'README.md', 'LICENSE'], exports: { './aug-package.json': './aug-package.json' }, dependencies: {} });
|
|
276
449
|
writeFileSync(join(directory, 'src/export.aug'), 'export add from arithmetic\n');
|
|
277
450
|
writeFileSync(join(directory, 'src/arithmetic.aug'), '/** Add two integers. @param left First value. @param right Second value. @return Their sum. */\nadd(int left, int right) returns int {\n return left + right\n}\n\ntest add {\n when addition {\n it adds_two_integers {\n assert(add(left=2, right=3) == 5)\n }\n }\n}\n');
|
|
278
451
|
writeFileSync(join(directory, 'README.md'), `# ${name}\n\nAugust ${compilerVersion()} source library. Public exports live in src/export.aug.\n`);
|
|
@@ -281,11 +454,13 @@ export function initPackage(directory, name) {
|
|
|
281
454
|
/** Synchronize transport metadata; August's manifest owns dependency aliases. */
|
|
282
455
|
export function preparePackage(root) {
|
|
283
456
|
const manifest = json(join(root, 'aug-package.json'));
|
|
284
|
-
const transport = json(join(root, 'package.json'));
|
|
457
|
+
const transport = existsSync(join(root, 'package.json')) ? json(join(root, 'package.json')) : {};
|
|
285
458
|
transport.name = manifest.name;
|
|
286
459
|
transport.version = manifest.version;
|
|
287
460
|
transport.dependencies = manifest.dependencies ?? {};
|
|
288
461
|
transport.files = [...new Set([...(Array.isArray(transport.files) ? transport.files : ['README.md', 'LICENSE']), manifest.source, '.aug-spec', 'aug-package.json'])];
|
|
462
|
+
if (manifest.native)
|
|
463
|
+
transport.files.push('native.abi.json', 'THIRD_PARTY_NOTICES.md');
|
|
289
464
|
writeJson(join(root, 'package.json'), transport);
|
|
290
465
|
readPackage(root);
|
|
291
466
|
}
|
|
@@ -297,3 +472,27 @@ export function packPackage(root) {
|
|
|
297
472
|
throw new Error('npm pack returned no archive');
|
|
298
473
|
return join(destination, basename(result.filename));
|
|
299
474
|
}
|
|
475
|
+
/** Give a source package a short import name and install its verified dependency graph. */
|
|
476
|
+
export function addPackage(root, request, alias, offline = false) {
|
|
477
|
+
const loaded = loadConfig(root);
|
|
478
|
+
if (loaded.diagnostics.length)
|
|
479
|
+
throw new Error(loaded.diagnostics.map(issue => issue.message).join('\n'));
|
|
480
|
+
assertAlias(isLibrary(root) ? readPackage(root).sourceRoot : root, alias);
|
|
481
|
+
normalizeSpecifier(request, root);
|
|
482
|
+
const path = join(root, 'main.yaml'), existed = existsSync(path), before = existed ? readFileSync(path, 'utf8') : '';
|
|
483
|
+
const dependencies = { ...loaded.config.packages, [alias]: request };
|
|
484
|
+
const block = 'packages:\n' + Object.entries(ordered(dependencies)).map(([name, value]) => ' ' + name + ': ' + JSON.stringify(value)).join('\n') + '\n';
|
|
485
|
+
const expression = /^packages:[^\n]*(?:\n|$)(?:[ \t][^\n]*(?:\n|$)|\n)*/m;
|
|
486
|
+
const after = expression.test(before) ? before.replace(expression, block) : before.trimEnd() + (before.trim() ? '\n\n' : '') + block;
|
|
487
|
+
writeFileSync(path, after);
|
|
488
|
+
try {
|
|
489
|
+
return installPackages(root, false, offline);
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
if (existed)
|
|
493
|
+
writeFileSync(path, before);
|
|
494
|
+
else
|
|
495
|
+
rmSync(path, { force: true });
|
|
496
|
+
throw error;
|
|
497
|
+
}
|
|
498
|
+
}
|
package/src/parser.js
CHANGED
|
@@ -218,8 +218,14 @@ class Parser {
|
|
|
218
218
|
return { kind: 'composition', name, typeParams: [], bindings, span: this.span(start) };
|
|
219
219
|
}
|
|
220
220
|
if (this.at('extern')) {
|
|
221
|
-
this.take();
|
|
221
|
+
const start = this.take().span;
|
|
222
222
|
this.expect('C');
|
|
223
|
+
if (this.current().value === 'resource') {
|
|
224
|
+
this.take();
|
|
225
|
+
const name = this.expect('identifier').value;
|
|
226
|
+
this.endStatement();
|
|
227
|
+
return { kind: 'resource', name, typeParams: [], span: this.span(start) };
|
|
228
|
+
}
|
|
223
229
|
return this.parseFunction(true);
|
|
224
230
|
}
|
|
225
231
|
if (this.looksLikeBareClass())
|
|
@@ -395,6 +401,11 @@ class Parser {
|
|
|
395
401
|
this.parseTypeParams();
|
|
396
402
|
if (this.at('('))
|
|
397
403
|
this.parseParams(true);
|
|
404
|
+
if (this.match('unless')) {
|
|
405
|
+
this.parseType();
|
|
406
|
+
while (this.match('and') || this.match(','))
|
|
407
|
+
this.parseType();
|
|
408
|
+
}
|
|
398
409
|
if (this.match('=>')) {
|
|
399
410
|
return true;
|
|
400
411
|
}
|
|
@@ -416,7 +427,9 @@ class Parser {
|
|
|
416
427
|
while (!everything && this.match('and'))
|
|
417
428
|
names.push(this.expect('identifier').value);
|
|
418
429
|
this.expect('from');
|
|
419
|
-
const from = [this.expect('identifier').value];
|
|
430
|
+
const from = [this.at('string') ? this.take().value : this.expect('identifier').value];
|
|
431
|
+
if (!/^(?:https:\/\/|git\+(?:https|file):\/\/)/.test(from[0]) && this.tokens[this.position - 1].kind === 'string')
|
|
432
|
+
throw new ParseFailure({ ...start, code: 'IMPORT', message: 'A quoted import source must be a public repository URL' });
|
|
420
433
|
while (this.match('.'))
|
|
421
434
|
from.push(this.expect('identifier').value);
|
|
422
435
|
this.endStatement();
|
|
@@ -462,11 +475,13 @@ class Parser {
|
|
|
462
475
|
const header = this.parseTypeParams();
|
|
463
476
|
const fields = this.parseParams(true);
|
|
464
477
|
const validationErrors = [];
|
|
465
|
-
|
|
478
|
+
const validationDeclared = !!this.match('unless');
|
|
479
|
+
if (validationDeclared) {
|
|
466
480
|
validationErrors.push(this.parseType());
|
|
467
481
|
while (this.match('and') || this.match(','))
|
|
468
482
|
validationErrors.push(this.parseType());
|
|
469
483
|
}
|
|
484
|
+
const headerEnd = this.current().span.start;
|
|
470
485
|
let constructorBody = this.match('=>') ? this.parseBlock(start) : undefined;
|
|
471
486
|
let hasBody = !!constructorBody;
|
|
472
487
|
if (!constructorBody && (this.at('{') || this.at(':'))) {
|
|
@@ -486,13 +501,20 @@ class Parser {
|
|
|
486
501
|
if (!hasBody)
|
|
487
502
|
this.endStatement();
|
|
488
503
|
return { kind: 'class', record: true, name, ...header, fields, constructorBody,
|
|
489
|
-
validationErrors, implements: [], methods: [], span: this.span(start) };
|
|
504
|
+
validationErrors, validationDeclared, headerEnd, implements: [], methods: [], span: this.span(start) };
|
|
490
505
|
}
|
|
491
506
|
parseClass() {
|
|
492
507
|
const start = this.current().span;
|
|
493
508
|
const name = this.expect('identifier').value;
|
|
494
509
|
const { typeParams, typeConstraints, typeVariance } = this.parseTypeParams();
|
|
495
510
|
const fields = this.at('(') ? this.parseParams(true) : [];
|
|
511
|
+
const validationErrors = [];
|
|
512
|
+
const validationDeclared = !!this.match('unless');
|
|
513
|
+
if (validationDeclared) {
|
|
514
|
+
validationErrors.push(this.parseType());
|
|
515
|
+
while (this.match('and') || this.match(','))
|
|
516
|
+
validationErrors.push(this.parseType());
|
|
517
|
+
}
|
|
496
518
|
let constructorBody = this.match('=>') ? this.parseBlock(start) : undefined;
|
|
497
519
|
const implemented = [];
|
|
498
520
|
if (!this.at('implements'))
|
|
@@ -502,6 +524,7 @@ class Parser {
|
|
|
502
524
|
implemented.push(this.parseType());
|
|
503
525
|
while (this.match(','))
|
|
504
526
|
implemented.push(this.parseType());
|
|
527
|
+
const headerEnd = this.current().span.start;
|
|
505
528
|
this.openBlock(start);
|
|
506
529
|
const methods = [];
|
|
507
530
|
const stateFields = [];
|
|
@@ -537,7 +560,7 @@ class Parser {
|
|
|
537
560
|
}
|
|
538
561
|
this.closeBrace();
|
|
539
562
|
return { kind: 'class', name, typeParams, typeConstraints, typeVariance, fields, stateFields, constructorBody,
|
|
540
|
-
implements: implemented, methods, span: this.span(start) };
|
|
563
|
+
validationErrors, validationDeclared, implements: implemented, methods, headerEnd, span: this.span(start) };
|
|
541
564
|
}
|
|
542
565
|
parseInterface() {
|
|
543
566
|
const keyword = this.take();
|
|
@@ -638,13 +661,16 @@ class Parser {
|
|
|
638
661
|
} while (this.match(',') || this.match('and'));
|
|
639
662
|
}
|
|
640
663
|
}
|
|
664
|
+
const headerEnd = this.current().span.start;
|
|
641
665
|
const body = this.at('{') || this.at(':') ? this.parseBlock(start) : (this.endStatement(), undefined);
|
|
642
666
|
if (externC && body) {
|
|
643
667
|
throw new ParseFailure({ file: start.file, line: start.line, column: start.column,
|
|
644
668
|
message: 'extern C functions cannot have a body', code: 'PARSE' });
|
|
645
669
|
}
|
|
646
670
|
return { kind: 'function', name, typeParams, typeConstraints, typeVariance, params, returns, returnOwnership,
|
|
647
|
-
throws, changes, uses, body, externC, valueAbi, nativePure, endpoint, annotations,
|
|
671
|
+
throws, changes, uses, body, externC, valueAbi, nativePure, endpoint, annotations,
|
|
672
|
+
declared: { returns: clauses.has('returns') || clauses.has('streams'), errors: clauses.has('unless'),
|
|
673
|
+
changes: clauses.has('changes'), uses: clauses.has('uses') }, headerEnd, span: this.span(start) };
|
|
648
674
|
}
|
|
649
675
|
parseTypeParams() {
|
|
650
676
|
if (!this.match('<'))
|