@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,244 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `contracts.aug`
|
|
4
|
+
|
|
5
|
+
<a id="symbol-Crypto"></a>
|
|
6
|
+
## `Crypto` · capability interface · [source](contracts.aug#L4)
|
|
7
|
+
|
|
8
|
+
Explicit permission for native cryptographic operations. Keys and bytes are immutable.
|
|
9
|
+
|
|
10
|
+
<a id="symbol-Crypto.random"></a>
|
|
11
|
+
### `Crypto.random` · [source](contracts.aug#L6)
|
|
12
|
+
|
|
13
|
+
Generate unpredictable bytes with the operating-system-backed GnuTLS RNG. It takes `size` as an integer.
|
|
14
|
+
|
|
15
|
+
It returns `Bytes`. It can call [`Crypto.random`](contracts.aug.md#symbol-Crypto.random). Failures can raise `CryptoError`.
|
|
16
|
+
|
|
17
|
+
<a id="symbol-Crypto.sha256"></a>
|
|
18
|
+
### `Crypto.sha256` · [source](contracts.aug#L8)
|
|
19
|
+
|
|
20
|
+
Hash the complete input using SHA-256. It takes `input` as `Bytes`.
|
|
21
|
+
|
|
22
|
+
It returns `Bytes`. It can call [`Crypto.sha256`](contracts.aug.md#symbol-Crypto.sha256). Failures can raise `CryptoError`.
|
|
23
|
+
|
|
24
|
+
<a id="symbol-Crypto.generateRsa"></a>
|
|
25
|
+
### `Crypto.generateRsa` · [source](contracts.aug#L10)
|
|
26
|
+
|
|
27
|
+
Create a fresh 3072-bit RSA private key. Private material is opaque and scrubbed on reclamation.
|
|
28
|
+
|
|
29
|
+
It returns `RsaPrivateKey`. It can call [`Crypto.generateRsa`](contracts.aug.md#symbol-Crypto.generateRsa). Failures can raise `CryptoError`.
|
|
30
|
+
|
|
31
|
+
<a id="symbol-Crypto.publicRsa"></a>
|
|
32
|
+
### `Crypto.publicRsa` · [source](contracts.aug#L12)
|
|
33
|
+
|
|
34
|
+
Export the corresponding public key as an opaque immutable value. It takes `key` as `RsaPrivateKey`.
|
|
35
|
+
|
|
36
|
+
It returns `RsaPublicKey`. It can call [`Crypto.publicRsa`](contracts.aug.md#symbol-Crypto.publicRsa). Failures can raise `CryptoError`.
|
|
37
|
+
|
|
38
|
+
<a id="symbol-Crypto.signRsa"></a>
|
|
39
|
+
### `Crypto.signRsa` · [source](contracts.aug#L14)
|
|
40
|
+
|
|
41
|
+
Sign bytes using RSASSA-PKCS1-v1_5 with SHA-256 (JOSE RS256). It takes `key` as `RsaPrivateKey` and `input` as `Bytes`.
|
|
42
|
+
|
|
43
|
+
It returns `Bytes`. It can call [`Crypto.signRsa`](contracts.aug.md#symbol-Crypto.signRsa). Failures can raise `CryptoError`.
|
|
44
|
+
|
|
45
|
+
<a id="symbol-Crypto.verifyRsa"></a>
|
|
46
|
+
### `Crypto.verifyRsa` · [source](contracts.aug#L16)
|
|
47
|
+
|
|
48
|
+
Verify only RS256. Invalid signatures return false; invalid keys raise CryptoError. It takes `publicKey` as `RsaPublicKey` and `input` and `signature` as `Bytes`.
|
|
49
|
+
|
|
50
|
+
It returns `bool`. It can call [`Crypto.verifyRsa`](contracts.aug.md#symbol-Crypto.verifyRsa). Failures can raise `CryptoError`.
|
|
51
|
+
|
|
52
|
+
<a id="symbol-Crypto.decodeBase64url"></a>
|
|
53
|
+
### `Crypto.decodeBase64url` · [source](contracts.aug#L18)
|
|
54
|
+
|
|
55
|
+
Decode canonical unpadded URL-safe base64, rejecting invalid characters and unused bits. It takes `input` as a string.
|
|
56
|
+
|
|
57
|
+
It returns `Bytes`. It can call [`Crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url). Failures can raise `CryptoError`.
|
|
58
|
+
|
|
59
|
+
<a id="symbol-Crypto.equal"></a>
|
|
60
|
+
### `Crypto.equal` · [source](contracts.aug#L20)
|
|
61
|
+
|
|
62
|
+
Compare bytes without early exit on their contents. Length remains observable. It takes `left` and `right` as `Bytes`.
|
|
63
|
+
|
|
64
|
+
It returns `bool`. It can call [`Crypto.equal`](contracts.aug.md#symbol-Crypto.equal).
|
|
65
|
+
|
|
66
|
+
<a id="symbol-Crypto.exportRsa"></a>
|
|
67
|
+
### `Crypto.exportRsa` · [source](contracts.aug#L22)
|
|
68
|
+
|
|
69
|
+
Export unsigned big-endian modulus and exponent for an RSA JWK. It takes `publicKey` as `RsaPublicKey`.
|
|
70
|
+
|
|
71
|
+
It returns `Tuple<Bytes,Bytes>`. It can call [`Crypto.exportRsa`](contracts.aug.md#symbol-Crypto.exportRsa). Failures can raise `CryptoError`.
|
|
72
|
+
|
|
73
|
+
<a id="symbol-Crypto.importRsa"></a>
|
|
74
|
+
### `Crypto.importRsa` · [source](contracts.aug#L24)
|
|
75
|
+
|
|
76
|
+
Import canonical public RSA parameters. Keys must have 2048 to 8192 bits. It takes `modulus` and `exponent` as `Bytes`.
|
|
77
|
+
|
|
78
|
+
It returns `RsaPublicKey`. It can call [`Crypto.importRsa`](contracts.aug.md#symbol-Crypto.importRsa). Failures can raise `CryptoError`.
|
|
79
|
+
|
|
80
|
+
<a id="symbol-Crypto.passwordHash"></a>
|
|
81
|
+
### `Crypto.passwordHash` · [source](contracts.aug#L26)
|
|
82
|
+
|
|
83
|
+
PBKDF2-HMAC-SHA256, producing 32 bytes. Use a unique 16–64 byte salt; supported work factors are 100,000–2,000,000. It takes `password` and `salt` as `Bytes` and `iterations` as an integer.
|
|
84
|
+
|
|
85
|
+
It returns `Bytes`. It can call [`Crypto.passwordHash`](contracts.aug.md#symbol-Crypto.passwordHash). Failures can raise `CryptoError`.
|
|
86
|
+
|
|
87
|
+
<a id="symbol-GnuTlsCrypto"></a>
|
|
88
|
+
## `GnuTlsCrypto` · class · [source](contracts.aug#L41)
|
|
89
|
+
|
|
90
|
+
GnuTLS-backed capability adapter. Its constructor performs no I/O or key generation. It implements [`Crypto`](contracts.aug.md#symbol-Crypto).
|
|
91
|
+
|
|
92
|
+
<a id="symbol-GnuTlsCrypto.random"></a>
|
|
93
|
+
### `GnuTlsCrypto.random` · [source](contracts.aug#L42)
|
|
94
|
+
|
|
95
|
+
Generate unpredictable bytes with the operating-system-backed GnuTLS RNG. It takes `size` as an integer. Failures can raise `CryptoError`.
|
|
96
|
+
|
|
97
|
+
Within an unsafe block, it returns [`_aug_crypto_random`](contracts.aug.md#symbol-_aug_crypto_random) with `size`. Native operations must satisfy their declared C contracts.
|
|
98
|
+
|
|
99
|
+
<a id="symbol-GnuTlsCrypto.sha256"></a>
|
|
100
|
+
### `GnuTlsCrypto.sha256` · [source](contracts.aug#L45)
|
|
101
|
+
|
|
102
|
+
Hash the complete input using SHA-256. It takes `input` as `Bytes`. Failures can raise `CryptoError`.
|
|
103
|
+
|
|
104
|
+
Within an unsafe block, it returns [`_aug_crypto_sha256`](contracts.aug.md#symbol-_aug_crypto_sha256) with `input`. Native operations must satisfy their declared C contracts.
|
|
105
|
+
|
|
106
|
+
<a id="symbol-GnuTlsCrypto.generateRsa"></a>
|
|
107
|
+
### `GnuTlsCrypto.generateRsa` · [source](contracts.aug#L48)
|
|
108
|
+
|
|
109
|
+
Create a fresh 3072-bit RSA private key. Private material is opaque and scrubbed on reclamation. Failures can raise `CryptoError`.
|
|
110
|
+
|
|
111
|
+
Within an unsafe block, it returns [`_aug_crypto_generate_rsa`](contracts.aug.md#symbol-_aug_crypto_generate_rsa). Native operations must satisfy their declared C contracts.
|
|
112
|
+
|
|
113
|
+
<a id="symbol-GnuTlsCrypto.publicRsa"></a>
|
|
114
|
+
### `GnuTlsCrypto.publicRsa` · [source](contracts.aug#L51)
|
|
115
|
+
|
|
116
|
+
Export the corresponding public key as an opaque immutable value. It takes `key` as `RsaPrivateKey`. Failures can raise `CryptoError`.
|
|
117
|
+
|
|
118
|
+
Within an unsafe block, it returns [`_aug_crypto_public_rsa`](contracts.aug.md#symbol-_aug_crypto_public_rsa) with `key`. Native operations must satisfy their declared C contracts.
|
|
119
|
+
|
|
120
|
+
<a id="symbol-GnuTlsCrypto.signRsa"></a>
|
|
121
|
+
### `GnuTlsCrypto.signRsa` · [source](contracts.aug#L54)
|
|
122
|
+
|
|
123
|
+
Sign bytes using RSASSA-PKCS1-v1_5 with SHA-256 (JOSE RS256). It takes `key` as `RsaPrivateKey` and `input` as `Bytes`. Failures can raise `CryptoError`.
|
|
124
|
+
|
|
125
|
+
Within an unsafe block, it returns [`_aug_crypto_sign_rsa`](contracts.aug.md#symbol-_aug_crypto_sign_rsa) with `key` and `input`. Native operations must satisfy their declared C contracts.
|
|
126
|
+
|
|
127
|
+
<a id="symbol-GnuTlsCrypto.verifyRsa"></a>
|
|
128
|
+
### `GnuTlsCrypto.verifyRsa` · [source](contracts.aug#L57)
|
|
129
|
+
|
|
130
|
+
Verify only RS256. Invalid signatures return false; invalid keys raise CryptoError. It takes `publicKey` as `RsaPublicKey` and `input` and `signature` as `Bytes`. Failures can raise `CryptoError`.
|
|
131
|
+
|
|
132
|
+
Within an unsafe block, it returns [`_aug_crypto_verify_rsa`](contracts.aug.md#symbol-_aug_crypto_verify_rsa) with `publicKey`, `input`, and `signature`. Native operations must satisfy their declared C contracts.
|
|
133
|
+
|
|
134
|
+
<a id="symbol-GnuTlsCrypto.decodeBase64url"></a>
|
|
135
|
+
### `GnuTlsCrypto.decodeBase64url` · [source](contracts.aug#L60)
|
|
136
|
+
|
|
137
|
+
Decode canonical unpadded URL-safe base64, rejecting invalid characters and unused bits. It takes `input` as a string. Failures can raise `CryptoError`.
|
|
138
|
+
|
|
139
|
+
Within an unsafe block, it returns [`_aug_crypto_decode_base64url`](contracts.aug.md#symbol-_aug_crypto_decode_base64url) with `input`. Native operations must satisfy their declared C contracts.
|
|
140
|
+
|
|
141
|
+
<a id="symbol-GnuTlsCrypto.equal"></a>
|
|
142
|
+
### `GnuTlsCrypto.equal` · [source](contracts.aug#L63)
|
|
143
|
+
|
|
144
|
+
Compare bytes without early exit on their contents. Length remains observable. It takes `left` and `right` as `Bytes`.
|
|
145
|
+
|
|
146
|
+
Within an unsafe block, it returns [`_aug_crypto_equal`](contracts.aug.md#symbol-_aug_crypto_equal) with `left` and `right`. Native operations must satisfy their declared C contracts.
|
|
147
|
+
|
|
148
|
+
<a id="symbol-GnuTlsCrypto.exportRsa"></a>
|
|
149
|
+
### `GnuTlsCrypto.exportRsa` · [source](contracts.aug#L66)
|
|
150
|
+
|
|
151
|
+
Export unsigned big-endian modulus and exponent for an RSA JWK. It takes `publicKey` as `RsaPublicKey`. Failures can raise `CryptoError`.
|
|
152
|
+
|
|
153
|
+
Within an unsafe block, it returns [`_aug_crypto_export_rsa`](contracts.aug.md#symbol-_aug_crypto_export_rsa) with `publicKey`. Native operations must satisfy their declared C contracts.
|
|
154
|
+
|
|
155
|
+
<a id="symbol-GnuTlsCrypto.importRsa"></a>
|
|
156
|
+
### `GnuTlsCrypto.importRsa` · [source](contracts.aug#L69)
|
|
157
|
+
|
|
158
|
+
Import canonical public RSA parameters. Keys must have 2048 to 8192 bits. It takes `modulus` and `exponent` as `Bytes`. Failures can raise `CryptoError`.
|
|
159
|
+
|
|
160
|
+
Within an unsafe block, it returns [`_aug_crypto_import_rsa`](contracts.aug.md#symbol-_aug_crypto_import_rsa) with `modulus` and `exponent`. Native operations must satisfy their declared C contracts.
|
|
161
|
+
|
|
162
|
+
<a id="symbol-GnuTlsCrypto.passwordHash"></a>
|
|
163
|
+
### `GnuTlsCrypto.passwordHash` · [source](contracts.aug#L72)
|
|
164
|
+
|
|
165
|
+
PBKDF2-HMAC-SHA256, producing 32 bytes. Use a unique 16–64 byte salt; supported work factors are 100,000–2,000,000. It takes `password` and `salt` as `Bytes` and `iterations` as an integer. Failures can raise `CryptoError`.
|
|
166
|
+
|
|
167
|
+
Within an unsafe block, it returns [`_aug_crypto_password_hash`](contracts.aug.md#symbol-_aug_crypto_password_hash) with `password`, `salt`, and `iterations`. Native operations must satisfy their declared C contracts.
|
|
168
|
+
|
|
169
|
+
<a id="symbol-_aug_crypto_random"></a>
|
|
170
|
+
## `_aug_crypto_random` · [source](contracts.aug#L28)
|
|
171
|
+
|
|
172
|
+
It is private to its defining scope. It takes `size` as an integer.
|
|
173
|
+
|
|
174
|
+
It returns `Bytes`. It can call [`Crypto.random`](contracts.aug.md#symbol-Crypto.random). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
175
|
+
|
|
176
|
+
<a id="symbol-_aug_crypto_sha256"></a>
|
|
177
|
+
## `_aug_crypto_sha256` · [source](contracts.aug#L29)
|
|
178
|
+
|
|
179
|
+
It is private to its defining scope. It takes `input` as `Bytes`.
|
|
180
|
+
|
|
181
|
+
It returns `Bytes`. It can call [`Crypto.sha256`](contracts.aug.md#symbol-Crypto.sha256). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
182
|
+
|
|
183
|
+
<a id="symbol-_aug_crypto_generate_rsa"></a>
|
|
184
|
+
## `_aug_crypto_generate_rsa` · [source](contracts.aug#L30)
|
|
185
|
+
|
|
186
|
+
It is private to its defining scope. It returns `RsaPrivateKey`. It can call [`Crypto.generateRsa`](contracts.aug.md#symbol-Crypto.generateRsa). Failures can raise `CryptoError`.
|
|
187
|
+
|
|
188
|
+
Native C implementation; only its declared contract is visible here.
|
|
189
|
+
|
|
190
|
+
<a id="symbol-_aug_crypto_public_rsa"></a>
|
|
191
|
+
## `_aug_crypto_public_rsa` · [source](contracts.aug#L31)
|
|
192
|
+
|
|
193
|
+
It is private to its defining scope. It takes `key` as `RsaPrivateKey`.
|
|
194
|
+
|
|
195
|
+
It returns `RsaPublicKey`. It can call [`Crypto.publicRsa`](contracts.aug.md#symbol-Crypto.publicRsa). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
196
|
+
|
|
197
|
+
<a id="symbol-_aug_crypto_sign_rsa"></a>
|
|
198
|
+
## `_aug_crypto_sign_rsa` · [source](contracts.aug#L32)
|
|
199
|
+
|
|
200
|
+
It is private to its defining scope. It takes `key` as `RsaPrivateKey` and `input` as `Bytes`.
|
|
201
|
+
|
|
202
|
+
It returns `Bytes`. It can call [`Crypto.signRsa`](contracts.aug.md#symbol-Crypto.signRsa). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
203
|
+
|
|
204
|
+
<a id="symbol-_aug_crypto_verify_rsa"></a>
|
|
205
|
+
## `_aug_crypto_verify_rsa` · [source](contracts.aug#L33)
|
|
206
|
+
|
|
207
|
+
It is private to its defining scope. It takes `publicKey` as `RsaPublicKey` and `input` and `signature` as `Bytes`.
|
|
208
|
+
|
|
209
|
+
It returns `bool`. It can call [`Crypto.verifyRsa`](contracts.aug.md#symbol-Crypto.verifyRsa). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
210
|
+
|
|
211
|
+
<a id="symbol-_aug_crypto_decode_base64url"></a>
|
|
212
|
+
## `_aug_crypto_decode_base64url` · [source](contracts.aug#L34)
|
|
213
|
+
|
|
214
|
+
It is private to its defining scope. It takes `input` as a string.
|
|
215
|
+
|
|
216
|
+
It returns `Bytes`. It can call [`Crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
217
|
+
|
|
218
|
+
<a id="symbol-_aug_crypto_equal"></a>
|
|
219
|
+
## `_aug_crypto_equal` · [source](contracts.aug#L35)
|
|
220
|
+
|
|
221
|
+
It is private to its defining scope. It takes `left` and `right` as `Bytes`. It returns `bool`. It can call [`Crypto.equal`](contracts.aug.md#symbol-Crypto.equal).
|
|
222
|
+
|
|
223
|
+
Native C implementation; only its declared contract is visible here.
|
|
224
|
+
|
|
225
|
+
<a id="symbol-_aug_crypto_export_rsa"></a>
|
|
226
|
+
## `_aug_crypto_export_rsa` · [source](contracts.aug#L36)
|
|
227
|
+
|
|
228
|
+
It is private to its defining scope. It takes `publicKey` as `RsaPublicKey`.
|
|
229
|
+
|
|
230
|
+
It returns `Tuple<Bytes,Bytes>`. It can call [`Crypto.exportRsa`](contracts.aug.md#symbol-Crypto.exportRsa). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
231
|
+
|
|
232
|
+
<a id="symbol-_aug_crypto_import_rsa"></a>
|
|
233
|
+
## `_aug_crypto_import_rsa` · [source](contracts.aug#L37)
|
|
234
|
+
|
|
235
|
+
It is private to its defining scope. It takes `modulus` and `exponent` as `Bytes`.
|
|
236
|
+
|
|
237
|
+
It returns `RsaPublicKey`. It can call [`Crypto.importRsa`](contracts.aug.md#symbol-Crypto.importRsa). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
238
|
+
|
|
239
|
+
<a id="symbol-_aug_crypto_password_hash"></a>
|
|
240
|
+
## `_aug_crypto_password_hash` · [source](contracts.aug#L38)
|
|
241
|
+
|
|
242
|
+
It is private to its defining scope. It takes `password` and `salt` as `Bytes` and `iterations` as an integer.
|
|
243
|
+
|
|
244
|
+
It returns `Bytes`. It can call [`Crypto.passwordHash`](contracts.aug.md#symbol-Crypto.passwordHash). Failures can raise `CryptoError`. Native C implementation; only its declared contract is visible here.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by aug spec. This is a copy of the installed dependency source.
|
|
2
|
+
// aug-spec: "jose.aug.md" explains this file. Read it before changes; refresh with aug spec.
|
|
2
3
|
import Crypto from contracts
|
|
3
|
-
import parse from
|
|
4
|
+
import parse from "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0"
|
|
4
5
|
|
|
5
6
|
/** A failed JOSE validation reveals no unverified claims. */
|
|
6
7
|
JwtError() implements Error:
|
|
@@ -12,12 +13,12 @@ record RsaJwk(string kty, string kid, string alg, string use, string n, string e
|
|
|
12
13
|
record RsaJwks(List<RsaJwk> keys)
|
|
13
14
|
|
|
14
15
|
/** Export public parameters. Private key material never enters the JSON document. */
|
|
15
|
-
rsaJwk(RsaPublicKey publicKey, string kid, resolve Crypto crypto)
|
|
16
|
+
rsaJwk(RsaPublicKey publicKey, string kid, resolve Crypto crypto) :
|
|
16
17
|
(modulus, exponent) = crypto.exportRsa(publicKey)
|
|
17
18
|
return RsaJwk(kty="RSA", kid=kid, alg="RS256", use="sig", n=modulus.base64url(), e=exponent.base64url())
|
|
18
19
|
|
|
19
20
|
/** Import only an RSA signing key for RS256. The transport caller selects the trusted JWKS URL. */
|
|
20
|
-
importJwk(RsaJwk jwk, resolve Crypto crypto)
|
|
21
|
+
importJwk(RsaJwk jwk, resolve Crypto crypto) :
|
|
21
22
|
if jwk.kty != "RSA" or jwk.alg != "RS256" or jwk.use != "sig":
|
|
22
23
|
throw JwtError()
|
|
23
24
|
try:
|
|
@@ -28,7 +29,7 @@ importJwk(RsaJwk jwk, resolve Crypto crypto) returns RsaPublicKey uses crypto.de
|
|
|
28
29
|
throw JwtError()
|
|
29
30
|
|
|
30
31
|
/** Sign immutable JSON with an explicit key id and token type. Claims are validated by the protocol that consumes the token. */
|
|
31
|
-
signJwt(RsaPrivateKey key, Json claims, string kid, string tokenType, resolve Crypto crypto)
|
|
32
|
+
signJwt(RsaPrivateKey key, Json claims, string kid, string tokenType, resolve Crypto crypto) :
|
|
32
33
|
try:
|
|
33
34
|
header = Json(value=JwtHeader(alg="RS256", kid=kid, typ=tokenType)).stringify()
|
|
34
35
|
payload = claims.stringify()
|
|
@@ -41,7 +42,7 @@ signJwt(RsaPrivateKey key, Json claims, string kid, string tokenType, resolve Cr
|
|
|
41
42
|
throw JwtError()
|
|
42
43
|
|
|
43
44
|
/** Verify the signature and configured algorithm, key id, and type before exposing the JSON payload. Never follows token-supplied URLs. */
|
|
44
|
-
verifyJwt(string token, RsaPublicKey publicKey, string kid, string tokenType, resolve Crypto crypto)
|
|
45
|
+
verifyJwt(string token, RsaPublicKey publicKey, string kid, string tokenType, resolve Crypto crypto) :
|
|
45
46
|
if token.length() > 16384:
|
|
46
47
|
throw JwtError()
|
|
47
48
|
parts = token.split(separator=".")
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `jose.aug`
|
|
4
|
+
|
|
5
|
+
<a id="symbol-JwtError"></a>
|
|
6
|
+
## `JwtError` · class · [source](jose.aug#L7)
|
|
7
|
+
|
|
8
|
+
A failed JOSE validation reveals no unverified claims. It implements `Error`.
|
|
9
|
+
|
|
10
|
+
<a id="symbol-JwtHeader"></a>
|
|
11
|
+
## `JwtHeader` · immutable record · [source](jose.aug#L10)
|
|
12
|
+
|
|
13
|
+
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.
|
|
14
|
+
|
|
15
|
+
<a id="symbol-RsaJwk"></a>
|
|
16
|
+
## `RsaJwk` · immutable record · [source](jose.aug#L12)
|
|
17
|
+
|
|
18
|
+
Public signing-key metadata in RFC 7517 / RFC 7518 form. It takes `kty`, `kid`, `alg`, `use`, `n`, and `e` as strings, kept read-only.
|
|
19
|
+
|
|
20
|
+
<a id="symbol-RsaJwks"></a>
|
|
21
|
+
## `RsaJwks` · immutable record · [source](jose.aug#L13)
|
|
22
|
+
|
|
23
|
+
It takes `keys` as `List<RsaJwk>`, kept read-only.
|
|
24
|
+
|
|
25
|
+
<a id="symbol-rsaJwk"></a>
|
|
26
|
+
## `rsaJwk` · [source](jose.aug#L16)
|
|
27
|
+
|
|
28
|
+
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.aug.md#symbol-Crypto)) from dependency injection.
|
|
29
|
+
|
|
30
|
+
Failures can raise `CryptoError`. It splits [`crypto.exportRsa`](contracts.aug.md#symbol-Crypto.exportRsa) with `publicKey` into `modulus` and `exponent` in order. It returns a [`RsaJwk`](jose.aug.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`.
|
|
31
|
+
|
|
32
|
+
<a id="symbol-importJwk"></a>
|
|
33
|
+
## `importJwk` · [source](jose.aug#L21)
|
|
34
|
+
|
|
35
|
+
Import only an RSA signing key for RS256. The transport caller selects the trusted JWKS URL. It takes `jwk` as [`RsaJwk`](jose.aug.md#symbol-RsaJwk). It gets `crypto` ([`Crypto`](contracts.aug.md#symbol-Crypto)) from dependency injection.
|
|
36
|
+
|
|
37
|
+
Failures can raise [`JwtError`](jose.aug.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.aug.md#symbol-JwtError) at the first failed check.
|
|
38
|
+
|
|
39
|
+
It tries to set `modulus` to [`crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url) with `input` from `jwk.n`, then set `exponent` to [`crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url) with `input` from `jwk.e`, then return [`crypto.importRsa`](contracts.aug.md#symbol-Crypto.importRsa) with `modulus` and `exponent`. If this work raises `CryptoError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError).
|
|
40
|
+
|
|
41
|
+
<a id="symbol-signJwt"></a>
|
|
42
|
+
## `signJwt` · [source](jose.aug#L32)
|
|
43
|
+
|
|
44
|
+
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.aug.md#symbol-Crypto)) from dependency injection.
|
|
45
|
+
|
|
46
|
+
Failures can raise [`JwtError`](jose.aug.md#symbol-JwtError).
|
|
47
|
+
|
|
48
|
+
It sets `header` to `stringify` on a `Json` with `value` from a [`JwtHeader`](jose.aug.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.aug.md#symbol-Crypto.signRsa) with `key` and `input` from the UTF-8 bytes of `signing`.
|
|
49
|
+
|
|
50
|
+
It returns the text `{signing}.{the URL-safe base64 encoding of signature}`. If this work raises `CryptoError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError). If this work raises `JsonError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError).
|
|
51
|
+
|
|
52
|
+
<a id="symbol-verifyJwt"></a>
|
|
53
|
+
## `verifyJwt` · [source](jose.aug#L45)
|
|
54
|
+
|
|
55
|
+
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.aug.md#symbol-Crypto)) from dependency injection.
|
|
56
|
+
|
|
57
|
+
Failures can raise [`JwtError`](jose.aug.md#symbol-JwtError). It checks that the byte length of `token` is at most `16384`. It raises a [`JwtError`](jose.aug.md#symbol-JwtError) at the first failed check. It sets `parts` to `token.split` with `separator` `"."`.
|
|
58
|
+
|
|
59
|
+
It checks that the number of elements in `parts` equals `3`. It raises a [`JwtError`](jose.aug.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`.
|
|
60
|
+
|
|
61
|
+
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.aug.md#symbol-parse) with `input` from `text` on [`crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url) with `input` from `first` for [`JwtHeader`](jose.aug.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.aug.md#symbol-JwtError) at the first failed check.
|
|
62
|
+
|
|
63
|
+
It sets `signature` to [`crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url) with `input` from `third`. It checks that [`crypto.verifyRsa`](contracts.aug.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.aug.md#symbol-JwtError) at the first failed check. It returns [`parse`](../../url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md#symbol-parse) with `input` from `text` on [`crypto.decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url) with `input` from `second`.
|
|
64
|
+
|
|
65
|
+
If this work raises `CryptoError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError). If this work raises `ConversionError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError). If this work raises `JsonError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError). If this work raises `IndexError`, it raises a [`JwtError`](jose.aug.md#symbol-JwtError).
|
|
66
|
+
|
|
67
|
+
## Dependencies
|
|
68
|
+
|
|
69
|
+
It uses [`parse`](../../url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md#symbol-parse) from `https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0`. It uses [`Crypto`](contracts.aug.md#symbol-Crypto) ([`decodeBase64url`](contracts.aug.md#symbol-Crypto.decodeBase64url), [`exportRsa`](contracts.aug.md#symbol-Crypto.exportRsa), [`importRsa`](contracts.aug.md#symbol-Crypto.importRsa), [`signRsa`](contracts.aug.md#symbol-Crypto.signRsa), and [`verifyRsa`](contracts.aug.md#symbol-Crypto.verifyRsa)) from `contracts`.
|
|
70
|
+
|
|
71
|
+
Built-in operations follow the [language reference](https://greenpandastudios.github.io/augscript/language-constructs).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
|
+
|
|
3
|
+
# `contracts.aug`
|
|
4
|
+
|
|
5
|
+
<a id="symbol-Clock"></a>
|
|
6
|
+
## `Clock` · capability interface · [source](contracts.aug#L3)
|
|
7
|
+
|
|
8
|
+
An explicit clock dependency makes time-based behavior replaceable in tests.
|
|
9
|
+
|
|
10
|
+
<a id="symbol-Clock.now"></a>
|
|
11
|
+
### `Clock.now` · [source](contracts.aug#L5)
|
|
12
|
+
|
|
13
|
+
Read whole Unix seconds in UTC. It returns `int`. It can call [`Clock.now`](contracts.aug.md#symbol-Clock.now). Failures can raise `TimeError`.
|
|
14
|
+
|
|
15
|
+
<a id="symbol-SystemClock"></a>
|
|
16
|
+
## `SystemClock` · class · [source](contracts.aug#L8)
|
|
17
|
+
|
|
18
|
+
Operating-system wall clock. It implements [`Clock`](contracts.aug.md#symbol-Clock).
|
|
19
|
+
|
|
20
|
+
<a id="symbol-SystemClock.now"></a>
|
|
21
|
+
### `SystemClock.now` · [source](contracts.aug#L9)
|
|
22
|
+
|
|
23
|
+
Read whole Unix seconds in UTC. Failures can raise `TimeError`. Within an unsafe block, it returns [`_aug_time_now`](contracts.aug.md#symbol-_aug_time_now). Native operations must satisfy their declared C contracts.
|
|
24
|
+
|
|
25
|
+
<a id="symbol-_aug_time_now"></a>
|
|
26
|
+
## `_aug_time_now` · [source](contracts.aug#L6)
|
|
27
|
+
|
|
28
|
+
It is private to its defining scope. It returns `int`. It can call [`Clock.now`](contracts.aug.md#symbol-Clock.now). Failures can raise `TimeError`.
|
|
29
|
+
|
|
30
|
+
Native C implementation; only its declared contract is visible here.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"compiler": "0.20.1",
|
|
4
|
+
"specifications": {
|
|
5
|
+
"crypto": "https://github.com/GreenPandaStudios/augscript/src/stdlib/crypto#b14a0f9aa41f1ce58bd51133bcdc424033e40d40",
|
|
6
|
+
"json": "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0",
|
|
7
|
+
"memory": "https://github.com/GreenPandaStudios/augscript/src/stdlib/memory#v0.19.0",
|
|
8
|
+
"time": "https://github.com/GreenPandaStudios/augscript/src/stdlib/time#v0.19.0",
|
|
9
|
+
"web": "https://github.com/GreenPandaStudios/augscript/src/stdlib/web#v0.19.0"
|
|
10
|
+
},
|
|
11
|
+
"roots": {
|
|
12
|
+
"crypto": "packages/url_c64a406ed867b506f314",
|
|
13
|
+
"json": "packages/url_ac5ce553f84fc815ffc3",
|
|
14
|
+
"memory": "packages/url_c0ae6b2968a0e749820c",
|
|
15
|
+
"time": "packages/url_d13f6c7bf776c8e5c665",
|
|
16
|
+
"web": "packages/url_3d8a4bc50002396b26a3"
|
|
17
|
+
},
|
|
18
|
+
"npm": {},
|
|
19
|
+
"git": [
|
|
20
|
+
{
|
|
21
|
+
"request": "https://github.com/GreenPandaStudios/augscript/src/stdlib/crypto#b14a0f9aa41f1ce58bd51133bcdc424033e40d40",
|
|
22
|
+
"repository": "https://github.com/GreenPandaStudios/augscript.git",
|
|
23
|
+
"revision": "b14a0f9aa41f1ce58bd51133bcdc424033e40d40",
|
|
24
|
+
"folder": "src/stdlib/crypto",
|
|
25
|
+
"commit": "b14a0f9aa41f1ce58bd51133bcdc424033e40d40"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"request": "https://github.com/GreenPandaStudios/augscript/src/stdlib/json#v0.19.0",
|
|
29
|
+
"repository": "https://github.com/GreenPandaStudios/augscript.git",
|
|
30
|
+
"revision": "v0.19.0",
|
|
31
|
+
"folder": "src/stdlib/json",
|
|
32
|
+
"commit": "a39fc582565d4fca40be4f75fa304d71adc69301"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"request": "https://github.com/GreenPandaStudios/augscript/src/stdlib/memory#v0.19.0",
|
|
36
|
+
"repository": "https://github.com/GreenPandaStudios/augscript.git",
|
|
37
|
+
"revision": "v0.19.0",
|
|
38
|
+
"folder": "src/stdlib/memory",
|
|
39
|
+
"commit": "a39fc582565d4fca40be4f75fa304d71adc69301"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"request": "https://github.com/GreenPandaStudios/augscript/src/stdlib/time#v0.19.0",
|
|
43
|
+
"repository": "https://github.com/GreenPandaStudios/augscript.git",
|
|
44
|
+
"revision": "v0.19.0",
|
|
45
|
+
"folder": "src/stdlib/time",
|
|
46
|
+
"commit": "a39fc582565d4fca40be4f75fa304d71adc69301"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"request": "https://github.com/GreenPandaStudios/augscript/src/stdlib/web#v0.19.0",
|
|
50
|
+
"repository": "https://github.com/GreenPandaStudios/augscript.git",
|
|
51
|
+
"revision": "v0.19.0",
|
|
52
|
+
"folder": "src/stdlib/web",
|
|
53
|
+
"commit": "a39fc582565d4fca40be4f75fa304d71adc69301"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"packages": [
|
|
57
|
+
{
|
|
58
|
+
"path": "packages/url_3d8a4bc50002396b26a3",
|
|
59
|
+
"name": "@git/url_897efafd565158fc4908",
|
|
60
|
+
"version": "0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301",
|
|
61
|
+
"source": ".",
|
|
62
|
+
"digest": "51308a4dc69f952f8eaaafc9e6d1be3a903cd60389e4b3c614594d74c1b58653",
|
|
63
|
+
"dependencies": {}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"path": "packages/url_ac5ce553f84fc815ffc3",
|
|
67
|
+
"name": "@git/url_2d3c37c690c0fa115be1",
|
|
68
|
+
"version": "0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301",
|
|
69
|
+
"source": ".",
|
|
70
|
+
"digest": "fa30fce8a20017921a6a568b901785de6df6f2a276762cfbea2ed8cdc9eee360",
|
|
71
|
+
"dependencies": {}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"path": "packages/url_c0ae6b2968a0e749820c",
|
|
75
|
+
"name": "@git/url_0eb7c89453c87681ed15",
|
|
76
|
+
"version": "0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301",
|
|
77
|
+
"source": ".",
|
|
78
|
+
"digest": "3def29fd500e43dff62f62828dc458f253623bd1a6eed299d76870f528b4c6c2",
|
|
79
|
+
"dependencies": {}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"path": "packages/url_c64a406ed867b506f314",
|
|
83
|
+
"name": "@git/url_9ef654c66d34ab8f5527",
|
|
84
|
+
"version": "0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40",
|
|
85
|
+
"source": ".",
|
|
86
|
+
"digest": "42a3a3567867da26f1b9fdf7d0c43ce323fd3ece03be74fd449c317cb845b960",
|
|
87
|
+
"dependencies": {
|
|
88
|
+
"url_ac5ce553f84fc815ffc3": "packages/url_ac5ce553f84fc815ffc3"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"path": "packages/url_d13f6c7bf776c8e5c665",
|
|
93
|
+
"name": "@git/url_c092cd151499c4e1d8a1",
|
|
94
|
+
"version": "0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301",
|
|
95
|
+
"source": ".",
|
|
96
|
+
"digest": "9f299994afc477c182fe3404c811e974e1856282df4b2fe5c327799f780f9cac",
|
|
97
|
+
"dependencies": {}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// aug-spec: "contracts.aug.md" explains this file. Read it before changes; refresh with aug spec.
|
|
1
2
|
/** Browser-bound client state, nonce and PKCE verifier, consumed by the callback. */
|
|
2
3
|
record LoginTransaction(string state, string nonce, string verifier, int expires)
|
|
3
4
|
/** Sessions require their own issuer, audience, key and JWT type, plus a live registry entry. */
|
|
@@ -1,80 +1,23 @@
|
|
|
1
1
|
<!-- Generated by aug spec. Edit the August source, then regenerate. -->
|
|
2
2
|
|
|
3
|
-
# `contracts.aug`
|
|
4
|
-
|
|
5
|
-
August 0.19.0. This document is compiled from checked code with deterministic wording guided by Simplified Technical English.
|
|
6
|
-
|
|
7
|
-
## In this file
|
|
8
|
-
|
|
9
|
-
- [`LoginTransaction`](contracts.aug.md#symbol-LoginTransaction) is an immutable record.
|
|
10
|
-
- [`SessionClaims`](contracts.aug.md#symbol-SessionClaims) is an immutable record.
|
|
11
|
-
- [`LogoutForm`](contracts.aug.md#symbol-LogoutForm) is an immutable record.
|
|
12
|
-
- [`SessionError`](contracts.aug.md#symbol-SessionError) is a class implementing `Error`.
|
|
3
|
+
# `contracts.aug`
|
|
13
4
|
|
|
14
5
|
<a id="symbol-LoginTransaction"></a>
|
|
6
|
+
## `LoginTransaction` · immutable record · [source](contracts.aug#L3)
|
|
15
7
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
[source](contracts.aug#L2)
|
|
19
|
-
|
|
20
|
-
Immutable record.
|
|
21
|
-
|
|
22
|
-
**Author documentation**
|
|
23
|
-
|
|
24
|
-
Browser-bound client state, nonce and PKCE verifier, consumed by the callback.
|
|
25
|
-
|
|
26
|
-
**Inputs**
|
|
27
|
-
|
|
28
|
-
- `state` (`string`) — required labeled input — stored as `state` and read-only after initialization.
|
|
29
|
-
- `nonce` (`string`) — required labeled input — stored as `nonce` and read-only after initialization.
|
|
30
|
-
- `verifier` (`string`) — required labeled input — stored as `verifier` and read-only after initialization.
|
|
31
|
-
- `expires` (`int`) — required labeled input — stored as `expires` and read-only after initialization.
|
|
8
|
+
Browser-bound client state, nonce and PKCE verifier, consumed by the callback. It takes `state`, `nonce`, and `verifier` as strings, kept read-only and `expires` as an integer, kept read-only.
|
|
32
9
|
|
|
33
10
|
<a id="symbol-SessionClaims"></a>
|
|
11
|
+
## `SessionClaims` · immutable record · [source](contracts.aug#L5)
|
|
34
12
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
[source](contracts.aug#L4)
|
|
38
|
-
|
|
39
|
-
Immutable record.
|
|
40
|
-
|
|
41
|
-
**Author documentation**
|
|
42
|
-
|
|
43
|
-
Sessions require their own issuer, audience, key and JWT type, plus a live registry entry.
|
|
44
|
-
|
|
45
|
-
**Inputs**
|
|
46
|
-
|
|
47
|
-
- `iss` (`string`) — required labeled input — stored as `iss` and read-only after initialization.
|
|
48
|
-
- `sub` (`string`) — required labeled input — stored as `sub` and read-only after initialization.
|
|
49
|
-
- `aud` (`string`) — required labeled input — stored as `aud` and read-only after initialization.
|
|
50
|
-
- `exp` (`int`) — required labeled input — stored as `exp` and read-only after initialization.
|
|
51
|
-
- `iat` (`int`) — required labeled input — stored as `iat` and read-only after initialization.
|
|
52
|
-
- `jti` (`string`) — required labeled input — stored as `jti` and read-only after initialization.
|
|
53
|
-
- `csrf` (`string`) — required labeled input — stored as `csrf` and read-only after initialization.
|
|
54
|
-
- `name` (`string`) — required labeled input — stored as `name` and read-only after initialization.
|
|
13
|
+
Sessions require their own issuer, audience, key and JWT type, plus a live registry entry. It takes `iss`, `sub`, and `aud` as strings, kept read-only, `exp` and `iat` as integers, kept read-only, and `jti`, `csrf`, and `name` as strings, kept read-only.
|
|
55
14
|
|
|
56
15
|
<a id="symbol-LogoutForm"></a>
|
|
16
|
+
## `LogoutForm` · immutable record · [source](contracts.aug#L6)
|
|
57
17
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
[source](contracts.aug#L5)
|
|
61
|
-
|
|
62
|
-
Immutable record.
|
|
63
|
-
|
|
64
|
-
**Inputs**
|
|
65
|
-
|
|
66
|
-
- `csrf` (`string`) — required labeled input — stored as `csrf` and read-only after initialization.
|
|
18
|
+
It takes `csrf` as a string, kept read-only.
|
|
67
19
|
|
|
68
20
|
<a id="symbol-SessionError"></a>
|
|
21
|
+
## `SessionError` · class · [source](contracts.aug#L7)
|
|
69
22
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
[source](contracts.aug#L6)
|
|
73
|
-
|
|
74
|
-
Behavioral class.
|
|
75
|
-
|
|
76
|
-
Satisfies `Error`.
|
|
77
|
-
|
|
78
|
-
## Shared language rules
|
|
79
|
-
|
|
80
|
-
See the [language reference](https://greenpandastudios.github.io/augscript/reference) for numeric, equality, ownership, and task rules.
|
|
23
|
+
It implements `Error`.
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
// aug-spec: "endpoints.aug.md" explains this file. Read it before changes; refresh with aug spec.
|
|
1
2
|
import SessionClaims and SessionError from contracts
|
|
2
3
|
import authenticate from session
|
|
3
4
|
import LoginPage and Welcome from views
|
|
4
5
|
import UserInfo from provider
|
|
5
6
|
import settings and SigningKeys and KeyError and securityHeaders and withCookie from common
|
|
6
|
-
import Crypto from
|
|
7
|
-
import Clock from
|
|
8
|
-
import ExpiringStore from
|
|
7
|
+
import Crypto from crypto
|
|
8
|
+
import Clock from time
|
|
9
|
+
import ExpiringStore from memory
|
|
9
10
|
|
|
10
11
|
/** The app renders a verified session or offers its OIDC login flow. No token claims are displayed before verification. */
|
|
11
|
-
endpoint GET "/" as home(optional string token from cookie "aug_session", resolve Crypto crypto, resolve Clock clock, resolve SigningKeys keys, resolve ExpiringStore<SessionClaims> sessions)
|
|
12
|
+
endpoint GET "/" as home(optional string token from cookie "aug_session", resolve Crypto crypto, resolve Clock clock, resolve SigningKeys keys, resolve ExpiringStore<SessionClaims> sessions) :
|
|
12
13
|
try:
|
|
13
14
|
session = authenticate(token)
|
|
14
15
|
return HttpResponse(body=Welcome(session), headers=securityHeaders())
|
|
@@ -16,6 +17,6 @@ endpoint GET "/" as home(optional string token from cookie "aug_session", resolv
|
|
|
16
17
|
return HttpResponse(body=LoginPage(), headers=securityHeaders())
|
|
17
18
|
|
|
18
19
|
/** A protected JSON resource accepts only a live, verified application session. */
|
|
19
|
-
endpoint GET "/me" as me(optional string token from cookie "aug_session", resolve Crypto crypto, resolve Clock clock, resolve SigningKeys keys, resolve ExpiringStore<SessionClaims> sessions)
|
|
20
|
+
endpoint GET "/me" as me(optional string token from cookie "aug_session", resolve Crypto crypto, resolve Clock clock, resolve SigningKeys keys, resolve ExpiringStore<SessionClaims> sessions) unless SessionError with status 401 and KeyError and TimeError and HttpError:
|
|
20
21
|
session = authenticate(token)
|
|
21
22
|
return HttpResponse(body=UserInfo(sub=session.sub, name=session.name), headers=securityHeaders())
|