@wbce/projen-d9 0.0.28 → 0.1.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/.jsii +202 -45
- package/API.md +167 -37
- package/CHANGELOG.md +19 -0
- package/README.md +10 -3
- package/docs/D9-plumbing.md +194 -0
- package/lib/cli/atlas.d.ts +10 -0
- package/lib/cli/atlas.js +65 -0
- package/lib/cli/commands/cedar/cedar-format.d.ts +7 -0
- package/lib/cli/commands/cedar/cedar-format.js +75 -0
- package/lib/cli/commands/cedar/cedar-to-d9-translations.d.ts +12 -0
- package/lib/cli/commands/cedar/cedar-to-d9-translations.js +130 -0
- package/lib/cli/commands/cedar/cedar-to-d9.d.ts +57 -0
- package/lib/cli/commands/cedar/cedar-to-d9.js +221 -0
- package/lib/cli/commands/cedar/cedar-translations.d.ts +9 -0
- package/lib/cli/commands/cedar/cedar-translations.js +213 -0
- package/lib/cli/commands/cedar/d9-permission.d.ts +27 -0
- package/lib/cli/commands/cedar/d9-permission.js +45 -0
- package/lib/cli/commands/cedar/d9-to-cedar.d.ts +33 -0
- package/lib/cli/commands/cedar/d9-to-cedar.js +157 -0
- package/lib/cli/commands/cedar/roles-table.d.ts +14 -0
- package/lib/cli/commands/cedar/roles-table.js +29 -0
- package/lib/cli/commands/save/apply-snapshot.d.ts +2 -7
- package/lib/cli/commands/save/apply-snapshot.js +41 -31
- package/lib/cli/commands/save/check-unsaved.d.ts +9 -0
- package/lib/cli/commands/save/check-unsaved.js +81 -0
- package/lib/cli/commands/save/env.d.ts +37 -0
- package/lib/cli/commands/save/env.js +111 -0
- package/lib/cli/commands/save/save-snapshot.d.ts +4 -0
- package/lib/cli/commands/save/save-snapshot.js +233 -0
- package/lib/cli/commands/save/sync-files.d.ts +5 -0
- package/lib/cli/commands/save/sync-files.js +46 -0
- package/lib/cli/commands/save/transfer.d.ts +18 -0
- package/lib/cli/commands/save/transfer.js +97 -0
- package/lib/cli/commands/save/utils.d.ts +5 -0
- package/lib/cli/commands/save/utils.js +33 -3
- package/lib/cli/commands/sync.js +4 -3
- package/lib/cli/index.js +67 -25
- package/lib/cli/logger.d.ts +2 -0
- package/lib/cli/logger.js +10 -0
- package/lib/cli/plumbing-config.d.ts +12 -0
- package/lib/cli/plumbing-config.js +13 -0
- package/lib/index.d.ts +49 -5
- package/lib/index.js +54 -41
- package/node_modules/@cedar-policy/cedar-wasm/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.d.ts +427 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.js +9 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.js +434 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/esm/package.json +23 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.d.ts +427 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.js +463 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/nodejs/package.json +18 -0
- package/node_modules/@cedar-policy/cedar-wasm/package.json +53 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/README.md +181 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.d.ts +486 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.js +534 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm +0 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm.d.ts +34 -0
- package/node_modules/@cedar-policy/cedar-wasm/web/package.json +21 -0
- package/node_modules/@types/node/README.md +5 -6
- package/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/node_modules/@types/node/assert.d.ts +1040 -79
- package/node_modules/@types/node/async_hooks.d.ts +476 -119
- package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/node_modules/@types/node/buffer.d.ts +1925 -13
- package/node_modules/@types/node/child_process.d.ts +1204 -235
- package/node_modules/@types/node/cluster.d.ts +455 -137
- package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/node_modules/@types/node/console.d.ts +450 -1
- package/node_modules/@types/node/constants.d.ts +20 -447
- package/node_modules/@types/node/crypto.d.ts +3962 -600
- package/node_modules/@types/node/dgram.d.ts +515 -33
- package/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
- package/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/node_modules/@types/node/dns.d.ts +798 -247
- package/node_modules/@types/node/domain.d.ts +164 -10
- package/node_modules/@types/node/events.d.ts +954 -25
- package/node_modules/@types/node/fs/promises.d.ts +1295 -0
- package/node_modules/@types/node/fs.d.ts +3463 -1569
- package/node_modules/@types/node/globals.d.ts +98 -1277
- package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/node_modules/@types/node/http.d.ts +1933 -300
- package/node_modules/@types/node/http2.d.ts +1946 -254
- package/node_modules/@types/node/https.d.ts +557 -134
- package/node_modules/@types/node/index.d.ts +54 -48
- package/node_modules/@types/node/inspector.d.ts +227 -3014
- package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/node_modules/@types/node/module.d.ts +890 -2
- package/node_modules/@types/node/net.d.ts +872 -105
- package/node_modules/@types/node/os.d.ts +452 -209
- package/node_modules/@types/node/package.json +78 -128
- package/node_modules/@types/node/path.d.ts +196 -155
- package/node_modules/@types/node/perf_hooks.d.ts +829 -120
- package/node_modules/@types/node/process.d.ts +2072 -3
- package/node_modules/@types/node/punycode.d.ts +69 -27
- package/node_modules/@types/node/querystring.d.ts +132 -9
- package/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/node_modules/@types/node/readline.d.ts +485 -49
- package/node_modules/@types/node/repl.d.ts +121 -83
- package/node_modules/@types/node/sea.d.ts +153 -0
- package/node_modules/@types/node/sqlite.d.ts +721 -0
- package/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/node_modules/@types/node/stream/web.d.ts +622 -0
- package/node_modules/@types/node/stream.d.ts +1470 -140
- package/node_modules/@types/node/string_decoder.d.ts +64 -4
- package/node_modules/@types/node/test.d.ts +2163 -0
- package/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/node_modules/@types/node/timers.d.ts +284 -13
- package/node_modules/@types/node/tls.d.ts +850 -244
- package/node_modules/@types/node/trace_events.d.ts +147 -11
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +97 -0
- package/node_modules/@types/node/tty.d.ts +160 -18
- package/node_modules/@types/node/url.d.ts +890 -53
- package/node_modules/@types/node/util.d.ts +2566 -160
- package/node_modules/@types/node/v8.d.ts +806 -83
- package/node_modules/@types/node/vm.d.ts +932 -44
- package/node_modules/@types/node/wasi.d.ts +148 -22
- package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/node_modules/@types/node/worker_threads.d.ts +657 -80
- package/node_modules/@types/node/zlib.d.ts +510 -119
- package/node_modules/pino/.nojekyll +0 -0
- package/node_modules/pino/.prettierignore +1 -0
- package/node_modules/pino/CNAME +1 -0
- package/node_modules/pino/CONTRIBUTING.md +34 -0
- package/node_modules/pino/LICENSE +21 -0
- package/node_modules/pino/README.md +177 -0
- package/node_modules/pino/SECURITY.md +103 -0
- package/node_modules/pino/benchmarks/basic.bench.js +95 -0
- package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
- package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
- package/node_modules/pino/benchmarks/child.bench.js +62 -0
- package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
- package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
- package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
- package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
- package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
- package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
- package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
- package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
- package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
- package/node_modules/pino/benchmarks/multistream.js +98 -0
- package/node_modules/pino/benchmarks/object.bench.js +82 -0
- package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
- package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
- package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
- package/node_modules/pino/bin.js +6 -0
- package/node_modules/pino/browser.js +607 -0
- package/node_modules/pino/build/sync-version.js +25 -0
- package/node_modules/pino/docs/api.md +1664 -0
- package/node_modules/pino/docs/asynchronous.md +55 -0
- package/node_modules/pino/docs/benchmarks.md +55 -0
- package/node_modules/pino/docs/browser.md +341 -0
- package/node_modules/pino/docs/bundling.md +40 -0
- package/node_modules/pino/docs/child-loggers.md +116 -0
- package/node_modules/pino/docs/diagnostics.md +16 -0
- package/node_modules/pino/docs/ecosystem.md +87 -0
- package/node_modules/pino/docs/help.md +353 -0
- package/node_modules/pino/docs/lts.md +93 -0
- package/node_modules/pino/docs/pretty.md +38 -0
- package/node_modules/pino/docs/redaction.md +130 -0
- package/node_modules/pino/docs/transports.md +1447 -0
- package/node_modules/pino/docs/web.md +306 -0
- package/node_modules/pino/eslint.config.js +36 -0
- package/node_modules/pino/examples/basic.js +43 -0
- package/node_modules/pino/examples/transport.js +68 -0
- package/node_modules/pino/favicon.ico +0 -0
- package/node_modules/pino/file.js +12 -0
- package/node_modules/pino/inc-version.sh +42 -0
- package/node_modules/pino/index.html +55 -0
- package/node_modules/pino/lib/caller.js +40 -0
- package/node_modules/pino/lib/constants.js +28 -0
- package/node_modules/pino/lib/deprecations.js +8 -0
- package/node_modules/pino/lib/levels.js +241 -0
- package/node_modules/pino/lib/meta.js +3 -0
- package/node_modules/pino/lib/multistream.js +211 -0
- package/node_modules/pino/lib/proto.js +256 -0
- package/node_modules/pino/lib/redaction.js +119 -0
- package/node_modules/pino/lib/symbols.js +76 -0
- package/node_modules/pino/lib/time.js +39 -0
- package/node_modules/pino/lib/tools.js +427 -0
- package/node_modules/pino/lib/transport-stream.js +56 -0
- package/node_modules/pino/lib/transport.js +302 -0
- package/node_modules/pino/lib/worker.js +197 -0
- package/node_modules/pino/package.json +112 -0
- package/node_modules/pino/pino.d.ts +881 -0
- package/node_modules/pino/pino.js +259 -0
- package/node_modules/pino/test/basic.test.js +952 -0
- package/node_modules/pino/test/broken-pipe.test.js +59 -0
- package/node_modules/pino/test/browser-bindings.test.js +114 -0
- package/node_modules/pino/test/browser-child.test.js +132 -0
- package/node_modules/pino/test/browser-disabled.test.js +87 -0
- package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
- package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
- package/node_modules/pino/test/browser-levels.test.js +241 -0
- package/node_modules/pino/test/browser-redaction.test.js +264 -0
- package/node_modules/pino/test/browser-serializers.test.js +352 -0
- package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
- package/node_modules/pino/test/browser-timestamp.test.js +88 -0
- package/node_modules/pino/test/browser-transmit.test.js +417 -0
- package/node_modules/pino/test/browser.test.js +698 -0
- package/node_modules/pino/test/caller.test.js +20 -0
- package/node_modules/pino/test/complex-objects.test.js +36 -0
- package/node_modules/pino/test/crlf.test.js +34 -0
- package/node_modules/pino/test/custom-levels.test.js +267 -0
- package/node_modules/pino/test/diagnostics.test.js +107 -0
- package/node_modules/pino/test/error-key.test.js +37 -0
- package/node_modules/pino/test/error.test.js +403 -0
- package/node_modules/pino/test/escaping.test.js +110 -0
- package/node_modules/pino/test/esm/esm.mjs +14 -0
- package/node_modules/pino/test/esm/index.test.js +21 -0
- package/node_modules/pino/test/esm/named-exports.mjs +29 -0
- package/node_modules/pino/test/exit.test.js +79 -0
- package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
- package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
- package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
- package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
- package/node_modules/pino/test/fixtures/console-transport.js +13 -0
- package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
- package/node_modules/pino/test/fixtures/default-exit.js +8 -0
- package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
- package/node_modules/pino/test/fixtures/eval/index.js +13 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
- package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
- package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
- package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
- package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
- package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
- package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
- package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
- package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
- package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
- package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
- package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
- package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
- package/node_modules/pino/test/fixtures/transport/index.js +12 -0
- package/node_modules/pino/test/fixtures/transport/package.json +5 -0
- package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
- package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
- package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
- package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
- package/node_modules/pino/test/fixtures/transport-main.js +9 -0
- package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
- package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
- package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
- package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
- package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
- package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
- package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
- package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
- package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
- package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
- package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
- package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
- package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
- package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
- package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
- package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
- package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
- package/node_modules/pino/test/formatters.test.js +364 -0
- package/node_modules/pino/test/helper.d.ts +4 -0
- package/node_modules/pino/test/helper.js +159 -0
- package/node_modules/pino/test/hooks.test.js +114 -0
- package/node_modules/pino/test/http.test.js +214 -0
- package/node_modules/pino/test/internals/version.test.js +17 -0
- package/node_modules/pino/test/is-level-enabled.test.js +179 -0
- package/node_modules/pino/test/jest/basic.spec.js +10 -0
- package/node_modules/pino/test/levels.test.js +810 -0
- package/node_modules/pino/test/metadata.test.js +120 -0
- package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
- package/node_modules/pino/test/mixin.test.js +241 -0
- package/node_modules/pino/test/multistream.test.js +793 -0
- package/node_modules/pino/test/redact.test.js +923 -0
- package/node_modules/pino/test/serializers.test.js +257 -0
- package/node_modules/pino/test/smoke.js +59 -0
- package/node_modules/pino/test/stdout-protection.test.js +41 -0
- package/node_modules/pino/test/syncfalse.test.js +186 -0
- package/node_modules/pino/test/timestamp-nano.test.js +37 -0
- package/node_modules/pino/test/timestamp.test.js +124 -0
- package/node_modules/pino/test/transport/big.test.js +42 -0
- package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
- package/node_modules/pino/test/transport/caller.test.js +24 -0
- package/node_modules/pino/test/transport/core.test.js +818 -0
- package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
- package/node_modules/pino/test/transport/crash.test.js +36 -0
- package/node_modules/pino/test/transport/module-link.test.js +241 -0
- package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
- package/node_modules/pino/test/transport/node-options.test.js +116 -0
- package/node_modules/pino/test/transport/pipeline.test.js +137 -0
- package/node_modules/pino/test/transport/preload.test.js +54 -0
- package/node_modules/pino/test/transport/repl.test.js +15 -0
- package/node_modules/pino/test/transport/sync-false.test.js +79 -0
- package/node_modules/pino/test/transport/sync-true.test.js +57 -0
- package/node_modules/pino/test/transport/targets.test.js +48 -0
- package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
- package/node_modules/pino/test/transport-stream.test.js +40 -0
- package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
- package/node_modules/pino/test/types/pino-import.tst.js +73 -0
- package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
- package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
- package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
- package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
- package/node_modules/pino/test/types/pino.ts +98 -0
- package/node_modules/pino/test/types/pino.tst.ts +681 -0
- package/node_modules/pino/test/types/tsconfig.json +10 -0
- package/node_modules/pino/tsconfig.json +14 -0
- package/node_modules/pino-pretty/.borp.yaml +6 -0
- package/node_modules/pino-pretty/.editorconfig +13 -0
- package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
- package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
- package/node_modules/pino-pretty/LICENSE +21 -0
- package/node_modules/pino-pretty/Readme.md +425 -0
- package/node_modules/pino-pretty/SECURITY.md +146 -0
- package/node_modules/pino-pretty/benchmark.js +105 -0
- package/node_modules/pino-pretty/bin.js +113 -0
- package/node_modules/pino-pretty/demo.png +0 -0
- package/node_modules/pino-pretty/docs/help.md +24 -0
- package/node_modules/pino-pretty/eslint.config.js +5 -0
- package/node_modules/pino-pretty/help/help.txt +68 -0
- package/node_modules/pino-pretty/index.d.ts +227 -0
- package/node_modules/pino-pretty/index.js +234 -0
- package/node_modules/pino-pretty/lib/colors.js +134 -0
- package/node_modules/pino-pretty/lib/colors.test.js +132 -0
- package/node_modules/pino-pretty/lib/constants.js +55 -0
- package/node_modules/pino-pretty/lib/pretty.js +171 -0
- package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
- package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
- package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
- package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
- package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
- package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
- package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
- package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
- package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
- package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
- package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
- package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
- package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
- package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
- package/node_modules/pino-pretty/lib/utils/index.js +108 -0
- package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
- package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
- package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
- package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
- package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
- package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
- package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
- package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
- package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
- package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
- package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
- package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
- package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
- package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
- package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
- package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
- package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
- package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
- package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
- package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
- package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
- package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
- package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
- package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
- package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
- package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
- package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
- package/node_modules/pino-pretty/package.json +64 -0
- package/node_modules/pino-pretty/test/basic.test.js +1305 -0
- package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
- package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
- package/node_modules/pino-pretty/test/cli.test.js +360 -0
- package/node_modules/pino-pretty/test/crlf.test.js +33 -0
- package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
- package/node_modules/pino-pretty/test/example/example.js +33 -0
- package/node_modules/pino-pretty/test/helper.js +19 -0
- package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
- package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
- package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
- package/package.json +12 -5
- package/lib/cli/commands/init.d.ts +0 -1
- package/lib/cli/commands/init.js +0 -8
- package/node_modules/@types/node/globals.global.d.ts +0 -1
package/lib/cli/atlas.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_ATLAS_VERSION = void 0;
|
|
4
|
+
exports.atlasFileName = atlasFileName;
|
|
5
|
+
exports.ensureAtlas = ensureAtlas;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
const logger_1 = require("./logger");
|
|
11
|
+
const plumbing_config_1 = require("./plumbing-config");
|
|
12
|
+
exports.DEFAULT_ATLAS_VERSION = '1.3.3';
|
|
13
|
+
const RELEASE_SERVER = 'https://release.ariga.io/atlas';
|
|
14
|
+
// resolved at startup: check-unsaved changes the cwd to a worktree without node_modules
|
|
15
|
+
const CACHE_DIR = (0, path_1.resolve)('./node_modules/.cache/d9-plumbing');
|
|
16
|
+
const PLATFORMS = { darwin: 'darwin', linux: 'linux' };
|
|
17
|
+
const ARCHS = { x64: 'amd64', arm64: 'arm64' };
|
|
18
|
+
/**
|
|
19
|
+
* Name of the Atlas release file, e.g. atlas-community-linux-amd64-v1.3.3
|
|
20
|
+
*/
|
|
21
|
+
function atlasFileName(version, platform = process.platform, arch = process.arch) {
|
|
22
|
+
const os = PLATFORMS[platform];
|
|
23
|
+
const cpu = ARCHS[arch];
|
|
24
|
+
if (!os || !cpu) {
|
|
25
|
+
throw new Error(`atlas is not available for ${platform}-${arch} (supported: darwin/linux, x64/arm64)`);
|
|
26
|
+
}
|
|
27
|
+
return `atlas-community-${os}-${cpu}-v${version}`;
|
|
28
|
+
}
|
|
29
|
+
async function download(url) {
|
|
30
|
+
const response = await fetch(url);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`failed to download ${url}: ${response.status} ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
return Buffer.from(await response.arrayBuffer());
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Downloads the Atlas Community Edition binary (Apache 2.0) in the version configured in d9-plumbing.json and returns its path.
|
|
38
|
+
* The binary is cached in node_modules/.cache/d9-plumbing.
|
|
39
|
+
*/
|
|
40
|
+
async function ensureAtlas() {
|
|
41
|
+
const config = (0, plumbing_config_1.readPlumbingConfig)();
|
|
42
|
+
const fileName = atlasFileName(config.atlasVersion ?? exports.DEFAULT_ATLAS_VERSION);
|
|
43
|
+
const binPath = (0, path_1.join)(CACHE_DIR, fileName);
|
|
44
|
+
if ((0, fs_1.existsSync)(binPath)) {
|
|
45
|
+
return binPath;
|
|
46
|
+
}
|
|
47
|
+
logger_1.logger.info(`Downloading ${fileName}`);
|
|
48
|
+
const [binary, checksumFile] = await Promise.all([
|
|
49
|
+
download(`${RELEASE_SERVER}/${fileName}`),
|
|
50
|
+
download(`${RELEASE_SERVER}/${fileName}.sha256`),
|
|
51
|
+
]);
|
|
52
|
+
const expected = checksumFile.toString().trim().split(/\s+/)[0];
|
|
53
|
+
const actual = (0, crypto_1.createHash)('sha256').update(binary).digest('hex');
|
|
54
|
+
if (actual !== expected) {
|
|
55
|
+
throw new Error(`checksum mismatch for ${fileName}: expected ${expected}, got ${actual}`);
|
|
56
|
+
}
|
|
57
|
+
await (0, promises_1.mkdir)(CACHE_DIR, { recursive: true });
|
|
58
|
+
// written then renamed, so an interrupted download never leaves a broken binary in the cache
|
|
59
|
+
const tmpPath = `${binPath}.tmp`;
|
|
60
|
+
await (0, promises_1.writeFile)(tmpPath, binary);
|
|
61
|
+
await (0, promises_1.chmod)(tmpPath, 0o755);
|
|
62
|
+
await (0, promises_1.rename)(tmpPath, binPath);
|
|
63
|
+
return binPath;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2F0bGFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1CQSxzQ0FPQztBQWNELGtDQTBCQztBQWxFRCxtQ0FBb0M7QUFDcEMsMkJBQWdDO0FBQ2hDLDBDQUE4RDtBQUM5RCwrQkFBcUM7QUFDckMscUNBQWtDO0FBQ2xDLHVEQUF1RDtBQUUxQyxRQUFBLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztBQUU3QyxNQUFNLGNBQWMsR0FBRyxnQ0FBZ0MsQ0FBQztBQUN4RCx3RkFBd0Y7QUFDeEYsTUFBTSxTQUFTLEdBQUcsSUFBQSxjQUFPLEVBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUUvRCxNQUFNLFNBQVMsR0FBMkIsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUMvRSxNQUFNLEtBQUssR0FBMkIsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUV2RTs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUFlLEVBQUUsV0FBbUIsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFlLE9BQU8sQ0FBQyxJQUFJO0lBQzdHLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFFBQVEsSUFBSSxJQUFJLHVDQUF1QyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUNELE9BQU8sbUJBQW1CLEVBQUUsSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELEtBQUssVUFBVSxRQUFRLENBQUMsR0FBVztJQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQ0FBa0IsR0FBRSxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLDZCQUFxQixDQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLElBQUksSUFBQSxlQUFVLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsZUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDL0MsUUFBUSxDQUFDLEdBQUcsY0FBYyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxHQUFHLGNBQWMsSUFBSSxRQUFRLFNBQVMsQ0FBQztLQUNqRCxDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsY0FBYyxRQUFRLFNBQVMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsTUFBTSxJQUFBLGdCQUFLLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsNkZBQTZGO0lBQzdGLE1BQU0sT0FBTyxHQUFHLEdBQUcsT0FBTyxNQUFNLENBQUM7SUFDakMsTUFBTSxJQUFBLG9CQUFTLEVBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sSUFBQSxnQkFBSyxFQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QixNQUFNLElBQUEsaUJBQU0sRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0IsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGNobW9kLCBta2RpciwgcmVuYW1lLCB3cml0ZUZpbGUgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyByZWFkUGx1bWJpbmdDb25maWcgfSBmcm9tICcuL3BsdW1iaW5nLWNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUTEFTX1ZFUlNJT04gPSAnMS4zLjMnO1xuXG5jb25zdCBSRUxFQVNFX1NFUlZFUiA9ICdodHRwczovL3JlbGVhc2UuYXJpZ2EuaW8vYXRsYXMnO1xuLy8gcmVzb2x2ZWQgYXQgc3RhcnR1cDogY2hlY2stdW5zYXZlZCBjaGFuZ2VzIHRoZSBjd2QgdG8gYSB3b3JrdHJlZSB3aXRob3V0IG5vZGVfbW9kdWxlc1xuY29uc3QgQ0FDSEVfRElSID0gcmVzb2x2ZSgnLi9ub2RlX21vZHVsZXMvLmNhY2hlL2Q5LXBsdW1iaW5nJyk7XG5cbmNvbnN0IFBMQVRGT1JNUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgZGFyd2luOiAnZGFyd2luJywgbGludXg6ICdsaW51eCcgfTtcbmNvbnN0IEFSQ0hTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyB4NjQ6ICdhbWQ2NCcsIGFybTY0OiAnYXJtNjQnIH07XG5cbi8qKlxuICogTmFtZSBvZiB0aGUgQXRsYXMgcmVsZWFzZSBmaWxlLCBlLmcuIGF0bGFzLWNvbW11bml0eS1saW51eC1hbWQ2NC12MS4zLjNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0bGFzRmlsZU5hbWUodmVyc2lvbjogc3RyaW5nLCBwbGF0Zm9ybTogc3RyaW5nID0gcHJvY2Vzcy5wbGF0Zm9ybSwgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoKSB7XG4gIGNvbnN0IG9zID0gUExBVEZPUk1TW3BsYXRmb3JtXTtcbiAgY29uc3QgY3B1ID0gQVJDSFNbYXJjaF07XG4gIGlmICghb3MgfHwgIWNwdSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYXRsYXMgaXMgbm90IGF2YWlsYWJsZSBmb3IgJHtwbGF0Zm9ybX0tJHthcmNofSAoc3VwcG9ydGVkOiBkYXJ3aW4vbGludXgsIHg2NC9hcm02NClgKTtcbiAgfVxuICByZXR1cm4gYGF0bGFzLWNvbW11bml0eS0ke29zfS0ke2NwdX0tdiR7dmVyc2lvbn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZykge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBkb3dubG9hZCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgQXRsYXMgQ29tbXVuaXR5IEVkaXRpb24gYmluYXJ5IChBcGFjaGUgMi4wKSBpbiB0aGUgdmVyc2lvbiBjb25maWd1cmVkIGluIGQ5LXBsdW1iaW5nLmpzb24gYW5kIHJldHVybnMgaXRzIHBhdGguXG4gKiBUaGUgYmluYXJ5IGlzIGNhY2hlZCBpbiBub2RlX21vZHVsZXMvLmNhY2hlL2Q5LXBsdW1iaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXRsYXMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29uZmlnID0gcmVhZFBsdW1iaW5nQ29uZmlnKCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gYXRsYXNGaWxlTmFtZShjb25maWcuYXRsYXNWZXJzaW9uID8/IERFRkFVTFRfQVRMQVNfVkVSU0lPTik7XG4gIGNvbnN0IGJpblBhdGggPSBqb2luKENBQ0hFX0RJUiwgZmlsZU5hbWUpO1xuICBpZiAoZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgIHJldHVybiBiaW5QYXRoO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oYERvd25sb2FkaW5nICR7ZmlsZU5hbWV9YCk7XG4gIGNvbnN0IFtiaW5hcnksIGNoZWNrc3VtRmlsZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZG93bmxvYWQoYCR7UkVMRUFTRV9TRVJWRVJ9LyR7ZmlsZU5hbWV9YCksXG4gICAgZG93bmxvYWQoYCR7UkVMRUFTRV9TRVJWRVJ9LyR7ZmlsZU5hbWV9LnNoYTI1NmApLFxuICBdKTtcbiAgY29uc3QgZXhwZWN0ZWQgPSBjaGVja3N1bUZpbGUudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKVswXTtcbiAgY29uc3QgYWN0dWFsID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJpbmFyeSkuZGlnZXN0KCdoZXgnKTtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNoZWNrc3VtIG1pc21hdGNoIGZvciAke2ZpbGVOYW1lfTogZXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH1gKTtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKENBQ0hFX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIHdyaXR0ZW4gdGhlbiByZW5hbWVkLCBzbyBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZCBuZXZlciBsZWF2ZXMgYSBicm9rZW4gYmluYXJ5IGluIHRoZSBjYWNoZVxuICBjb25zdCB0bXBQYXRoID0gYCR7YmluUGF0aH0udG1wYDtcbiAgYXdhaXQgd3JpdGVGaWxlKHRtcFBhdGgsIGJpbmFyeSk7XG4gIGF3YWl0IGNobW9kKHRtcFBhdGgsIDBvNzU1KTtcbiAgYXdhaXQgcmVuYW1lKHRtcFBhdGgsIGJpblBhdGgpO1xuICByZXR1cm4gYmluUGF0aDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PolicyJson } from '@cedar-policy/cedar-wasm/nodejs';
|
|
2
|
+
/**
|
|
3
|
+
* Cedar's formatter for the policy head, our own layout for the conditions:
|
|
4
|
+
* operands of one logical level share an indentation, each nested level adds one,
|
|
5
|
+
* and the `&&` / `||` operator leads the line.
|
|
6
|
+
*/
|
|
7
|
+
export declare function policyToCedarText(policy: PolicyJson): string;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.policyToCedarText = policyToCedarText;
|
|
4
|
+
const cedar = require("@cedar-policy/cedar-wasm/nodejs");
|
|
5
|
+
const logger_1 = require("../../logger");
|
|
6
|
+
/** Width of one logical level: the operator column (`|| `) plus the base gap. */
|
|
7
|
+
const LEVEL_INDENT = ' '.repeat(5);
|
|
8
|
+
function booleanOperator(expr) {
|
|
9
|
+
const key = Object.keys(expr)[0];
|
|
10
|
+
return key === '&&' || key === '||' ? key : undefined;
|
|
11
|
+
}
|
|
12
|
+
/** Cedar's text for a policy with `All` scopes and a single `when` clause. */
|
|
13
|
+
const LEAF_PREFIX = 'permit(principal, action, resource) when { ';
|
|
14
|
+
const LEAF_SUFFIX = ' };';
|
|
15
|
+
/** Any non-boolean expression, printed by Cedar itself. */
|
|
16
|
+
function leafToText(expr) {
|
|
17
|
+
const result = cedar.policyToText({
|
|
18
|
+
effect: 'permit',
|
|
19
|
+
principal: { op: 'All' },
|
|
20
|
+
action: { op: 'All' },
|
|
21
|
+
resource: { op: 'All' },
|
|
22
|
+
conditions: [{ kind: 'when', body: expr }],
|
|
23
|
+
});
|
|
24
|
+
if (result.type === 'failure') {
|
|
25
|
+
logger_1.logger.error({ expr }, 'failed to transform expression into text');
|
|
26
|
+
throw new Error(result.errors);
|
|
27
|
+
}
|
|
28
|
+
return result.text.slice(LEAF_PREFIX.length, -LEAF_SUFFIX.length);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Lines of `expr` within a group of `parent`, each starting with a 3-character
|
|
32
|
+
* operator column; a nested group (other operator) goes one level deeper in parentheses.
|
|
33
|
+
*/
|
|
34
|
+
function toLines(expr, parent) {
|
|
35
|
+
const operator = booleanOperator(expr);
|
|
36
|
+
if (!operator)
|
|
37
|
+
return [` ${leafToText(expr)}`];
|
|
38
|
+
// the top level (no parent) is a group without parentheses
|
|
39
|
+
if (parent && operator !== parent) {
|
|
40
|
+
return [' (', ...toLines(expr, operator).map((line) => LEVEL_INDENT + line), ' )'];
|
|
41
|
+
}
|
|
42
|
+
// the operator joins the two sides, on the line where the right side starts
|
|
43
|
+
const [first, ...rest] = toLines(expr[operator].right, operator);
|
|
44
|
+
return [...toLines(expr[operator].left, operator), `${operator} ${first.slice(3)}`, ...rest];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Cedar's formatter for the policy head, our own layout for the conditions:
|
|
48
|
+
* operands of one logical level share an indentation, each nested level adds one,
|
|
49
|
+
* and the `&&` / `||` operator leads the line.
|
|
50
|
+
*/
|
|
51
|
+
function policyToCedarText(policy) {
|
|
52
|
+
const head = cedar.policyToText({ ...policy, conditions: [] });
|
|
53
|
+
if (head.type === 'failure') {
|
|
54
|
+
logger_1.logger.error({ policy }, 'failed to transform policy into text');
|
|
55
|
+
throw new Error(head.errors);
|
|
56
|
+
}
|
|
57
|
+
const formattedHead = cedar.formatPolicies({
|
|
58
|
+
policyText: head.text,
|
|
59
|
+
lineWidth: 100,
|
|
60
|
+
indentWidth: 2,
|
|
61
|
+
});
|
|
62
|
+
if (formattedHead.type === 'failure') {
|
|
63
|
+
throw new Error(formattedHead);
|
|
64
|
+
}
|
|
65
|
+
// a policy without conditions is formatted as `…;\n`
|
|
66
|
+
const lines = [formattedHead.formatted_policy.slice(0, -2)];
|
|
67
|
+
// translateToCedar writes at most one `when` clause
|
|
68
|
+
const [condition] = policy.conditions;
|
|
69
|
+
if (condition) {
|
|
70
|
+
const when = toLines(condition.body);
|
|
71
|
+
lines.push(['when {', ...when.map((line) => ` ${line}`), '}'].join('\n'));
|
|
72
|
+
}
|
|
73
|
+
return lines.join('\n') + ';';
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jZWRhci9jZWRhci1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxREEsOENBeUJDO0FBOUVELHlEQUF5RDtBQUV6RCx5Q0FBc0M7QUFFdEMsaUZBQWlGO0FBQ2pGLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbkMsU0FBUyxlQUFlLENBQUMsSUFBUztJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sV0FBVyxHQUFHLDZDQUE2QyxDQUFDO0FBQ2xFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQiwyREFBMkQ7QUFDM0QsU0FBUyxVQUFVLENBQUMsSUFBUztJQUMzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDeEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNyQixRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ3ZCLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLGVBQU0sQ0FBQyxL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QUFDLENBQy9ELENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2VkYXIgZnJvbSAnQGNlZGFyLXBvbGljeS9jZWRhci13YXNtL25vZGVqcyc7XG5pbXBvcnQgdHlwZSB7IFBvbGljeUpzb24gfSBmcm9tICdAY2VkYXItcG9saWN5L2NlZGFyLXdhc20vbm9kZWpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5cbi8qKiBXaWR0aCBvZiBvbmUgbG9naWNhbCBsZXZlbDogdGhlIG9wZXJhdG9yIGNvbHVtbiAoYHx8IGApIHBsdXMgdGhlIGJhc2UgZ2FwLiAqL1xuY29uc3QgTEVWRUxfSU5ERU5UID0gJyAnLnJlcGVhdCg1KTtcblxuZnVuY3Rpb24gYm9vbGVhbk9wZXJhdG9yKGV4cHI6IGFueSk6ICcmJicgfCAnfHwnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZXhwcilbMF07XG4gIHJldHVybiBrZXkgPT09ICcmJicgfHwga2V5ID09PSAnfHwnID8ga2V5IDogdW5kZWZpbmVkO1xufVxuXG4vKiogQ2VkYXIncyB0ZXh0IGZvciBhIHBvbGljeSB3aXRoIGBBbGxgIHNjb3BlcyBhbmQgYSBzaW5nbGUgYHdoZW5gIGNsYXVzZS4gKi9cbmNvbnN0IExFQUZfUFJFRklYID0gJ3Blcm1pdChwcmluY2lwYWwsIGFjdGlvbiwgcmVzb3VyY2UpIHdoZW4geyAnO1xuY29uc3QgTEVBRl9TVUZGSVggPSAnIH07JztcblxuLyoqIEFueSBub24tYm9vbGVhbiBleHByZXNzaW9uLCBwcmludGVkIGJ5IENlZGFyIGl0c2VsZi4gKi9cbmZ1bmN0aW9uIGxlYWZUb1RleHQoZXhwcjogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gY2VkYXIucG9saWN5VG9UZXh0KHtcbiAgICBlZmZlY3Q6ICdwZXJtaXQnLFxuICAgIHByaW5jaXBhbDogeyBvcDogJ0FsbCcgfSxcbiAgICBhY3Rpb246IHsgb3A6ICdBbGwnIH0sXG4gICAgcmVzb3VyY2U6IHsgb3A6ICdBbGwnIH0sXG4gICAgY29uZGl0aW9uczogW3sga2luZDogJ3doZW4nLCBib2R5OiBleHByIH1dLFxuICB9KTtcbiAgaWYgKHJlc3VsdC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBleHByIH0sICdmYWlsZWQgdG8gdHJhbnNmb3JtIGV4cHJlc3Npb24gaW50byB0ZXh0Jyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvcnMgYXMgYW55KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnRleHQuc2xpY2UoTEVBRl9QUkVGSVgubGVuZ3RoLCAtTEVBRl9TVUZGSVgubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBMaW5lcyBvZiBgZXhwcmAgd2l0aGluIGEgZ3JvdXAgb2YgYHBhcmVudGAsIGVhY2ggc3RhcnRpbmcgd2l0aCBhIDMtY2hhcmFjdGVyXG4gKiBvcGVyYXRvciBjb2x1bW47IGEgbmVzdGVkIGdyb3VwIChvdGhlciBvcGVyYXRvcikgZ29lcyBvbmUgbGV2ZWwgZGVlcGVyIGluIHBhcmVudGhlc2VzLlxuICovXG5mdW5jdGlvbiB0b0xpbmVzKGV4cHI6IGFueSwgcGFyZW50Pzogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBvcGVyYXRvciA9IGJvb2xlYW5PcGVyYXRvcihleHByKTtcbiAgaWYgKCFvcGVyYXRvcikgcmV0dXJuIFtgICAgJHtsZWFmVG9UZXh0KGV4cHIpfWBdO1xuICAvLyB0aGUgdG9wIGxldmVsIChubyBwYXJlbnQpIGlzIGEgZ3JvdXAgd2l0aG91dCBwYXJlbnRoZXNlc1xuICBpZiAocGFyZW50ICYmIG9wZXJhdG9yICE9PSBwYXJlbnQpIHtcbiAgICByZXR1cm4gWycgICAoJywgLi4udG9MaW5lcyhleHByLCBvcGVyYXRvcikubWFwKChsaW5lKSA9PiBMRVZFTF9JTkRFTlQgKyBsaW5lKSwgJyAgICknXTtcbiAgfVxuICAvLyB0aGUgb3BlcmF0b3Igam9pbnMgdGhlIHR3byBzaWRlcywgb24gdGhlIGxpbmUgd2hlcmUgdGhlIHJpZ2h0IHNpZGUgc3RhcnRzXG4gIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSB0b0xpbmVzKGV4cHJbb3BlcmF0b3JdLnJpZ2h0LCBvcGVyYXRvcik7XG4gIHJldHVybiBbLi4udG9MaW5lcyhleHByW29wZXJhdG9yXS5sZWZ0LCBvcGVyYXRvciksIGAke29wZXJhdG9yfSAke2ZpcnN0IS5zbGljZSgzKX1gLCAuLi5yZXN0XTtcbn1cblxuLyoqXG4gKiBDZWRhcidzIGZvcm1hdHRlciBmb3IgdGhlIHBvbGljeSBoZWFkLCBvdXIgb3duIGxheW91dCBmb3IgdGhlIGNvbmRpdGlvbnM6XG4gKiBvcGVyYW5kcyBvZiBvbmUgbG9naWNhbCBsZXZlbCBzaGFyZSBhbiBpbmRlbnRhdGlvbiwgZWFjaCBuZXN0ZWQgbGV2ZWwgYWRkcyBvbmUsXG4gKiBhbmQgdGhlIGAmJmAgLyBgfHxgIG9wZXJhdG9yIGxlYWRzIHRoZSBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9saWN5VG9DZWRhclRleHQocG9saWN5OiBQb2xpY3lKc29uKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZCA9IGNlZGFyLnBvbGljeVRvVGV4dCh7IC4uLnBvbGljeSwgY29uZGl0aW9uczogW10gfSk7XG4gIGlmIChoZWFkLnR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgIGxvZ2dlci5lcnJvcih7IHBvbGljeSB9LCAnZmFpbGVkIHRvIHRyYW5zZm9ybSBwb2xpY3kgaW50byB0ZXh0Jyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGhlYWQuZXJyb3JzIGFzIGFueSk7XG4gIH1cbiAgY29uc3QgZm9ybWF0dGVkSGVhZCA9IGNlZGFyLmZvcm1hdFBvbGljaWVzKHtcbiAgICBwb2xpY3lUZXh0OiBoZWFkLnRleHQsXG4gICAgbGluZVdpZHRoOiAxMDAsXG4gICAgaW5kZW50V2lkdGg6IDIsXG4gIH0pO1xuICBpZiAoZm9ybWF0dGVkSGVhZC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0dGVkSGVhZCBhcyBhbnkpO1xuICB9XG4gIC8vIGEgcG9saWN5IHdpdGhvdXQgY29uZGl0aW9ucyBpcyBmb3JtYXR0ZWQgYXMgYOKApjtcXG5gXG4gIGNvbnN0IGxpbmVzID0gW2Zvcm1hdHRlZEhlYWQuZm9ybWF0dGVkX3BvbGljeS5zbGljZSgwLCAtMildO1xuICAvLyB0cmFuc2xhdGVUb0NlZGFyIHdyaXRlcyBhdCBtb3N0IG9uZSBgd2hlbmAgY2xhdXNlXG4gIGNvbnN0IFtjb25kaXRpb25dID0gcG9saWN5LmNvbmRpdGlvbnM7XG4gIGlmIChjb25kaXRpb24pIHtcbiAgICBjb25zdCB3aGVuID0gdG9MaW5lcyhjb25kaXRpb24uYm9keSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIFsnd2hlbiB7JywgLi4ud2hlbi5tYXAoKGxpbmUpID0+IGAgICR7bGluZX1gKSwgJ30nXS5qb2luKCdcXG4nKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKSArICc7Jztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConditionSubject } from './cedar-translations';
|
|
2
|
+
import type { Filter } from './d9-permission';
|
|
3
|
+
/** Inverse of `addWhenClauses`: a Cedar Expr tree back into a D9 filter. */
|
|
4
|
+
export declare function exprToFilter(expr?: any, subject?: ConditionSubject): Filter;
|
|
5
|
+
/** Field list from a check-fields policy's `containsAll` clause. */
|
|
6
|
+
export declare function extractFields(expr: any): string[];
|
|
7
|
+
/** Inverse of `refactoPolicies`: expand `action in [...]` into one tuple each. */
|
|
8
|
+
export declare function expandPolicy(policy: any): Array<{
|
|
9
|
+
collection: string;
|
|
10
|
+
action: string;
|
|
11
|
+
conditions: any[];
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exprToFilter = exprToFilter;
|
|
4
|
+
exports.extractFields = extractFields;
|
|
5
|
+
exports.expandPolicy = expandPolicy;
|
|
6
|
+
function rightToValue(right) {
|
|
7
|
+
if (right?.Var === 'principal')
|
|
8
|
+
return '$CURRENT_USER';
|
|
9
|
+
if (right?.Value !== undefined)
|
|
10
|
+
return right.Value;
|
|
11
|
+
throw new Error(`Unsupported right-hand Cedar expression: ${JSON.stringify(right)}`);
|
|
12
|
+
}
|
|
13
|
+
function pathToFilter(node, subject, leaf) {
|
|
14
|
+
let acc = leaf;
|
|
15
|
+
let cur = node;
|
|
16
|
+
if (subject === 'context.newValue') {
|
|
17
|
+
while (cur && cur['.']) {
|
|
18
|
+
const { left, attr } = cur['.'];
|
|
19
|
+
// Reached the `context.newValue` base: stop without wrapping `newValue`.
|
|
20
|
+
if (attr === 'newValue' && left?.Var === 'context')
|
|
21
|
+
return acc;
|
|
22
|
+
acc = { [attr]: acc };
|
|
23
|
+
cur = left;
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`Unexpected context.newValue base path: ${JSON.stringify(node)}`);
|
|
26
|
+
}
|
|
27
|
+
while (cur && cur['.']) {
|
|
28
|
+
acc = { [cur['.'].attr]: acc };
|
|
29
|
+
cur = cur['.'].left;
|
|
30
|
+
}
|
|
31
|
+
if (!(cur && cur.Var === 'resource')) {
|
|
32
|
+
throw new Error(`Unexpected resource base path: ${JSON.stringify(node)}`);
|
|
33
|
+
}
|
|
34
|
+
return acc;
|
|
35
|
+
}
|
|
36
|
+
function patternToOperation(pattern) {
|
|
37
|
+
// Cedar splits a `like` pattern into per-character Literal elements.
|
|
38
|
+
const value = pattern
|
|
39
|
+
.filter((p) => p !== 'Wildcard')
|
|
40
|
+
.map((p) => p.Literal)
|
|
41
|
+
.join('');
|
|
42
|
+
const startsWildcard = pattern[0] === 'Wildcard';
|
|
43
|
+
const endsWildcard = pattern[pattern.length - 1] === 'Wildcard';
|
|
44
|
+
if (startsWildcard && endsWildcard)
|
|
45
|
+
return { operator: '_contains', value };
|
|
46
|
+
if (endsWildcard)
|
|
47
|
+
return { operator: '_starts_with', value };
|
|
48
|
+
if (startsWildcard)
|
|
49
|
+
return { operator: '_ends_with', value };
|
|
50
|
+
throw new Error(`Unsupported like pattern: ${JSON.stringify(pattern)}`);
|
|
51
|
+
}
|
|
52
|
+
const COMPARISON_OPS = {
|
|
53
|
+
'==': '_eq',
|
|
54
|
+
'!=': '_neq',
|
|
55
|
+
'>': '_gt',
|
|
56
|
+
'>=': '_gte',
|
|
57
|
+
'<': '_lt',
|
|
58
|
+
'<=': '_lte',
|
|
59
|
+
};
|
|
60
|
+
/** Inverse of `addWhenClauses`: a Cedar Expr tree back into a D9 filter. */
|
|
61
|
+
function exprToFilter(expr, subject = 'resource') {
|
|
62
|
+
if (!expr)
|
|
63
|
+
return {};
|
|
64
|
+
const key = Object.keys(expr)[0];
|
|
65
|
+
const node = expr[key];
|
|
66
|
+
if (key === '&&' || key === '||') {
|
|
67
|
+
const operator = key === '&&' ? '_and' : '_or';
|
|
68
|
+
const left = exprToFilter(node.left, subject);
|
|
69
|
+
const right = exprToFilter(node.right, subject);
|
|
70
|
+
const operands = [left[operator] ?? left, right[operator] ?? right].flat();
|
|
71
|
+
return { [operator]: operands };
|
|
72
|
+
}
|
|
73
|
+
if (key === 'has') {
|
|
74
|
+
return pathToFilter(node.left, subject, { [node.attr]: { _nnull: true } });
|
|
75
|
+
}
|
|
76
|
+
if (key === '!') {
|
|
77
|
+
const arg = node.arg;
|
|
78
|
+
if (arg && arg.has) {
|
|
79
|
+
return pathToFilter(arg.has.left, subject, {
|
|
80
|
+
[arg.has.attr]: { _null: true },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
throw new Error(`Unsupported negation expression: ${JSON.stringify(expr)}`);
|
|
84
|
+
}
|
|
85
|
+
if (key === 'like') {
|
|
86
|
+
const { operator, value } = patternToOperation(node.pattern);
|
|
87
|
+
return pathToFilter(node.left, subject, { [operator]: value });
|
|
88
|
+
}
|
|
89
|
+
if (key in COMPARISON_OPS) {
|
|
90
|
+
return pathToFilter(node.left, subject, {
|
|
91
|
+
[COMPARISON_OPS[key]]: rightToValue(node.right),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Unsupported Cedar expression operator: ${key}`);
|
|
95
|
+
}
|
|
96
|
+
/** Field list from a check-fields policy's `containsAll` clause. */
|
|
97
|
+
function extractFields(expr) {
|
|
98
|
+
const left = expr?.containsAll?.left;
|
|
99
|
+
// A literal array is normalized by Cedar into a Set of Value elements.
|
|
100
|
+
if (Array.isArray(left?.Set))
|
|
101
|
+
return left.Set.map((e) => e.Value);
|
|
102
|
+
if (Array.isArray(left?.Value))
|
|
103
|
+
return left.Value;
|
|
104
|
+
throw new Error(`Unexpected check-fields policy shape: ${JSON.stringify(expr)}`);
|
|
105
|
+
}
|
|
106
|
+
/** Inverse of `refactoPolicies`: expand `action in [...]` into one tuple each. */
|
|
107
|
+
function expandPolicy(policy) {
|
|
108
|
+
const action = policy.action;
|
|
109
|
+
let entities = [];
|
|
110
|
+
if (action.op === '==') {
|
|
111
|
+
entities = [action.entity];
|
|
112
|
+
}
|
|
113
|
+
else if (action.op === 'in') {
|
|
114
|
+
// Cedar parses a single-element `action in [X]` as `{ op: 'in', entity }`
|
|
115
|
+
entities = action.entities ?? [action.entity];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// returning no tuple would silently remove the matching rows from the CSV
|
|
119
|
+
throw new Error(`Unexpected action constraint: ${JSON.stringify(action)}`);
|
|
120
|
+
}
|
|
121
|
+
return entities.map((e) => {
|
|
122
|
+
const ent = e;
|
|
123
|
+
return {
|
|
124
|
+
collection: ent.type.replace(/^Db::/, '').replace(/::Action$/, ''),
|
|
125
|
+
action: ent.id,
|
|
126
|
+
conditions: policy.conditions ?? [],
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItdG8tZDktdHJhbnNsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jZWRhci9jZWRhci10by1kOS10cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvRUEsb0NBMENDO0FBR0Qsc0NBUUM7QUFHRCxvQ0FzQkM7QUE3SUQsU0FBUyxZQUFZLENBQUMsS0FBVTtJQUM5QixJQUFJLEtBQUssRUFBRSxHQUFHLEtBQUssV0FBVztRQUFFLE9BQU8sZUFBZSxDQUFDO0lBQ3ZELElBQUksS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsNENBQTRDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDcEUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsSUFBUyxFQUNULE9BQXlCLEVBQ3pCLElBQXlCO0lBRXpCLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFFZixJQUFJLE9BQU8sS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLHlFQUF5RTtZQUN6RSxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxTQUFTO2dCQUFFLE9BQU8sR0FBRyxDQUFDO1lBQy9ELEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDdEIsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLElB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O1FBQzlCLDBFQUEwRTtRQUMxRSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO1NBQU0sQ0FBQztRQUNOLDBFQUEwRTtRQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxHQUFHLEdBQUcsQ0FBYyxDQUFDO1FBQzNCLE9BQU87WUFDTCxVQUFVLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNkLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7U0FDcEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmRpdGlvblN1YmplY3QgfSBmcm9tICcuL2NlZGFyLXRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEZpbHRlciB9IGZyb20gJy4vZDktcGVybWlzc2lvbic7XG5cbnR5cGUgRW50aXR5UmVmID0geyB0eXBlOiBzdHJpbmc7IGlkOiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gcmlnaHRUb1ZhbHVlKHJpZ2h0OiBhbnkpOiBhbnkge1xuICBpZiAocmlnaHQ/LlZhciA9PT0gJ3ByaW5jaXBhbCcpIHJldHVybiAnJENVUlJFTlRfVVNFUic7XG4gIGlmIChyaWdodD8uVmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJpZ2h0LlZhbHVlO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuc3VwcG9ydGVkIHJpZ2h0LWhhbmQgQ2VkYXIgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShyaWdodCl9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGF0aFRvRmlsdGVyKFxuICBub2RlOiBhbnksXG4gIHN1YmplY3Q6IENvbmRpdGlvblN1YmplY3QsXG4gIGxlYWY6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pOiBGaWx0ZXIge1xuICBsZXQgYWNjOiBhbnkgPSBsZWFmO1xuICBsZXQgY3VyID0gbm9kZTtcblxuICBpZiAoc3ViamVjdCA9PT0gJ2NvbnRleHQubmV3VmFsdWUnKSB7XG4gICAgd2hpbGUgKGN1ciAmJiBjdXJbJy4nXSkge1xuICAgICAgY29uc3QgeyBsZWZ0LCBhdHRyIH0gPSBjdXJbJy4nXTtcbiAgICAgIC8vIFJlYWNoZWQgdGhlIGBjb250ZXh0Lm5ld1ZhbHVlYCBiYXNlOiBzdG9wIHdpdGhvdXQgd3JhcHBpbmcgYG5ld1ZhbHVlYC5cbiAgICAgIGlmIChhdHRyID09PSAnbmV3VmFsdWUnICYmIGxlZnQ/LlZhciA9PT0gJ2NvbnRleHQnKSByZXR1cm4gYWNjO1xuICAgICAgYWNjID0geyBbYXR0cl06IGFjYyB9O1xuICAgICAgY3VyID0gbGVmdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgY29udGV4dC5uZXdWYWx1ZSBiYXNlIHBhdGg6ICR7SlNPTi5zdHJpbmdpZnkobm9kZSl9YCxcbiAgICApO1xuICB9XG5cbiAgd2hpbGUgKGN1ciAmJiBjdXJbJy4nXSkge1xuICAgIGFjYyA9IHsgW2N1clsnLiddLmF0dHJdOiBhY2MgfTtcbiAgICBjdXIgPSBjdXJbJy4nXS5sZWZ0O1xuICB9XG4gIGlmICghKGN1ciAmJiBjdXIuVmFyID09PSAncmVzb3VyY2UnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNvdXJjZSBiYXNlIHBhdGg6ICR7SlNPTi5zdHJpbmdpZnkobm9kZSl9YCk7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn1cblxuZnVuY3Rpb24gcGF0dGVyblRvT3BlcmF0aW9uKHBhdHRlcm46IGFueVtdKTogeyBvcGVyYXRvcjogc3RyaW5nOyB2YWx1ZTogYW55IH0ge1xuICAvLyBDZWRhciBzcGxpdHMgYSBgbGlrZWAgcGF0dGVybiBpbnRvIHBlci1jaGFyYWN0ZXIgTGl0ZXJhbCBlbGVtZW50cy5cbiAgY29uc3QgdmFsdWUgPSBwYXR0ZXJuXG4gICAgLmZpbHRlcigocCkgPT4gcCAhPT0gJ1dpbGRjYXJkJylcbiAgICAubWFwKChwKSA9PiBwLkxpdGVyYWwpXG4gICAgLmpvaW4oJycpO1xuICBjb25zdCBzdGFydHNXaWxkY2FyZCA9IHBhdHRlcm5bMF0gPT09ICdXaWxkY2FyZCc7XG4gIGNvbnN0IGVuZHNXaWxkY2FyZCA9IHBhdHRlcm5bcGF0dGVybi5sZW5ndGggLSAxXSA9PT0gJ1dpbGRjYXJkJztcbiAgaWYgKHN0YXJ0c1dpbGRjYXJkICYmIGVuZHNXaWxkY2FyZCkgcmV0dXJuIHsgb3BlcmF0b3I6ICdfY29udGFpbnMnLCB2YWx1ZSB9O1xuICBpZiAoZW5kc1dpbGRjYXJkKSByZXR1cm4geyBvcGVyYXRvcjogJ19zdGFydHNfd2l0aCcsIHZhbHVlIH07XG4gIGlmIChzdGFydHNXaWxkY2FyZCkgcmV0dXJuIHsgb3BlcmF0b3I6ICdfZW5kc193aXRoJywgdmFsdWUgfTtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsaWtlIHBhdHRlcm46ICR7SlNPTi5zdHJpbmdpZnkocGF0dGVybil9YCk7XG59XG5cbmNvbnN0IENPTVBBUklTT05fT1BTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnPT0nOiAnX2VxJyxcbiAgJyE9JzogJ19uZXEnLFxuICAnPic6ICdfZ3QnLFxuICAnPj0nOiAnX2d0ZScsXG4gICc8JzogJ19sdCcsXG4gICc8PSc6ICdfbHRlJyxcbn07XG5cbi8qKiBJbnZlcnNlIG9mIGBhZGRXaGVuQ2xhdXNlc2A6IGEgQ2VkYXIgRXhwciB0cmVlIGJhY2sgaW50byBhIEQ5IGZpbHRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHByVG9GaWx0ZXIoXG4gIGV4cHI/OiBhbnksXG4gIHN1YmplY3Q6IENvbmRpdGlvblN1YmplY3QgPSAncmVzb3VyY2UnLFxuKTogRmlsdGVyIHtcbiAgaWYgKCFleHByKSByZXR1cm4ge307XG4gIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGV4cHIpWzBdITtcbiAgY29uc3Qgbm9kZSA9IChleHByIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG5cbiAgaWYgKGtleSA9PT0gJyYmJyB8fCBrZXkgPT09ICd8fCcpIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IGtleSA9PT0gJyYmJyA/ICdfYW5kJyA6ICdfb3InO1xuICAgIGNvbnN0IGxlZnQgPSBleHByVG9GaWx0ZXIobm9kZS5sZWZ0LCBzdWJqZWN0KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHJpZ2h0ID0gZXhwclRvRmlsdGVyKG5vZGUucmlnaHQsIHN1YmplY3QpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3Qgb3BlcmFuZHMgPSBbbGVmdFtvcGVyYXRvcl0gPz8gbGVmdCwgcmlnaHRbb3BlcmF0b3JdID8/IHJpZ2h0XS5mbGF0KCk7XG4gICAgcmV0dXJuIHsgW29wZXJhdG9yXTogb3BlcmFuZHMgfSBhcyBGaWx0ZXI7XG4gIH1cblxuICBpZiAoa2V5ID09PSAnaGFzJykge1xuICAgIHJldHVybiBwYXRoVG9GaWx0ZXIobm9kZS5sZWZ0LCBzdWJqZWN0LCB7IFtub2RlLmF0dHJdOiB7IF9ubnVsbDogdHJ1ZSB9IH0pO1xuICB9XG5cbiAgaWYgKGtleSA9PT0gJyEnKSB7XG4gICAgY29uc3QgYXJnID0gbm9kZS5hcmc7XG4gICAgaWYgKGFyZyAmJiBhcmcuaGFzKSB7XG4gICAgICByZXR1cm4gcGF0aFRvRmlsdGVyKGFyZy5oYXMubGVmdCwgc3ViamVjdCwge1xuICAgICAgICBbYXJnLmhhcy5hdHRyXTogeyBfbnVsbDogdHJ1ZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbmVnYXRpb24gZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHByKX1gKTtcbiAgfVxuXG4gIGlmIChrZXkgPT09ICdsaWtlJykge1xuICAgIGNvbnN0IHsgb3BlcmF0b3IsIHZhbHVlIH0gPSBwYXR0ZXJuVG9PcGVyYXRpb24obm9kZS5wYXR0ZXJuKTtcbiAgICByZXR1cm4gcGF0aFRvRmlsdGVyKG5vZGUubGVmdCwgc3ViamVjdCwgeyBbb3BlcmF0b3JdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGlmIChrZXkgaW4gQ09NUEFSSVNPTl9PUFMpIHtcbiAgICByZXR1cm4gcGF0aFRvRmlsdGVyKG5vZGUubGVmdCwgc3ViamVjdCwge1xuICAgICAgW0NPTVBBUklTT05fT1BTW2tleV0hXTogcmlnaHRUb1ZhbHVlKG5vZGUucmlnaHQpLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBDZWRhciBleHByZXNzaW9uIG9wZXJhdG9yOiAke2tleX1gKTtcbn1cblxuLyoqIEZpZWxkIGxpc3QgZnJvbSBhIGNoZWNrLWZpZWxkcyBwb2xpY3kncyBgY29udGFpbnNBbGxgIGNsYXVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RmllbGRzKGV4cHI6IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGVmdCA9IGV4cHI/LmNvbnRhaW5zQWxsPy5sZWZ0O1xuICAvLyBBIGxpdGVyYWwgYXJyYXkgaXMgbm9ybWFsaXplZCBieSBDZWRhciBpbnRvIGEgU2V0IG9mIFZhbHVlIGVsZW1lbnRzLlxuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0Py5TZXQpKSByZXR1cm4gbGVmdC5TZXQubWFwKChlOiBhbnkpID0+IGUuVmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0Py5WYWx1ZSkpIHJldHVybiBsZWZ0LlZhbHVlO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuZXhwZWN0ZWQgY2hlY2stZmllbGRzIHBvbGljeSBzaGFwZTogJHtKU09OLnN0cmluZ2lmeShleHByKX1gLFxuICApO1xufVxuXG4vKiogSW52ZXJzZSBvZiBgcmVmYWN0b1BvbGljaWVzYDogZXhwYW5kIGBhY3Rpb24gaW4gWy4uLl1gIGludG8gb25lIHR1cGxlIGVhY2guICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kUG9saWN5KFxuICBwb2xpY3k6IGFueSxcbik6IEFycmF5PHsgY29sbGVjdGlvbjogc3RyaW5nOyBhY3Rpb246IHN0cmluZzsgY29uZGl0aW9uczogYW55W10gfT4ge1xuICBjb25zdCBhY3Rpb24gPSBwb2xpY3kuYWN0aW9uO1xuICBsZXQgZW50aXRpZXM6IGFueVtdID0gW107XG4gIGlmIChhY3Rpb24ub3AgPT09ICc9PScpIHtcbiAgICBlbnRpdGllcyA9IFthY3Rpb24uZW50aXR5XTtcbiAgfSBlbHNlIGlmIChhY3Rpb24ub3AgPT09ICdpbicpIHtcbiAgICAvLyBDZWRhciBwYXJzZXMgYSBzaW5nbGUtZWxlbWVudCBgYWN0aW9uIGluIFtYXWAgYXMgYHsgb3A6ICdpbicsIGVudGl0eSB9YFxuICAgIGVudGl0aWVzID0gYWN0aW9uLmVudGl0aWVzID8/IFthY3Rpb24uZW50aXR5XTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXR1cm5pbmcgbm8gdHVwbGUgd291bGQgc2lsZW50bHkgcmVtb3ZlIHRoZSBtYXRjaGluZyByb3dzIGZyb20gdGhlIENTVlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhY3Rpb24gY29uc3RyYWludDogJHtKU09OLnN0cmluZ2lmeShhY3Rpb24pfWApO1xuICB9XG4gIHJldHVybiBlbnRpdGllcy5tYXAoKGUpID0+IHtcbiAgICBjb25zdCBlbnQgPSBlIGFzIEVudGl0eVJlZjtcbiAgICByZXR1cm4ge1xuICAgICAgY29sbGVjdGlvbjogZW50LnR5cGUucmVwbGFjZSgvXkRiOjovLCAnJykucmVwbGFjZSgvOjpBY3Rpb24kLywgJycpLFxuICAgICAgYWN0aW9uOiBlbnQuaWQsXG4gICAgICBjb25kaXRpb25zOiBwb2xpY3kuY29uZGl0aW9ucyA/PyBbXSxcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { D9Permission } from './d9-permission';
|
|
2
|
+
import { RolesTable } from './roles-table';
|
|
3
|
+
/** Map keyed by a tuple of strings (Map indexes arrays by identity, hence the join). */
|
|
4
|
+
declare class TupleKeyMap<Value> {
|
|
5
|
+
private readonly createValue?;
|
|
6
|
+
private readonly entries;
|
|
7
|
+
/** `createValue` is required to use {@link getOrCreate}; omit it for a plain get/set map. */
|
|
8
|
+
constructor(createValue?: ((parts: string[]) => Value) | undefined);
|
|
9
|
+
private keyOf;
|
|
10
|
+
get(parts: string[]): Value | undefined;
|
|
11
|
+
set(parts: string[], value: Value): void;
|
|
12
|
+
delete(parts: string[]): void;
|
|
13
|
+
/** Return the value for `parts`, creating and storing it via the factory if absent. */
|
|
14
|
+
getOrCreate(parts: string[]): Value;
|
|
15
|
+
values(): Value[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Reverse of d9-to-cedar: reads the per-role Cedar policy files back into D9
|
|
19
|
+
* permission rows and merges them into directus_permissions.csv. The original
|
|
20
|
+
* CSV stays the source of truth for the columns Cedar does not carry (`id`,
|
|
21
|
+
* `role` UUID, `presets`); only `permissions`/`fields`/`validation` are rewritten.
|
|
22
|
+
*/
|
|
23
|
+
export declare class CedarToD9Manager {
|
|
24
|
+
permissionPath: string;
|
|
25
|
+
sqlPath: string;
|
|
26
|
+
outputPath: string;
|
|
27
|
+
roles: RolesTable;
|
|
28
|
+
baseRowsByTuple: TupleKeyMap<Record<string, string>>;
|
|
29
|
+
header: string[];
|
|
30
|
+
nextId: number;
|
|
31
|
+
reconstructed: D9Permission[];
|
|
32
|
+
constructor(opts?: {
|
|
33
|
+
permissionPath?: string;
|
|
34
|
+
sqlPath?: string;
|
|
35
|
+
outputPath?: string;
|
|
36
|
+
});
|
|
37
|
+
readBasePermissionFile(): Promise<void>;
|
|
38
|
+
readRoleFile(): Promise<void>;
|
|
39
|
+
/** Read one `.cedar` file into expanded (collection, action, conditions) tuples. */
|
|
40
|
+
parseCedarFile(filePath: string): Promise<Array<{
|
|
41
|
+
collection: string;
|
|
42
|
+
action: string;
|
|
43
|
+
conditions: any[];
|
|
44
|
+
}>>;
|
|
45
|
+
parseRoleFolder(roleName: string): Promise<D9Permission[]>;
|
|
46
|
+
parseAllFolders(): Promise<void>;
|
|
47
|
+
mergeIntoRows(): void;
|
|
48
|
+
writeOutput(): Promise<void>;
|
|
49
|
+
readCedarAndWriteCsv(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/** CLI action: merge Cedar policies back into directus_permissions.csv. */
|
|
52
|
+
export declare function cedarToD9(options?: {
|
|
53
|
+
permissionPath?: string;
|
|
54
|
+
sqlPath?: string;
|
|
55
|
+
outputPath?: string;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
export {};
|