@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,267 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "provider/contracts.aug · OpenID Connect login application"
|
|
3
|
+
generated: true
|
|
4
|
+
source: "examples/oidc-login/provider/contracts.aug"
|
|
5
|
+
editLink: false
|
|
6
|
+
prev: false
|
|
7
|
+
next: false
|
|
8
|
+
outline: [2, 3]
|
|
9
|
+
pageClass: aug-example-page
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# `provider/contracts.aug`
|
|
13
|
+
|
|
14
|
+
[OpenID Connect login application](../index.md) · Source and specification
|
|
15
|
+
|
|
16
|
+
::: details Files in this project
|
|
17
|
+
|
|
18
|
+
- [`main.aug`](../main.md)
|
|
19
|
+
- [`client/contracts.aug`](../client/contracts.md)
|
|
20
|
+
- [`client/endpoints.aug`](../client/endpoints.md)
|
|
21
|
+
- [`client/export.aug`](../client/export.md)
|
|
22
|
+
- [`client/login.aug`](../client/login.md)
|
|
23
|
+
- [`client/logout.aug`](../client/logout.md)
|
|
24
|
+
- [`client/protocol.aug`](../client/protocol.md)
|
|
25
|
+
- [`client/session.aug`](../client/session.md)
|
|
26
|
+
- [`client/views.aug`](../client/views.md)
|
|
27
|
+
- [`common/export.aug`](../common/export.md)
|
|
28
|
+
- [`common/headers.aug`](../common/headers.md)
|
|
29
|
+
- [`common/keys.aug`](../common/keys.md)
|
|
30
|
+
- [`common/settings.aug`](../common/settings.md)
|
|
31
|
+
- [`common/views.aug`](../common/views.md)
|
|
32
|
+
- [`provider/authorization.aug`](authorization.md)
|
|
33
|
+
- [`provider/contracts.aug`](contracts.md)
|
|
34
|
+
- [`provider/credentials.aug`](credentials.md)
|
|
35
|
+
- [`provider/discovery.aug`](discovery.md)
|
|
36
|
+
- [`provider/export.aug`](export.md)
|
|
37
|
+
- [`provider/token.aug`](token.md)
|
|
38
|
+
- [`provider/userinfo.aug`](userinfo.md)
|
|
39
|
+
- [`provider/views.aug`](views.md)
|
|
40
|
+
|
|
41
|
+
:::
|
|
42
|
+
|
|
43
|
+
::::: example-compare
|
|
44
|
+
|
|
45
|
+
:::: example-code
|
|
46
|
+
|
|
47
|
+
## Code {#code}
|
|
48
|
+
|
|
49
|
+
::: code-group
|
|
50
|
+
|
|
51
|
+
```aug [Indentation]
|
|
52
|
+
/** A provider request is bound to a browser cookie, a form CSRF token, and a registered client. */
|
|
53
|
+
record AuthorizationRequest(string clientId, string redirectUri, string state, string nonce, string challenge, string browser, string csrf, int expires)
|
|
54
|
+
/** Codes are short-lived, single-use and bound to a redirect URI and S256 challenge. */
|
|
55
|
+
record AuthorizationCode(string clientId, string redirectUri, string challenge, string nonce, string subject, string name, int expires)
|
|
56
|
+
record IdClaims(string iss, string sub, string aud, int exp, int iat, string nonce, string name)
|
|
57
|
+
record AccessGrant(string subject, string name, int expires)
|
|
58
|
+
record TokenResponse(string token_type, string access_token, string id_token, int expires_in, string scope)
|
|
59
|
+
record OAuthError(string error, string error_description)
|
|
60
|
+
record TokenForm(string grant_type, string code, string redirect_uri, string client_id, string code_verifier)
|
|
61
|
+
record LoginForm(string request_id, string csrf, string username, string password)
|
|
62
|
+
record UserInfo(string sub, string name)
|
|
63
|
+
LoginError() implements Error:
|
|
64
|
+
pass
|
|
65
|
+
CodeError() implements Error:
|
|
66
|
+
pass
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```aug [Braces]
|
|
70
|
+
/** A provider request is bound to a browser cookie, a form CSRF token, and a registered client. */
|
|
71
|
+
record AuthorizationRequest(string clientId, string redirectUri, string state, string nonce, string challenge, string browser, string csrf, int expires)
|
|
72
|
+
/** Codes are short-lived, single-use and bound to a redirect URI and S256 challenge. */
|
|
73
|
+
record AuthorizationCode(string clientId, string redirectUri, string challenge, string nonce, string subject, string name, int expires)
|
|
74
|
+
record IdClaims(string iss, string sub, string aud, int exp, int iat, string nonce, string name)
|
|
75
|
+
record AccessGrant(string subject, string name, int expires)
|
|
76
|
+
record TokenResponse(string token_type, string access_token, string id_token, int expires_in, string scope)
|
|
77
|
+
record OAuthError(string error, string error_description)
|
|
78
|
+
record TokenForm(string grant_type, string code, string redirect_uri, string client_id, string code_verifier)
|
|
79
|
+
record LoginForm(string request_id, string csrf, string username, string password)
|
|
80
|
+
record UserInfo(string sub, string name)
|
|
81
|
+
LoginError() implements Error {
|
|
82
|
+
pass
|
|
83
|
+
}
|
|
84
|
+
CodeError() implements Error {
|
|
85
|
+
pass
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
:::
|
|
90
|
+
|
|
91
|
+
::::
|
|
92
|
+
|
|
93
|
+
:::: example-spec
|
|
94
|
+
|
|
95
|
+
## Compiled specification {#specification}
|
|
96
|
+
|
|
97
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
98
|
+
|
|
99
|
+
### In this file
|
|
100
|
+
|
|
101
|
+
- [`AuthorizationRequest`](contracts.md#symbol-AuthorizationRequest) is an immutable record.
|
|
102
|
+
- [`AuthorizationCode`](contracts.md#symbol-AuthorizationCode) is an immutable record.
|
|
103
|
+
- [`IdClaims`](contracts.md#symbol-IdClaims) is an immutable record.
|
|
104
|
+
- [`AccessGrant`](contracts.md#symbol-AccessGrant) is an immutable record.
|
|
105
|
+
- [`TokenResponse`](contracts.md#symbol-TokenResponse) is an immutable record.
|
|
106
|
+
- [`OAuthError`](contracts.md#symbol-OAuthError) is an immutable record.
|
|
107
|
+
- [`TokenForm`](contracts.md#symbol-TokenForm) is an immutable record.
|
|
108
|
+
- [`LoginForm`](contracts.md#symbol-LoginForm) is an immutable record.
|
|
109
|
+
- [`UserInfo`](contracts.md#symbol-UserInfo) is an immutable record.
|
|
110
|
+
- [`LoginError`](contracts.md#symbol-LoginError) is a class implementing `Error`.
|
|
111
|
+
- [`CodeError`](contracts.md#symbol-CodeError) is a class implementing `Error`.
|
|
112
|
+
|
|
113
|
+
### `AuthorizationRequest` {#symbol-AuthorizationRequest}
|
|
114
|
+
|
|
115
|
+
[source](contracts.md#code)
|
|
116
|
+
|
|
117
|
+
Immutable record.
|
|
118
|
+
|
|
119
|
+
**Author documentation**
|
|
120
|
+
|
|
121
|
+
A provider request is bound to a browser cookie, a form CSRF token, and a registered client.
|
|
122
|
+
|
|
123
|
+
**Inputs**
|
|
124
|
+
|
|
125
|
+
- `clientId` (`string`) — required labeled input — stored as `clientId` and read-only after initialization.
|
|
126
|
+
- `redirectUri` (`string`) — required labeled input — stored as `redirectUri` and read-only after initialization.
|
|
127
|
+
- `state` (`string`) — required labeled input — stored as `state` and read-only after initialization.
|
|
128
|
+
- `nonce` (`string`) — required labeled input — stored as `nonce` and read-only after initialization.
|
|
129
|
+
- `challenge` (`string`) — required labeled input — stored as `challenge` and read-only after initialization.
|
|
130
|
+
- `browser` (`string`) — required labeled input — stored as `browser` and read-only after initialization.
|
|
131
|
+
- `csrf` (`string`) — required labeled input — stored as `csrf` and read-only after initialization.
|
|
132
|
+
- `expires` (`int`) — required labeled input — stored as `expires` and read-only after initialization.
|
|
133
|
+
|
|
134
|
+
### `AuthorizationCode` {#symbol-AuthorizationCode}
|
|
135
|
+
|
|
136
|
+
[source](contracts.md#code)
|
|
137
|
+
|
|
138
|
+
Immutable record.
|
|
139
|
+
|
|
140
|
+
**Author documentation**
|
|
141
|
+
|
|
142
|
+
Codes are short-lived, single-use and bound to a redirect URI and S256 challenge.
|
|
143
|
+
|
|
144
|
+
**Inputs**
|
|
145
|
+
|
|
146
|
+
- `clientId` (`string`) — required labeled input — stored as `clientId` and read-only after initialization.
|
|
147
|
+
- `redirectUri` (`string`) — required labeled input — stored as `redirectUri` and read-only after initialization.
|
|
148
|
+
- `challenge` (`string`) — required labeled input — stored as `challenge` and read-only after initialization.
|
|
149
|
+
- `nonce` (`string`) — required labeled input — stored as `nonce` and read-only after initialization.
|
|
150
|
+
- `subject` (`string`) — required labeled input — stored as `subject` and read-only after initialization.
|
|
151
|
+
- `name` (`string`) — required labeled input — stored as `name` and read-only after initialization.
|
|
152
|
+
- `expires` (`int`) — required labeled input — stored as `expires` and read-only after initialization.
|
|
153
|
+
|
|
154
|
+
### `IdClaims` {#symbol-IdClaims}
|
|
155
|
+
|
|
156
|
+
[source](contracts.md#code)
|
|
157
|
+
|
|
158
|
+
Immutable record.
|
|
159
|
+
|
|
160
|
+
**Inputs**
|
|
161
|
+
|
|
162
|
+
- `iss` (`string`) — required labeled input — stored as `iss` and read-only after initialization.
|
|
163
|
+
- `sub` (`string`) — required labeled input — stored as `sub` and read-only after initialization.
|
|
164
|
+
- `aud` (`string`) — required labeled input — stored as `aud` and read-only after initialization.
|
|
165
|
+
- `exp` (`int`) — required labeled input — stored as `exp` and read-only after initialization.
|
|
166
|
+
- `iat` (`int`) — required labeled input — stored as `iat` and read-only after initialization.
|
|
167
|
+
- `nonce` (`string`) — required labeled input — stored as `nonce` and read-only after initialization.
|
|
168
|
+
- `name` (`string`) — required labeled input — stored as `name` and read-only after initialization.
|
|
169
|
+
|
|
170
|
+
### `AccessGrant` {#symbol-AccessGrant}
|
|
171
|
+
|
|
172
|
+
[source](contracts.md#code)
|
|
173
|
+
|
|
174
|
+
Immutable record.
|
|
175
|
+
|
|
176
|
+
**Inputs**
|
|
177
|
+
|
|
178
|
+
- `subject` (`string`) — required labeled input — stored as `subject` and read-only after initialization.
|
|
179
|
+
- `name` (`string`) — required labeled input — stored as `name` and read-only after initialization.
|
|
180
|
+
- `expires` (`int`) — required labeled input — stored as `expires` and read-only after initialization.
|
|
181
|
+
|
|
182
|
+
### `TokenResponse` {#symbol-TokenResponse}
|
|
183
|
+
|
|
184
|
+
[source](contracts.md#code)
|
|
185
|
+
|
|
186
|
+
Immutable record.
|
|
187
|
+
|
|
188
|
+
**Inputs**
|
|
189
|
+
|
|
190
|
+
- `token_type` (`string`) — required labeled input — stored as `token_type` and read-only after initialization.
|
|
191
|
+
- `access_token` (`string`) — required labeled input — stored as `access_token` and read-only after initialization.
|
|
192
|
+
- `id_token` (`string`) — required labeled input — stored as `id_token` and read-only after initialization.
|
|
193
|
+
- `expires_in` (`int`) — required labeled input — stored as `expires_in` and read-only after initialization.
|
|
194
|
+
- `scope` (`string`) — required labeled input — stored as `scope` and read-only after initialization.
|
|
195
|
+
|
|
196
|
+
### `OAuthError` {#symbol-OAuthError}
|
|
197
|
+
|
|
198
|
+
[source](contracts.md#code)
|
|
199
|
+
|
|
200
|
+
Immutable record.
|
|
201
|
+
|
|
202
|
+
**Inputs**
|
|
203
|
+
|
|
204
|
+
- `error` (`string`) — required labeled input — stored as `error` and read-only after initialization.
|
|
205
|
+
- `error_description` (`string`) — required labeled input — stored as `error_description` and read-only after initialization.
|
|
206
|
+
|
|
207
|
+
### `TokenForm` {#symbol-TokenForm}
|
|
208
|
+
|
|
209
|
+
[source](contracts.md#code)
|
|
210
|
+
|
|
211
|
+
Immutable record.
|
|
212
|
+
|
|
213
|
+
**Inputs**
|
|
214
|
+
|
|
215
|
+
- `grant_type` (`string`) — required labeled input — stored as `grant_type` and read-only after initialization.
|
|
216
|
+
- `code` (`string`) — required labeled input — stored as `code` and read-only after initialization.
|
|
217
|
+
- `redirect_uri` (`string`) — required labeled input — stored as `redirect_uri` and read-only after initialization.
|
|
218
|
+
- `client_id` (`string`) — required labeled input — stored as `client_id` and read-only after initialization.
|
|
219
|
+
- `code_verifier` (`string`) — required labeled input — stored as `code_verifier` and read-only after initialization.
|
|
220
|
+
|
|
221
|
+
### `LoginForm` {#symbol-LoginForm}
|
|
222
|
+
|
|
223
|
+
[source](contracts.md#code)
|
|
224
|
+
|
|
225
|
+
Immutable record.
|
|
226
|
+
|
|
227
|
+
**Inputs**
|
|
228
|
+
|
|
229
|
+
- `request_id` (`string`) — required labeled input — stored as `request_id` and read-only after initialization.
|
|
230
|
+
- `csrf` (`string`) — required labeled input — stored as `csrf` and read-only after initialization.
|
|
231
|
+
- `username` (`string`) — required labeled input — stored as `username` and read-only after initialization.
|
|
232
|
+
- `password` (`string`) — required labeled input — stored as `password` and read-only after initialization.
|
|
233
|
+
|
|
234
|
+
### `UserInfo` {#symbol-UserInfo}
|
|
235
|
+
|
|
236
|
+
[source](contracts.md#code)
|
|
237
|
+
|
|
238
|
+
Immutable record.
|
|
239
|
+
|
|
240
|
+
**Inputs**
|
|
241
|
+
|
|
242
|
+
- `sub` (`string`) — required labeled input — stored as `sub` and read-only after initialization.
|
|
243
|
+
- `name` (`string`) — required labeled input — stored as `name` and read-only after initialization.
|
|
244
|
+
|
|
245
|
+
### `LoginError` {#symbol-LoginError}
|
|
246
|
+
|
|
247
|
+
[source](contracts.md#code)
|
|
248
|
+
|
|
249
|
+
Behavioral class.
|
|
250
|
+
|
|
251
|
+
Satisfies `Error`.
|
|
252
|
+
|
|
253
|
+
### `CodeError` {#symbol-CodeError}
|
|
254
|
+
|
|
255
|
+
[source](contracts.md#code)
|
|
256
|
+
|
|
257
|
+
Behavioral class.
|
|
258
|
+
|
|
259
|
+
Satisfies `Error`.
|
|
260
|
+
|
|
261
|
+
### Shared language rules
|
|
262
|
+
|
|
263
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
264
|
+
|
|
265
|
+
::::
|
|
266
|
+
|
|
267
|
+
:::::
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "provider/credentials.aug · OpenID Connect login application"
|
|
3
|
+
generated: true
|
|
4
|
+
source: "examples/oidc-login/provider/credentials.aug"
|
|
5
|
+
editLink: false
|
|
6
|
+
prev: false
|
|
7
|
+
next: false
|
|
8
|
+
outline: [2, 3]
|
|
9
|
+
pageClass: aug-example-page
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# `provider/credentials.aug`
|
|
13
|
+
|
|
14
|
+
[OpenID Connect login application](../index.md) · Source and specification
|
|
15
|
+
|
|
16
|
+
::: details Files in this project
|
|
17
|
+
|
|
18
|
+
- [`main.aug`](../main.md)
|
|
19
|
+
- [`client/contracts.aug`](../client/contracts.md)
|
|
20
|
+
- [`client/endpoints.aug`](../client/endpoints.md)
|
|
21
|
+
- [`client/export.aug`](../client/export.md)
|
|
22
|
+
- [`client/login.aug`](../client/login.md)
|
|
23
|
+
- [`client/logout.aug`](../client/logout.md)
|
|
24
|
+
- [`client/protocol.aug`](../client/protocol.md)
|
|
25
|
+
- [`client/session.aug`](../client/session.md)
|
|
26
|
+
- [`client/views.aug`](../client/views.md)
|
|
27
|
+
- [`common/export.aug`](../common/export.md)
|
|
28
|
+
- [`common/headers.aug`](../common/headers.md)
|
|
29
|
+
- [`common/keys.aug`](../common/keys.md)
|
|
30
|
+
- [`common/settings.aug`](../common/settings.md)
|
|
31
|
+
- [`common/views.aug`](../common/views.md)
|
|
32
|
+
- [`provider/authorization.aug`](authorization.md)
|
|
33
|
+
- [`provider/contracts.aug`](contracts.md)
|
|
34
|
+
- [`provider/credentials.aug`](credentials.md)
|
|
35
|
+
- [`provider/discovery.aug`](discovery.md)
|
|
36
|
+
- [`provider/export.aug`](export.md)
|
|
37
|
+
- [`provider/token.aug`](token.md)
|
|
38
|
+
- [`provider/userinfo.aug`](userinfo.md)
|
|
39
|
+
- [`provider/views.aug`](views.md)
|
|
40
|
+
|
|
41
|
+
:::
|
|
42
|
+
|
|
43
|
+
::::: example-compare
|
|
44
|
+
|
|
45
|
+
:::: example-code
|
|
46
|
+
|
|
47
|
+
## Code {#code}
|
|
48
|
+
|
|
49
|
+
::: code-group
|
|
50
|
+
|
|
51
|
+
```aug [Indentation]
|
|
52
|
+
import Crypto from august.crypto
|
|
53
|
+
/** One development account with a PBKDF2-HMAC-SHA256 verifier. Production account storage is deliberately a separate capability. */
|
|
54
|
+
verifyCredentials(string username, string password, resolve Crypto crypto) returns bool uses crypto.passwordHash and crypto.decodeBase64url and crypto.equal unless CryptoError:
|
|
55
|
+
if username.length() > 64 or password.length() > 256:
|
|
56
|
+
return false
|
|
57
|
+
actual = crypto.passwordHash(password=password.bytes(), salt="August demo salt v1".bytes(), iterations=600000)
|
|
58
|
+
expected = crypto.decodeBase64url(input="s70USYF6WohPz2f7VLA9haS_ZgEtenviSf_HG0o7B_A")
|
|
59
|
+
userMatches = crypto.equal(left=username.bytes(), right="ada".bytes())
|
|
60
|
+
passwordMatches = crypto.equal(left=actual, right=expected)
|
|
61
|
+
return userMatches and passwordMatches
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```aug [Braces]
|
|
65
|
+
import Crypto from august.crypto
|
|
66
|
+
/** One development account with a PBKDF2-HMAC-SHA256 verifier. Production account storage is deliberately a separate capability. */
|
|
67
|
+
verifyCredentials(string username, string password, resolve Crypto crypto) returns bool uses crypto.passwordHash and crypto.decodeBase64url and crypto.equal unless CryptoError {
|
|
68
|
+
if username.length() > 64 or password.length() > 256 {
|
|
69
|
+
return false
|
|
70
|
+
}
|
|
71
|
+
actual = crypto.passwordHash(password=password.bytes(), salt="August demo salt v1".bytes(), iterations=600000)
|
|
72
|
+
expected = crypto.decodeBase64url(input="s70USYF6WohPz2f7VLA9haS_ZgEtenviSf_HG0o7B_A")
|
|
73
|
+
userMatches = crypto.equal(left=username.bytes(), right="ada".bytes())
|
|
74
|
+
passwordMatches = crypto.equal(left=actual, right=expected)
|
|
75
|
+
return userMatches and passwordMatches
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
:::
|
|
80
|
+
|
|
81
|
+
::::
|
|
82
|
+
|
|
83
|
+
:::: example-spec
|
|
84
|
+
|
|
85
|
+
## Compiled specification {#specification}
|
|
86
|
+
|
|
87
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
88
|
+
|
|
89
|
+
### In this file
|
|
90
|
+
|
|
91
|
+
- [`verifyCredentials`](credentials.md#symbol-verifyCredentials) is a function returning `bool`.
|
|
92
|
+
|
|
93
|
+
### `verifyCredentials` {#symbol-verifyCredentials}
|
|
94
|
+
|
|
95
|
+
[source](credentials.md#code)
|
|
96
|
+
|
|
97
|
+
**Inputs**
|
|
98
|
+
|
|
99
|
+
- `username` (`string`) — required labeled input.
|
|
100
|
+
- `password` (`string`) — required labeled input.
|
|
101
|
+
- `crypto` ([`Crypto`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto)) — injected; callers omit it.
|
|
102
|
+
|
|
103
|
+
Returns: `bool`.
|
|
104
|
+
|
|
105
|
+
Capabilities: [`crypto.passwordHash`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.passwordHash), [`crypto.decodeBase64url`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.decodeBase64url), [`crypto.equal`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.equal).
|
|
106
|
+
|
|
107
|
+
Can fail with `CryptoError`. Callers must catch or propagate these errors.
|
|
108
|
+
|
|
109
|
+
**What it does**
|
|
110
|
+
|
|
111
|
+
- If (call `length` on `username` is greater than `64`) or (call `length` on `password` is greater than `256`):
|
|
112
|
+
- Return `false`.
|
|
113
|
+
- Set `actual` to call [`Crypto.passwordHash`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.passwordHash) on `crypto` with `password` = call `bytes` on `password`; `salt` = call `bytes` on `"August demo salt v1"`; `iterations` = `600000`.
|
|
114
|
+
- Set `expected` to call [`Crypto.decodeBase64url`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.decodeBase64url) on `crypto` with `input` = `"s70USYF6WohPz2f7VLA9haS_ZgEtenviSf_HG0o7B_A"`.
|
|
115
|
+
- Set `userMatches` to call [`Crypto.equal`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.equal) on `crypto` with `left` = call `bytes` on `username`; `right` = call `bytes` on `"ada"`.
|
|
116
|
+
- Set `passwordMatches` to call [`Crypto.equal`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.equal) on `crypto` with `left` = `actual`; `right` = `expected`.
|
|
117
|
+
- Return `userMatches` and `passwordMatches`.
|
|
118
|
+
|
|
119
|
+
**Author documentation**
|
|
120
|
+
|
|
121
|
+
One development account with a PBKDF2-HMAC-SHA256 verifier. Production account storage is deliberately a separate capability.
|
|
122
|
+
|
|
123
|
+
### Dependencies used by this file
|
|
124
|
+
|
|
125
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
126
|
+
|
|
127
|
+
#### [`Crypto`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto)
|
|
128
|
+
|
|
129
|
+
Capability interface from `august.crypto`.
|
|
130
|
+
|
|
131
|
+
- [`Crypto.decodeBase64url`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.decodeBase64url) (`input`: `string`) → `Bytes`; can fail with `CryptoError`.
|
|
132
|
+
- [`Crypto.equal`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.equal) (`left`: `Bytes`, `right`: `Bytes`) → `bool`.
|
|
133
|
+
- [`Crypto.passwordHash`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.passwordHash) (`password`: `Bytes`, `salt`: `Bytes`, `iterations`: `int`) → `Bytes`; can fail with `CryptoError`.
|
|
134
|
+
|
|
135
|
+
### Built-in operations used by this file
|
|
136
|
+
|
|
137
|
+
- `string.bytes` (no inputs) → `Bytes`: Encode this string as immutable UTF-8 bytes.
|
|
138
|
+
- `string.length` (no inputs) → `int`: Read the number of UTF-8 bytes. Unicode text is preserved losslessly.
|
|
139
|
+
|
|
140
|
+
[Full built-in reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
141
|
+
|
|
142
|
+
### Shared language rules
|
|
143
|
+
|
|
144
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
145
|
+
|
|
146
|
+
::::
|
|
147
|
+
|
|
148
|
+
:::::
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "provider/discovery.aug · OpenID Connect login application"
|
|
3
|
+
generated: true
|
|
4
|
+
source: "examples/oidc-login/provider/discovery.aug"
|
|
5
|
+
editLink: false
|
|
6
|
+
prev: false
|
|
7
|
+
next: false
|
|
8
|
+
outline: [2, 3]
|
|
9
|
+
pageClass: aug-example-page
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# `provider/discovery.aug`
|
|
13
|
+
|
|
14
|
+
[OpenID Connect login application](../index.md) · Source and specification
|
|
15
|
+
|
|
16
|
+
::: details Files in this project
|
|
17
|
+
|
|
18
|
+
- [`main.aug`](../main.md)
|
|
19
|
+
- [`client/contracts.aug`](../client/contracts.md)
|
|
20
|
+
- [`client/endpoints.aug`](../client/endpoints.md)
|
|
21
|
+
- [`client/export.aug`](../client/export.md)
|
|
22
|
+
- [`client/login.aug`](../client/login.md)
|
|
23
|
+
- [`client/logout.aug`](../client/logout.md)
|
|
24
|
+
- [`client/protocol.aug`](../client/protocol.md)
|
|
25
|
+
- [`client/session.aug`](../client/session.md)
|
|
26
|
+
- [`client/views.aug`](../client/views.md)
|
|
27
|
+
- [`common/export.aug`](../common/export.md)
|
|
28
|
+
- [`common/headers.aug`](../common/headers.md)
|
|
29
|
+
- [`common/keys.aug`](../common/keys.md)
|
|
30
|
+
- [`common/settings.aug`](../common/settings.md)
|
|
31
|
+
- [`common/views.aug`](../common/views.md)
|
|
32
|
+
- [`provider/authorization.aug`](authorization.md)
|
|
33
|
+
- [`provider/contracts.aug`](contracts.md)
|
|
34
|
+
- [`provider/credentials.aug`](credentials.md)
|
|
35
|
+
- [`provider/discovery.aug`](discovery.md)
|
|
36
|
+
- [`provider/export.aug`](export.md)
|
|
37
|
+
- [`provider/token.aug`](token.md)
|
|
38
|
+
- [`provider/userinfo.aug`](userinfo.md)
|
|
39
|
+
- [`provider/views.aug`](views.md)
|
|
40
|
+
|
|
41
|
+
:::
|
|
42
|
+
|
|
43
|
+
::::: example-compare
|
|
44
|
+
|
|
45
|
+
:::: example-code
|
|
46
|
+
|
|
47
|
+
## Code {#code}
|
|
48
|
+
|
|
49
|
+
::: code-group
|
|
50
|
+
|
|
51
|
+
```aug [Indentation]
|
|
52
|
+
import settings and SigningKeys and KeyError from common
|
|
53
|
+
import Crypto and RsaJwks and rsaJwk from august.crypto
|
|
54
|
+
/** Discovery advertises exactly this provider's supported authorization-code profile. */
|
|
55
|
+
record Discovery(string issuer, string authorization_endpoint, string token_endpoint, string userinfo_endpoint, string jwks_uri, List<string> response_types_supported, List<string> grant_types_supported, List<string> subject_types_supported, List<string> id_token_signing_alg_values_supported, List<string> token_endpoint_auth_methods_supported, List<string> scopes_supported, List<string> claims_supported, List<string> code_challenge_methods_supported)
|
|
56
|
+
endpoint GET "/provider/.well-known/openid-configuration" as discovery() returns Discovery:
|
|
57
|
+
config = settings()
|
|
58
|
+
return Discovery(issuer=config.issuer, authorization_endpoint=config.issuer + "/authorize", token_endpoint=config.issuer + "/token", userinfo_endpoint=config.issuer + "/userinfo", jwks_uri=config.issuer + "/jwks", response_types_supported=["code"], grant_types_supported=["authorization_code"], subject_types_supported=["public"], id_token_signing_alg_values_supported=["RS256"], token_endpoint_auth_methods_supported=["none"], scopes_supported=["openid", "profile"], claims_supported=["iss", "sub", "aud", "exp", "iat", "nonce", "name"], code_challenge_methods_supported=["S256"])
|
|
59
|
+
/** Only the provider's public signing key is published. Session keys never enter this JWKS. */
|
|
60
|
+
endpoint GET "/provider/jwks" as jwks(resolve Crypto crypto, resolve SigningKeys keys) returns RsaJwks uses keys.provider and crypto.publicRsa and crypto.exportRsa unless KeyError and CryptoError:
|
|
61
|
+
publicKey = crypto.publicRsa(key=keys.provider())
|
|
62
|
+
return RsaJwks(keys=[rsaJwk(publicKey=publicKey, kid="provider-1")])
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```aug [Braces]
|
|
66
|
+
import settings and SigningKeys and KeyError from common
|
|
67
|
+
import Crypto and RsaJwks and rsaJwk from august.crypto
|
|
68
|
+
/** Discovery advertises exactly this provider's supported authorization-code profile. */
|
|
69
|
+
record Discovery(string issuer, string authorization_endpoint, string token_endpoint, string userinfo_endpoint, string jwks_uri, List<string> response_types_supported, List<string> grant_types_supported, List<string> subject_types_supported, List<string> id_token_signing_alg_values_supported, List<string> token_endpoint_auth_methods_supported, List<string> scopes_supported, List<string> claims_supported, List<string> code_challenge_methods_supported)
|
|
70
|
+
endpoint GET "/provider/.well-known/openid-configuration" as discovery() returns Discovery {
|
|
71
|
+
config = settings()
|
|
72
|
+
return Discovery(issuer=config.issuer, authorization_endpoint=config.issuer + "/authorize", token_endpoint=config.issuer + "/token", userinfo_endpoint=config.issuer + "/userinfo", jwks_uri=config.issuer + "/jwks", response_types_supported=["code"], grant_types_supported=["authorization_code"], subject_types_supported=["public"], id_token_signing_alg_values_supported=["RS256"], token_endpoint_auth_methods_supported=["none"], scopes_supported=["openid", "profile"], claims_supported=["iss", "sub", "aud", "exp", "iat", "nonce", "name"], code_challenge_methods_supported=["S256"])
|
|
73
|
+
}
|
|
74
|
+
/** Only the provider's public signing key is published. Session keys never enter this JWKS. */
|
|
75
|
+
endpoint GET "/provider/jwks" as jwks(resolve Crypto crypto, resolve SigningKeys keys) returns RsaJwks uses keys.provider and crypto.publicRsa and crypto.exportRsa unless KeyError and CryptoError {
|
|
76
|
+
publicKey = crypto.publicRsa(key=keys.provider())
|
|
77
|
+
return RsaJwks(keys=[rsaJwk(publicKey=publicKey, kid="provider-1")])
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
:::
|
|
82
|
+
|
|
83
|
+
::::
|
|
84
|
+
|
|
85
|
+
:::: example-spec
|
|
86
|
+
|
|
87
|
+
## Compiled specification {#specification}
|
|
88
|
+
|
|
89
|
+
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
90
|
+
|
|
91
|
+
### In this file
|
|
92
|
+
|
|
93
|
+
- [`Discovery`](discovery.md#symbol-Discovery) is an immutable record.
|
|
94
|
+
- [`discovery`](discovery.md#symbol-discovery) handles `GET` `/provider/.well-known/openid-configuration` returning `Discovery`.
|
|
95
|
+
- [`jwks`](discovery.md#symbol-jwks) handles `GET` `/provider/jwks` returning `RsaJwks`.
|
|
96
|
+
|
|
97
|
+
### `Discovery` {#symbol-Discovery}
|
|
98
|
+
|
|
99
|
+
[source](discovery.md#code)
|
|
100
|
+
|
|
101
|
+
Immutable record.
|
|
102
|
+
|
|
103
|
+
**Author documentation**
|
|
104
|
+
|
|
105
|
+
Discovery advertises exactly this provider's supported authorization-code profile.
|
|
106
|
+
|
|
107
|
+
**Inputs**
|
|
108
|
+
|
|
109
|
+
- `issuer` (`string`) — required labeled input — stored as `issuer` and read-only after initialization.
|
|
110
|
+
- `authorization_endpoint` (`string`) — required labeled input — stored as `authorization_endpoint` and read-only after initialization.
|
|
111
|
+
- `token_endpoint` (`string`) — required labeled input — stored as `token_endpoint` and read-only after initialization.
|
|
112
|
+
- `userinfo_endpoint` (`string`) — required labeled input — stored as `userinfo_endpoint` and read-only after initialization.
|
|
113
|
+
- `jwks_uri` (`string`) — required labeled input — stored as `jwks_uri` and read-only after initialization.
|
|
114
|
+
- `response_types_supported` (`List<string>`) — required labeled input — stored as `response_types_supported` and read-only after initialization.
|
|
115
|
+
- `grant_types_supported` (`List<string>`) — required labeled input — stored as `grant_types_supported` and read-only after initialization.
|
|
116
|
+
- `subject_types_supported` (`List<string>`) — required labeled input — stored as `subject_types_supported` and read-only after initialization.
|
|
117
|
+
- `id_token_signing_alg_values_supported` (`List<string>`) — required labeled input — stored as `id_token_signing_alg_values_supported` and read-only after initialization.
|
|
118
|
+
- `token_endpoint_auth_methods_supported` (`List<string>`) — required labeled input — stored as `token_endpoint_auth_methods_supported` and read-only after initialization.
|
|
119
|
+
- `scopes_supported` (`List<string>`) — required labeled input — stored as `scopes_supported` and read-only after initialization.
|
|
120
|
+
- `claims_supported` (`List<string>`) — required labeled input — stored as `claims_supported` and read-only after initialization.
|
|
121
|
+
- `code_challenge_methods_supported` (`List<string>`) — required labeled input — stored as `code_challenge_methods_supported` and read-only after initialization.
|
|
122
|
+
|
|
123
|
+
### `discovery` {#symbol-discovery}
|
|
124
|
+
|
|
125
|
+
[source](discovery.md#code)
|
|
126
|
+
|
|
127
|
+
Returns: [`Discovery`](discovery.md#symbol-Discovery).
|
|
128
|
+
|
|
129
|
+
HTTP route: `GET` `/provider/.well-known/openid-configuration`. Use status 200 when the handler returns a body; a returned HttpResponse can set its own status. An unhandled request failure returns status 500 and cancels its request tasks.
|
|
130
|
+
|
|
131
|
+
**What it does**
|
|
132
|
+
|
|
133
|
+
- Set `config` to call [`settings`](../common/settings.md#symbol-settings).
|
|
134
|
+
- Return call [`Discovery`](discovery.md#symbol-Discovery) with `issuer` = `issuer` of `config`; `authorization_endpoint` = (`issuer` of `config` plus `"/authorize"`); `token_endpoint` = (`issuer` of `config` plus `"/token"`); `userinfo_endpoint` = (`issuer` of `config` plus `"/userinfo"`); `jwks_uri` = (`issuer` of `config` plus `"/jwks"`); `response_types_supported` = a list containing `"code"`; `grant_types_supported` = a list containing `"authorization_code"`; `subject_types_supported` = a list containing `"public"`; `id_token_signing_alg_values_supported` = a list containing `"RS256"`; `token_endpoint_auth_methods_supported` = a list containing `"none"`; `scopes_supported` = a list containing `"openid"`, `"profile"`; `claims_supported` = a list containing `"iss"`, `"sub"`, `"aud"`, `"exp"`, `"iat"`, `"nonce"`, `"name"`; `code_challenge_methods_supported` = a list containing `"S256"`.
|
|
135
|
+
|
|
136
|
+
### `jwks` {#symbol-jwks}
|
|
137
|
+
|
|
138
|
+
[source](discovery.md#code)
|
|
139
|
+
|
|
140
|
+
**Inputs**
|
|
141
|
+
|
|
142
|
+
- `crypto` ([`Crypto`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto)) — injected; callers omit it.
|
|
143
|
+
- `keys` ([`SigningKeys`](../common/keys.md#symbol-SigningKeys)) — injected; callers omit it.
|
|
144
|
+
|
|
145
|
+
Returns: [`RsaJwks`](../dependencies/august/0.19.0/crypto/jose.md#symbol-RsaJwks).
|
|
146
|
+
|
|
147
|
+
Capabilities: [`keys.provider`](../common/keys.md#symbol-SigningKeys.provider), [`crypto.publicRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.publicRsa), [`crypto.exportRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.exportRsa).
|
|
148
|
+
|
|
149
|
+
Can fail with `KeyError`, `CryptoError`. Callers must catch or propagate these errors.
|
|
150
|
+
|
|
151
|
+
HTTP route: `GET` `/provider/jwks`. Use status 200 when the handler returns a body; a returned HttpResponse can set its own status. An unhandled request failure returns status 500 and cancels its request tasks.
|
|
152
|
+
|
|
153
|
+
**What it does**
|
|
154
|
+
|
|
155
|
+
- Set `publicKey` to call [`Crypto.publicRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.publicRsa) on `crypto` with `key` = call [`SigningKeys.provider`](../common/keys.md#symbol-SigningKeys.provider) on `keys`.
|
|
156
|
+
- Return call [`RsaJwks`](../dependencies/august/0.19.0/crypto/jose.md#symbol-RsaJwks) with `keys` = a list containing call [`rsaJwk`](../dependencies/august/0.19.0/crypto/jose.md#symbol-rsaJwk) with `publicKey` = `publicKey`; `kid` = `"provider-1"`; inject `crypto` from `crypto`.
|
|
157
|
+
|
|
158
|
+
**Author documentation**
|
|
159
|
+
|
|
160
|
+
Only the provider's public signing key is published. Session keys never enter this JWKS.
|
|
161
|
+
|
|
162
|
+
### Dependencies used by this file
|
|
163
|
+
|
|
164
|
+
Only referenced types and operations appear here. Each name links to its complete specification.
|
|
165
|
+
|
|
166
|
+
#### [`Crypto`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto)
|
|
167
|
+
|
|
168
|
+
Capability interface from `august.crypto`.
|
|
169
|
+
|
|
170
|
+
- [`Crypto.exportRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.exportRsa) (`publicKey`: `RsaPublicKey`) → `Tuple<Bytes,Bytes>`; can fail with `CryptoError`.
|
|
171
|
+
- [`Crypto.publicRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.publicRsa) (`key`: `RsaPrivateKey`) → `RsaPublicKey`; can fail with `CryptoError`.
|
|
172
|
+
|
|
173
|
+
#### [`RsaJwks`](../dependencies/august/0.19.0/crypto/jose.md#symbol-RsaJwks)
|
|
174
|
+
|
|
175
|
+
Record from `august.crypto`.
|
|
176
|
+
|
|
177
|
+
- Construct with `keys`: `List<RsaJwk>` → [`RsaJwks`](../dependencies/august/0.19.0/crypto/jose.md#symbol-RsaJwks).
|
|
178
|
+
|
|
179
|
+
#### [`rsaJwk`](../dependencies/august/0.19.0/crypto/jose.md#symbol-rsaJwk)
|
|
180
|
+
|
|
181
|
+
Function from `august.crypto`.
|
|
182
|
+
|
|
183
|
+
- [`rsaJwk`](../dependencies/august/0.19.0/crypto/jose.md#symbol-rsaJwk) (`publicKey`: `RsaPublicKey`, `kid`: `string`) → [`RsaJwk`](../dependencies/august/0.19.0/crypto/jose.md#symbol-RsaJwk); inject `crypto`: [`Crypto`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto); uses [`crypto.exportRsa`](../dependencies/august/0.19.0/crypto/contracts.md#symbol-Crypto.exportRsa); can fail with `CryptoError`.
|
|
184
|
+
|
|
185
|
+
#### [`KeyError`](../common/keys.md#symbol-KeyError)
|
|
186
|
+
|
|
187
|
+
Class from `common`.
|
|
188
|
+
|
|
189
|
+
Used as a type or provider.
|
|
190
|
+
|
|
191
|
+
#### [`SigningKeys`](../common/keys.md#symbol-SigningKeys)
|
|
192
|
+
|
|
193
|
+
Capability interface from `common`.
|
|
194
|
+
|
|
195
|
+
- [`SigningKeys.provider`](../common/keys.md#symbol-SigningKeys.provider) (no caller inputs) → `RsaPrivateKey`; can fail with `KeyError`.
|
|
196
|
+
|
|
197
|
+
#### [`Settings`](../common/settings.md#symbol-Settings)
|
|
198
|
+
|
|
199
|
+
Record.
|
|
200
|
+
|
|
201
|
+
- Read `issuer` (`string`).
|
|
202
|
+
|
|
203
|
+
#### [`settings`](../common/settings.md#symbol-settings)
|
|
204
|
+
|
|
205
|
+
Function from `common`.
|
|
206
|
+
|
|
207
|
+
- [`settings`](../common/settings.md#symbol-settings) (no caller inputs) → [`Settings`](../common/settings.md#symbol-Settings).
|
|
208
|
+
|
|
209
|
+
### Shared language rules
|
|
210
|
+
|
|
211
|
+
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
212
|
+
|
|
213
|
+
::::
|
|
214
|
+
|
|
215
|
+
:::::
|