@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,47 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `settings.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
|
+
- [`Settings`](settings.aug.md#symbol-Settings) is an immutable record.
|
|
10
|
+
- [`settings`](settings.aug.md#symbol-settings) is a function returning `Settings`.
|
|
11
|
+
|
|
12
|
+
<a id="symbol-Settings"></a>
|
|
13
|
+
|
|
14
|
+
## `Settings`
|
|
15
|
+
|
|
16
|
+
[source](settings.aug#L2)
|
|
17
|
+
|
|
18
|
+
Immutable record.
|
|
19
|
+
|
|
20
|
+
**Author documentation**
|
|
21
|
+
|
|
22
|
+
Explicit loopback development settings. The provider accepts one registered client and its exact callback URI.
|
|
23
|
+
|
|
24
|
+
**Inputs**
|
|
25
|
+
|
|
26
|
+
- `baseUrl` (`string`) — required labeled input — stored as `baseUrl` and read-only after initialization.
|
|
27
|
+
- `issuer` (`string`) — required labeled input — stored as `issuer` and read-only after initialization.
|
|
28
|
+
- `clientId` (`string`) — required labeled input — stored as `clientId` and read-only after initialization.
|
|
29
|
+
- `callback` (`string`) — required labeled input — stored as `callback` and read-only after initialization.
|
|
30
|
+
- `sessionSeconds` (`int`) — required labeled input — stored as `sessionSeconds` and read-only after initialization.
|
|
31
|
+
- `secureCookies` (`bool`) — required labeled input — stored as `secureCookies` and read-only after initialization.
|
|
32
|
+
|
|
33
|
+
<a id="symbol-settings"></a>
|
|
34
|
+
|
|
35
|
+
## `settings`
|
|
36
|
+
|
|
37
|
+
[source](settings.aug#L3)
|
|
38
|
+
|
|
39
|
+
Returns: [`Settings`](settings.aug.md#symbol-Settings).
|
|
40
|
+
|
|
41
|
+
**What it does**
|
|
42
|
+
|
|
43
|
+
- Return call [`Settings`](settings.aug.md#symbol-Settings) with `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`.
|
|
44
|
+
|
|
45
|
+
## Shared language rules
|
|
46
|
+
|
|
47
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Small server components keep each page's behavior and dependencies visible. */
|
|
2
|
+
Page(string title, List<Html> children) returns Html:
|
|
3
|
+
return <html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>{title} — August</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body style="margin:0;background:#f3f5f9;color:#17233a;font:17px system-ui,sans-serif;line-height:1.6">
|
|
10
|
+
<main style="max-width:640px;margin:48px auto;padding:28px;background:white;border-radius:20px;box-shadow:0 12px 48px #17233a12">
|
|
11
|
+
<nav><a href="/" style="color:#4852d7;font-weight:750;text-decoration:none">August · OpenID Connect</a></nav>
|
|
12
|
+
<h1>{title}</h1>
|
|
13
|
+
{children}
|
|
14
|
+
</main>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
- [`Page`](views.aug.md#symbol-Page) is a function returning `Html`.
|
|
10
|
+
|
|
11
|
+
<a id="symbol-Page"></a>
|
|
12
|
+
|
|
13
|
+
## `Page`
|
|
14
|
+
|
|
15
|
+
[source](views.aug#L2)
|
|
16
|
+
|
|
17
|
+
**Inputs**
|
|
18
|
+
|
|
19
|
+
- `title` (`string`) — required labeled input.
|
|
20
|
+
- `children` (`List<Html>`) — required labeled input.
|
|
21
|
+
|
|
22
|
+
Returns: `Html`.
|
|
23
|
+
|
|
24
|
+
**What it does**
|
|
25
|
+
|
|
26
|
+
- Return the HTML element `html` with `lang` = `"en"` containing the HTML element `head` containing the HTML element `meta` with `charset` = `"utf-8"` (rendered on the server with embedded text escaped), the HTML element `meta` with `name` = `"viewport"`, `content` = `"width=device-width, initial-scale=1"` (rendered on the server with embedded text escaped), the HTML element `title` containing `title`, ` — August` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped), the HTML element `body` with `style` = `"margin:0;background:#f3f5f9;color:#17233a;font:17px system-ui,sans-serif;line-height:1.6"` containing the HTML element `main` with `style` = `"max-width:640px;margin:48px auto;padding:28px;background:white;border-radius:20px;box-shadow:0 12px 48px #17233a12"` containing the HTML element `nav` containing the HTML element `a` with `href` = `"/"`, `style` = `"color:#4852d7;font-weight:750;text-decoration:none"` containing `August · OpenID Connect` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped), the HTML element `h1` containing `title` (rendered on the server with embedded text escaped), `children` (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped) (rendered on the server with embedded text escaped).
|
|
27
|
+
|
|
28
|
+
**Author documentation**
|
|
29
|
+
|
|
30
|
+
Small server components keep each page's behavior and dependencies visible.
|
|
31
|
+
|
|
32
|
+
## Shared language rules
|
|
33
|
+
|
|
34
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Crypto and GnuTlsCrypto from august.crypto
|
|
2
|
+
import Clock and SystemClock from august.time
|
|
3
|
+
import HttpClient and WebHttpClient from august.web
|
|
4
|
+
import ExpiringStore and MemoryStore from august.memory
|
|
5
|
+
import LoginTransaction and SessionClaims and home and me and logout and startLogin and loginCallback from client
|
|
6
|
+
import AuthorizationRequest and AuthorizationCode and AccessGrant and discovery and jwks and authorize and providerLogin and token and userinfo from provider
|
|
7
|
+
import SigningKeys and MemorySigningKeys and initializeKeys and KeyError from common
|
|
8
|
+
|
|
9
|
+
implement Crypto with GnuTlsCrypto
|
|
10
|
+
implement Clock with SystemClock
|
|
11
|
+
implement HttpClient with WebHttpClient
|
|
12
|
+
implement SigningKeys with MemorySigningKeys shared mutable
|
|
13
|
+
implement ExpiringStore<LoginTransaction> with MemoryStore<LoginTransaction> shared mutable
|
|
14
|
+
implement ExpiringStore<AuthorizationRequest> with MemoryStore<AuthorizationRequest> shared mutable
|
|
15
|
+
implement ExpiringStore<AuthorizationCode> with MemoryStore<AuthorizationCode> shared mutable
|
|
16
|
+
implement ExpiringStore<SessionClaims> with MemoryStore<SessionClaims> shared mutable
|
|
17
|
+
implement ExpiringStore<AccessGrant> with MemoryStore<AccessGrant> shared mutable
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
initializeKeys()
|
|
21
|
+
catch CryptoError error:
|
|
22
|
+
print(value="Cryptographic initialization failed")
|
|
23
|
+
exit(status=1)
|
|
24
|
+
catch KeyError error:
|
|
25
|
+
print(value="Signing keys could not be initialized")
|
|
26
|
+
exit(status=1)
|
|
27
|
+
|
|
28
|
+
serve home
|
|
29
|
+
and me
|
|
30
|
+
and logout
|
|
31
|
+
and startLogin
|
|
32
|
+
and loginCallback
|
|
33
|
+
and discovery
|
|
34
|
+
and jwks
|
|
35
|
+
and authorize
|
|
36
|
+
and providerLogin
|
|
37
|
+
and token
|
|
38
|
+
and userinfo
|
|
39
|
+
on port 8787
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `main.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
|
+
- Register 9 dependency providers before startup.
|
|
10
|
+
- Run startup operations with checked error recovery.
|
|
11
|
+
- Serve 11 HTTP routes.
|
|
12
|
+
|
|
13
|
+
## HTTP configuration
|
|
14
|
+
|
|
15
|
+
Listen on `127.0.0.1`. Limit request bodies to 16384 bytes and buffered responses to 1048576 bytes.
|
|
16
|
+
|
|
17
|
+
Serve the OpenAPI document at `/openapi.json` and API documentation at `/docs`.
|
|
18
|
+
|
|
19
|
+
## Dependency providers
|
|
20
|
+
|
|
21
|
+
Register these providers before startup. Their declaration order does not set initialization order; shared instances initialize in dependency order.
|
|
22
|
+
|
|
23
|
+
- Provide [`GnuTlsCrypto`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-GnuTlsCrypto) when `Crypto` is requested. Reuse one instance.
|
|
24
|
+
- Provide [`SystemClock`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-SystemClock) when `Clock` is requested. Reuse one instance.
|
|
25
|
+
- Provide [`WebHttpClient`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-WebHttpClient) when `HttpClient` is requested. Reuse one instance.
|
|
26
|
+
- Provide [`MemorySigningKeys`](common/keys.aug.md#symbol-MemorySigningKeys) when `SigningKeys` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
27
|
+
- Provide [`MemoryStore<LoginTransaction>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore) when `ExpiringStore<LoginTransaction>` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
28
|
+
- Provide [`MemoryStore<AuthorizationRequest>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore) when `ExpiringStore<AuthorizationRequest>` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
29
|
+
- Provide [`MemoryStore<AuthorizationCode>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore) when `ExpiringStore<AuthorizationCode>` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
30
|
+
- Provide [`MemoryStore<SessionClaims>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore) when `ExpiringStore<SessionClaims>` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
31
|
+
- Provide [`MemoryStore<AccessGrant>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore) when `ExpiringStore<AccessGrant>` is requested. Reuse one instance. Permit explicit shared mutation.
|
|
32
|
+
|
|
33
|
+
## Startup, in source order
|
|
34
|
+
|
|
35
|
+
- Try these operations:
|
|
36
|
+
- Call [`initializeKeys`](common/keys.aug.md#symbol-initializeKeys); inject `crypto` from `Crypto`, `keys` from `SigningKeys`.
|
|
37
|
+
- If they fail with `CryptoError`, name the failure `error` and recover:
|
|
38
|
+
- Call `print` with `value` = `"Cryptographic initialization failed"`.
|
|
39
|
+
- Call `exit` with `status` = `1`.
|
|
40
|
+
- If they fail with [`KeyError`](common/keys.aug.md#symbol-KeyError), name the failure `error` and recover:
|
|
41
|
+
- Call `print` with `value` = `"Signing keys could not be initialized"`.
|
|
42
|
+
- Call `exit` with `status` = `1`.
|
|
43
|
+
- Serve [`home`](client/endpoints.aug.md#symbol-home), [`me`](client/endpoints.aug.md#symbol-me), [`logout`](client/logout.aug.md#symbol-logout), [`startLogin`](client/login.aug.md#symbol-startLogin), [`loginCallback`](client/login.aug.md#symbol-loginCallback), [`discovery`](provider/discovery.aug.md#symbol-discovery), [`jwks`](provider/discovery.aug.md#symbol-jwks), [`authorize`](provider/authorization.aug.md#symbol-authorize), [`providerLogin`](provider/authorization.aug.md#symbol-providerLogin), [`token`](provider/token.aug.md#symbol-token), [`userinfo`](provider/userinfo.aug.md#symbol-userinfo) on port `8787`.
|
|
44
|
+
|
|
45
|
+
## Dependencies used by this file
|
|
46
|
+
|
|
47
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
48
|
+
|
|
49
|
+
### [`GnuTlsCrypto`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-GnuTlsCrypto)
|
|
50
|
+
|
|
51
|
+
Class from `august.crypto`.
|
|
52
|
+
|
|
53
|
+
Used as a type or provider.
|
|
54
|
+
|
|
55
|
+
### [`MemoryStore`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-MemoryStore)
|
|
56
|
+
|
|
57
|
+
Class from `august.memory`.
|
|
58
|
+
|
|
59
|
+
Used as a type or provider.
|
|
60
|
+
|
|
61
|
+
### [`SystemClock`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-SystemClock)
|
|
62
|
+
|
|
63
|
+
Class from `august.time`.
|
|
64
|
+
|
|
65
|
+
Used as a type or provider.
|
|
66
|
+
|
|
67
|
+
### [`WebHttpClient`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-WebHttpClient)
|
|
68
|
+
|
|
69
|
+
Class from `august.web`.
|
|
70
|
+
|
|
71
|
+
Used as a type or provider.
|
|
72
|
+
|
|
73
|
+
### [`home`](client/endpoints.aug.md#symbol-home)
|
|
74
|
+
|
|
75
|
+
Function from `client`.
|
|
76
|
+
|
|
77
|
+
- [`home`](client/endpoints.aug.md#symbol-home) (`token`: `optional string` from HTTP cookie `aug_session`) → `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); can fail with `KeyError`, `TimeError`, `HttpError`.
|
|
78
|
+
|
|
79
|
+
### [`me`](client/endpoints.aug.md#symbol-me)
|
|
80
|
+
|
|
81
|
+
Function from `client`.
|
|
82
|
+
|
|
83
|
+
- [`me`](client/endpoints.aug.md#symbol-me) (`token`: `optional string` from HTTP cookie `aug_session`) → `HttpResponse<UserInfo>`; 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); can fail with `SessionError`, `KeyError`, `TimeError`, `HttpError`.
|
|
84
|
+
|
|
85
|
+
### [`loginCallback`](client/login.aug.md#symbol-loginCallback)
|
|
86
|
+
|
|
87
|
+
Function from `client`.
|
|
88
|
+
|
|
89
|
+
- [`loginCallback`](client/login.aug.md#symbol-loginCallback) (`code`: `string` from HTTP query, `state`: `string` from HTTP query, `browser`: `optional string` from HTTP cookie `aug_login`) → `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), `client`: [`HttpClient`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-HttpClient), `keys`: [`SigningKeys`](common/keys.aug.md#symbol-SigningKeys), `transactions`: [`ExpiringStore<LoginTransaction>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore), `sessions`: [`ExpiringStore<SessionClaims>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.equal`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal), [`crypto.random`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.random), [`crypto.signRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.signRsa), [`crypto.decodeBase64url`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`crypto.importRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.importRsa), [`crypto.verifyRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.verifyRsa), [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`client.request`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-HttpClient.request), [`keys.session`](common/keys.aug.md#symbol-SigningKeys.session), [`transactions.take`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.take), [`sessions.put`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.put); can fail with `SessionError`, `CryptoError`, `TimeError`, `KeyError`, `StoreFull`, `JwtError`, `JsonError`, `HttpError`.
|
|
90
|
+
|
|
91
|
+
### [`startLogin`](client/login.aug.md#symbol-startLogin)
|
|
92
|
+
|
|
93
|
+
Function from `client`.
|
|
94
|
+
|
|
95
|
+
- [`startLogin`](client/login.aug.md#symbol-startLogin) (no caller inputs) → `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), `client`: [`HttpClient`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-HttpClient), `transactions`: [`ExpiringStore<LoginTransaction>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.random`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.random), [`crypto.sha256`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.sha256), [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`client.request`](.aug-spec/august/0.19.0/web/contracts.aug.md#symbol-HttpClient.request), [`transactions.put`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.put); can fail with `SessionError`, `CryptoError`, `TimeError`, `StoreFull`, `HttpError`.
|
|
96
|
+
|
|
97
|
+
### [`logout`](client/logout.aug.md#symbol-logout)
|
|
98
|
+
|
|
99
|
+
Function from `client`.
|
|
100
|
+
|
|
101
|
+
- [`logout`](client/logout.aug.md#symbol-logout) (`input`: [`LogoutForm`](client/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`.
|
|
102
|
+
|
|
103
|
+
### [`KeyError`](common/keys.aug.md#symbol-KeyError)
|
|
104
|
+
|
|
105
|
+
Class from `common`.
|
|
106
|
+
|
|
107
|
+
Used as a type or provider.
|
|
108
|
+
|
|
109
|
+
### [`MemorySigningKeys`](common/keys.aug.md#symbol-MemorySigningKeys)
|
|
110
|
+
|
|
111
|
+
Class from `common`.
|
|
112
|
+
|
|
113
|
+
Used as a type or provider.
|
|
114
|
+
|
|
115
|
+
### [`initializeKeys`](common/keys.aug.md#symbol-initializeKeys)
|
|
116
|
+
|
|
117
|
+
Function from `common`.
|
|
118
|
+
|
|
119
|
+
- [`initializeKeys`](common/keys.aug.md#symbol-initializeKeys) (no caller inputs) → `void`; inject `crypto`: [`Crypto`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto), `keys`: [`SigningKeys`](common/keys.aug.md#symbol-SigningKeys); uses [`crypto.generateRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.generateRsa), [`keys.configure`](common/keys.aug.md#symbol-SigningKeys.configure); can fail with `CryptoError`, `KeyError`.
|
|
120
|
+
|
|
121
|
+
### [`authorize`](provider/authorization.aug.md#symbol-authorize)
|
|
122
|
+
|
|
123
|
+
Function from `provider`.
|
|
124
|
+
|
|
125
|
+
- [`authorize`](provider/authorization.aug.md#symbol-authorize) (`response_type`: `string` from HTTP query, `client_id`: `string` from HTTP query, `redirect_uri`: `string` from HTTP query, `requestedScope`: `string` from HTTP query `scope`, `state`: `string` from HTTP query, `nonce`: `string` from HTTP query, `code_challenge`: `string` from HTTP query, `code_challenge_method`: `string` from HTTP query) → `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), `requests`: [`ExpiringStore<AuthorizationRequest>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.random`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.random), [`crypto.decodeBase64url`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`requests.put`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.put); can fail with `LoginError`, `CryptoError`, `TimeError`, `StoreFull`, `HttpError`.
|
|
126
|
+
|
|
127
|
+
### [`providerLogin`](provider/authorization.aug.md#symbol-providerLogin)
|
|
128
|
+
|
|
129
|
+
Function from `provider`.
|
|
130
|
+
|
|
131
|
+
- [`providerLogin`](provider/authorization.aug.md#symbol-providerLogin) (`form`: [`LoginForm`](provider/contracts.aug.md#symbol-LoginForm) from HTTP form, `browser`: `optional string` from HTTP cookie `aug_authorize`, `origin`: `optional string` from HTTP header `origin`) → `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), `requests`: [`ExpiringStore<AuthorizationRequest>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore), `codes`: [`ExpiringStore<AuthorizationCode>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.equal`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal), [`crypto.random`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.random), [`crypto.passwordHash`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.passwordHash), [`crypto.decodeBase64url`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.decodeBase64url), [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`requests.take`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.take), [`codes.put`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.put); can fail with `CryptoError`, `TimeError`, `StoreFull`, `HttpError`.
|
|
132
|
+
|
|
133
|
+
### [`discovery`](provider/discovery.aug.md#symbol-discovery)
|
|
134
|
+
|
|
135
|
+
Function from `provider`.
|
|
136
|
+
|
|
137
|
+
- [`discovery`](provider/discovery.aug.md#symbol-discovery) (no caller inputs) → [`Discovery`](provider/discovery.aug.md#symbol-Discovery).
|
|
138
|
+
|
|
139
|
+
### [`jwks`](provider/discovery.aug.md#symbol-jwks)
|
|
140
|
+
|
|
141
|
+
Function from `provider`.
|
|
142
|
+
|
|
143
|
+
- [`jwks`](provider/discovery.aug.md#symbol-jwks) (no caller inputs) → [`RsaJwks`](.aug-spec/august/0.19.0/crypto/jose.aug.md#symbol-RsaJwks); inject `crypto`: [`Crypto`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto), `keys`: [`SigningKeys`](common/keys.aug.md#symbol-SigningKeys); uses [`keys.provider`](common/keys.aug.md#symbol-SigningKeys.provider), [`crypto.publicRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.publicRsa), [`crypto.exportRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.exportRsa); can fail with `KeyError`, `CryptoError`.
|
|
144
|
+
|
|
145
|
+
### [`token`](provider/token.aug.md#symbol-token)
|
|
146
|
+
|
|
147
|
+
Function from `provider`.
|
|
148
|
+
|
|
149
|
+
- [`token`](provider/token.aug.md#symbol-token) (`http`: `HttpRequest` from HTTP request) → `HttpResponse<Json>`; 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), `codes`: [`ExpiringStore<AuthorizationCode>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore), `access`: [`ExpiringStore<AccessGrant>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`crypto.sha256`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.sha256), [`crypto.equal`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.equal), [`crypto.random`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.random), [`crypto.signRsa`](.aug-spec/august/0.19.0/crypto/contracts.aug.md#symbol-Crypto.signRsa), [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`keys.provider`](common/keys.aug.md#symbol-SigningKeys.provider), [`codes.take`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.take), [`access.put`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.put); can fail with `CryptoError`, `TimeError`, `KeyError`, `JwtError`, `StoreFull`, `HttpError`.
|
|
150
|
+
|
|
151
|
+
### [`userinfo`](provider/userinfo.aug.md#symbol-userinfo)
|
|
152
|
+
|
|
153
|
+
Function from `provider`.
|
|
154
|
+
|
|
155
|
+
- [`userinfo`](provider/userinfo.aug.md#symbol-userinfo) (`authorization`: `optional string` from HTTP header) → `HttpResponse<Json>`; inject `clock`: [`Clock`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock), `access`: [`ExpiringStore<AccessGrant>`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore); uses [`clock.now`](.aug-spec/august/0.19.0/time/contracts.aug.md#symbol-Clock.now), [`access.get`](.aug-spec/august/0.19.0/memory/store.aug.md#symbol-ExpiringStore.get); can fail with `TimeError`, `HttpError`.
|
|
156
|
+
|
|
157
|
+
## Built-in operations used by this file
|
|
158
|
+
|
|
159
|
+
- `exit` (`status`: `int`) → `void`: Exit from main with a status from 0 to 255 after cancellation and cleanup.
|
|
160
|
+
- `print` (`value`: `any`) → `void`: Composition and test output. Other callables receive Console and declare uses console.write.
|
|
161
|
+
|
|
162
|
+
[Full built-in reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
163
|
+
|
|
164
|
+
## Shared language rules
|
|
165
|
+
|
|
166
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import AuthorizationRequest and AuthorizationCode and LoginForm and LoginError from contracts
|
|
2
|
+
import ProviderLogin and ProviderFailure from views
|
|
3
|
+
import verifyCredentials from credentials
|
|
4
|
+
import settings and securityHeaders and withCookie from common
|
|
5
|
+
import Crypto from august.crypto
|
|
6
|
+
import Clock from august.time
|
|
7
|
+
import ExpiringStore and StoreFull from august.memory
|
|
8
|
+
import urlEncode from august.web
|
|
9
|
+
|
|
10
|
+
/** Validate the registered client before offering a login form. A malformed redirect is never followed. */
|
|
11
|
+
endpoint GET "/provider/authorize" as authorize(string response_type from query, string client_id from query, string redirect_uri from query, string requestedScope from query "scope", string state from query, string nonce from query, string code_challenge from query, string code_challenge_method from query, resolve Crypto crypto, resolve Clock clock, resolve ExpiringStore<AuthorizationRequest> requests) returns HttpResponse<Html> uses crypto.random and crypto.decodeBase64url and clock.now and requests.put unless LoginError with status 400 and CryptoError with status 503 and TimeError with status 503 and StoreFull with status 503 and HttpError:
|
|
12
|
+
config = settings()
|
|
13
|
+
if client_id != config.clientId or redirect_uri != config.callback or response_type != "code" or code_challenge_method != "S256":
|
|
14
|
+
throw LoginError()
|
|
15
|
+
if requestedScope != "openid" and requestedScope != "openid profile":
|
|
16
|
+
throw LoginError()
|
|
17
|
+
if (not state.isToken(min=43, max=128)) or (not nonce.isToken(min=43, max=128)) or code_challenge.length() != 43:
|
|
18
|
+
throw LoginError()
|
|
19
|
+
try:
|
|
20
|
+
if crypto.decodeBase64url(input=code_challenge).length() != 32:
|
|
21
|
+
throw LoginError()
|
|
22
|
+
catch CryptoError error:
|
|
23
|
+
throw LoginError()
|
|
24
|
+
requestId = crypto.random(size=32).base64url()
|
|
25
|
+
browser = crypto.random(size=32).base64url()
|
|
26
|
+
csrf = crypto.random(size=32).base64url()
|
|
27
|
+
now = clock.now()
|
|
28
|
+
request = AuthorizationRequest(clientId=client_id, redirectUri=redirect_uri, state=state, nonce=nonce, challenge=code_challenge, browser=browser, csrf=csrf, expires=now + 300)
|
|
29
|
+
requests.put(key=requestId, value=request, expires=request.expires, now=now)
|
|
30
|
+
headers = withCookie(headers=securityHeaders(), name="aug_authorize", value=browser, path="/provider", maxAge=300, secure=config.secureCookies)
|
|
31
|
+
return HttpResponse(body=ProviderLogin(requestId, csrf, message="Authorize the registered August login app.", submit=handle providerLogin(input from form)), headers=headers)
|
|
32
|
+
|
|
33
|
+
/** The browser binding and CSRF token are checked before credentials. Each form request is consumed once. */
|
|
34
|
+
endpoint POST "/provider/login" as providerLogin(LoginForm form from form, optional string browser from cookie "aug_authorize", optional string origin from header "origin", resolve Crypto crypto, resolve Clock clock, resolve ExpiringStore<AuthorizationRequest> requests, resolve ExpiringStore<AuthorizationCode> codes) returns HttpResponse<Html> uses crypto.equal and crypto.random and crypto.passwordHash and crypto.decodeBase64url and clock.now and requests.take and codes.put unless CryptoError with status 503 and TimeError with status 503 and StoreFull with status 503 and HttpError:
|
|
35
|
+
config = settings()
|
|
36
|
+
try:
|
|
37
|
+
if origin != config.baseUrl:
|
|
38
|
+
return HttpResponse(body=ProviderFailure(message="The sign-in form must come from this app."), status=403, headers=securityHeaders())
|
|
39
|
+
match requests.take(key=form.request_id, now=clock.now()):
|
|
40
|
+
when null:
|
|
41
|
+
return HttpResponse(body=ProviderFailure(message="The sign-in request expired or was already used."), status=400, headers=securityHeaders())
|
|
42
|
+
when some request:
|
|
43
|
+
match browser:
|
|
44
|
+
when null:
|
|
45
|
+
return HttpResponse(body=ProviderFailure(message="The browser binding is missing."), status=403, headers=securityHeaders())
|
|
46
|
+
when some secret:
|
|
47
|
+
if (not crypto.equal(left=secret.bytes(), right=request.browser.bytes())) or (not crypto.equal(left=form.csrf.bytes(), right=request.csrf.bytes())):
|
|
48
|
+
return HttpResponse(body=ProviderFailure(message="The sign-in form could not be verified."), status=403, headers=securityHeaders())
|
|
49
|
+
if (not verifyCredentials(username=form.username, password=form.password)):
|
|
50
|
+
return HttpResponse(body=ProviderFailure(message="The username or password was not accepted."), status=401, headers=securityHeaders())
|
|
51
|
+
now = clock.now()
|
|
52
|
+
code = crypto.random(size=32).base64url()
|
|
53
|
+
grant = AuthorizationCode(clientId=request.clientId, redirectUri=request.redirectUri, challenge=request.challenge, nonce=request.nonce, subject="demo-ada", name="Ada", expires=now + 60)
|
|
54
|
+
codes.put(key=code, value=grant, expires=grant.expires, now=now)
|
|
55
|
+
location = request.redirectUri + "?code=" + urlEncode(input=code) + "&state=" + urlEncode(input=request.state)
|
|
56
|
+
headers = withCookie(headers=securityHeaders().with(name="location", value=location), name="aug_authorize", value="", path="/provider", maxAge=0, secure=config.secureCookies)
|
|
57
|
+
return HttpResponse(body=<p>Returning to the application.</p>, status=303, headers=headers)
|
|
58
|
+
catch HttpError error:
|
|
59
|
+
return HttpResponse(body=ProviderFailure(message="The submitted form is invalid."), status=400, headers=securityHeaders())
|