@greenpandastudios/aug-cli 0.19.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/LICENSE +21 -0
- package/README.md +13 -0
- package/THIRD_PARTY_NOTICES.md +18 -0
- package/bin/aug.mjs +3 -0
- package/docs/api/crypto.md +351 -0
- package/docs/api/io.md +207 -0
- package/docs/api/json.md +21 -0
- package/docs/api/memory.md +109 -0
- package/docs/api/time.md +54 -0
- package/docs/api/web.md +184 -0
- package/docs/assets/benchmarks/execution.svg +2978 -0
- package/docs/assets/benchmarks/http.svg +1674 -0
- package/docs/assets/benchmarks/improvements.svg +2315 -0
- package/docs/assets/benchmarks/memory.svg +1891 -0
- package/docs/benchmark-baseline.json +1087 -0
- package/docs/benchmark-results.json +91123 -0
- package/docs/benchmarks.json +38 -0
- package/docs/compatibility.md +42 -0
- package/docs/concurrency-implementation.md +18 -0
- package/docs/diagnostics.md +97 -0
- package/docs/docker.md +35 -0
- package/docs/example-projects.json +26 -0
- package/docs/examples/approved-design/counters.md +253 -0
- package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/approved-design/domain/app.md +165 -0
- package/docs/examples/approved-design/domain/export.md +83 -0
- package/docs/examples/approved-design/domain/models.md +80 -0
- package/docs/examples/approved-design/domain/numbers.md +248 -0
- package/docs/examples/approved-design/index.md +39 -0
- package/docs/examples/approved-design/main-yaml.md +24 -0
- package/docs/examples/approved-design/main.md +215 -0
- package/docs/examples/benchmark/index.md +33 -0
- package/docs/examples/benchmark/main-yaml.md +17 -0
- package/docs/examples/benchmark/main.md +117 -0
- package/docs/examples/cli-args/index.md +32 -0
- package/docs/examples/cli-args/main.md +107 -0
- package/docs/examples/collections/index.md +32 -0
- package/docs/examples/collections/main.md +118 -0
- package/docs/examples/collections-benchmark/index.md +34 -0
- package/docs/examples/collections-benchmark/main.md +115 -0
- package/docs/examples/cpu-benchmark/index.md +34 -0
- package/docs/examples/cpu-benchmark/main.md +90 -0
- package/docs/examples/developer-workflow/calculator.md +357 -0
- package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/developer-workflow/index.md +37 -0
- package/docs/examples/developer-workflow/logging/console.md +124 -0
- package/docs/examples/developer-workflow/logging/export.md +70 -0
- package/docs/examples/developer-workflow/logging/logger.md +111 -0
- package/docs/examples/developer-workflow/main.md +172 -0
- package/docs/examples/drop/index.md +33 -0
- package/docs/examples/drop/main.md +85 -0
- package/docs/examples/drop/resource.md +95 -0
- package/docs/examples/errors/errors.md +85 -0
- package/docs/examples/errors/index.md +33 -0
- package/docs/examples/errors/main.md +92 -0
- package/docs/examples/ffi/index.md +33 -0
- package/docs/examples/ffi/main.md +75 -0
- package/docs/examples/ffi/native.md +93 -0
- package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/generic-di/index.md +33 -0
- package/docs/examples/generic-di/main.md +111 -0
- package/docs/examples/generic-di/types.md +180 -0
- package/docs/examples/generics/index.md +33 -0
- package/docs/examples/generics/main.md +120 -0
- package/docs/examples/generics/types.md +189 -0
- package/docs/examples/hello/app/export.md +67 -0
- package/docs/examples/hello/app/greeter.md +190 -0
- package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/hello/index.md +37 -0
- package/docs/examples/hello/logging/console.md +121 -0
- package/docs/examples/hello/logging/export.md +71 -0
- package/docs/examples/hello/logging/logger.md +120 -0
- package/docs/examples/hello/main.md +115 -0
- package/docs/examples/http-benchmark/index.md +35 -0
- package/docs/examples/http-benchmark/main.md +79 -0
- package/docs/examples/http-benchmark/routes.md +88 -0
- package/docs/examples/index.md +60 -0
- package/docs/examples/interceptors/app.md +250 -0
- package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/interceptors/index.md +35 -0
- package/docs/examples/interceptors/interceptors.md +284 -0
- package/docs/examples/interceptors/logging.md +155 -0
- package/docs/examples/interceptors/main.md +162 -0
- package/docs/examples/json-benchmark/data.md +71 -0
- package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +103 -0
- package/docs/examples/json-benchmark/index.md +35 -0
- package/docs/examples/json-benchmark/main.md +131 -0
- package/docs/examples/new-syntax/console.md +118 -0
- package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/new-syntax/greeter.md +145 -0
- package/docs/examples/new-syntax/index.md +36 -0
- package/docs/examples/new-syntax/logger.md +111 -0
- package/docs/examples/new-syntax/main.md +135 -0
- package/docs/examples/new-syntax/math.md +79 -0
- package/docs/examples/oidc-login/client/contracts.md +151 -0
- package/docs/examples/oidc-login/client/endpoints.md +263 -0
- package/docs/examples/oidc-login/client/export.md +107 -0
- package/docs/examples/oidc-login/client/login.md +515 -0
- package/docs/examples/oidc-login/client/logout.md +249 -0
- package/docs/examples/oidc-login/client/protocol.md +595 -0
- package/docs/examples/oidc-login/client/session.md +297 -0
- package/docs/examples/oidc-login/client/views.md +144 -0
- package/docs/examples/oidc-login/common/export.md +115 -0
- package/docs/examples/oidc-login/common/headers.md +162 -0
- package/docs/examples/oidc-login/common/keys.md +336 -0
- package/docs/examples/oidc-login/common/settings.md +116 -0
- package/docs/examples/oidc-login/common/views.md +103 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +925 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +434 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +103 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +374 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +150 -0
- package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +532 -0
- package/docs/examples/oidc-login/index.md +57 -0
- package/docs/examples/oidc-login/main-yaml.md +28 -0
- package/docs/examples/oidc-login/main.md +283 -0
- package/docs/examples/oidc-login/provider/authorization.md +457 -0
- package/docs/examples/oidc-login/provider/contracts.md +267 -0
- package/docs/examples/oidc-login/provider/credentials.md +148 -0
- package/docs/examples/oidc-login/provider/discovery.md +215 -0
- package/docs/examples/oidc-login/provider/export.md +131 -0
- package/docs/examples/oidc-login/provider/token.md +364 -0
- package/docs/examples/oidc-login/provider/userinfo.md +228 -0
- package/docs/examples/oidc-login/provider/views.md +137 -0
- package/docs/examples/ownership/counter.md +140 -0
- package/docs/examples/ownership/index.md +33 -0
- package/docs/examples/ownership/main.md +90 -0
- package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +395 -0
- package/docs/examples/ownership-transfer/index.md +33 -0
- package/docs/examples/ownership-transfer/main.md +125 -0
- package/docs/examples/ownership-transfer/resource.md +150 -0
- package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +117 -0
- package/docs/examples/packages-app/index.md +34 -0
- package/docs/examples/packages-app/main-yaml.md +18 -0
- package/docs/examples/packages-app/main.md +80 -0
- package/docs/examples/packages-math/aug-package-json.md +24 -0
- package/docs/examples/packages-math/index.md +36 -0
- package/docs/examples/packages-math/package-json.md +25 -0
- package/docs/examples/packages-math/src/arithmetic.md +121 -0
- package/docs/examples/packages-math/src/export.md +63 -0
- package/docs/examples/startup-benchmark/index.md +34 -0
- package/docs/examples/startup-benchmark/main.md +68 -0
- package/docs/examples/visibility/counter.md +142 -0
- package/docs/examples/visibility/index.md +33 -0
- package/docs/examples/visibility/main.md +96 -0
- package/docs/examples.json +47 -0
- package/docs/getting-started.md +5 -0
- package/docs/grammar.md +136 -0
- package/docs/implementation-map.md +106 -0
- package/docs/index.md +46 -0
- package/docs/language-conformance.md +30 -0
- package/docs/language-constructs.md +1461 -0
- package/docs/language-design-audit.md +147 -0
- package/docs/maintaining-docs.md +43 -0
- package/docs/packages.md +184 -0
- package/docs/performance.md +535 -0
- package/docs/production-readiness.md +39 -0
- package/docs/reference.md +361 -0
- package/docs/release-review.md +23 -0
- package/docs/releasing.md +79 -0
- package/docs/roadmap.md +13 -0
- package/docs/specifications.md +86 -0
- package/docs/testing.md +120 -0
- package/docs/tooling.md +197 -0
- package/docs/web-implementation-plan.md +39 -0
- package/docs/web-library-gaps.md +27 -0
- package/docs/web.md +197 -0
- package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/approved-design/.aug-spec/manifest.json +14 -0
- package/examples/approved-design/counters.aug +22 -0
- package/examples/approved-design/counters.aug.md +177 -0
- package/examples/approved-design/domain/app.aug +12 -0
- package/examples/approved-design/domain/app.aug.md +97 -0
- package/examples/approved-design/domain/export.aug +5 -0
- package/examples/approved-design/domain/export.aug.md +25 -0
- package/examples/approved-design/domain/models.aug +2 -0
- package/examples/approved-design/domain/models.aug.md +30 -0
- package/examples/approved-design/domain/numbers.aug +29 -0
- package/examples/approved-design/domain/numbers.aug.md +141 -0
- package/examples/approved-design/main.aug +26 -0
- package/examples/approved-design/main.aug.md +108 -0
- package/examples/approved-design/main.yaml +8 -0
- package/examples/benchmark/.aug-spec/manifest.json +7 -0
- package/examples/benchmark/main.aug +17 -0
- package/examples/benchmark/main.aug.md +43 -0
- package/examples/benchmark/main.yaml +1 -0
- package/examples/cli-args/.aug-spec/manifest.json +7 -0
- package/examples/cli-args/main.aug +15 -0
- package/examples/cli-args/main.aug.md +38 -0
- package/examples/collections/.aug-spec/manifest.json +7 -0
- package/examples/collections/main.aug +18 -0
- package/examples/collections/main.aug.md +43 -0
- package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/developer-workflow/.aug-spec/manifest.json +13 -0
- package/examples/developer-workflow/calculator.aug +55 -0
- package/examples/developer-workflow/calculator.aug.md +228 -0
- package/examples/developer-workflow/logging/console.aug +8 -0
- package/examples/developer-workflow/logging/console.aug.md +67 -0
- package/examples/developer-workflow/logging/export.aug +2 -0
- package/examples/developer-workflow/logging/export.aug.md +19 -0
- package/examples/developer-workflow/logging/logger.aug +6 -0
- package/examples/developer-workflow/logging/logger.aug.md +57 -0
- package/examples/developer-workflow/main.aug +25 -0
- package/examples/developer-workflow/main.aug.md +79 -0
- package/examples/drop/.aug-spec/manifest.json +8 -0
- package/examples/drop/main.aug +3 -0
- package/examples/drop/main.aug.md +35 -0
- package/examples/drop/resource.aug +8 -0
- package/examples/drop/resource.aug.md +44 -0
- package/examples/errors/.aug-spec/manifest.json +8 -0
- package/examples/errors/errors.aug +6 -0
- package/examples/errors/errors.aug.md +33 -0
- package/examples/errors/main.aug +7 -0
- package/examples/errors/main.aug.md +36 -0
- package/examples/ffi/.aug-spec/manifest.json +8 -0
- package/examples/ffi/main.aug +2 -0
- package/examples/ffi/main.aug.md +27 -0
- package/examples/ffi/native.aug +6 -0
- package/examples/ffi/native.aug.md +43 -0
- package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/generic-di/.aug-spec/manifest.json +10 -0
- package/examples/generic-di/main.aug +9 -0
- package/examples/generic-di/main.aug.md +49 -0
- package/examples/generic-di/types.aug +17 -0
- package/examples/generic-di/types.aug.md +124 -0
- package/examples/generics/.aug-spec/manifest.json +8 -0
- package/examples/generics/main.aug +9 -0
- package/examples/generics/main.aug.md +58 -0
- package/examples/generics/types.aug +19 -0
- package/examples/generics/types.aug.md +132 -0
- package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/hello/.aug-spec/manifest.json +14 -0
- package/examples/hello/app/export.aug +1 -0
- package/examples/hello/app/export.aug.md +17 -0
- package/examples/hello/app/greeter.aug +22 -0
- package/examples/hello/app/greeter.aug.md +109 -0
- package/examples/hello/logging/console.aug +7 -0
- package/examples/hello/logging/console.aug.md +65 -0
- package/examples/hello/logging/export.aug +2 -0
- package/examples/hello/logging/export.aug.md +19 -0
- package/examples/hello/logging/logger.aug +9 -0
- package/examples/hello/logging/logger.aug.md +59 -0
- package/examples/hello/main.aug +9 -0
- package/examples/hello/main.aug.md +49 -0
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/interceptors/.aug-spec/manifest.json +12 -0
- package/examples/interceptors/app.aug +28 -0
- package/examples/interceptors/app.aug.md +162 -0
- package/examples/interceptors/interceptors.aug +40 -0
- package/examples/interceptors/interceptors.aug.md +180 -0
- package/examples/interceptors/logging.aug +12 -0
- package/examples/interceptors/logging.aug.md +96 -0
- package/examples/interceptors/main.aug +22 -0
- package/examples/interceptors/main.aug.md +76 -0
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/new-syntax/.aug-spec/manifest.json +13 -0
- package/examples/new-syntax/console.aug +7 -0
- package/examples/new-syntax/console.aug.md +63 -0
- package/examples/new-syntax/greeter.aug +10 -0
- package/examples/new-syntax/greeter.aug.md +89 -0
- package/examples/new-syntax/logger.aug +6 -0
- package/examples/new-syntax/logger.aug.md +57 -0
- package/examples/new-syntax/main.aug +12 -0
- package/examples/new-syntax/main.aug.md +64 -0
- package/examples/new-syntax/math.aug +3 -0
- package/examples/new-syntax/math.aug.md +29 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug +73 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +791 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug +68 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +266 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug +6 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +55 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug +45 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +250 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug +11 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +96 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug +58 -0
- package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +420 -0
- package/examples/oidc-login/.aug-spec/manifest.json +40 -0
- package/examples/oidc-login/README.md +29 -0
- package/examples/oidc-login/client/contracts.aug +7 -0
- package/examples/oidc-login/client/contracts.aug.md +80 -0
- package/examples/oidc-login/client/endpoints.aug +21 -0
- package/examples/oidc-login/client/endpoints.aug.md +161 -0
- package/examples/oidc-login/client/export.aug +7 -0
- package/examples/oidc-login/client/export.aug.md +29 -0
- package/examples/oidc-login/client/login.aug +58 -0
- package/examples/oidc-login/client/login.aug.md +331 -0
- package/examples/oidc-login/client/logout.aug +18 -0
- package/examples/oidc-login/client/logout.aug.md +150 -0
- package/examples/oidc-login/client/protocol.aug +106 -0
- package/examples/oidc-login/client/protocol.aug.md +326 -0
- package/examples/oidc-login/client/session.aug +34 -0
- package/examples/oidc-login/client/session.aug.md +155 -0
- package/examples/oidc-login/client/views.aug +21 -0
- package/examples/oidc-login/client/views.aug.md +68 -0
- package/examples/oidc-login/common/export.aug +9 -0
- package/examples/oidc-login/common/export.aug.md +33 -0
- package/examples/oidc-login/common/headers.aug +11 -0
- package/examples/oidc-login/common/headers.aug.md +79 -0
- package/examples/oidc-login/common/keys.aug +37 -0
- package/examples/oidc-login/common/keys.aug.md +207 -0
- package/examples/oidc-login/common/settings.aug +4 -0
- package/examples/oidc-login/common/settings.aug.md +47 -0
- package/examples/oidc-login/common/views.aug +16 -0
- package/examples/oidc-login/common/views.aug.md +34 -0
- package/examples/oidc-login/main.aug +39 -0
- package/examples/oidc-login/main.aug.md +166 -0
- package/examples/oidc-login/main.yaml +12 -0
- package/examples/oidc-login/provider/authorization.aug +59 -0
- package/examples/oidc-login/provider/authorization.aug.md +264 -0
- package/examples/oidc-login/provider/contracts.aug +15 -0
- package/examples/oidc-login/provider/contracts.aug.md +193 -0
- package/examples/oidc-login/provider/credentials.aug +10 -0
- package/examples/oidc-login/provider/credentials.aug.md +64 -0
- package/examples/oidc-login/provider/discovery.aug +13 -0
- package/examples/oidc-login/provider/discovery.aug.md +133 -0
- package/examples/oidc-login/provider/export.aug +13 -0
- package/examples/oidc-login/provider/export.aug.md +41 -0
- package/examples/oidc-login/provider/token.aug +37 -0
- package/examples/oidc-login/provider/token.aug.md +223 -0
- package/examples/oidc-login/provider/userinfo.aug +26 -0
- package/examples/oidc-login/provider/userinfo.aug.md +104 -0
- package/examples/oidc-login/provider/views.aug +18 -0
- package/examples/oidc-login/provider/views.aug.md +63 -0
- package/examples/ownership/.aug-spec/manifest.json +8 -0
- package/examples/ownership/counter.aug +14 -0
- package/examples/ownership/counter.aug.md +85 -0
- package/examples/ownership/main.aug +4 -0
- package/examples/ownership/main.aug.md +38 -0
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +36 -0
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +316 -0
- package/examples/ownership-transfer/.aug-spec/manifest.json +10 -0
- package/examples/ownership-transfer/main.aug +9 -0
- package/examples/ownership-transfer/main.aug.md +63 -0
- package/examples/ownership-transfer/resource.aug +16 -0
- package/examples/ownership-transfer/resource.aug.md +89 -0
- package/examples/packages/README.md +15 -0
- package/examples/packages/app/.aug-spec/manifest.json +9 -0
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +9 -0
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +63 -0
- package/examples/packages/app/main.aug +2 -0
- package/examples/packages/app/main.aug.md +33 -0
- package/examples/packages/app/main.yaml +2 -0
- package/examples/packages/math/.aug-spec/manifest.json +8 -0
- package/examples/packages/math/README.md +3 -0
- package/examples/packages/math/aug-package.json +8 -0
- package/examples/packages/math/package.json +9 -0
- package/examples/packages/math/src/arithmetic.aug +8 -0
- package/examples/packages/math/src/arithmetic.aug.md +63 -0
- package/examples/packages/math/src/export.aug +1 -0
- package/examples/packages/math/src/export.aug.md +17 -0
- package/examples/visibility/.aug-spec/manifest.json +8 -0
- package/examples/visibility/counter.aug +14 -0
- package/examples/visibility/counter.aug.md +87 -0
- package/examples/visibility/main.aug +7 -0
- package/examples/visibility/main.aug.md +39 -0
- package/package.json +50 -0
- package/runtime/aug_crypto.c +121 -0
- package/runtime/aug_html.c +93 -0
- package/runtime/aug_http.c +829 -0
- package/runtime/aug_json.c +165 -0
- package/runtime/aug_runtime.c +792 -0
- package/runtime/aug_runtime.h +245 -0
- package/runtime/aug_tasks.c +172 -0
- package/runtime/aug_time.c +5 -0
- package/runtime/aug_values.c +80 -0
- package/scripts/bootstrap-native.mjs +121 -0
- package/scripts/native-dependencies.lock.json +65 -0
- package/scripts/native-home.mjs +11 -0
- package/src/actions.js +109 -0
- package/src/ast.js +19 -0
- package/src/builtins.js +93 -0
- package/src/checker.js +2896 -0
- package/src/cli.js +344 -0
- package/src/codegen.js +1159 -0
- package/src/config.js +149 -0
- package/src/continuation.js +110 -0
- package/src/di.js +24 -0
- package/src/documentation.js +27 -0
- package/src/editor.js +782 -0
- package/src/effects.js +29 -0
- package/src/fixes.js +222 -0
- package/src/formatter.js +296 -0
- package/src/freshness.js +154 -0
- package/src/help.js +212 -0
- package/src/html.js +27 -0
- package/src/http-policies.js +90 -0
- package/src/inference.js +16 -0
- package/src/interceptors.js +70 -0
- package/src/javadoc.js +67 -0
- package/src/lexer.js +199 -0
- package/src/libraries.js +31 -0
- package/src/lsp.js +180 -0
- package/src/native.js +144 -0
- package/src/navigation.js +162 -0
- package/src/openapi.js +220 -0
- package/src/ownership.js +232 -0
- package/src/package-manager.js +299 -0
- package/src/parser.js +1155 -0
- package/src/policies.js +130 -0
- package/src/project-init.js +19 -0
- package/src/project.js +292 -0
- package/src/schemas.js +62 -0
- package/src/semantic.js +255 -0
- package/src/spec.js +738 -0
- package/src/testing.js +186 -0
- package/src/types.js +10 -0
package/src/semantic.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { basename, resolve } from 'node:path';
|
|
3
|
+
import { fieldsOf, syntheticType, typeName } from "./ast.js";
|
|
4
|
+
import { checkProject, tyName } from "./checker.js";
|
|
5
|
+
import { completions, hoverInfo, semanticTokens } from "./editor.js";
|
|
6
|
+
import { suggestedFixes } from "./fixes.js";
|
|
7
|
+
import { definitionAt } from "./navigation.js";
|
|
8
|
+
import { loadProject } from "./project.js";
|
|
9
|
+
import { lex } from "./lexer.js";
|
|
10
|
+
import { javadocBefore } from "./javadoc.js";
|
|
11
|
+
import { checkUnitTests, discoverTests, mergeTestAnalysis, uniqueDiagnostics } from "./testing.js";
|
|
12
|
+
import { formatFile } from "./formatter.js";
|
|
13
|
+
import { interceptorBehavior } from "./interceptors.js";
|
|
14
|
+
const genericFacts = (header) => header.typeParams.map(name => ({ name,
|
|
15
|
+
variance: header.typeVariance?.[name] ?? 'invariant', constraints: (header.typeConstraints?.[name] ?? []).map(typeName) }));
|
|
16
|
+
export function contractFacts(checked) {
|
|
17
|
+
const { project } = checked;
|
|
18
|
+
const callable = (method, constructor) => {
|
|
19
|
+
const contract = checked.effectContracts.get(method);
|
|
20
|
+
const layers = checked.interceptorPlans.get(constructor ?? method) ?? [];
|
|
21
|
+
return { name: method.name, location: method.span, genericParameters: genericFacts(method),
|
|
22
|
+
inputs: method.params.map(param => ({ label: param.label ?? param.name, name: param.name,
|
|
23
|
+
type: typeName(param.type), ownership: param.ownership, injected: param.injected, source: param.source })),
|
|
24
|
+
http: method.endpoint ? { method: method.endpoint.method, path: method.endpoint.path, status: method.endpoint.status,
|
|
25
|
+
streaming: !!method.endpoint.streams, errors: method.endpoint.errors.map(error => ({ type: typeName(error.type), status: error.status })) } : undefined,
|
|
26
|
+
policies: (checked.httpPolicies.get(method) ?? []).map((policy, index) => ({ name: policy.name, order: index + 1, options: policy.options,
|
|
27
|
+
dependencies: policy.dependencies.map(index => method.params[index]?.label ?? method.params[index]?.name ?? '') })),
|
|
28
|
+
result: `${method.returnOwnership === 'own' ? 'own ' : ''}${typeName(method.returns)}`,
|
|
29
|
+
changes: [...(contract?.changes ?? method.changes ?? [])],
|
|
30
|
+
capabilities: [...(contract?.uses.values() ?? [])].map(effect => `${effect.source}.${effect.operation}`).concat(method.externC ? [`C.${method.name}`] : []),
|
|
31
|
+
inferredEffects: !!contract?.inferred,
|
|
32
|
+
errors: [...new Set([...method.throws.map(typeName), ...layers.flatMap(layer => layer.errors.map(tyName))])],
|
|
33
|
+
interceptors: layers.map((layer, order) => {
|
|
34
|
+
const effects = checked.effectContracts.get(layer.around);
|
|
35
|
+
return { name: layer.definition.name, order: order + 1, location: layer.definition.node.span,
|
|
36
|
+
dependencies: [...new Set([...(layer.definition.node.kind === 'interceptor' ? layer.definition.node.fields : []), ...layer.around.params].filter(param => param.injected).map(param => typeName(param.type)))],
|
|
37
|
+
changes: [...(effects?.changes ?? layer.around.changes ?? [])],
|
|
38
|
+
capabilities: [...(effects?.uses.values() ?? [])].map(effect => `${effect.source}.${effect.operation}`), errors: layer.errors.map(tyName),
|
|
39
|
+
...interceptorBehavior(layer.around.body ?? []) };
|
|
40
|
+
}) };
|
|
41
|
+
};
|
|
42
|
+
return [...project.definitions.values()].map(def => {
|
|
43
|
+
const node = def.node, file = project.files.get(def.file);
|
|
44
|
+
const methods = node.kind === 'function' ? [node] : 'methods' in node ? node.methods : [];
|
|
45
|
+
const calls = [];
|
|
46
|
+
const visit = (value) => {
|
|
47
|
+
if (!value || typeof value !== 'object')
|
|
48
|
+
return;
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
value.forEach(visit);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const call = value;
|
|
54
|
+
if (call.kind === 'call' && call.callee?.kind === 'name' && call.span) {
|
|
55
|
+
const target = project.scopes.get(call.span.file)?.get(call.callee.name);
|
|
56
|
+
if (target)
|
|
57
|
+
calls.push({ target: target.id, location: call.span });
|
|
58
|
+
}
|
|
59
|
+
if (call.kind === 'call' && call.callee?.kind === 'member' && call.callee.object && call.span) {
|
|
60
|
+
const target = checked.expressionTypes.get(call.callee.object)?.def;
|
|
61
|
+
if (target)
|
|
62
|
+
calls.push({ target: target.id, location: call.span });
|
|
63
|
+
}
|
|
64
|
+
for (const [key, child] of Object.entries(value))
|
|
65
|
+
if (!['span', 'nameSpan', 'sourceSpan'].includes(key))
|
|
66
|
+
visit(child);
|
|
67
|
+
};
|
|
68
|
+
visit(node);
|
|
69
|
+
return { id: def.id, name: def.name, kind: node.kind === 'class' && node.record ? 'record' :
|
|
70
|
+
node.kind === 'interface' && node.capability ? 'capability' : node.kind,
|
|
71
|
+
location: node.span, public: !node.name.startsWith('_'), typeParameters: node.typeParams, genericParameters: genericFacts(node),
|
|
72
|
+
documentation: javadocBefore(file.source, 'annotations' in node ? node.annotations?.[0]?.span.start ?? node.span.start : node.span.start)?.markdown,
|
|
73
|
+
interfaces: node.kind === 'class' ? node.implements.map(typeName) : node.kind === 'interface' ? node.extends.map(typeName) : [],
|
|
74
|
+
fields: 'fields' in node ? fieldsOf(node).map(field => ({ label: field.label ?? field.name, storage: field.name, type: typeName(field.type),
|
|
75
|
+
mutable: !!field.mutable, injected: field.injected, ownership: field.ownership })) : [],
|
|
76
|
+
callables: [...(node.kind === 'class' ? [callable({ kind: 'function', name: node.name, typeParams: node.typeParams,
|
|
77
|
+
typeConstraints: node.typeConstraints, typeVariance: node.typeVariance, params: node.fields,
|
|
78
|
+
returns: syntheticType(node.name, node.span), returnOwnership: 'managed',
|
|
79
|
+
throws: node.validationErrors ?? [], changes: [], uses: [], body: node.constructorBody, externC: false, span: node.span }, node)] : []),
|
|
80
|
+
...methods.filter(method => !method.name.startsWith('_')).map(method => callable(method))], calls,
|
|
81
|
+
tests: file.items.flatMap(item => item.kind === 'test' && item.type.name === def.name ? item.groups.flatMap(group => group.cases.map(test => ({ group: group.name, name: test.name, location: test.span }))) : []) };
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function describe(checked, fileName, options = {}) {
|
|
85
|
+
const path = resolve(fileName), file = checked.project.files.get(path);
|
|
86
|
+
if (!file)
|
|
87
|
+
throw new Error(`Unknown source file ${path}`);
|
|
88
|
+
const facts = contractFacts(checked);
|
|
89
|
+
const budget = Math.max(512, Math.min(options.budget ?? 12000, 100000));
|
|
90
|
+
const selected = [];
|
|
91
|
+
const queue = facts.filter(fact => fact.location.file === path && (options.name ? fact.name === options.name : fact.public));
|
|
92
|
+
if (options.name && !queue.length) {
|
|
93
|
+
const def = checked.project.scopes.get(path)?.get(options.name);
|
|
94
|
+
const fact = facts.find(fact => fact.id === def?.id);
|
|
95
|
+
if (fact)
|
|
96
|
+
queue.push(fact);
|
|
97
|
+
else
|
|
98
|
+
throw new Error(`No declaration named ${options.name} in ${path}`);
|
|
99
|
+
}
|
|
100
|
+
const allImports = file.items.filter((item) => item.kind === 'import').map(item => ({ module: item.from.join('.'), location: item.span,
|
|
101
|
+
names: (checked.project.imports.get(item) ?? []).map(def => ({ name: def.name, id: def.id, location: def.node.span })) }));
|
|
102
|
+
if (options.context)
|
|
103
|
+
for (const item of allImports)
|
|
104
|
+
for (const name of item.names) {
|
|
105
|
+
const fact = facts.find(fact => fact.id === name.id);
|
|
106
|
+
if (fact)
|
|
107
|
+
queue.push(fact);
|
|
108
|
+
}
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
const imports = [], bindings = [];
|
|
111
|
+
const snippets = [];
|
|
112
|
+
const architecture = [], changes = [];
|
|
113
|
+
let truncated = false;
|
|
114
|
+
const result = () => ({ file: path, completeness: checked.diagnostics.some(issue => issue.severity !== 'warning') ? 'partial' : 'checked',
|
|
115
|
+
budget, truncated, imports, contracts: selected, bindings, snippets, architecture, changes });
|
|
116
|
+
const append = (array, value) => {
|
|
117
|
+
array.push(value);
|
|
118
|
+
if (JSON.stringify(result()).length > budget) {
|
|
119
|
+
array.pop();
|
|
120
|
+
truncated = true;
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
};
|
|
125
|
+
allImports.forEach(item => append(imports, item));
|
|
126
|
+
for (let index = 0; index < queue.length; index++) {
|
|
127
|
+
const fact = queue[index];
|
|
128
|
+
if (seen.has(fact.id))
|
|
129
|
+
continue;
|
|
130
|
+
seen.add(fact.id);
|
|
131
|
+
if (!append(selected, fact))
|
|
132
|
+
continue;
|
|
133
|
+
if (options.context)
|
|
134
|
+
for (const call of fact.calls) {
|
|
135
|
+
const next = facts.find(fact => fact.id === call.target);
|
|
136
|
+
if (next)
|
|
137
|
+
queue.push(next);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
checked.bindings.forEach(binding => append(bindings, { key: binding.key, target: binding.target.id, lifetime: binding.lifetime,
|
|
141
|
+
stateful: binding.stateful, dependencies: binding.dependencies, location: binding.declaration.span }));
|
|
142
|
+
for (const source of checked.project.files.values())
|
|
143
|
+
if (!source.builtin && (source.path === path || selected.some(fact => fact.location.file === source.path))) {
|
|
144
|
+
const publicFacts = facts.filter(fact => fact.public && fact.location.file === source.path);
|
|
145
|
+
const module = { file: source.path, dependencies: [...new Set(source.items.flatMap(item => item.kind === 'import' ?
|
|
146
|
+
(checked.project.imports.get(item) ?? []).map(def => def.file) : []))].sort(),
|
|
147
|
+
public: publicFacts.map(fact => ({ name: fact.name, shape: createHash('sha256').update(JSON.stringify({ kind: fact.kind,
|
|
148
|
+
generics: fact.genericParameters, fields: fact.fields.filter(field => !field.storage.startsWith('_')),
|
|
149
|
+
interfaces: fact.interfaces, callables: fact.callables.map(({ location, interceptors, inputs, ...contract }) => ({ ...contract,
|
|
150
|
+
inputs: inputs.map(({ name, ...input }) => input),
|
|
151
|
+
interceptors: interceptors.map(({ location, ...layer }) => layer) })) })).digest('hex') })),
|
|
152
|
+
members: publicFacts.reduce((count, fact) => count + 1 + fact.callables.length + fact.fields.filter(field => !field.storage.startsWith('_')).length, 0) };
|
|
153
|
+
append(architecture, module);
|
|
154
|
+
const previous = options.baseline?.architecture?.find(before => before.file === module.file);
|
|
155
|
+
if (previous) {
|
|
156
|
+
const delta = { file: module.file, addedDependencies: module.dependencies.filter(file => !previous.dependencies.includes(file)),
|
|
157
|
+
removedDependencies: previous.dependencies.filter(file => !module.dependencies.includes(file)), addedPublic: module.public.filter(symbol => !previous.public.some(before => before.name === symbol.name)).map(symbol => symbol.name),
|
|
158
|
+
removedPublic: previous.public.filter(symbol => !module.public.some(after => after.name === symbol.name)).map(symbol => symbol.name),
|
|
159
|
+
changedPublic: module.public.filter(symbol => previous.public.some(before => before.name === symbol.name && before.shape !== symbol.shape)).map(symbol => symbol.name), memberGrowth: module.members - previous.members };
|
|
160
|
+
if (delta.addedDependencies.length || delta.removedDependencies.length || delta.addedPublic.length || delta.removedPublic.length || delta.changedPublic.length || delta.memberGrowth)
|
|
161
|
+
append(changes, delta);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (options.context)
|
|
165
|
+
for (const fact of selected) {
|
|
166
|
+
const source = checked.project.files.get(fact.location.file).source.slice(fact.location.start, fact.location.end);
|
|
167
|
+
append(snippets, { id: fact.id, source });
|
|
168
|
+
}
|
|
169
|
+
return result();
|
|
170
|
+
}
|
|
171
|
+
/** Immutable document revision; compiler internals never escape through editor queries. */
|
|
172
|
+
export class SemanticDocument {
|
|
173
|
+
revision;
|
|
174
|
+
diagnostics;
|
|
175
|
+
source;
|
|
176
|
+
checked;
|
|
177
|
+
path;
|
|
178
|
+
constructor(checked, path, revision) {
|
|
179
|
+
this.checked = checked;
|
|
180
|
+
this.path = path;
|
|
181
|
+
this.revision = revision;
|
|
182
|
+
this.diagnostics = Object.freeze(checked.diagnostics.map(issue => Object.freeze({ ...issue })));
|
|
183
|
+
this.source = checked.project.files.get(path)?.source ?? '';
|
|
184
|
+
}
|
|
185
|
+
hover(offset) { return hoverInfo(this.checked, this.path, offset); }
|
|
186
|
+
complete(offset) { return completions(this.checked, this.path, offset); }
|
|
187
|
+
tokens() { return semanticTokens(this.checked, this.path); }
|
|
188
|
+
fixes() { return suggestedFixes(this.checked, this.path); }
|
|
189
|
+
format() { return formatFile(this.checked.project, this.checked.project.files.get(this.path)); }
|
|
190
|
+
describe(options) { return describe(this.checked, this.path, options); }
|
|
191
|
+
definition(offset) {
|
|
192
|
+
const source = this.checked.project.files.get(this.path)?.source ?? '';
|
|
193
|
+
const token = lex(this.path, source).tokens.find(token => token.span.start <= offset && offset < token.span.end);
|
|
194
|
+
const scopes = [...this.checked.scopes.values()].filter(scope => scope.span.file === this.path && scope.span.start <= offset && offset <= scope.span.end)
|
|
195
|
+
.sort((left, right) => left.span.end - left.span.start - (right.span.end - right.span.start));
|
|
196
|
+
const local = scopes[0]?.locals.find(local => local.name === token?.value);
|
|
197
|
+
if (local?.definition) {
|
|
198
|
+
const tokens = lex(this.path, source).tokens;
|
|
199
|
+
const target = tokens.filter(token => local.definition.start <= token.span.start && token.span.end <= local.definition.end && token.value === local.name).at(-1)?.span ?? local.definition;
|
|
200
|
+
return { name: local.name, file: target.file, line: target.line, column: target.column, kind: local.kind };
|
|
201
|
+
}
|
|
202
|
+
return definitionAt(this.checked.project, this.path, offset);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export class SemanticWorkspace {
|
|
206
|
+
overrides = new Map();
|
|
207
|
+
versions = new Map();
|
|
208
|
+
parsed = new Map();
|
|
209
|
+
documents = new Map();
|
|
210
|
+
stats = { analyses: 0, cacheHits: 0 };
|
|
211
|
+
root;
|
|
212
|
+
constructor(root) { this.root = root; }
|
|
213
|
+
close(path) { this.overrides.delete(resolve(path)); this.versions.delete(resolve(path)); this.documents.delete(resolve(path)); }
|
|
214
|
+
document(fileName, edit) {
|
|
215
|
+
const path = resolve(fileName);
|
|
216
|
+
if (edit && edit.version >= (this.versions.get(path) ?? -1)) {
|
|
217
|
+
this.overrides.set(path, edit.text);
|
|
218
|
+
this.versions.set(path, edit.version);
|
|
219
|
+
}
|
|
220
|
+
const project = loadProject(this.root, this.overrides, this.parsed);
|
|
221
|
+
const closure = new Set();
|
|
222
|
+
const include = (file) => {
|
|
223
|
+
if (closure.has(file))
|
|
224
|
+
return;
|
|
225
|
+
closure.add(file);
|
|
226
|
+
for (const item of project.files.get(file)?.items ?? [])
|
|
227
|
+
if (item.kind === 'import')
|
|
228
|
+
for (const def of project.imports.get(item) ?? [])
|
|
229
|
+
include(def.file);
|
|
230
|
+
};
|
|
231
|
+
include(path);
|
|
232
|
+
const root = basename(path) === 'main.aug';
|
|
233
|
+
const relevant = root ? [...project.files.keys()] : [...closure];
|
|
234
|
+
const key = createHash('sha256').update(JSON.stringify([project.config, relevant.map(file => [file, project.files.get(file)?.source]),
|
|
235
|
+
project.diagnostics.filter(issue => relevant.includes(issue.file) || issue.code === 'PACKAGE')])).digest('hex');
|
|
236
|
+
const cached = this.documents.get(path);
|
|
237
|
+
if (cached?.key === key) {
|
|
238
|
+
this.stats.cacheHits++;
|
|
239
|
+
return cached.view;
|
|
240
|
+
}
|
|
241
|
+
const local = root ? project : { ...project, main: undefined,
|
|
242
|
+
definitions: new Map([...project.definitions].filter(([, def]) => closure.has(def.file))),
|
|
243
|
+
diagnostics: project.diagnostics.filter(issue => closure.has(issue.file) || issue.code === 'CONFIG' || issue.code === 'PACKAGE') };
|
|
244
|
+
const checked = checkProject(local);
|
|
245
|
+
const discovered = discoverTests(local);
|
|
246
|
+
const tests = checkUnitTests(local, discovered.tests.filter(unit => root || closure.has(unit.file)));
|
|
247
|
+
checked.diagnostics = uniqueDiagnostics([...checked.diagnostics, ...discovered.diagnostics, ...tests.flatMap(test => test.checked.diagnostics)]);
|
|
248
|
+
mergeTestAnalysis(checked, tests);
|
|
249
|
+
const view = new SemanticDocument(checked, path, key);
|
|
250
|
+
this.documents.set(path, { key, view });
|
|
251
|
+
this.stats.analyses++;
|
|
252
|
+
return view;
|
|
253
|
+
}
|
|
254
|
+
invalidate() { this.documents.clear(); }
|
|
255
|
+
}
|