@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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `session.aug` specification
|
|
4
|
+
|
|
5
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
+
|
|
7
|
+
## In this file
|
|
8
|
+
|
|
9
|
+
- [`authenticate`](session.aug.md#symbol-authenticate) is a function returning `SessionClaims`.
|
|
10
|
+
|
|
11
|
+
<a id="symbol-authenticate"></a>
|
|
12
|
+
|
|
13
|
+
## `authenticate`
|
|
14
|
+
|
|
15
|
+
[source](session.aug#L8)
|
|
16
|
+
|
|
17
|
+
**Inputs**
|
|
18
|
+
|
|
19
|
+
- `token` (`optional string`) — optional labeled input; omission becomes null.
|
|
20
|
+
- `crypto` ([`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto)) — injected; callers omit it.
|
|
21
|
+
- `clock` ([`Clock`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock)) — injected; callers omit it.
|
|
22
|
+
- `keys` ([`SigningKeys`](../common/keys.aug.md#symbol-SigningKeys)) — injected; callers omit it.
|
|
23
|
+
- `sessions` ([`ExpiringStore<SessionClaims>`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore)) — injected; callers omit it.
|
|
24
|
+
|
|
25
|
+
Returns: [`SessionClaims`](contracts.aug.md#symbol-SessionClaims).
|
|
26
|
+
|
|
27
|
+
Capabilities: [`crypto.publicRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.publicRsa), [`crypto.decodeBase64url`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`crypto.verifyRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.verifyRsa), [`crypto.equal`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal), [`clock.now`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`keys.session`](../common/keys.aug.md#symbol-SigningKeys.session), [`sessions.get`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.get).
|
|
28
|
+
|
|
29
|
+
Can fail with `SessionError`, `KeyError`, `TimeError`. Callers must catch or propagate these errors.
|
|
30
|
+
|
|
31
|
+
**What it does**
|
|
32
|
+
|
|
33
|
+
- Select the matching case for `token`:
|
|
34
|
+
- A null value, including omitted optional input:
|
|
35
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
36
|
+
- A present, non-null value, named `value`:
|
|
37
|
+
- Try these operations:
|
|
38
|
+
- Set `publicKey` to call [`Crypto.publicRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.publicRsa) on `crypto` with `key` = call [`SigningKeys.session`](../common/keys.aug.md#symbol-SigningKeys.session) on `keys`.
|
|
39
|
+
- Set `claims` to call `decode` on call [`verifyJwt`](../.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-verifyJwt) with `token` = `value`; `publicKey` = `publicKey`; `kid` = `"session-1"`; `tokenType` = `"august-session+jwt"`; inject `crypto` from `crypto` with type arguments [`SessionClaims`](contracts.aug.md#symbol-SessionClaims).
|
|
40
|
+
- Set `config` to call [`settings`](../common/settings.aug.md#symbol-settings).
|
|
41
|
+
- Set `now` to call [`Clock.now`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now) on `clock`.
|
|
42
|
+
- If (((((((`iss` of `claims` does not equal (`baseUrl` of `config` plus `"/app"`)) or (`aud` of `claims` does not equal `"august-app"`)) or (call `length` on `sub` of `claims` equals `0`)) or (`exp` of `claims` is at most `now`)) or (`iat` of `claims` is greater than (`now` plus `30`))) or (`iat` of `claims` is less than (`now` minus `sessionSeconds` of `config`))) or (`exp` of `claims` is at most `iat` of `claims`)) or (`exp` of `claims` is greater than ((`now` plus `sessionSeconds` of `config`) plus `30`)):
|
|
43
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
44
|
+
- If not (call `isToken` on `jti` of `claims` with `min` = `43`; `max` = `43`) or not (call `isToken` on `csrf` of `claims` with `min` = `43`; `max` = `43`):
|
|
45
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
46
|
+
- Select the matching case for call [`ExpiringStore.get`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.get) on `sessions` with `key` = `jti` of `claims`; `now` = `now`:
|
|
47
|
+
- A null value, including omitted optional input:
|
|
48
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
49
|
+
- A present, non-null value, named `saved`:
|
|
50
|
+
- If ((`sub` of `saved` does not equal `sub` of `claims`) or (`exp` of `saved` does not equal `exp` of `claims`)) or not (call [`Crypto.equal`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal) on `crypto` with `left` = call `bytes` on `csrf` of `saved`; `right` = call `bytes` on `csrf` of `claims`):
|
|
51
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
52
|
+
- Return `claims`.
|
|
53
|
+
- If they fail with `CryptoError`, name the failure `error` and recover:
|
|
54
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
55
|
+
- If they fail with [`JwtError`](../.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-JwtError), name the failure `error` and recover:
|
|
56
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
57
|
+
- If they fail with `JsonError`, name the failure `error` and recover:
|
|
58
|
+
- Fail with call [`SessionError`](contracts.aug.md#symbol-SessionError). Transfer control to a matching catch or propagate the failure.
|
|
59
|
+
|
|
60
|
+
**Author documentation**
|
|
61
|
+
|
|
62
|
+
An app session has its own key, issuer, audience and token type. A live registry entry is required so logout revokes a signed token immediately.
|
|
63
|
+
|
|
64
|
+
## Dependencies used by this file
|
|
65
|
+
|
|
66
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
67
|
+
|
|
68
|
+
### [`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto)
|
|
69
|
+
|
|
70
|
+
Capability interface from `august.crypto`.
|
|
71
|
+
|
|
72
|
+
- [`Crypto.decodeBase64url`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url) (`input`: `string`) → `Bytes`; can fail with `CryptoError`.
|
|
73
|
+
- [`Crypto.equal`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal) (`left`: `Bytes`, `right`: `Bytes`) → `bool`.
|
|
74
|
+
- [`Crypto.publicRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.publicRsa) (`key`: `RsaPrivateKey`) → `RsaPublicKey`; can fail with `CryptoError`.
|
|
75
|
+
- [`Crypto.verifyRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.verifyRsa) (`publicKey`: `RsaPublicKey`, `input`: `Bytes`, `signature`: `Bytes`) → `bool`; can fail with `CryptoError`.
|
|
76
|
+
|
|
77
|
+
### [`JwtError`](../.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-JwtError)
|
|
78
|
+
|
|
79
|
+
Class from `august.crypto`.
|
|
80
|
+
|
|
81
|
+
Used as a type or provider.
|
|
82
|
+
|
|
83
|
+
### [`verifyJwt`](../.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-verifyJwt)
|
|
84
|
+
|
|
85
|
+
Function from `august.crypto`.
|
|
86
|
+
|
|
87
|
+
- [`verifyJwt`](../.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-verifyJwt) (`token`: `string`, `publicKey`: `RsaPublicKey`, `kid`: `string`, `tokenType`: `string`) → `Json`; inject `crypto`: [`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto); uses [`crypto.decodeBase64url`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`crypto.verifyRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.verifyRsa); can fail with `JwtError`.
|
|
88
|
+
|
|
89
|
+
### [`ExpiringStore`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore)
|
|
90
|
+
|
|
91
|
+
Capability interface from `august.memory`.
|
|
92
|
+
|
|
93
|
+
- [`ExpiringStore.get`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.get) (`key`: `string`, `now`: `int`) → `optional T`.
|
|
94
|
+
|
|
95
|
+
### [`Clock`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock)
|
|
96
|
+
|
|
97
|
+
Capability interface from `august.time`.
|
|
98
|
+
|
|
99
|
+
- [`Clock.now`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now) (no caller inputs) → `int`; can fail with `TimeError`.
|
|
100
|
+
|
|
101
|
+
### [`SessionClaims`](contracts.aug.md#symbol-SessionClaims)
|
|
102
|
+
|
|
103
|
+
Record from `contracts`.
|
|
104
|
+
|
|
105
|
+
- Read `aud` (`string`).
|
|
106
|
+
- Read `csrf` (`string`).
|
|
107
|
+
- Read `exp` (`int`).
|
|
108
|
+
- Read `iat` (`int`).
|
|
109
|
+
- Read `iss` (`string`).
|
|
110
|
+
- Read `jti` (`string`).
|
|
111
|
+
- Read `sub` (`string`).
|
|
112
|
+
|
|
113
|
+
### [`SessionError`](contracts.aug.md#symbol-SessionError)
|
|
114
|
+
|
|
115
|
+
Class from `contracts`.
|
|
116
|
+
|
|
117
|
+
- Construct with no caller inputs → [`SessionError`](contracts.aug.md#symbol-SessionError).
|
|
118
|
+
|
|
119
|
+
### [`KeyError`](../common/keys.aug.md#symbol-KeyError)
|
|
120
|
+
|
|
121
|
+
Class from `common`.
|
|
122
|
+
|
|
123
|
+
Used as a type or provider.
|
|
124
|
+
|
|
125
|
+
### [`SigningKeys`](../common/keys.aug.md#symbol-SigningKeys)
|
|
126
|
+
|
|
127
|
+
Capability interface from `common`.
|
|
128
|
+
|
|
129
|
+
- [`SigningKeys.session`](../common/keys.aug.md#symbol-SigningKeys.session) (no caller inputs) → `RsaPrivateKey`; can fail with `KeyError`.
|
|
130
|
+
|
|
131
|
+
### [`Settings`](../common/settings.aug.md#symbol-Settings)
|
|
132
|
+
|
|
133
|
+
Record.
|
|
134
|
+
|
|
135
|
+
- Read `baseUrl` (`string`).
|
|
136
|
+
- Read `sessionSeconds` (`int`).
|
|
137
|
+
|
|
138
|
+
### [`settings`](../common/settings.aug.md#symbol-settings)
|
|
139
|
+
|
|
140
|
+
Function from `common`.
|
|
141
|
+
|
|
142
|
+
- [`settings`](../common/settings.aug.md#symbol-settings) (no caller inputs) → [`Settings`](../common/settings.aug.md#symbol-Settings).
|
|
143
|
+
|
|
144
|
+
## Built-in operations used by this file
|
|
145
|
+
|
|
146
|
+
- `Json.decode` (no inputs) → `SessionClaims`: Decode a checked record or data type: json.decode<Profile>(). Unknown fields, type mismatches, and validation errors are rejected. Can fail with `JsonError`.
|
|
147
|
+
- `string.bytes` (no inputs) → `Bytes`: Encode this string as immutable UTF-8 bytes.
|
|
148
|
+
- `string.isToken` (`min`: `int`, `max`: `int`) → `bool`: Require an ASCII RFC 3986 unreserved token with a bounded length.
|
|
149
|
+
- `string.length` (no inputs) → `int`: Read the number of UTF-8 bytes. Unicode text is preserved losslessly.
|
|
150
|
+
|
|
151
|
+
[Full built-in reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
152
|
+
|
|
153
|
+
## Shared language rules
|
|
154
|
+
|
|
155
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import SessionClaims from contracts
|
|
2
|
+
import Page from common
|
|
3
|
+
import logout from logout
|
|
4
|
+
|
|
5
|
+
LoginPage() returns Html:
|
|
6
|
+
return <Page title="Sign in">
|
|
7
|
+
<p>This August app is both an OpenID Connect provider and a login client.</p>
|
|
8
|
+
<p><a href="/login/start" style="display:inline-block;padding:12px 20px;border-radius:10px;background:#4852d7;color:white;text-decoration:none">Sign in with OpenID Connect</a></p>
|
|
9
|
+
<p>The server uses authorization codes, S256 PKCE, state and nonce validation. Your session is a separate signed JWT in an HttpOnly cookie.</p>
|
|
10
|
+
</Page>
|
|
11
|
+
|
|
12
|
+
Welcome(SessionClaims session) returns Html unless HttpError:
|
|
13
|
+
return <Page title={"Welcome, " + session.name}>
|
|
14
|
+
<p>You are signed in as <strong>{session.name}</strong>.</p>
|
|
15
|
+
<p>Subject: <code>{session.sub}</code></p>
|
|
16
|
+
<p><a href="/me">View the protected JSON endpoint</a></p>
|
|
17
|
+
<form method="post" action="/logout" onSubmit={handle logout(input from form)}>
|
|
18
|
+
<input type="hidden" name="csrf" value={session.csrf} />
|
|
19
|
+
<button type="submit" style="padding:10px 18px;border-radius:10px;border:0;background:#17233a;color:white;font:inherit">Sign out</button>
|
|
20
|
+
</form>
|
|
21
|
+
</Page>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `views.aug` specification
|
|
4
|
+
|
|
5
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
+
|
|
7
|
+
## In this file
|
|
8
|
+
|
|
9
|
+
- [`LoginPage`](views.aug.md#symbol-LoginPage) is a function returning `Html`.
|
|
10
|
+
- [`Welcome`](views.aug.md#symbol-Welcome) is a function returning `Html`.
|
|
11
|
+
|
|
12
|
+
<a id="symbol-LoginPage"></a>
|
|
13
|
+
|
|
14
|
+
## `LoginPage`
|
|
15
|
+
|
|
16
|
+
[source](views.aug#L5)
|
|
17
|
+
|
|
18
|
+
Returns: `Html`.
|
|
19
|
+
|
|
20
|
+
**What it does**
|
|
21
|
+
|
|
22
|
+
- Return the server component [`Page`](../common/views.aug.md#symbol-Page) with `title` = `"Sign in"` containing the HTML element `p` containing `This August app is both an OpenID Connect provider and a login client.` (rendered on the server with embedded text escaped), the HTML element `p` containing the HTML element `a` with `href` = `"/login/start"`, `style` = `"display:inline-block;padding:12px 20px;border-radius:10px;background:#4852d7;color:white;text-decoration:none"` containing `Sign in with OpenID Connect` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped), the HTML element `p` containing `The server uses authorization codes, S256 PKCE, state and nonce validation. Your session is a separate signed JWT in an HttpOnly cookie.` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped).
|
|
23
|
+
|
|
24
|
+
<a id="symbol-Welcome"></a>
|
|
25
|
+
|
|
26
|
+
## `Welcome`
|
|
27
|
+
|
|
28
|
+
[source](views.aug#L12)
|
|
29
|
+
|
|
30
|
+
**Inputs**
|
|
31
|
+
|
|
32
|
+
- `session` ([`SessionClaims`](contracts.aug.md#symbol-SessionClaims)) — required labeled input.
|
|
33
|
+
|
|
34
|
+
Returns: `Html`.
|
|
35
|
+
|
|
36
|
+
Can fail with `HttpError`. Callers must catch or propagate these errors.
|
|
37
|
+
|
|
38
|
+
**What it does**
|
|
39
|
+
|
|
40
|
+
- Return the server component [`Page`](../common/views.aug.md#symbol-Page) with `title` = `"Welcome, "` plus `name` of `session` containing the HTML element `p` containing `You are signed in as `, the HTML element `strong` containing `name` of `session` (rendered on the server with embedded text escaped), `.` (rendered on the server with embedded text escaped), the HTML element `p` containing `Subject: `, the HTML element `code` containing `sub` of `session` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped), the HTML element `p` containing the HTML element `a` with `href` = `"/me"` containing `View the protected JSON endpoint` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped), the HTML element `form` with `method` = `"post"`, `action` = `"/logout"`, `onSubmit` = a deferred HTTP form action for [`logout`](logout.aug.md#symbol-logout); inputs: `1` from the checked form input supplied when the HTTP form is submitted; capture supplied values when rendering, and read form inputs when submitted; send the form to that endpoint with its declared HTTP method containing the HTML element `input` with `type` = `"hidden"`, `name` = `"csrf"`, `value` = `csrf` of `session` (rendered on the server with embedded text escaped), the HTML element `button` with `type` = `"submit"`, `style` = `"padding:10px 18px;border-radius:10px;border:0;background:#17233a;color:white;font:inherit"` containing `Sign out` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped).
|
|
41
|
+
|
|
42
|
+
## Dependencies used by this file
|
|
43
|
+
|
|
44
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
45
|
+
|
|
46
|
+
### [`SessionClaims`](contracts.aug.md#symbol-SessionClaims)
|
|
47
|
+
|
|
48
|
+
Record from `contracts`.
|
|
49
|
+
|
|
50
|
+
- Read `csrf` (`string`).
|
|
51
|
+
- Read `name` (`string`).
|
|
52
|
+
- Read `sub` (`string`).
|
|
53
|
+
|
|
54
|
+
### [`logout`](logout.aug.md#symbol-logout)
|
|
55
|
+
|
|
56
|
+
Function from `logout`.
|
|
57
|
+
|
|
58
|
+
- [`logout`](logout.aug.md#symbol-logout) (`input`: [`LogoutForm`](contracts.aug.md#symbol-LogoutForm) from HTTP form, `token`: `optional string` from HTTP cookie `aug_session`, `origin`: `optional string` from HTTP header) → `HttpResponse<Html>`; inject `crypto`: [`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto), `clock`: [`Clock`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock), `keys`: [`SigningKeys`](../common/keys.aug.md#symbol-SigningKeys), `sessions`: [`ExpiringStore<SessionClaims>`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.publicRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.publicRsa), [`crypto.decodeBase64url`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`crypto.verifyRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.verifyRsa), [`crypto.equal`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal), [`clock.now`](../.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`keys.session`](../common/keys.aug.md#symbol-SigningKeys.session), [`sessions.get`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.get), [`sessions.take`](../.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.take); can fail with `SessionError`, `KeyError`, `TimeError`, `CryptoError`, `HttpError`.
|
|
59
|
+
|
|
60
|
+
### [`Page`](../common/views.aug.md#symbol-Page)
|
|
61
|
+
|
|
62
|
+
Function from `common`.
|
|
63
|
+
|
|
64
|
+
- [`Page`](../common/views.aug.md#symbol-Page) (`title`: `string`, `children`: `List<Html>`) → `Html`.
|
|
65
|
+
|
|
66
|
+
## Shared language rules
|
|
67
|
+
|
|
68
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export Settings from settings
|
|
2
|
+
export settings from settings
|
|
3
|
+
export SigningKeys from keys
|
|
4
|
+
export MemorySigningKeys from keys
|
|
5
|
+
export initializeKeys from keys
|
|
6
|
+
export KeyError from keys
|
|
7
|
+
export Page from views
|
|
8
|
+
export securityHeaders from headers
|
|
9
|
+
export withCookie from headers
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `export.aug` specification
|
|
4
|
+
|
|
5
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
+
|
|
7
|
+
## In this file
|
|
8
|
+
|
|
9
|
+
- Export `Settings` from this folder.
|
|
10
|
+
- Export `settings` from this folder.
|
|
11
|
+
- Export `SigningKeys` from this folder.
|
|
12
|
+
- Export `MemorySigningKeys` from this folder.
|
|
13
|
+
- Export `initializeKeys` from this folder.
|
|
14
|
+
- Export `KeyError` from this folder.
|
|
15
|
+
- Export `Page` from this folder.
|
|
16
|
+
- Export `securityHeaders` from this folder.
|
|
17
|
+
- Export `withCookie` from this folder.
|
|
18
|
+
|
|
19
|
+
## Folder exports
|
|
20
|
+
|
|
21
|
+
- Export the declaration `Settings` from [`settings.aug`](settings.aug.md#symbol-Settings).
|
|
22
|
+
- Export the declaration `settings` from [`settings.aug`](settings.aug.md#symbol-settings).
|
|
23
|
+
- Export the declaration `SigningKeys` from [`keys.aug`](keys.aug.md#symbol-SigningKeys).
|
|
24
|
+
- Export the declaration `MemorySigningKeys` from [`keys.aug`](keys.aug.md#symbol-MemorySigningKeys).
|
|
25
|
+
- Export the declaration `initializeKeys` from [`keys.aug`](keys.aug.md#symbol-initializeKeys).
|
|
26
|
+
- Export the declaration `KeyError` from [`keys.aug`](keys.aug.md#symbol-KeyError).
|
|
27
|
+
- Export the declaration `Page` from [`views.aug`](views.aug.md#symbol-Page).
|
|
28
|
+
- Export the declaration `securityHeaders` from [`headers.aug`](headers.aug.md#symbol-securityHeaders).
|
|
29
|
+
- Export the declaration `withCookie` from [`headers.aug`](headers.aug.md#symbol-withCookie).
|
|
30
|
+
|
|
31
|
+
## Shared language rules
|
|
32
|
+
|
|
33
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Responses containing identity data are never cached or embedded by another site. */
|
|
2
|
+
securityHeaders() returns Headers unless HttpError:
|
|
3
|
+
return Headers().with(name="cache-control", value="no-store").with(name="pragma", value="no-cache").with(name="x-content-type-options", value="nosniff").with(name="referrer-policy", value="no-referrer").with(name="content-security-policy", value="default-src 'self'; style-src 'unsafe-inline'; script-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'")
|
|
4
|
+
|
|
5
|
+
/** Add a checked cookie without losing duplicate Set-Cookie response fields. */
|
|
6
|
+
withCookie(Headers headers, string name, string value, string path, int maxAge, bool secure) returns Headers unless HttpError:
|
|
7
|
+
result = headers
|
|
8
|
+
for content in cookie(name, value, path, maxAge, secure).all(name="set-cookie"):
|
|
9
|
+
result = result.with(name="set-cookie", value=content)
|
|
10
|
+
return result
|
|
11
|
+
import cookie from august.web
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `headers.aug` specification
|
|
4
|
+
|
|
5
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
+
|
|
7
|
+
## In this file
|
|
8
|
+
|
|
9
|
+
- [`securityHeaders`](headers.aug.md#symbol-securityHeaders) is a function returning `Headers`.
|
|
10
|
+
- [`withCookie`](headers.aug.md#symbol-withCookie) is a function returning `Headers`.
|
|
11
|
+
|
|
12
|
+
<a id="symbol-securityHeaders"></a>
|
|
13
|
+
|
|
14
|
+
## `securityHeaders`
|
|
15
|
+
|
|
16
|
+
[source](headers.aug#L2)
|
|
17
|
+
|
|
18
|
+
Returns: `Headers`.
|
|
19
|
+
|
|
20
|
+
Can fail with `HttpError`. Callers must catch or propagate these errors.
|
|
21
|
+
|
|
22
|
+
**What it does**
|
|
23
|
+
|
|
24
|
+
- Return call `with` on call `with` on call `with` on call `with` on call `with` on call `Headers` with `name` = `"cache-control"`; `value` = `"no-store"` with `name` = `"pragma"`; `value` = `"no-cache"` with `name` = `"x-content-type-options"`; `value` = `"nosniff"` with `name` = `"referrer-policy"`; `value` = `"no-referrer"` with `name` = `"content-security-policy"`; `value` = `"default-src 'self'; style-src 'unsafe-inline'; script-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'"`.
|
|
25
|
+
|
|
26
|
+
**Author documentation**
|
|
27
|
+
|
|
28
|
+
Responses containing identity data are never cached or embedded by another site.
|
|
29
|
+
|
|
30
|
+
<a id="symbol-withCookie"></a>
|
|
31
|
+
|
|
32
|
+
## `withCookie`
|
|
33
|
+
|
|
34
|
+
[source](headers.aug#L6)
|
|
35
|
+
|
|
36
|
+
**Inputs**
|
|
37
|
+
|
|
38
|
+
- `headers` (`Headers`) — required labeled input.
|
|
39
|
+
- `name` (`string`) — required labeled input.
|
|
40
|
+
- `value` (`string`) — required labeled input.
|
|
41
|
+
- `path` (`string`) — required labeled input.
|
|
42
|
+
- `maxAge` (`int`) — required labeled input.
|
|
43
|
+
- `secure` (`bool`) — required labeled input.
|
|
44
|
+
|
|
45
|
+
Returns: `Headers`.
|
|
46
|
+
|
|
47
|
+
Can fail with `HttpError`. Callers must catch or propagate these errors.
|
|
48
|
+
|
|
49
|
+
**What it does**
|
|
50
|
+
|
|
51
|
+
- Set `result` to `headers`.
|
|
52
|
+
- For each `content` in a snapshot of call `all` on call [`cookie`](../.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-cookie) with `name` = `name`; `value` = `value`; `path` = `path`; `maxAge` = `maxAge`; `secure` = `secure` with `name` = `"set-cookie"`, in iteration order:
|
|
53
|
+
- Set `result` to call `with` on `result` with `name` = `"set-cookie"`; `value` = `content`.
|
|
54
|
+
- Return `result`.
|
|
55
|
+
|
|
56
|
+
**Author documentation**
|
|
57
|
+
|
|
58
|
+
Add a checked cookie without losing duplicate Set-Cookie response fields.
|
|
59
|
+
|
|
60
|
+
## Dependencies used by this file
|
|
61
|
+
|
|
62
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
63
|
+
|
|
64
|
+
### [`cookie`](../.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-cookie)
|
|
65
|
+
|
|
66
|
+
Function from `august.web`.
|
|
67
|
+
|
|
68
|
+
- [`cookie`](../.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-cookie) (`name`: `string`, `value`: `string`, `path`: `string`, `maxAge`: `int`, `secure`: `bool`) → `Headers`; can fail with `HttpError`.
|
|
69
|
+
|
|
70
|
+
## Built-in operations used by this file
|
|
71
|
+
|
|
72
|
+
- `Headers.all` (`name`: `string`) → `List<string>`: Read every value of this header in wire order.
|
|
73
|
+
- `Headers.with` (`name`: `string`, `value`: `string`) → `Headers`: Return new headers with one additional validated field. Header names ignore case; duplicate values remain separate. Can fail with `HttpError`.
|
|
74
|
+
|
|
75
|
+
[Full built-in reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
76
|
+
|
|
77
|
+
## Shared language rules
|
|
78
|
+
|
|
79
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Crypto from august.crypto
|
|
2
|
+
|
|
3
|
+
KeyError() implements Error:
|
|
4
|
+
pass
|
|
5
|
+
/** Keys are initialized explicitly in main and expose distinct provider and session roles. */
|
|
6
|
+
capability SigningKeys:
|
|
7
|
+
configure(RsaPrivateKey provider, RsaPrivateKey session) uses SigningKeys.configure unless KeyError
|
|
8
|
+
provider() returns RsaPrivateKey uses SigningKeys.provider unless KeyError
|
|
9
|
+
session() returns RsaPrivateKey uses SigningKeys.session unless KeyError
|
|
10
|
+
|
|
11
|
+
MemorySigningKeys() implements SigningKeys:
|
|
12
|
+
Shared<Map<string, RsaPrivateKey>> _keys = Shared(value=Map<string, RsaPrivateKey>())
|
|
13
|
+
configure(RsaPrivateKey provider, RsaPrivateKey session) uses SigningKeys.configure unless KeyError:
|
|
14
|
+
lock _keys as keys:
|
|
15
|
+
if keys.length() != 0:
|
|
16
|
+
throw KeyError()
|
|
17
|
+
keys.set(key="provider", value=provider)
|
|
18
|
+
keys.set(key="session", value=session)
|
|
19
|
+
provider() returns RsaPrivateKey uses SigningKeys.provider unless KeyError:
|
|
20
|
+
lock _keys as keys:
|
|
21
|
+
match keys.get(key="provider"):
|
|
22
|
+
when null:
|
|
23
|
+
throw KeyError()
|
|
24
|
+
when some key:
|
|
25
|
+
return key
|
|
26
|
+
session() returns RsaPrivateKey uses SigningKeys.session unless KeyError:
|
|
27
|
+
lock _keys as keys:
|
|
28
|
+
match keys.get(key="session"):
|
|
29
|
+
when null:
|
|
30
|
+
throw KeyError()
|
|
31
|
+
when some key:
|
|
32
|
+
return key
|
|
33
|
+
|
|
34
|
+
initializeKeys(resolve Crypto crypto, resolve SigningKeys keys) uses crypto.generateRsa and keys.configure unless CryptoError and KeyError:
|
|
35
|
+
provider = crypto.generateRsa()
|
|
36
|
+
session = crypto.generateRsa()
|
|
37
|
+
keys.configure(provider, session)
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `keys.aug` specification
|
|
4
|
+
|
|
5
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
+
|
|
7
|
+
## In this file
|
|
8
|
+
|
|
9
|
+
- [`KeyError`](keys.aug.md#symbol-KeyError) is a class implementing `Error`.
|
|
10
|
+
- [`SigningKeys`](keys.aug.md#symbol-SigningKeys) is a capability interface.
|
|
11
|
+
- [`MemorySigningKeys`](keys.aug.md#symbol-MemorySigningKeys) is a class implementing `SigningKeys`.
|
|
12
|
+
- [`initializeKeys`](keys.aug.md#symbol-initializeKeys) is a function.
|
|
13
|
+
|
|
14
|
+
<a id="symbol-KeyError"></a>
|
|
15
|
+
|
|
16
|
+
## `KeyError`
|
|
17
|
+
|
|
18
|
+
[source](keys.aug#L3)
|
|
19
|
+
|
|
20
|
+
Behavioral class.
|
|
21
|
+
|
|
22
|
+
Satisfies `Error`.
|
|
23
|
+
|
|
24
|
+
<a id="symbol-SigningKeys"></a>
|
|
25
|
+
|
|
26
|
+
## `SigningKeys`
|
|
27
|
+
|
|
28
|
+
[source](keys.aug#L6)
|
|
29
|
+
|
|
30
|
+
Capability interface.
|
|
31
|
+
|
|
32
|
+
**Author documentation**
|
|
33
|
+
|
|
34
|
+
Keys are initialized explicitly in main and expose distinct provider and session roles.
|
|
35
|
+
|
|
36
|
+
<a id="symbol-SigningKeys.configure"></a>
|
|
37
|
+
|
|
38
|
+
### `SigningKeys.configure`
|
|
39
|
+
|
|
40
|
+
[source](keys.aug#L7)
|
|
41
|
+
|
|
42
|
+
**Inputs**
|
|
43
|
+
|
|
44
|
+
- `provider` (`RsaPrivateKey`) — required labeled input.
|
|
45
|
+
- `session` (`RsaPrivateKey`) — required labeled input.
|
|
46
|
+
|
|
47
|
+
Returns: no value.
|
|
48
|
+
|
|
49
|
+
Capabilities: [`SigningKeys.configure`](keys.aug.md#symbol-SigningKeys.configure).
|
|
50
|
+
|
|
51
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
52
|
+
|
|
53
|
+
Interface contract. A selected implementation supplies the behavior.
|
|
54
|
+
|
|
55
|
+
<a id="symbol-SigningKeys.provider"></a>
|
|
56
|
+
|
|
57
|
+
### `SigningKeys.provider`
|
|
58
|
+
|
|
59
|
+
[source](keys.aug#L8)
|
|
60
|
+
|
|
61
|
+
Returns: `RsaPrivateKey`.
|
|
62
|
+
|
|
63
|
+
Capabilities: [`SigningKeys.provider`](keys.aug.md#symbol-SigningKeys.provider).
|
|
64
|
+
|
|
65
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
66
|
+
|
|
67
|
+
Interface contract. A selected implementation supplies the behavior.
|
|
68
|
+
|
|
69
|
+
<a id="symbol-SigningKeys.session"></a>
|
|
70
|
+
|
|
71
|
+
### `SigningKeys.session`
|
|
72
|
+
|
|
73
|
+
[source](keys.aug#L9)
|
|
74
|
+
|
|
75
|
+
Returns: `RsaPrivateKey`.
|
|
76
|
+
|
|
77
|
+
Capabilities: [`SigningKeys.session`](keys.aug.md#symbol-SigningKeys.session).
|
|
78
|
+
|
|
79
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
80
|
+
|
|
81
|
+
Interface contract. A selected implementation supplies the behavior.
|
|
82
|
+
|
|
83
|
+
<a id="symbol-MemorySigningKeys"></a>
|
|
84
|
+
|
|
85
|
+
## `MemorySigningKeys`
|
|
86
|
+
|
|
87
|
+
[source](keys.aug#L11)
|
|
88
|
+
|
|
89
|
+
Behavioral class.
|
|
90
|
+
|
|
91
|
+
Satisfies [`SigningKeys`](keys.aug.md#symbol-SigningKeys).
|
|
92
|
+
|
|
93
|
+
**Field initialization**
|
|
94
|
+
|
|
95
|
+
- Initialize `_keys` of type `Shared<Map<string,RsaPrivateKey>>` to call `Shared` with `value` = an empty map from `string` to `RsaPrivateKey`. Read-only storage, private to this class.
|
|
96
|
+
|
|
97
|
+
<a id="symbol-MemorySigningKeys.configure"></a>
|
|
98
|
+
|
|
99
|
+
### `MemorySigningKeys.configure`
|
|
100
|
+
|
|
101
|
+
[source](keys.aug#L13)
|
|
102
|
+
|
|
103
|
+
**Inputs**
|
|
104
|
+
|
|
105
|
+
- `provider` (`RsaPrivateKey`) — required labeled input.
|
|
106
|
+
- `session` (`RsaPrivateKey`) — required labeled input.
|
|
107
|
+
|
|
108
|
+
Returns: no value.
|
|
109
|
+
|
|
110
|
+
Capabilities: [`SigningKeys.configure`](keys.aug.md#symbol-SigningKeys.configure).
|
|
111
|
+
|
|
112
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
113
|
+
|
|
114
|
+
**What it does**
|
|
115
|
+
|
|
116
|
+
- Lock `_keys`, expose its mutable value as `keys`, and release the lock on every exit:
|
|
117
|
+
- If call `length` on `keys` does not equal `0`:
|
|
118
|
+
- Fail with call [`KeyError`](keys.aug.md#symbol-KeyError). Transfer control to a matching catch or propagate the failure.
|
|
119
|
+
- Call `set` on `keys` with `key` = `"provider"`; `value` = `provider`.
|
|
120
|
+
- Call `set` on `keys` with `key` = `"session"`; `value` = `session`.
|
|
121
|
+
|
|
122
|
+
<a id="symbol-MemorySigningKeys.provider"></a>
|
|
123
|
+
|
|
124
|
+
### `MemorySigningKeys.provider`
|
|
125
|
+
|
|
126
|
+
[source](keys.aug#L19)
|
|
127
|
+
|
|
128
|
+
Returns: `RsaPrivateKey`.
|
|
129
|
+
|
|
130
|
+
Capabilities: [`SigningKeys.provider`](keys.aug.md#symbol-SigningKeys.provider).
|
|
131
|
+
|
|
132
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
133
|
+
|
|
134
|
+
**What it does**
|
|
135
|
+
|
|
136
|
+
- Lock `_keys`, expose its mutable value as `keys`, and release the lock on every exit:
|
|
137
|
+
- Select the matching case for call `get` on `keys` with `key` = `"provider"`:
|
|
138
|
+
- A null value, including omitted optional input:
|
|
139
|
+
- Fail with call [`KeyError`](keys.aug.md#symbol-KeyError). Transfer control to a matching catch or propagate the failure.
|
|
140
|
+
- A present, non-null value, named `key`:
|
|
141
|
+
- Return `key`.
|
|
142
|
+
|
|
143
|
+
<a id="symbol-MemorySigningKeys.session"></a>
|
|
144
|
+
|
|
145
|
+
### `MemorySigningKeys.session`
|
|
146
|
+
|
|
147
|
+
[source](keys.aug#L26)
|
|
148
|
+
|
|
149
|
+
Returns: `RsaPrivateKey`.
|
|
150
|
+
|
|
151
|
+
Capabilities: [`SigningKeys.session`](keys.aug.md#symbol-SigningKeys.session).
|
|
152
|
+
|
|
153
|
+
Can fail with `KeyError`. Callers must catch or propagate these errors.
|
|
154
|
+
|
|
155
|
+
**What it does**
|
|
156
|
+
|
|
157
|
+
- Lock `_keys`, expose its mutable value as `keys`, and release the lock on every exit:
|
|
158
|
+
- Select the matching case for call `get` on `keys` with `key` = `"session"`:
|
|
159
|
+
- A null value, including omitted optional input:
|
|
160
|
+
- Fail with call [`KeyError`](keys.aug.md#symbol-KeyError). Transfer control to a matching catch or propagate the failure.
|
|
161
|
+
- A present, non-null value, named `key`:
|
|
162
|
+
- Return `key`.
|
|
163
|
+
|
|
164
|
+
<a id="symbol-initializeKeys"></a>
|
|
165
|
+
|
|
166
|
+
## `initializeKeys`
|
|
167
|
+
|
|
168
|
+
[source](keys.aug#L34)
|
|
169
|
+
|
|
170
|
+
**Inputs**
|
|
171
|
+
|
|
172
|
+
- `crypto` ([`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto)) — injected; callers omit it.
|
|
173
|
+
- `keys` ([`SigningKeys`](keys.aug.md#symbol-SigningKeys)) — injected; callers omit it.
|
|
174
|
+
|
|
175
|
+
Returns: no value.
|
|
176
|
+
|
|
177
|
+
Capabilities: [`crypto.generateRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.generateRsa), [`keys.configure`](keys.aug.md#symbol-SigningKeys.configure).
|
|
178
|
+
|
|
179
|
+
Can fail with `CryptoError`, `KeyError`. Callers must catch or propagate these errors.
|
|
180
|
+
|
|
181
|
+
**What it does**
|
|
182
|
+
|
|
183
|
+
- Set `provider` to call [`Crypto.generateRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.generateRsa) on `crypto`.
|
|
184
|
+
- Set `session` to call [`Crypto.generateRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.generateRsa) on `crypto`.
|
|
185
|
+
- Call [`SigningKeys.configure`](keys.aug.md#symbol-SigningKeys.configure) on `keys` with `provider` = `provider`; `session` = `session`.
|
|
186
|
+
|
|
187
|
+
## Dependencies used by this file
|
|
188
|
+
|
|
189
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
190
|
+
|
|
191
|
+
### [`Crypto`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto)
|
|
192
|
+
|
|
193
|
+
Capability interface from `august.crypto`.
|
|
194
|
+
|
|
195
|
+
- [`Crypto.generateRsa`](../.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.generateRsa) (no caller inputs) → `RsaPrivateKey`; can fail with `CryptoError`.
|
|
196
|
+
|
|
197
|
+
## Built-in operations used by this file
|
|
198
|
+
|
|
199
|
+
- `Map<string, RsaPrivateKey>.get` (`key`: `string`) → `optional RsaPrivateKey`: Read a value by key; an absent key returns null. contains distinguishes an absent key from a stored null.
|
|
200
|
+
- `Map<string, RsaPrivateKey>.length` (no inputs) → `int`: Read the number of elements.
|
|
201
|
+
- `Map<string, RsaPrivateKey>.set` (`key`: `string`, `value`: `RsaPrivateKey`) → `void`: Insert or replace an entry with exclusive mutable access. Changes the receiver.
|
|
202
|
+
|
|
203
|
+
[Full built-in reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
204
|
+
|
|
205
|
+
## Shared language rules
|
|
206
|
+
|
|
207
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Explicit loopback development settings. The provider accepts one registered client and its exact callback URI. */
|
|
2
|
+
record Settings(string baseUrl, string issuer, string clientId, string callback, int sessionSeconds, bool secureCookies)
|
|
3
|
+
settings() returns Settings:
|
|
4
|
+
return Settings(baseUrl="http://127.0.0.1:8787", issuer="http://127.0.0.1:8787/provider", clientId="august-login-app", callback="http://127.0.0.1:8787/login/callback", sessionSeconds=900, secureCookies=false)
|