@greenpandastudios/aug-cli 0.19.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/bin/aug.mjs +12 -2
- package/docs/about.md +27 -0
- package/docs/api/crypto.md +103 -69
- package/docs/api/io.md +35 -33
- package/docs/api/json.md +3 -3
- package/docs/api/memory.md +23 -19
- package/docs/api/time.md +10 -9
- package/docs/api/web.md +33 -38
- package/docs/compatibility.md +3 -3
- package/docs/contributing-benchmarks.md +38 -0
- package/docs/dev-containers.md +95 -0
- package/docs/diagnostics.md +15 -5
- package/docs/docker.md +174 -12
- package/docs/editor.md +35 -0
- package/docs/example-projects.json +206 -24
- package/docs/examples/approved-design/counters.md +34 -126
- package/docs/examples/approved-design/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/approved-design/domain/app.md +13 -77
- package/docs/examples/approved-design/domain/export.md +5 -19
- package/docs/examples/approved-design/domain/models.md +4 -23
- package/docs/examples/approved-design/domain/numbers.md +24 -114
- package/docs/examples/approved-design/index.md +16 -7
- package/docs/examples/approved-design/main.md +19 -96
- package/docs/examples/benchmark/index.md +6 -5
- package/docs/examples/benchmark/main.md +7 -35
- package/docs/examples/cli-args/index.md +6 -5
- package/docs/examples/cli-args/main.md +6 -31
- package/docs/examples/collections/index.md +6 -5
- package/docs/examples/collections/main.md +7 -35
- package/docs/examples/collections-benchmark/index.md +6 -5
- package/docs/examples/collections-benchmark/main.md +7 -35
- package/docs/examples/cpu-benchmark/index.md +6 -5
- package/docs/examples/cpu-benchmark/main.md +5 -24
- package/docs/examples/developer-workflow/calculator.md +39 -186
- package/docs/examples/developer-workflow/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/developer-workflow/index.md +16 -7
- package/docs/examples/developer-workflow/logging/console.md +10 -56
- package/docs/examples/developer-workflow/logging/export.md +4 -14
- package/docs/examples/developer-workflow/logging/logger.md +7 -43
- package/docs/examples/developer-workflow/main.md +17 -69
- package/docs/examples/drop/index.md +6 -5
- package/docs/examples/drop/main.md +7 -27
- package/docs/examples/drop/resource.md +7 -30
- package/docs/examples/errors/errors.md +7 -27
- package/docs/examples/errors/index.md +6 -5
- package/docs/examples/errors/main.md +7 -28
- package/docs/examples/ffi/index.md +6 -5
- package/docs/examples/ffi/main.md +6 -20
- package/docs/examples/ffi/native.md +8 -34
- package/docs/examples/generic-di/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/generic-di/index.md +6 -5
- package/docs/examples/generic-di/main.md +9 -39
- package/docs/examples/generic-di/types.md +23 -92
- package/docs/examples/generics/index.md +6 -5
- package/docs/examples/generics/main.md +10 -47
- package/docs/examples/generics/types.md +25 -100
- package/docs/examples/hello/app/export.md +4 -12
- package/docs/examples/hello/app/greeter.md +13 -91
- package/docs/examples/hello/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/hello/index.md +17 -6
- package/docs/examples/hello/logging/console.md +10 -54
- package/docs/examples/hello/logging/export.md +4 -14
- package/docs/examples/hello/logging/logger.md +7 -45
- package/docs/examples/hello/main.md +9 -39
- package/docs/examples/http-benchmark/index.md +6 -5
- package/docs/examples/http-benchmark/main.md +6 -20
- package/docs/examples/http-benchmark/routes.md +9 -31
- package/docs/examples/index.md +46 -29
- package/docs/examples/interceptors/app.md +20 -139
- package/docs/examples/interceptors/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/interceptors/index.md +6 -5
- package/docs/examples/interceptors/interceptors.md +24 -148
- package/docs/examples/interceptors/logging.md +13 -76
- package/docs/examples/interceptors/main.md +10 -65
- package/docs/examples/json-benchmark/data.md +4 -20
- package/docs/examples/json-benchmark/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/json-benchmark/index.md +7 -5
- package/docs/examples/json-benchmark/main-yaml.md +20 -0
- package/docs/examples/json-benchmark/main.md +10 -49
- package/docs/examples/new-syntax/console.md +10 -52
- package/docs/examples/new-syntax/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/new-syntax/greeter.md +13 -71
- package/docs/examples/new-syntax/index.md +6 -5
- package/docs/examples/new-syntax/logger.md +7 -43
- package/docs/examples/new-syntax/main.md +10 -53
- package/docs/examples/new-syntax/math.md +6 -24
- package/docs/examples/oidc-login/client/contracts.md +10 -61
- package/docs/examples/oidc-login/client/endpoints.md +32 -154
- package/docs/examples/oidc-login/client/export.md +5 -23
- package/docs/examples/oidc-login/client/login.md +234 -344
- package/docs/examples/oidc-login/client/logout.md +38 -143
- package/docs/examples/oidc-login/client/protocol.md +183 -304
- package/docs/examples/oidc-login/client/session.md +41 -149
- package/docs/examples/oidc-login/client/views.md +13 -58
- package/docs/examples/oidc-login/common/export.md +6 -26
- package/docs/examples/oidc-login/common/headers.md +42 -72
- package/docs/examples/oidc-login/common/keys.md +40 -164
- package/docs/examples/oidc-login/common/settings.md +24 -40
- package/docs/examples/oidc-login/common/views.md +7 -28
- package/docs/examples/oidc-login/dependencies/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.md +205 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +267 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.md +415 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.md +271 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +89 -0
- package/docs/examples/oidc-login/index.md +8 -7
- package/docs/examples/oidc-login/main-yaml.md +7 -0
- package/docs/examples/oidc-login/main.md +26 -153
- package/docs/examples/oidc-login/provider/authorization.md +232 -275
- package/docs/examples/oidc-login/provider/contracts.md +24 -146
- package/docs/examples/oidc-login/provider/credentials.md +24 -57
- package/docs/examples/oidc-login/provider/discovery.md +48 -122
- package/docs/examples/oidc-login/provider/export.md +11 -37
- package/docs/examples/oidc-login/provider/token.md +159 -237
- package/docs/examples/oidc-login/provider/userinfo.md +47 -102
- package/docs/examples/oidc-login/provider/views.md +13 -53
- package/docs/examples/ownership/counter.md +17 -63
- package/docs/examples/ownership/index.md +6 -5
- package/docs/examples/ownership/main.md +7 -30
- package/docs/examples/ownership-transfer/dependencies/august/0.20.1/io/contracts.md +178 -0
- package/docs/examples/ownership-transfer/index.md +6 -5
- package/docs/examples/ownership-transfer/main.md +10 -52
- package/docs/examples/ownership-transfer/resource.md +15 -67
- package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +12 -50
- package/docs/examples/packages-app/index.md +7 -6
- package/docs/examples/packages-app/main.md +7 -25
- package/docs/examples/packages-math/aug-package-json.md +1 -1
- package/docs/examples/packages-math/index.md +7 -6
- package/docs/examples/packages-math/src/arithmetic.md +12 -50
- package/docs/examples/packages-math/src/export.md +4 -12
- package/docs/examples/startup-benchmark/index.md +6 -5
- package/docs/examples/startup-benchmark/main.md +5 -17
- package/docs/examples/visibility/counter.md +19 -67
- package/docs/examples/visibility/index.md +6 -5
- package/docs/examples/visibility/main.md +7 -31
- package/docs/examples/weather-api/forecasts.md +168 -0
- package/docs/examples/weather-api/index.md +42 -0
- package/docs/examples/weather-api/main-yaml.md +21 -0
- package/docs/examples/weather-api/main.md +65 -0
- package/docs/examples.json +10 -0
- package/docs/getting-started.md +105 -2
- package/docs/grammar.md +6 -4
- package/docs/guides/change-a-module.md +64 -0
- package/docs/guides/index.md +27 -0
- package/docs/index.md +51 -29
- package/docs/language-conformance.md +1 -1
- package/docs/language-constructs.md +22 -22
- package/docs/language-design-audit.md +1 -1
- package/docs/learn/data-and-errors.md +77 -0
- package/docs/learn/index.md +30 -0
- package/docs/learn/modules-and-dependencies.md +73 -0
- package/docs/learn/state-and-tests.md +71 -0
- package/docs/learn/values-and-functions.md +62 -0
- package/docs/lesson-failures.json +8 -0
- package/docs/maintaining-docs.md +16 -4
- package/docs/packages.md +72 -126
- package/docs/performance.md +13 -41
- package/docs/production-readiness.md +5 -4
- package/docs/public/downloads/approved-design.zip +0 -0
- package/docs/public/downloads/benchmark.zip +0 -0
- package/docs/public/downloads/cli-args.zip +0 -0
- package/docs/public/downloads/collections-benchmark.zip +0 -0
- package/docs/public/downloads/collections.zip +0 -0
- package/docs/public/downloads/cpu-benchmark.zip +0 -0
- package/docs/public/downloads/developer-workflow.zip +0 -0
- package/docs/public/downloads/drop.zip +0 -0
- package/docs/public/downloads/errors.zip +0 -0
- package/docs/public/downloads/ffi.zip +0 -0
- package/docs/public/downloads/generic-di.zip +0 -0
- package/docs/public/downloads/generics.zip +0 -0
- package/docs/public/downloads/hello.zip +0 -0
- package/docs/public/downloads/http-benchmark.zip +0 -0
- package/docs/public/downloads/interceptors.zip +0 -0
- package/docs/public/downloads/json-benchmark.zip +0 -0
- package/docs/public/downloads/new-syntax.zip +0 -0
- package/docs/public/downloads/oidc-login.zip +0 -0
- package/docs/public/downloads/ownership-transfer.zip +0 -0
- package/docs/public/downloads/ownership.zip +0 -0
- package/docs/public/downloads/packages-app.zip +0 -0
- package/docs/public/downloads/packages-math.zip +0 -0
- package/docs/public/downloads/startup-benchmark.zip +0 -0
- package/docs/public/downloads/visibility.zip +0 -0
- package/docs/public/downloads/weather-api.zip +0 -0
- package/docs/reference.md +23 -17
- package/docs/releasing.md +29 -15
- package/docs/research/code-to-natural-language.md +108 -0
- package/docs/research/ecosystem-workflow.md +41 -0
- package/docs/research/wiki-editorial-design.md +71 -0
- package/docs/roadmap.md +1 -1
- package/docs/specifications.md +27 -11
- package/docs/testing.md +19 -5
- package/docs/tooling.md +25 -12
- package/docs/weather-api.md +65 -0
- package/docs/web.md +50 -18
- package/docs/writing-docs.md +49 -0
- package/examples/{hello/.aug-spec/august/0.19.0 → approved-design/.aug-spec/august/0.20.1}/io/contracts.aug +4 -3
- package/examples/approved-design/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/approved-design/.aug-spec/manifest.json +3 -3
- package/examples/approved-design/counters.aug +5 -4
- package/examples/approved-design/counters.aug.md +25 -132
- package/examples/approved-design/domain/app.aug +2 -1
- package/examples/approved-design/domain/app.aug.md +10 -80
- package/examples/approved-design/domain/export.aug +1 -0
- package/examples/approved-design/domain/export.aug.md +4 -20
- package/examples/approved-design/domain/models.aug +1 -0
- package/examples/approved-design/domain/models.aug.md +3 -25
- package/examples/approved-design/domain/numbers.aug +3 -2
- package/examples/approved-design/domain/numbers.aug.md +19 -116
- package/examples/approved-design/main.aug +1 -0
- package/examples/approved-design/main.aug.md +12 -95
- package/examples/benchmark/.aug-spec/manifest.json +1 -1
- package/examples/benchmark/main.aug +1 -0
- package/examples/benchmark/main.aug.md +6 -36
- package/examples/cli-args/.aug-spec/manifest.json +1 -1
- package/examples/cli-args/main.aug +1 -0
- package/examples/cli-args/main.aug.md +5 -32
- package/examples/collections/.aug-spec/manifest.json +1 -1
- package/examples/collections/main.aug +1 -0
- package/examples/collections/main.aug.md +6 -36
- package/examples/{generic-di/.aug-spec/august/0.19.0 → developer-workflow/.aug-spec/august/0.20.1}/io/contracts.aug +4 -3
- package/examples/developer-workflow/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
- package/examples/developer-workflow/calculator.aug +3 -2
- package/examples/developer-workflow/calculator.aug.md +28 -189
- package/examples/developer-workflow/logging/console.aug +2 -1
- package/examples/developer-workflow/logging/console.aug.md +7 -57
- package/examples/developer-workflow/logging/export.aug +1 -0
- package/examples/developer-workflow/logging/export.aug.md +3 -15
- package/examples/developer-workflow/logging/logger.aug +1 -0
- package/examples/developer-workflow/logging/logger.aug.md +6 -46
- package/examples/developer-workflow/main.aug +1 -0
- package/examples/developer-workflow/main.aug.md +10 -68
- package/examples/drop/.aug-spec/manifest.json +1 -1
- package/examples/drop/main.aug +1 -0
- package/examples/drop/main.aug.md +6 -28
- package/examples/drop/resource.aug +1 -0
- package/examples/drop/resource.aug.md +6 -34
- package/examples/errors/.aug-spec/manifest.json +1 -1
- package/examples/errors/errors.aug +2 -1
- package/examples/errors/errors.aug.md +4 -27
- package/examples/errors/main.aug +1 -0
- package/examples/errors/main.aug.md +6 -29
- package/examples/ffi/.aug-spec/manifest.json +1 -1
- package/examples/ffi/main.aug +1 -0
- package/examples/ffi/main.aug.md +5 -21
- package/examples/ffi/native.aug +2 -1
- package/examples/ffi/native.aug.md +5 -35
- package/examples/{approved-design/.aug-spec/august/0.19.0 → generic-di/.aug-spec/august/0.20.1}/io/contracts.aug +4 -3
- package/examples/generic-di/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/generic-di/.aug-spec/manifest.json +3 -3
- package/examples/generic-di/main.aug +1 -0
- package/examples/generic-di/main.aug.md +8 -40
- package/examples/generic-di/types.aug +3 -2
- package/examples/generic-di/types.aug.md +18 -97
- package/examples/generics/.aug-spec/manifest.json +1 -1
- package/examples/generics/main.aug +1 -0
- package/examples/generics/main.aug.md +9 -48
- package/examples/generics/types.aug +4 -3
- package/examples/generics/types.aug.md +18 -104
- package/examples/{developer-workflow/.aug-spec/august/0.19.0 → hello/.aug-spec/august/0.20.1}/io/contracts.aug +4 -3
- package/examples/hello/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/hello/.aug-spec/manifest.json +3 -3
- package/examples/hello/app/export.aug +1 -0
- package/examples/hello/app/export.aug.md +3 -13
- package/examples/hello/app/greeter.aug +2 -1
- package/examples/hello/app/greeter.aug.md +10 -94
- package/examples/hello/logging/console.aug +2 -1
- package/examples/hello/logging/console.aug.md +7 -55
- package/examples/hello/logging/export.aug +1 -0
- package/examples/hello/logging/export.aug.md +3 -15
- package/examples/hello/logging/logger.aug +1 -0
- package/examples/hello/logging/logger.aug.md +6 -48
- package/examples/hello/main.aug +1 -0
- package/examples/hello/main.aug.md +8 -40
- package/examples/interceptors/.aug-spec/august/0.20.1/io/contracts.aug +37 -0
- package/examples/interceptors/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/interceptors/.aug-spec/manifest.json +3 -3
- package/examples/interceptors/app.aug +3 -2
- package/examples/interceptors/app.aug.md +15 -141
- package/examples/interceptors/interceptors.aug +3 -2
- package/examples/interceptors/interceptors.aug.md +19 -152
- package/examples/interceptors/logging.aug +2 -1
- package/examples/interceptors/logging.aug.md +10 -79
- package/examples/interceptors/main.aug +1 -0
- package/examples/interceptors/main.aug.md +9 -66
- package/examples/new-syntax/.aug-spec/august/0.20.1/io/contracts.aug +37 -0
- package/examples/new-syntax/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/new-syntax/.aug-spec/manifest.json +3 -3
- package/examples/new-syntax/console.aug +2 -1
- package/examples/new-syntax/console.aug.md +7 -53
- package/examples/new-syntax/greeter.aug +2 -1
- package/examples/new-syntax/greeter.aug.md +10 -74
- package/examples/new-syntax/logger.aug +1 -0
- package/examples/new-syntax/logger.aug.md +6 -46
- package/examples/new-syntax/main.aug +1 -0
- package/examples/new-syntax/main.aug.md +9 -54
- package/examples/new-syntax/math.aug +2 -1
- package/examples/new-syntax/math.aug.md +3 -24
- package/examples/oidc-login/.aug-spec/manifest.json +13 -13
- package/examples/oidc-login/.aug-spec/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +17 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +125 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/contracts.aug +12 -11
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.aug.md +244 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/jose.aug +6 -5
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +30 -0
- package/examples/oidc-login/aug.lock.json +100 -0
- package/examples/oidc-login/client/contracts.aug +1 -0
- package/examples/oidc-login/client/contracts.aug.md +9 -66
- package/examples/oidc-login/client/endpoints.aug +6 -5
- package/examples/oidc-login/client/endpoints.aug.md +13 -145
- package/examples/oidc-login/client/export.aug +1 -0
- package/examples/oidc-login/client/export.aug.md +4 -24
- package/examples/oidc-login/client/login.aug +7 -6
- package/examples/oidc-login/client/login.aug.md +25 -303
- package/examples/oidc-login/client/logout.aug +5 -4
- package/examples/oidc-login/client/logout.aug.md +13 -135
- package/examples/oidc-login/client/protocol.aug +7 -6
- package/examples/oidc-login/client/protocol.aug.md +36 -283
- package/examples/oidc-login/client/session.aug +5 -4
- package/examples/oidc-login/client/session.aug.md +12 -139
- package/examples/oidc-login/client/views.aug +3 -2
- package/examples/oidc-login/client/views.aug.md +8 -57
- package/examples/oidc-login/common/export.aug +1 -0
- package/examples/oidc-login/common/export.aug.md +5 -27
- package/examples/oidc-login/common/headers.aug +4 -3
- package/examples/oidc-login/common/headers.aug.md +9 -67
- package/examples/oidc-login/common/keys.aug +6 -5
- package/examples/oidc-login/common/keys.aug.md +29 -165
- package/examples/oidc-login/common/settings.aug +2 -1
- package/examples/oidc-login/common/settings.aug.md +5 -39
- package/examples/oidc-login/common/views.aug +2 -1
- package/examples/oidc-login/common/views.aug.md +4 -28
- package/examples/oidc-login/main.aug +6 -16
- package/examples/oidc-login/main.aug.md +17 -146
- package/examples/oidc-login/main.yaml +7 -0
- package/examples/oidc-login/provider/authorization.aug +7 -6
- package/examples/oidc-login/provider/authorization.aug.md +23 -238
- package/examples/oidc-login/provider/contracts.aug +1 -0
- package/examples/oidc-login/provider/contracts.aug.md +23 -158
- package/examples/oidc-login/provider/credentials.aug +3 -2
- package/examples/oidc-login/provider/credentials.aug.md +9 -53
- package/examples/oidc-login/provider/discovery.aug +4 -3
- package/examples/oidc-login/provider/discovery.aug.md +11 -118
- package/examples/oidc-login/provider/export.aug +1 -0
- package/examples/oidc-login/provider/export.aug.md +6 -34
- package/examples/oidc-login/provider/token.aug +6 -5
- package/examples/oidc-login/provider/token.aug.md +16 -204
- package/examples/oidc-login/provider/userinfo.aug +4 -3
- package/examples/oidc-login/provider/userinfo.aug.md +10 -92
- package/examples/oidc-login/provider/views.aug +3 -2
- package/examples/oidc-login/provider/views.aug.md +8 -52
- package/examples/ownership/.aug-spec/manifest.json +1 -1
- package/examples/ownership/counter.aug +3 -2
- package/examples/ownership/counter.aug.md +12 -66
- package/examples/ownership/main.aug +1 -0
- package/examples/ownership/main.aug.md +6 -31
- package/examples/ownership-transfer/.aug-spec/august/0.20.1/io/contracts.aug +37 -0
- package/examples/ownership-transfer/.aug-spec/august/0.20.1/io/contracts.aug.md +82 -0
- package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
- package/examples/ownership-transfer/main.aug +1 -0
- package/examples/ownership-transfer/main.aug.md +9 -53
- package/examples/ownership-transfer/resource.aug +2 -1
- package/examples/ownership-transfer/resource.aug.md +12 -71
- package/examples/packages/app/.aug-spec/manifest.json +1 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +2 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +9 -51
- package/examples/packages/app/main.aug +1 -0
- package/examples/packages/app/main.aug.md +6 -26
- package/examples/packages/math/.aug-spec/manifest.json +1 -1
- package/examples/packages/math/aug-package.json +1 -1
- package/examples/packages/math/src/arithmetic.aug +2 -1
- package/examples/packages/math/src/arithmetic.aug.md +9 -51
- package/examples/packages/math/src/export.aug +1 -0
- package/examples/packages/math/src/export.aug.md +3 -13
- package/examples/visibility/.aug-spec/manifest.json +1 -1
- package/examples/visibility/counter.aug +4 -3
- package/examples/visibility/counter.aug.md +12 -68
- package/examples/visibility/main.aug +1 -0
- package/examples/visibility/main.aug.md +6 -32
- package/examples/weather-api/.aug-spec/manifest.json +8 -0
- package/examples/weather-api/AGENTS.md +17 -0
- package/examples/weather-api/README.md +19 -0
- package/examples/weather-api/forecasts.aug +47 -0
- package/examples/weather-api/forecasts.aug.md +32 -0
- package/examples/weather-api/main.aug +4 -0
- package/examples/weather-api/main.aug.md +15 -0
- package/examples/weather-api/main.yaml +5 -0
- package/examples/weather-api/weather.http +5 -0
- package/package.json +3 -4
- package/scripts/bootstrap-native.mjs +181 -106
- package/scripts/native-setup.mjs +98 -0
- package/scripts/native-toolchain.mjs +28 -0
- package/src/builtins.js +1 -1
- package/src/checker.js +259 -72
- package/src/cli.js +114 -20
- package/src/codegen.js +1 -1
- package/src/config.js +1 -1
- package/src/contracts.js +10 -0
- package/src/editor.js +71 -16
- package/src/fixes.js +90 -2
- package/src/formatter.js +19 -8
- package/src/git-packages.js +110 -0
- package/src/help.js +24 -23
- package/src/http-contracts.js +14 -0
- package/src/http-policies.js +5 -5
- package/src/libraries.js +1 -1
- package/src/lsp.js +14 -5
- package/src/native.js +19 -13
- package/src/navigation.js +4 -2
- package/src/openapi.js +5 -4
- package/src/package-locking.js +45 -0
- package/src/package-manager.js +251 -67
- package/src/parser.js +13 -5
- package/src/policies.js +3 -3
- package/src/project-init.js +78 -4
- package/src/project.js +9 -7
- package/src/semantic.js +46 -2
- package/src/snippets.js +59 -0
- package/src/spec-hints.js +56 -0
- package/src/spec-tree.js +241 -0
- package/src/spec.js +626 -303
- package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +0 -925
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +0 -434
- package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +0 -374
- package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +0 -150
- package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +0 -532
- package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +0 -791
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +0 -266
- package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +0 -55
- package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +0 -250
- package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +0 -96
- package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +0 -420
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/memory → packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/store.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/json → packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/web → packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/time → packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug · OpenID Connect login application"
|
|
3
|
+
generated: true
|
|
4
|
+
source: "examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug"
|
|
5
|
+
editLink: false
|
|
6
|
+
prev: false
|
|
7
|
+
next: false
|
|
8
|
+
outline: [2, 3]
|
|
9
|
+
search: false
|
|
10
|
+
pageClass: aug-example-page
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# `packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug`
|
|
14
|
+
|
|
15
|
+
[OpenID Connect login application](../../../../../index.md) · Dependency source and specification
|
|
16
|
+
|
|
17
|
+
This is the exact dependency version used by this example.
|
|
18
|
+
|
|
19
|
+
::::: example-compare
|
|
20
|
+
|
|
21
|
+
:::: example-code
|
|
22
|
+
|
|
23
|
+
## Code {#code}
|
|
24
|
+
|
|
25
|
+
::: code-group
|
|
26
|
+
|
|
27
|
+
```aug [Indentation]
|
|
28
|
+
// aug-spec: "jose.aug.md" explains this file. Read it before changes; refresh with aug spec.
|
|
29
|
+
import Crypto from contracts
|
|
30
|
+
import parse from "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0"
|
|
31
|
+
/** A failed JOSE validation reveals no unverified claims. */
|
|
32
|
+
JwtError() implements Error:
|
|
33
|
+
pass
|
|
34
|
+
/** This profile accepts only RS256, a configured key id, and an explicit token type. */
|
|
35
|
+
record JwtHeader(string alg, string kid, string typ)
|
|
36
|
+
/** Public signing-key metadata in RFC 7517 / RFC 7518 form. */
|
|
37
|
+
record RsaJwk(string kty, string kid, string alg, string use, string n, string e)
|
|
38
|
+
record RsaJwks(List<RsaJwk> keys)
|
|
39
|
+
/** Export public parameters. Private key material never enters the JSON document. */
|
|
40
|
+
rsaJwk(RsaPublicKey publicKey, string kid, resolve Crypto crypto):
|
|
41
|
+
(modulus, exponent) = crypto.exportRsa(publicKey)
|
|
42
|
+
return RsaJwk(
|
|
43
|
+
kty="RSA",
|
|
44
|
+
kid=kid,
|
|
45
|
+
alg="RS256",
|
|
46
|
+
use="sig",
|
|
47
|
+
n=modulus.base64url(),
|
|
48
|
+
e=exponent.base64url()
|
|
49
|
+
)
|
|
50
|
+
/** Import only an RSA signing key for RS256. The transport caller selects the trusted JWKS URL. */
|
|
51
|
+
importJwk(RsaJwk jwk, resolve Crypto crypto):
|
|
52
|
+
if jwk.kty != "RSA" or jwk.alg != "RS256" or jwk.use != "sig":
|
|
53
|
+
throw JwtError()
|
|
54
|
+
try:
|
|
55
|
+
modulus = crypto.decodeBase64url(input=jwk.n)
|
|
56
|
+
exponent = crypto.decodeBase64url(input=jwk.e)
|
|
57
|
+
return crypto.importRsa(modulus, exponent)
|
|
58
|
+
catch CryptoError error:
|
|
59
|
+
throw JwtError()
|
|
60
|
+
/** Sign immutable JSON with an explicit key id and token type. Claims are validated by the protocol that consumes the token. */
|
|
61
|
+
signJwt(RsaPrivateKey key, Json claims, string kid, string tokenType, resolve Crypto crypto):
|
|
62
|
+
try:
|
|
63
|
+
header = Json(value=JwtHeader(alg="RS256", kid=kid, typ=tokenType)).stringify()
|
|
64
|
+
payload = claims.stringify()
|
|
65
|
+
signing = header.bytes().base64url() + "." + payload.bytes().base64url()
|
|
66
|
+
signature = crypto.signRsa(key=key, input=signing.bytes())
|
|
67
|
+
return signing + "." + signature.base64url()
|
|
68
|
+
catch CryptoError error:
|
|
69
|
+
throw JwtError()
|
|
70
|
+
catch JsonError error:
|
|
71
|
+
throw JwtError()
|
|
72
|
+
/** Verify the signature and configured algorithm, key id, and type before exposing the JSON payload. Never follows token-supplied URLs. */
|
|
73
|
+
verifyJwt(string token, RsaPublicKey publicKey, string kid, string tokenType, resolve Crypto crypto):
|
|
74
|
+
if token.length() > 16384:
|
|
75
|
+
throw JwtError()
|
|
76
|
+
parts = token.split(separator=".")
|
|
77
|
+
if parts.length() != 3:
|
|
78
|
+
throw JwtError()
|
|
79
|
+
try:
|
|
80
|
+
first = parts.get(index=0)
|
|
81
|
+
second = parts.get(index=1)
|
|
82
|
+
third = parts.get(index=2)
|
|
83
|
+
header = parse(input=crypto.decodeBase64url(input=first).text()).decode<JwtHeader>()
|
|
84
|
+
if header.alg != "RS256" or header.kid != kid or header.typ != tokenType:
|
|
85
|
+
throw JwtError()
|
|
86
|
+
signature = crypto.decodeBase64url(input=third)
|
|
87
|
+
if not crypto.verifyRsa(
|
|
88
|
+
publicKey=publicKey,
|
|
89
|
+
input=(first + "." + second).bytes(),
|
|
90
|
+
signature=signature
|
|
91
|
+
):
|
|
92
|
+
throw JwtError()
|
|
93
|
+
return parse(input=crypto.decodeBase64url(input=second).text())
|
|
94
|
+
catch CryptoError error:
|
|
95
|
+
throw JwtError()
|
|
96
|
+
catch ConversionError error:
|
|
97
|
+
throw JwtError()
|
|
98
|
+
catch JsonError error:
|
|
99
|
+
throw JwtError()
|
|
100
|
+
catch IndexError error:
|
|
101
|
+
throw JwtError()
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```aug [Braces]
|
|
105
|
+
// aug-spec: "jose.aug.md" explains this file. Read it before changes; refresh with aug spec.
|
|
106
|
+
import Crypto from contracts
|
|
107
|
+
import parse from "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0"
|
|
108
|
+
/** A failed JOSE validation reveals no unverified claims. */
|
|
109
|
+
JwtError() implements Error {
|
|
110
|
+
pass
|
|
111
|
+
}
|
|
112
|
+
/** This profile accepts only RS256, a configured key id, and an explicit token type. */
|
|
113
|
+
record JwtHeader(string alg, string kid, string typ)
|
|
114
|
+
/** Public signing-key metadata in RFC 7517 / RFC 7518 form. */
|
|
115
|
+
record RsaJwk(string kty, string kid, string alg, string use, string n, string e)
|
|
116
|
+
record RsaJwks(List<RsaJwk> keys)
|
|
117
|
+
/** Export public parameters. Private key material never enters the JSON document. */
|
|
118
|
+
rsaJwk(RsaPublicKey publicKey, string kid, resolve Crypto crypto) {
|
|
119
|
+
(modulus, exponent) = crypto.exportRsa(publicKey)
|
|
120
|
+
return RsaJwk(
|
|
121
|
+
kty="RSA",
|
|
122
|
+
kid=kid,
|
|
123
|
+
alg="RS256",
|
|
124
|
+
use="sig",
|
|
125
|
+
n=modulus.base64url(),
|
|
126
|
+
e=exponent.base64url()
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
/** Import only an RSA signing key for RS256. The transport caller selects the trusted JWKS URL. */
|
|
130
|
+
importJwk(RsaJwk jwk, resolve Crypto crypto) {
|
|
131
|
+
if jwk.kty != "RSA" or jwk.alg != "RS256" or jwk.use != "sig" {
|
|
132
|
+
throw JwtError()
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
modulus = crypto.decodeBase64url(input=jwk.n)
|
|
136
|
+
exponent = crypto.decodeBase64url(input=jwk.e)
|
|
137
|
+
return crypto.importRsa(modulus, exponent)
|
|
138
|
+
}
|
|
139
|
+
catch CryptoError error {
|
|
140
|
+
throw JwtError()
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Sign immutable JSON with an explicit key id and token type. Claims are validated by the protocol that consumes the token. */
|
|
144
|
+
signJwt(RsaPrivateKey key, Json claims, string kid, string tokenType, resolve Crypto crypto) {
|
|
145
|
+
try {
|
|
146
|
+
header = Json(value=JwtHeader(alg="RS256", kid=kid, typ=tokenType)).stringify()
|
|
147
|
+
payload = claims.stringify()
|
|
148
|
+
signing = header.bytes().base64url() + "." + payload.bytes().base64url()
|
|
149
|
+
signature = crypto.signRsa(key=key, input=signing.bytes())
|
|
150
|
+
return signing + "." + signature.base64url()
|
|
151
|
+
}
|
|
152
|
+
catch CryptoError error {
|
|
153
|
+
throw JwtError()
|
|
154
|
+
}
|
|
155
|
+
catch JsonError error {
|
|
156
|
+
throw JwtError()
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Verify the signature and configured algorithm, key id, and type before exposing the JSON payload. Never follows token-supplied URLs. */
|
|
160
|
+
verifyJwt(string token, RsaPublicKey publicKey, string kid, string tokenType, resolve Crypto crypto) {
|
|
161
|
+
if token.length() > 16384 {
|
|
162
|
+
throw JwtError()
|
|
163
|
+
}
|
|
164
|
+
parts = token.split(separator=".")
|
|
165
|
+
if parts.length() != 3 {
|
|
166
|
+
throw JwtError()
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
first = parts.get(index=0)
|
|
170
|
+
second = parts.get(index=1)
|
|
171
|
+
third = parts.get(index=2)
|
|
172
|
+
header = parse(input=crypto.decodeBase64url(input=first).text()).decode<JwtHeader>()
|
|
173
|
+
if header.alg != "RS256" or header.kid != kid or header.typ != tokenType {
|
|
174
|
+
throw JwtError()
|
|
175
|
+
}
|
|
176
|
+
signature = crypto.decodeBase64url(input=third)
|
|
177
|
+
if not crypto.verifyRsa(
|
|
178
|
+
publicKey=publicKey,
|
|
179
|
+
input=(first + "." + second).bytes(),
|
|
180
|
+
signature=signature
|
|
181
|
+
) {
|
|
182
|
+
throw JwtError()
|
|
183
|
+
}
|
|
184
|
+
return parse(input=crypto.decodeBase64url(input=second).text())
|
|
185
|
+
}
|
|
186
|
+
catch CryptoError error {
|
|
187
|
+
throw JwtError()
|
|
188
|
+
}
|
|
189
|
+
catch ConversionError error {
|
|
190
|
+
throw JwtError()
|
|
191
|
+
}
|
|
192
|
+
catch JsonError error {
|
|
193
|
+
throw JwtError()
|
|
194
|
+
}
|
|
195
|
+
catch IndexError error {
|
|
196
|
+
throw JwtError()
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
:::
|
|
202
|
+
|
|
203
|
+
::::
|
|
204
|
+
|
|
205
|
+
:::: example-spec
|
|
206
|
+
|
|
207
|
+
## Compiled specification {#specification}
|
|
208
|
+
|
|
209
|
+
### `JwtError` · class · [source](jose.md#code) {#symbol-JwtError}
|
|
210
|
+
|
|
211
|
+
A failed JOSE validation reveals no unverified claims. It implements `Error`.
|
|
212
|
+
|
|
213
|
+
### `JwtHeader` · immutable record · [source](jose.md#code) {#symbol-JwtHeader}
|
|
214
|
+
|
|
215
|
+
This profile accepts only RS256, a configured key id, and an explicit token type. It takes `alg`, `kid`, and `typ` as strings, kept read-only.
|
|
216
|
+
|
|
217
|
+
### `RsaJwk` · immutable record · [source](jose.md#code) {#symbol-RsaJwk}
|
|
218
|
+
|
|
219
|
+
Public signing-key metadata in RFC 7517 / RFC 7518 form. It takes `kty`, `kid`, `alg`, `use`, `n`, and `e` as strings, kept read-only.
|
|
220
|
+
|
|
221
|
+
### `RsaJwks` · immutable record · [source](jose.md#code) {#symbol-RsaJwks}
|
|
222
|
+
|
|
223
|
+
It takes `keys` as `List<RsaJwk>`, kept read-only.
|
|
224
|
+
|
|
225
|
+
### `rsaJwk` · [source](jose.md#code) {#symbol-rsaJwk}
|
|
226
|
+
|
|
227
|
+
Export public parameters. Private key material never enters the JSON document. It takes `publicKey` as `RsaPublicKey` and `kid` as a string. It gets `crypto` ([`Crypto`](contracts.md#symbol-Crypto)) from dependency injection.
|
|
228
|
+
|
|
229
|
+
Failures can raise `CryptoError`. It splits [`crypto.exportRsa`](contracts.md#symbol-Crypto.exportRsa) with `publicKey` into `modulus` and `exponent` in order. It returns a [`RsaJwk`](jose.md#symbol-RsaJwk) with `kty` `"RSA"`, `kid`, `alg` `"RS256"`, `use` `"sig"`, `n` from the URL-safe base64 encoding of `modulus`, and `e` from the URL-safe base64 encoding of `exponent`.
|
|
230
|
+
|
|
231
|
+
### `importJwk` · [source](jose.md#code) {#symbol-importJwk}
|
|
232
|
+
|
|
233
|
+
Import only an RSA signing key for RS256. The transport caller selects the trusted JWKS URL. It takes `jwk` as [`RsaJwk`](jose.md#symbol-RsaJwk). It gets `crypto` ([`Crypto`](contracts.md#symbol-Crypto)) from dependency injection.
|
|
234
|
+
|
|
235
|
+
Failures can raise [`JwtError`](jose.md#symbol-JwtError). It checks that `jwk.kty` equals `"RSA"` and `jwk.alg` equals `"RS256"` and `jwk.use` equals `"sig"`. It raises a [`JwtError`](jose.md#symbol-JwtError) at the first failed check.
|
|
236
|
+
|
|
237
|
+
It tries to set `modulus` to [`crypto.decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url) with `input` from `jwk.n`, then set `exponent` to [`crypto.decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url) with `input` from `jwk.e`, then return [`crypto.importRsa`](contracts.md#symbol-Crypto.importRsa) with `modulus` and `exponent`. If this work raises `CryptoError`, it raises a [`JwtError`](jose.md#symbol-JwtError).
|
|
238
|
+
|
|
239
|
+
### `signJwt` · [source](jose.md#code) {#symbol-signJwt}
|
|
240
|
+
|
|
241
|
+
Sign immutable JSON with an explicit key id and token type. Claims are validated by the protocol that consumes the token. It takes `key` as `RsaPrivateKey`, `claims` as `Json`, and `kid` and `tokenType` as strings. It gets `crypto` ([`Crypto`](contracts.md#symbol-Crypto)) from dependency injection.
|
|
242
|
+
|
|
243
|
+
Failures can raise [`JwtError`](jose.md#symbol-JwtError).
|
|
244
|
+
|
|
245
|
+
It sets `header` to `stringify` on a `Json` with `value` from a [`JwtHeader`](jose.md#symbol-JwtHeader) with `alg` `"RS256"`, `kid`, and `typ` from `tokenType`. It sets `payload` to `claims.stringify`. It builds `signing` as the text `{the URL-safe base64 encoding of the UTF-8 bytes of header}.{the URL-safe base64 encoding of the UTF-8 bytes of payload}`. It sets `signature` to [`crypto.signRsa`](contracts.md#symbol-Crypto.signRsa) with `key` and `input` from the UTF-8 bytes of `signing`.
|
|
246
|
+
|
|
247
|
+
It returns the text `{signing}.{the URL-safe base64 encoding of signature}`. If this work raises `CryptoError`, it raises a [`JwtError`](jose.md#symbol-JwtError). If this work raises `JsonError`, it raises a [`JwtError`](jose.md#symbol-JwtError).
|
|
248
|
+
|
|
249
|
+
### `verifyJwt` · [source](jose.md#code) {#symbol-verifyJwt}
|
|
250
|
+
|
|
251
|
+
Verify the signature and configured algorithm, key id, and type before exposing the JSON payload. Never follows token-supplied URLs. It takes `token` as a string, `publicKey` as `RsaPublicKey`, and `kid` and `tokenType` as strings. It gets `crypto` ([`Crypto`](contracts.md#symbol-Crypto)) from dependency injection.
|
|
252
|
+
|
|
253
|
+
Failures can raise [`JwtError`](jose.md#symbol-JwtError). It checks that the byte length of `token` is at most `16384`. It raises a [`JwtError`](jose.md#symbol-JwtError) at the first failed check. It sets `parts` to `token.split` with `separator` `"."`.
|
|
254
|
+
|
|
255
|
+
It checks that the number of elements in `parts` equals `3`. It raises a [`JwtError`](jose.md#symbol-JwtError) at the first failed check. It sets `first` to the item at index `0` in `parts`. It sets `second` to the item at index `1` in `parts`.
|
|
256
|
+
|
|
257
|
+
It sets `third` to the item at index `2` in `parts`. It sets `header` to `decode` on [`parse`](../../url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md#symbol-parse) with `input` from `text` on [`crypto.decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url) with `input` from `first` for [`JwtHeader`](jose.md#symbol-JwtHeader). It checks that `header.alg` equals `"RS256"` and `header.kid` equals `kid` and `header.typ` equals `tokenType`. It raises a [`JwtError`](jose.md#symbol-JwtError) at the first failed check.
|
|
258
|
+
|
|
259
|
+
It sets `signature` to [`crypto.decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url) with `input` from `third`. It checks that [`crypto.verifyRsa`](contracts.md#symbol-Crypto.verifyRsa) with `publicKey`, `input` from the UTF-8 bytes of the text `{first}.{second}`, and `signature` returns true. It raises a [`JwtError`](jose.md#symbol-JwtError) at the first failed check. It returns [`parse`](../../url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md#symbol-parse) with `input` from `text` on [`crypto.decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url) with `input` from `second`.
|
|
260
|
+
|
|
261
|
+
If this work raises `CryptoError`, it raises a [`JwtError`](jose.md#symbol-JwtError). If this work raises `ConversionError`, it raises a [`JwtError`](jose.md#symbol-JwtError). If this work raises `JsonError`, it raises a [`JwtError`](jose.md#symbol-JwtError). If this work raises `IndexError`, it raises a [`JwtError`](jose.md#symbol-JwtError).
|
|
262
|
+
|
|
263
|
+
### Dependencies
|
|
264
|
+
|
|
265
|
+
It uses [`parse`](../../url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md#symbol-parse) from `https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0`. It uses [`Crypto`](contracts.md#symbol-Crypto) ([`decodeBase64url`](contracts.md#symbol-Crypto.decodeBase64url), [`exportRsa`](contracts.md#symbol-Crypto.exportRsa), [`importRsa`](contracts.md#symbol-Crypto.importRsa), [`signRsa`](contracts.md#symbol-Crypto.signRsa), and [`verifyRsa`](contracts.md#symbol-Crypto.verifyRsa)) from `contracts`.
|
|
266
|
+
|
|
267
|
+
Built-in operations follow the [language reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
268
|
+
|
|
269
|
+
::::
|
|
270
|
+
|
|
271
|
+
:::::
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug · OpenID Connect login application"
|
|
3
|
+
generated: true
|
|
4
|
+
source: "examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug"
|
|
5
|
+
editLink: false
|
|
6
|
+
prev: false
|
|
7
|
+
next: false
|
|
8
|
+
outline: [2, 3]
|
|
9
|
+
search: false
|
|
10
|
+
pageClass: aug-example-page
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# `packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug`
|
|
14
|
+
|
|
15
|
+
[OpenID Connect login application](../../../../../index.md) · Dependency source and specification
|
|
16
|
+
|
|
17
|
+
This is the exact dependency version used by this example.
|
|
18
|
+
|
|
19
|
+
::::: example-compare
|
|
20
|
+
|
|
21
|
+
:::: example-code
|
|
22
|
+
|
|
23
|
+
## Code {#code}
|
|
24
|
+
|
|
25
|
+
::: code-group
|
|
26
|
+
|
|
27
|
+
```aug [Indentation]
|
|
28
|
+
/** An explicit clock dependency makes time-based behavior replaceable in tests. */
|
|
29
|
+
capability Clock:
|
|
30
|
+
/** Read whole Unix seconds in UTC. */
|
|
31
|
+
now() returns int uses Clock.now unless TimeError
|
|
32
|
+
extern C value _aug_time_now() returns int uses Clock.now unless TimeError
|
|
33
|
+
/** Operating-system wall clock. */
|
|
34
|
+
SystemClock() implements Clock:
|
|
35
|
+
now() returns int unless TimeError:
|
|
36
|
+
unsafe:
|
|
37
|
+
return _aug_time_now()
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```aug [Braces]
|
|
41
|
+
/** An explicit clock dependency makes time-based behavior replaceable in tests. */
|
|
42
|
+
capability Clock {
|
|
43
|
+
/** Read whole Unix seconds in UTC. */
|
|
44
|
+
now() returns int uses Clock.now unless TimeError
|
|
45
|
+
}
|
|
46
|
+
extern C value _aug_time_now() returns int uses Clock.now unless TimeError
|
|
47
|
+
/** Operating-system wall clock. */
|
|
48
|
+
SystemClock() implements Clock {
|
|
49
|
+
now() returns int unless TimeError {
|
|
50
|
+
unsafe {
|
|
51
|
+
return _aug_time_now()
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
:::
|
|
58
|
+
|
|
59
|
+
::::
|
|
60
|
+
|
|
61
|
+
:::: example-spec
|
|
62
|
+
|
|
63
|
+
## Compiled specification {#specification}
|
|
64
|
+
|
|
65
|
+
### `Clock` · capability interface · [source](contracts.md#code) {#symbol-Clock}
|
|
66
|
+
|
|
67
|
+
An explicit clock dependency makes time-based behavior replaceable in tests.
|
|
68
|
+
|
|
69
|
+
#### `Clock.now` · [source](contracts.md#code) {#symbol-Clock.now}
|
|
70
|
+
|
|
71
|
+
Read whole Unix seconds in UTC. It returns `int`. It can call [`Clock.now`](contracts.md#symbol-Clock.now). Failures can raise `TimeError`.
|
|
72
|
+
|
|
73
|
+
### `SystemClock` · class · [source](contracts.md#code) {#symbol-SystemClock}
|
|
74
|
+
|
|
75
|
+
Operating-system wall clock. It implements [`Clock`](contracts.md#symbol-Clock).
|
|
76
|
+
|
|
77
|
+
#### `SystemClock.now` · [source](contracts.md#code) {#symbol-SystemClock.now}
|
|
78
|
+
|
|
79
|
+
Read whole Unix seconds in UTC. Failures can raise `TimeError`. Within an unsafe block, it returns [`_aug_time_now`](contracts.md#symbol-_aug_time_now). Native operations must satisfy their declared C contracts.
|
|
80
|
+
|
|
81
|
+
### `_aug_time_now` · [source](contracts.md#code) {#symbol-_aug_time_now}
|
|
82
|
+
|
|
83
|
+
It is private to its defining scope. It returns `int`. It can call [`Clock.now`](contracts.md#symbol-Clock.now). Failures can raise `TimeError`.
|
|
84
|
+
|
|
85
|
+
Native C implementation; only its declared contract is visible here.
|
|
86
|
+
|
|
87
|
+
::::
|
|
88
|
+
|
|
89
|
+
:::::
|
|
@@ -10,9 +10,9 @@ outline: [2, 3]
|
|
|
10
10
|
|
|
11
11
|
# OpenID Connect login application
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
One executable hosts a login page, an OpenID Connect provider and client, session JWTs, and logout. Accounts, keys, and sessions are held in memory for this development demonstration.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Open a file to read its source beside the explanation produced by `aug spec`. **Indentation** and **Braces** display the same checked program; your choice carries across file pages.
|
|
16
16
|
|
|
17
17
|
## Project files
|
|
18
18
|
|
|
@@ -43,13 +43,14 @@ Read a file below to see its highlighted source and the Markdown produced by `au
|
|
|
43
43
|
|
|
44
44
|
## Try this project
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
[Download this project](/downloads/oidc-login.zip), then extract the archive in an empty working folder. It contains the checked source, configuration, and generated specs. [Install August](../../getting-started.md) once, then run these commands. Native libraries are prepared automatically when needed:
|
|
47
47
|
|
|
48
48
|
```sh
|
|
49
|
-
|
|
50
|
-
aug
|
|
51
|
-
aug
|
|
52
|
-
aug
|
|
49
|
+
cd oidc-login
|
|
50
|
+
aug check .
|
|
51
|
+
aug spec .
|
|
52
|
+
aug test .
|
|
53
|
+
aug run .
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
Open `http://127.0.0.1:8787` and sign in with **ada** / **august-demo**. This development example keeps accounts, signing keys, and sessions in process memory. See [web and crypto](../../web.md) and [the remaining library gaps](../../web-library-gaps.md).
|
|
@@ -25,4 +25,11 @@ openapi:
|
|
|
25
25
|
path: /openapi.json
|
|
26
26
|
docs: /docs
|
|
27
27
|
output: .aug-build/openapi.json
|
|
28
|
+
|
|
29
|
+
packages:
|
|
30
|
+
crypto: "https://github.com/GreenPandaStudios/augscript/src/stdlib/crypto#b14a0f9aa41f1ce58bd51133bcdc424033e40d40"
|
|
31
|
+
json: "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0"
|
|
32
|
+
memory: "https://github.com/GreenPandaStudios/augscript/src/stdlib/memory#v0.19.0"
|
|
33
|
+
time: "https://github.com/GreenPandaStudios/augscript/src/stdlib/time#v0.19.0"
|
|
34
|
+
web: "https://github.com/GreenPandaStudios/augscript/src/stdlib/web#v0.19.0"
|
|
28
35
|
```
|