@wbce/projen-d9 0.0.28 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +184 -45
- package/API.md +153 -37
- package/CHANGELOG.md +13 -0
- package/README.md +10 -3
- package/docs/D9-plumbing.md +189 -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.js +39 -30
- 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 +33 -0
- package/lib/cli/commands/save/env.js +109 -0
- package/lib/cli/commands/save/save-snapshot.d.ts +9 -0
- package/lib/cli/commands/save/save-snapshot.js +232 -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 +96 -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 +65 -25
- package/lib/cli/logger.d.ts +2 -0
- package/lib/cli/logger.js +10 -0
- package/lib/cli/plumbing-config.d.ts +11 -0
- package/lib/cli/plumbing-config.js +13 -0
- package/lib/index.d.ts +44 -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
|
@@ -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 {};
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CedarToD9Manager = void 0;
|
|
4
|
+
exports.cedarToD9 = cedarToD9;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const cedar = require("@cedar-policy/cedar-wasm/nodejs");
|
|
8
|
+
const cedar_to_d9_translations_1 = require("./cedar-to-d9-translations");
|
|
9
|
+
const d9_permission_1 = require("./d9-permission");
|
|
10
|
+
const roles_table_1 = require("./roles-table");
|
|
11
|
+
const logger_1 = require("../../logger");
|
|
12
|
+
const utils_1 = require("../save/utils");
|
|
13
|
+
/** Map keyed by a tuple of strings (Map indexes arrays by identity, hence the join). */
|
|
14
|
+
class TupleKeyMap {
|
|
15
|
+
/** `createValue` is required to use {@link getOrCreate}; omit it for a plain get/set map. */
|
|
16
|
+
constructor(createValue) {
|
|
17
|
+
this.createValue = createValue;
|
|
18
|
+
this.entries = new Map();
|
|
19
|
+
}
|
|
20
|
+
keyOf(parts) {
|
|
21
|
+
return parts.join(' ');
|
|
22
|
+
}
|
|
23
|
+
get(parts) {
|
|
24
|
+
return this.entries.get(this.keyOf(parts));
|
|
25
|
+
}
|
|
26
|
+
set(parts, value) {
|
|
27
|
+
this.entries.set(this.keyOf(parts), value);
|
|
28
|
+
}
|
|
29
|
+
delete(parts) {
|
|
30
|
+
this.entries.delete(this.keyOf(parts));
|
|
31
|
+
}
|
|
32
|
+
/** Return the value for `parts`, creating and storing it via the factory if absent. */
|
|
33
|
+
getOrCreate(parts) {
|
|
34
|
+
const key = this.keyOf(parts);
|
|
35
|
+
let value = this.entries.get(key);
|
|
36
|
+
if (value === undefined) {
|
|
37
|
+
if (!this.createValue) {
|
|
38
|
+
throw new Error('TupleKeyMap.getOrCreate called without a factory');
|
|
39
|
+
}
|
|
40
|
+
value = this.createValue(parts);
|
|
41
|
+
this.entries.set(key, value);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
values() {
|
|
46
|
+
return [...this.entries.values()];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reverse of d9-to-cedar: reads the per-role Cedar policy files back into D9
|
|
51
|
+
* permission rows and merges them into directus_permissions.csv. The original
|
|
52
|
+
* CSV stays the source of truth for the columns Cedar does not carry (`id`,
|
|
53
|
+
* `role` UUID, `presets`); only `permissions`/`fields`/`validation` are rewritten.
|
|
54
|
+
*/
|
|
55
|
+
class CedarToD9Manager {
|
|
56
|
+
constructor(opts) {
|
|
57
|
+
// Rows keyed by (role, collection, action); the map's values (insertion order)
|
|
58
|
+
// are what gets written back out, so it is the single source of truth for rows.
|
|
59
|
+
this.baseRowsByTuple = new TupleKeyMap();
|
|
60
|
+
this.header = [];
|
|
61
|
+
this.nextId = 0;
|
|
62
|
+
this.reconstructed = [];
|
|
63
|
+
this.permissionPath = opts?.permissionPath || './permissions';
|
|
64
|
+
this.sqlPath = opts?.sqlPath || './sql/data';
|
|
65
|
+
this.outputPath =
|
|
66
|
+
opts?.outputPath || `${this.sqlPath}/directus_permissions.csv`;
|
|
67
|
+
}
|
|
68
|
+
async readBasePermissionFile() {
|
|
69
|
+
const filePath = `${this.sqlPath}/directus_permissions.csv`;
|
|
70
|
+
const rows = await (0, utils_1.readCsvFile)(filePath);
|
|
71
|
+
const firstLine = await (0, utils_1.readFirstLineOfFile)(filePath);
|
|
72
|
+
this.header = firstLine.split(',').map((column) => column.trim());
|
|
73
|
+
for (const row of rows) {
|
|
74
|
+
this.baseRowsByTuple.set([row.role, row.collection, row.action], row);
|
|
75
|
+
const id = Number(row.id);
|
|
76
|
+
if (Number.isFinite(id) && id > this.nextId)
|
|
77
|
+
this.nextId = id;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async readRoleFile() {
|
|
81
|
+
this.roles = await roles_table_1.RolesTable.load(this.sqlPath);
|
|
82
|
+
}
|
|
83
|
+
/** Read one `.cedar` file into expanded (collection, action, conditions) tuples. */
|
|
84
|
+
async parseCedarFile(filePath) {
|
|
85
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
86
|
+
return []; // a role may not have every .cedar file (e.g. no validate.cedar)
|
|
87
|
+
}
|
|
88
|
+
const text = (await (0, promises_1.readFile)(filePath)).toString();
|
|
89
|
+
const parts = cedar.policySetTextToParts(text);
|
|
90
|
+
if (parts.type === 'failure') {
|
|
91
|
+
logger_1.logger.error(`failed to split policy set ${filePath}`);
|
|
92
|
+
throw new Error(parts.errors);
|
|
93
|
+
}
|
|
94
|
+
const tuples = [];
|
|
95
|
+
for (const policyText of parts.policies) {
|
|
96
|
+
const parsed = cedar.policyToJson(policyText);
|
|
97
|
+
if (parsed.type === 'failure') {
|
|
98
|
+
logger_1.logger.error({ policyText }, `failed to parse policy in ${filePath}`);
|
|
99
|
+
throw new Error(parsed.errors);
|
|
100
|
+
}
|
|
101
|
+
tuples.push(...(0, cedar_to_d9_translations_1.expandPolicy)(parsed.json));
|
|
102
|
+
}
|
|
103
|
+
return tuples;
|
|
104
|
+
}
|
|
105
|
+
async parseRoleFolder(roleName) {
|
|
106
|
+
// A (collection, action) tuple can appear across authorize/check-fields/validate,
|
|
107
|
+
// so the map creates one permission per tuple and we accumulate clauses onto it.
|
|
108
|
+
const byTuple = new TupleKeyMap(([collection, action]) => d9_permission_1.D9Permission.empty(roleName, collection, action));
|
|
109
|
+
const folder = `${this.permissionPath}/${roleName}`;
|
|
110
|
+
const authorizeTuples = await this.parseCedarFile(`${folder}/authorize.cedar`);
|
|
111
|
+
for (const tuple of authorizeTuples) {
|
|
112
|
+
byTuple.getOrCreate([tuple.collection, tuple.action]).permissions =
|
|
113
|
+
(0, cedar_to_d9_translations_1.exprToFilter)(tuple.conditions[0]?.body, 'resource');
|
|
114
|
+
}
|
|
115
|
+
const fieldTuples = await this.parseCedarFile(`${folder}/check-fields.cedar`);
|
|
116
|
+
for (const tuple of fieldTuples) {
|
|
117
|
+
if (tuple.conditions.length) {
|
|
118
|
+
byTuple.getOrCreate([tuple.collection, tuple.action]).fields =
|
|
119
|
+
(0, cedar_to_d9_translations_1.extractFields)(tuple.conditions[0].body);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const validateTuples = await this.parseCedarFile(`${folder}/validate.cedar`);
|
|
123
|
+
for (const tuple of validateTuples) {
|
|
124
|
+
if (tuple.conditions.length) {
|
|
125
|
+
byTuple.getOrCreate([tuple.collection, tuple.action]).validation =
|
|
126
|
+
(0, cedar_to_d9_translations_1.exprToFilter)(tuple.conditions[0].body, 'context.newValue');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return byTuple.values();
|
|
130
|
+
}
|
|
131
|
+
async parseAllFolders() {
|
|
132
|
+
const entries = await (0, promises_1.readdir)(this.permissionPath, { withFileTypes: true });
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
if (!entry.isDirectory())
|
|
135
|
+
continue;
|
|
136
|
+
this.reconstructed.push(...(await this.parseRoleFolder(entry.name)));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
mergeIntoRows() {
|
|
140
|
+
let merged = 0;
|
|
141
|
+
let updated = 0;
|
|
142
|
+
let added = 0;
|
|
143
|
+
let removed = 0;
|
|
144
|
+
const seen = new TupleKeyMap();
|
|
145
|
+
for (const perm of this.reconstructed) {
|
|
146
|
+
const roleId = this.roles.getIdFromName(perm.roleName);
|
|
147
|
+
if (!roleId && perm.roleName !== 'Public') {
|
|
148
|
+
// In V2, instead of throwing an error, we could create a new role in the CSV.
|
|
149
|
+
// But for now, we expect the roles to be pre-defined in the CSV.
|
|
150
|
+
// This is a sanity check: the role should exist in the CSV, otherwise something is wrong.
|
|
151
|
+
throw new Error(`role "${perm.roleName}" (from ${this.permissionPath}) not found in directus_roles.csv`);
|
|
152
|
+
}
|
|
153
|
+
seen.set([roleId, perm.collection, perm.action], true);
|
|
154
|
+
const row = this.baseRowsByTuple.get([roleId, perm.collection, perm.action]);
|
|
155
|
+
if (!row) {
|
|
156
|
+
// New tuple added in the Cedar files; the role exists, so create a row.
|
|
157
|
+
const newRow = {
|
|
158
|
+
id: String(++this.nextId),
|
|
159
|
+
role: roleId,
|
|
160
|
+
collection: perm.collection,
|
|
161
|
+
action: perm.action,
|
|
162
|
+
permissions: perm.permissionsCell(),
|
|
163
|
+
validation: perm.validationCell(),
|
|
164
|
+
fields: perm.fieldsCell(),
|
|
165
|
+
presets: '',
|
|
166
|
+
};
|
|
167
|
+
this.baseRowsByTuple.set([roleId, perm.collection, perm.action], newRow);
|
|
168
|
+
logger_1.logger.info(`added ${perm.roleName}/${perm.collection}/${perm.action} (id ${newRow.id})`);
|
|
169
|
+
added++;
|
|
170
|
+
merged++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// The Cedar policies are the source of truth: overwrite the three
|
|
174
|
+
// derivable columns directly (the round-trip is meaning-preserving, so
|
|
175
|
+
// this only reshapes representation, e.g. `{_and:[x]}` -> `x`).
|
|
176
|
+
row.permissions = perm.permissionsCell();
|
|
177
|
+
row.validation = perm.validationCell();
|
|
178
|
+
row.fields = perm.fieldsCell();
|
|
179
|
+
updated++;
|
|
180
|
+
merged++;
|
|
181
|
+
}
|
|
182
|
+
// Every row is written to authorize.cedar by d9-to-cedar, so a row no longer
|
|
183
|
+
// produced by the Cedar files has been removed from them.
|
|
184
|
+
for (const row of this.baseRowsByTuple.values()) {
|
|
185
|
+
const tuple = [row.role, row.collection, row.action];
|
|
186
|
+
if (seen.get(tuple))
|
|
187
|
+
continue;
|
|
188
|
+
this.baseRowsByTuple.delete(tuple);
|
|
189
|
+
const roleName = row.role ? this.roles.getNameFromId(row.role) : 'Public';
|
|
190
|
+
logger_1.logger.info(`removed ${roleName}/${row.collection}/${row.action} (id ${row.id})`);
|
|
191
|
+
removed++;
|
|
192
|
+
}
|
|
193
|
+
logger_1.logger.info(`merged ${merged} permissions, ${updated} row(s) updated, ${added} new row(s) added, ${removed} row(s) removed`);
|
|
194
|
+
}
|
|
195
|
+
async writeOutput() {
|
|
196
|
+
await (0, utils_1.writeCsvFile)(this.outputPath, this.header, this.baseRowsByTuple.values());
|
|
197
|
+
logger_1.logger.info(`wrote ${this.outputPath}`);
|
|
198
|
+
}
|
|
199
|
+
async readCedarAndWriteCsv() {
|
|
200
|
+
logger_1.logger.info('reading base permission file');
|
|
201
|
+
await this.readBasePermissionFile();
|
|
202
|
+
logger_1.logger.info(`found ${this.baseRowsByTuple.values().length} base permissions`);
|
|
203
|
+
logger_1.logger.info('reading role file');
|
|
204
|
+
await this.readRoleFile();
|
|
205
|
+
logger_1.logger.info('parsing cedar policy folders');
|
|
206
|
+
await this.parseAllFolders();
|
|
207
|
+
logger_1.logger.info(`reconstructed ${this.reconstructed.length} permissions from cedar`);
|
|
208
|
+
logger_1.logger.info('merging into base rows');
|
|
209
|
+
this.mergeIntoRows();
|
|
210
|
+
logger_1.logger.info('writing csv');
|
|
211
|
+
await this.writeOutput();
|
|
212
|
+
logger_1.logger.info('done');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.CedarToD9Manager = CedarToD9Manager;
|
|
216
|
+
/** CLI action: merge Cedar policies back into directus_permissions.csv. */
|
|
217
|
+
async function cedarToD9(options) {
|
|
218
|
+
const manager = new CedarToD9Manager(options);
|
|
219
|
+
await manager.readCedarAndWriteCsv();
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItdG8tZDkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL2NlZGFyLXRvLWQ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdSQSw4QkFPQztBQXZSRCwyQkFBZ0M7QUFDaEMsMENBQWdEO0FBQ2hELHlEQUF5RDtBQUN6RCx5RUFJb0M7QUFDcEMsbURBQStDO0FBQy9DLCtDQUEyQztBQUMzQyx5Q0FBc0M7QUFDdEMseUNBQStFO0FBRS9FLHdGQUF3RjtBQUN4RixNQUFNLFdBQVc7SUFHZiw2RkFBNkY7SUFDN0YsWUFBNkIsV0FBd0M7UUFBeEMsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBSHBELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUdvQixDQUFDO0lBRWpFLEtBQUssQ0FBQyxLQUFlO1FBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRU0sR0FBRyxDQUFDLEtBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLEdBQUcsQ0FBQyxLQUFlLEVBQUUsS0FBWTtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHVGQUF1RjtJQUNoRixXQUFXLENBQUMsS0FBZTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFhM0IsWUFBWSxJQUlYO1FBWEQsK0VBQStFO1FBQy9FLGdGQUFnRjtRQUN6RSxvQkFBZSxHQUFHLElBQUksV0FBVyxFQUEwQixDQUFDO1FBQzVELFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQU94QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksRUFBRSxjQUFjLElBQUksZUFBZSxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sSUFBSSxZQUFZLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVU7WUFDYixJQUFJLEVBQUUsVUFBVSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sMkJBQTJCLENBQUM7SUFDbkUsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0I7UUFDakMsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTywyQkFBMkIsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsbUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsMkJBQW1CLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLHdCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsb0ZBQW9GO0lBQzdFLEtBQUssQ0FBQyxjQUFjLENBQ3pCLFFBQWdCO1FBRWhCLElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxDQUFDLENBQUMsaUVBQWlFO1FBQzlFLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBQSxtQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FJUCxFQUFFLENBQUM7UUFDUixLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFhLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsdUNBQVksRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBZ0I7UUFDM0Msa0ZBQWtGO1FBQ2xGLGlGQUFpRjtRQUNqRixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBZSxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FDckUsNEJBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FDakQsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUVwRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQy9DLEdBQUcsTUFBTSxrQkFBa0IsQ0FDNUIsQ0FBQztRQUNGLEtBQUssTUFBTSxLQUFLLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDL0QsSUFBQSx1Q0FBWSxFQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLENBQUM7UUFDOUUsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07b0JBQzFELElBQUEsd0NBQWEsRUFBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdFLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVO29CQUM5RCxJQUFBLHVDQUFZLEVBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsa0JBQU8sRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFBRSxTQUFTO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBUSxDQUFDO1FBRXJDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFDLDhFQUE4RTtnQkFDOUUsaUVBQWlFO2dCQUNqRSwwRkFBMEY7Z0JBQzFGLE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxJQUFJLENBQUMsUUFBUSxXQUFXLElBQUksQ0FBQyxjQUFjLG1DQUFtQyxDQUN4RixDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1Qsd0VBQXdFO2dCQUN4RSxNQUFNLE1BQU0sR0FBMkI7b0JBQ3JDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUN6QixJQUFJLEVBQUUsTUFBTztvQkFDYixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDekIsT0FBTyxFQUFFLEVBQUU7aUJBQ1osQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDMUUsZUFBTSxDQUFDLElBQUksQ0FDVCxTQUFTLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxRQUFRLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FDN0UsQ0FBQztnQkFDRixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEVBQUUsQ0FBQztnQkFDVCxTQUFTO1lBQ1gsQ0FBQztZQUVELGtFQUFrRTtZQUNsRSx1RUFBdUU7WUFDdkUsZ0VBQWdFO1lBQ2hFLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxFQUFFLENBQUM7UUFDWCxDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLDBEQUEwRDtRQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxRQUFRLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELGVBQU0sQ0FBQyxJQUFJLENBQ1QsVUFBVSxNQUFNLGlCQUFpQixPQUFPLG9CQUFvQixLQUFLLHNCQUFzQixPQUFPLGlCQUFpQixDQUNoSCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sSUFBQSxvQkFBWSxFQUNoQixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FDOUIsQ0FBQztRQUNGLGVBQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQjtRQUMvQixlQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNwQyxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLENBQUM7UUFDOUUsZUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLGVBQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3QixlQUFNLENBQUMsSUFBSSxDQUNULGlCQUFpQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0seUJBQXlCLENBQ3BFLENBQUM7UUFDRixlQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLGVBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDekIsZUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixDQUFDO0NBRUY7QUFoTkQsNENBZ05DO0FBRUQsMkVBQTJFO0FBQ3BFLEtBQUssVUFBVSxTQUFTLENBQUMsT0FJL0I7SUFDQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgcmVhZGRpciB9IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIGNlZGFyIGZyb20gJ0BjZWRhci1wb2xpY3kvY2VkYXItd2FzbS9ub2RlanMnO1xuaW1wb3J0IHtcbiAgZXhwYW5kUG9saWN5LFxuICBleHByVG9GaWx0ZXIsXG4gIGV4dHJhY3RGaWVsZHMsXG59IGZyb20gJy4vY2VkYXItdG8tZDktdHJhbnNsYXRpb25zJztcbmltcG9ydCB7IEQ5UGVybWlzc2lvbiB9IGZyb20gJy4vZDktcGVybWlzc2lvbic7XG5pbXBvcnQgeyBSb2xlc1RhYmxlIH0gZnJvbSAnLi9yb2xlcy10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVhZENzdkZpbGUsIHJlYWRGaXJzdExpbmVPZkZpbGUsIHdyaXRlQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG4vKiogTWFwIGtleWVkIGJ5IGEgdHVwbGUgb2Ygc3RyaW5ncyAoTWFwIGluZGV4ZXMgYXJyYXlzIGJ5IGlkZW50aXR5LCBoZW5jZSB0aGUgam9pbikuICovXG5jbGFzcyBUdXBsZUtleU1hcDxWYWx1ZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgVmFsdWU+KCk7XG5cbiAgLyoqIGBjcmVhdGVWYWx1ZWAgaXMgcmVxdWlyZWQgdG8gdXNlIHtAbGluayBnZXRPckNyZWF0ZX07IG9taXQgaXQgZm9yIGEgcGxhaW4gZ2V0L3NldCBtYXAuICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVmFsdWU/OiAocGFydHM6IHN0cmluZ1tdKSA9PiBWYWx1ZSkge31cblxuICBwcml2YXRlIGtleU9mKHBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQocGFydHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGhpcy5rZXlPZihwYXJ0cykpO1xuICB9XG5cbiAgcHVibGljIHNldChwYXJ0czogc3RyaW5nW10sIHZhbHVlOiBWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5zZXQodGhpcy5rZXlPZihwYXJ0cyksIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZSh0aGlzLmtleU9mKHBhcnRzKSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYHBhcnRzYCwgY3JlYXRpbmcgYW5kIHN0b3JpbmcgaXQgdmlhIHRoZSBmYWN0b3J5IGlmIGFic2VudC4gKi9cbiAgcHVibGljIGdldE9yQ3JlYXRlKHBhcnRzOiBzdHJpbmdbXSk6IFZhbHVlIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleU9mKHBhcnRzKTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdGhpcy5jcmVhdGVWYWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R1cGxlS2V5TWFwLmdldE9yQ3JlYXRlIGNhbGxlZCB3aXRob3V0IGEgZmFjdG9yeScpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0aGlzLmNyZWF0ZVZhbHVlKHBhcnRzKTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMoKTogVmFsdWVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldO1xuICB9XG59XG5cbi8qKlxuICogUmV2ZXJzZSBvZiBkOS10by1jZWRhcjogcmVhZHMgdGhlIHBlci1yb2xlIENlZGFyIHBvbGljeSBmaWxlcyBiYWNrIGludG8gRDlcbiAqIHBlcm1pc3Npb24gcm93cyBhbmQgbWVyZ2VzIHRoZW0gaW50byBkaXJlY3R1c19wZXJtaXNzaW9ucy5jc3YuIFRoZSBvcmlnaW5hbFxuICogQ1NWIHN0YXlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjb2x1bW5zIENlZGFyIGRvZXMgbm90IGNhcnJ5IChgaWRgLFxuICogYHJvbGVgIFVVSUQsIGBwcmVzZXRzYCk7IG9ubHkgYHBlcm1pc3Npb25zYC9gZmllbGRzYC9gdmFsaWRhdGlvbmAgYXJlIHJld3JpdHRlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENlZGFyVG9EOU1hbmFnZXIge1xuICBwdWJsaWMgcGVybWlzc2lvblBhdGg6IHN0cmluZztcbiAgcHVibGljIHNxbFBhdGg6IHN0cmluZztcbiAgcHVibGljIG91dHB1dFBhdGg6IHN0cmluZztcblxuICBwdWJsaWMgcm9sZXMhOiBSb2xlc1RhYmxlO1xuICAvLyBSb3dzIGtleWVkIGJ5IChyb2xlLCBjb2xsZWN0aW9uLCBhY3Rpb24pOyB0aGUgbWFwJ3MgdmFsdWVzIChpbnNlcnRpb24gb3JkZXIpXG4gIC8vIGFyZSB3aGF0IGdldHMgd3JpdHRlbiBiYWNrIG91dCwgc28gaXQgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJvd3MuXG4gIHB1YmxpYyBiYXNlUm93c0J5VHVwbGUgPSBuZXcgVHVwbGVLZXlNYXA8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgcHVibGljIGhlYWRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIG5leHRJZCA9IDA7XG4gIHB1YmxpYyByZWNvbnN0cnVjdGVkOiBEOVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiB7XG4gICAgcGVybWlzc2lvblBhdGg/OiBzdHJpbmc7XG4gICAgc3FsUGF0aD86IHN0cmluZztcbiAgICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wZXJtaXNzaW9uUGF0aCA9IG9wdHM/LnBlcm1pc3Npb25QYXRoIHx8ICcuL3Blcm1pc3Npb25zJztcbiAgICB0aGlzLnNxbFBhdGggPSBvcHRzPy5zcWxQYXRoIHx8ICcuL3NxbC9kYXRhJztcbiAgICB0aGlzLm91dHB1dFBhdGggPVxuICAgICAgb3B0cz8ub3V0cHV0UGF0aCB8fCBgJHt0aGlzLnNxbFBhdGh9L2RpcmVjdHVzX3Blcm1pc3Npb25zLmNzdmA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEJhc2VQZXJtaXNzaW9uRmlsZSgpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke3RoaXMuc3FsUGF0aH0vZGlyZWN0dXNfcGVybWlzc2lvbnMuY3N2YDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVhZENzdkZpbGUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGZpcnN0TGluZSA9IGF3YWl0IHJlYWRGaXJzdExpbmVPZkZpbGUoZmlsZVBhdGgpO1xuICAgIHRoaXMuaGVhZGVyID0gZmlyc3RMaW5lLnNwbGl0KCcsJykubWFwKChjb2x1bW4pID0+IGNvbHVtbi50cmltKCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgdGhpcy5iYXNlUm93c0J5VHVwbGUuc2V0KFtyb3cucm9sZSwgcm93LmNvbGxlY3Rpb24sIHJvdy5hY3Rpb25dLCByb3cpO1xuICAgICAgY29uc3QgaWQgPSBOdW1iZXIocm93LmlkKTtcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoaWQpICYmIGlkID4gdGhpcy5uZXh0SWQpIHRoaXMubmV4dElkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRSb2xlRmlsZSgpIHtcbiAgICB0aGlzLnJvbGVzID0gYXdhaXQgUm9sZXNUYWJsZS5sb2FkKHRoaXMuc3FsUGF0aCk7XG4gIH1cblxuICAvKiogUmVhZCBvbmUgYC5jZWRhcmAgZmlsZSBpbnRvIGV4cGFuZGVkIChjb2xsZWN0aW9uLCBhY3Rpb24sIGNvbmRpdGlvbnMpIHR1cGxlcy4gKi9cbiAgcHVibGljIGFzeW5jIHBhcnNlQ2VkYXJGaWxlKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICk6IFByb21pc2U8QXJyYXk8eyBjb2xsZWN0aW9uOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nOyBjb25kaXRpb25zOiBhbnlbXSB9Pj4ge1xuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gYSByb2xlIG1heSBub3QgaGF2ZSBldmVyeSAuY2VkYXIgZmlsZSAoZS5nLiBubyB2YWxpZGF0ZS5jZWRhcilcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IChhd2FpdCByZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGFydHMgPSBjZWRhci5wb2xpY3lTZXRUZXh0VG9QYXJ0cyh0ZXh0KTtcbiAgICBpZiAocGFydHMudHlwZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBzcGxpdCBwb2xpY3kgc2V0ICR7ZmlsZVBhdGh9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocGFydHMuZXJyb3JzIGFzIGFueSk7XG4gICAgfVxuICAgIGNvbnN0IHR1cGxlczogQXJyYXk8e1xuICAgICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICBjb25kaXRpb25zOiBhbnlbXTtcbiAgICB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9saWN5VGV4dCBvZiBwYXJ0cy5wb2xpY2llcykge1xuICAgICAgY29uc3QgcGFyc2VkID0gY2VkYXIucG9saWN5VG9Kc29uKHBvbGljeVRleHQpO1xuICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHsgcG9saWN5VGV4dCB9LCBgZmFpbGVkIHRvIHBhcnNlIHBvbGljeSBpbiAke2ZpbGVQYXRofWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkLmVycm9ycyBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgdHVwbGVzLnB1c2goLi4uZXhwYW5kUG9saWN5KHBhcnNlZC5qc29uKSk7XG4gICAgfVxuICAgIHJldHVybiB0dXBsZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGFyc2VSb2xlRm9sZGVyKHJvbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEQ5UGVybWlzc2lvbltdPiB7XG4gICAgLy8gQSAoY29sbGVjdGlvbiwgYWN0aW9uKSB0dXBsZSBjYW4gYXBwZWFyIGFjcm9zcyBhdXRob3JpemUvY2hlY2stZmllbGRzL3ZhbGlkYXRlLFxuICAgIC8vIHNvIHRoZSBtYXAgY3JlYXRlcyBvbmUgcGVybWlzc2lvbiBwZXIgdHVwbGUgYW5kIHdlIGFjY3VtdWxhdGUgY2xhdXNlcyBvbnRvIGl0LlxuICAgIGNvbnN0IGJ5VHVwbGUgPSBuZXcgVHVwbGVLZXlNYXA8RDlQZXJtaXNzaW9uPigoW2NvbGxlY3Rpb24sIGFjdGlvbl0pID0+XG4gICAgICBEOVBlcm1pc3Npb24uZW1wdHkocm9sZU5hbWUsIGNvbGxlY3Rpb24sIGFjdGlvbiksXG4gICAgKTtcblxuICAgIGNvbnN0IGZvbGRlciA9IGAke3RoaXMucGVybWlzc2lvblBhdGh9LyR7cm9sZU5hbWV9YDtcblxuICAgIGNvbnN0IGF1dGhvcml6ZVR1cGxlcyA9IGF3YWl0IHRoaXMucGFyc2VDZWRhckZpbGUoXG4gICAgICBgJHtmb2xkZXJ9L2F1dGhvcml6ZS5jZWRhcmAsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHR1cGxlIG9mIGF1dGhvcml6ZVR1cGxlcykge1xuICAgICAgYnlUdXBsZS5nZXRPckNyZWF0ZShbdHVwbGUuY29sbGVjdGlvbiwgdHVwbGUuYWN0aW9uXSkucGVybWlzc2lvbnMgPVxuICAgICAgICBleHByVG9GaWx0ZXIodHVwbGUuY29uZGl0aW9uc1swXT8uYm9keSwgJ3Jlc291cmNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRUdXBsZXMgPSBhd2FpdCB0aGlzLnBhcnNlQ2VkYXJGaWxlKGAke2ZvbGRlcn0vY2hlY2stZmllbGRzLmNlZGFyYCk7XG4gICAgZm9yIChjb25zdCB0dXBsZSBvZiBmaWVsZFR1cGxlcykge1xuICAgICAgaWYgKHR1cGxlLmNvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGJ5VHVwbGUuZ2V0T3JDcmVhdGUoW3R1cGxlLmNvbGxlY3Rpb24sIHR1cGxlLmFjdGlvbl0pLmZpZWxkcyA9XG4gICAgICAgICAgZXh0cmFjdEZpZWxkcyh0dXBsZS5jb25kaXRpb25zWzBdLmJvZHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlVHVwbGVzID0gYXdhaXQgdGhpcy5wYXJzZUNlZGFyRmlsZShgJHtmb2xkZXJ9L3ZhbGlkYXRlLmNlZGFyYCk7XG4gICAgZm9yIChjb25zdCB0dXBsZSBvZiB2YWxpZGF0ZVR1cGxlcykge1xuICAgICAgaWYgKHR1cGxlLmNvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGJ5VHVwbGUuZ2V0T3JDcmVhdGUoW3R1cGxlLmNvbGxlY3Rpb24sIHR1cGxlLmFjdGlvbl0pLnZhbGlkYXRpb24gPVxuICAgICAgICAgIGV4cHJUb0ZpbHRlcih0dXBsZS5jb25kaXRpb25zWzBdLmJvZHksICdjb250ZXh0Lm5ld1ZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5VHVwbGUudmFsdWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGFyc2VBbGxGb2xkZXJzKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKHRoaXMucGVybWlzc2lvblBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG4gICAgICB0aGlzLnJlY29uc3RydWN0ZWQucHVzaCguLi4oYXdhaXQgdGhpcy5wYXJzZVJvbGVGb2xkZXIoZW50cnkubmFtZSkpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VJbnRvUm93cygpIHtcbiAgICBsZXQgbWVyZ2VkID0gMDtcbiAgICBsZXQgdXBkYXRlZCA9IDA7XG4gICAgbGV0IGFkZGVkID0gMDtcbiAgICBsZXQgcmVtb3ZlZCA9IDA7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBUdXBsZUtleU1hcDx0cnVlPigpO1xuXG4gICAgZm9yIChjb25zdCBwZXJtIG9mIHRoaXMucmVjb25zdHJ1Y3RlZCkge1xuICAgICAgY29uc3Qgcm9sZUlkID0gdGhpcy5yb2xlcy5nZXRJZEZyb21OYW1lKHBlcm0ucm9sZU5hbWUpO1xuICAgICAgaWYgKCFyb2xlSWQgJiYgcGVybS5yb2xlTmFtZSAhPT0gJ1B1YmxpYycpIHtcbiAgICAgICAgLy8gSW4gVjIsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IsIHdlIGNvdWxkIGNyZWF0ZSBhIG5ldyByb2xlIGluIHRoZSBDU1YuXG4gICAgICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSBleHBlY3QgdGhlIHJvbGVzIHRvIGJlIHByZS1kZWZpbmVkIGluIHRoZSBDU1YuXG4gICAgICAgIC8vIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2s6IHRoZSByb2xlIHNob3VsZCBleGlzdCBpbiB0aGUgQ1NWLCBvdGhlcndpc2Ugc29tZXRoaW5nIGlzIHdyb25nLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHJvbGUgXCIke3Blcm0ucm9sZU5hbWV9XCIgKGZyb20gJHt0aGlzLnBlcm1pc3Npb25QYXRofSkgbm90IGZvdW5kIGluIGRpcmVjdHVzX3JvbGVzLmNzdmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNlZW4uc2V0KFtyb2xlSWQhLCBwZXJtLmNvbGxlY3Rpb24sIHBlcm0uYWN0aW9uXSwgdHJ1ZSk7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLmJhc2VSb3dzQnlUdXBsZS5nZXQoW3JvbGVJZCEsIHBlcm0uY29sbGVjdGlvbiwgcGVybS5hY3Rpb25dKTtcbiAgICAgIGlmICghcm93KSB7XG4gICAgICAgIC8vIE5ldyB0dXBsZSBhZGRlZCBpbiB0aGUgQ2VkYXIgZmlsZXM7IHRoZSByb2xlIGV4aXN0cywgc28gY3JlYXRlIGEgcm93LlxuICAgICAgICBjb25zdCBuZXdSb3c6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgaWQ6IFN0cmluZygrK3RoaXMubmV4dElkKSxcbiAgICAgICAgICByb2xlOiByb2xlSWQhLFxuICAgICAgICAgIGNvbGxlY3Rpb246IHBlcm0uY29sbGVjdGlvbixcbiAgICAgICAgICBhY3Rpb246IHBlcm0uYWN0aW9uLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBwZXJtLnBlcm1pc3Npb25zQ2VsbCgpLFxuICAgICAgICAgIHZhbGlkYXRpb246IHBlcm0udmFsaWRhdGlvbkNlbGwoKSxcbiAgICAgICAgICBmaWVsZHM6IHBlcm0uZmllbGRzQ2VsbCgpLFxuICAgICAgICAgIHByZXNldHM6ICcnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhc2VSb3dzQnlUdXBsZS5zZXQoW3JvbGVJZCEsIHBlcm0uY29sbGVjdGlvbiwgcGVybS5hY3Rpb25dLCBuZXdSb3cpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgYWRkZWQgJHtwZXJtLnJvbGVOYW1lfS8ke3Blcm0uY29sbGVjdGlvbn0vJHtwZXJtLmFjdGlvbn0gKGlkICR7bmV3Um93LmlkfSlgLFxuICAgICAgICApO1xuICAgICAgICBhZGRlZCsrO1xuICAgICAgICBtZXJnZWQrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBDZWRhciBwb2xpY2llcyBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aDogb3ZlcndyaXRlIHRoZSB0aHJlZVxuICAgICAgLy8gZGVyaXZhYmxlIGNvbHVtbnMgZGlyZWN0bHkgKHRoZSByb3VuZC10cmlwIGlzIG1lYW5pbmctcHJlc2VydmluZywgc29cbiAgICAgIC8vIHRoaXMgb25seSByZXNoYXBlcyByZXByZXNlbnRhdGlvbiwgZS5nLiBge19hbmQ6W3hdfWAgLT4gYHhgKS5cbiAgICAgIHJvdy5wZXJtaXNzaW9ucyA9IHBlcm0ucGVybWlzc2lvbnNDZWxsKCk7XG4gICAgICByb3cudmFsaWRhdGlvbiA9IHBlcm0udmFsaWRhdGlvbkNlbGwoKTtcbiAgICAgIHJvdy5maWVsZHMgPSBwZXJtLmZpZWxkc0NlbGwoKTtcbiAgICAgIHVwZGF0ZWQrKztcbiAgICAgIG1lcmdlZCsrO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IHJvdyBpcyB3cml0dGVuIHRvIGF1dGhvcml6ZS5jZWRhciBieSBkOS10by1jZWRhciwgc28gYSByb3cgbm8gbG9uZ2VyXG4gICAgLy8gcHJvZHVjZWQgYnkgdGhlIENlZGFyIGZpbGVzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGVtLlxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuYmFzZVJvd3NCeVR1cGxlLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB0dXBsZSA9IFtyb3cucm9sZSwgcm93LmNvbGxlY3Rpb24sIHJvdy5hY3Rpb25dO1xuICAgICAgaWYgKHNlZW4uZ2V0KHR1cGxlKSkgY29udGludWU7XG4gICAgICB0aGlzLmJhc2VSb3dzQnlUdXBsZS5kZWxldGUodHVwbGUpO1xuICAgICAgY29uc3Qgcm9sZU5hbWUgPSByb3cucm9sZSA/IHRoaXMucm9sZXMuZ2V0TmFtZUZyb21JZChyb3cucm9sZSkgOiAnUHVibGljJztcbiAgICAgIGxvZ2dlci5pbmZvKGByZW1vdmVkICR7cm9sZU5hbWV9LyR7cm93LmNvbGxlY3Rpb259LyR7cm93LmFjdGlvbn0gKGlkICR7cm93LmlkfSlgKTtcbiAgICAgIHJlbW92ZWQrKztcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBtZXJnZWQgJHttZXJnZWR9IHBlcm1pc3Npb25zLCAke3VwZGF0ZWR9IHJvdyhzKSB1cGRhdGVkLCAke2FkZGVkfSBuZXcgcm93KHMpIGFkZGVkLCAke3JlbW92ZWR9IHJvdyhzKSByZW1vdmVkYCxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdyaXRlT3V0cHV0KCkge1xuICAgIGF3YWl0IHdyaXRlQ3N2RmlsZShcbiAgICAgIHRoaXMub3V0cHV0UGF0aCxcbiAgICAgIHRoaXMuaGVhZGVyLFxuICAgICAgdGhpcy5iYXNlUm93c0J5VHVwbGUudmFsdWVzKCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhgd3JvdGUgJHt0aGlzLm91dHB1dFBhdGh9YCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZENlZGFyQW5kV3JpdGVDc3YoKSB7XG4gICAgbG9nZ2VyLmluZm8oJ3JlYWRpbmcgYmFzZSBwZXJtaXNzaW9uIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRCYXNlUGVybWlzc2lvbkZpbGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgZm91bmQgJHt0aGlzLmJhc2VSb3dzQnlUdXBsZS52YWx1ZXMoKS5sZW5ndGh9IGJhc2UgcGVybWlzc2lvbnNgKTtcbiAgICBsb2dnZXIuaW5mbygncmVhZGluZyByb2xlIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRSb2xlRmlsZSgpO1xuICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nIGNlZGFyIHBvbGljeSBmb2xkZXJzJyk7XG4gICAgYXdhaXQgdGhpcy5wYXJzZUFsbEZvbGRlcnMoKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGByZWNvbnN0cnVjdGVkICR7dGhpcy5yZWNvbnN0cnVjdGVkLmxlbmd0aH0gcGVybWlzc2lvbnMgZnJvbSBjZWRhcmAsXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbygnbWVyZ2luZyBpbnRvIGJhc2Ugcm93cycpO1xuICAgIHRoaXMubWVyZ2VJbnRvUm93cygpO1xuICAgIGxvZ2dlci5pbmZvKCd3cml0aW5nIGNzdicpO1xuICAgIGF3YWl0IHRoaXMud3JpdGVPdXRwdXQoKTtcbiAgICBsb2dnZXIuaW5mbygnZG9uZScpO1xuICB9XG5cbn1cblxuLyoqIENMSSBhY3Rpb246IG1lcmdlIENlZGFyIHBvbGljaWVzIGJhY2sgaW50byBkaXJlY3R1c19wZXJtaXNzaW9ucy5jc3YuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2VkYXJUb0Q5KG9wdGlvbnM/OiB7XG4gIHBlcm1pc3Npb25QYXRoPzogc3RyaW5nO1xuICBzcWxQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5hZ2VyID0gbmV3IENlZGFyVG9EOU1hbmFnZXIob3B0aW9ucyk7XG4gIGF3YWl0IG1hbmFnZXIucmVhZENlZGFyQW5kV3JpdGVDc3YoKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PolicyJson } from '@cedar-policy/cedar-wasm/nodejs';
|
|
2
|
+
import { D9Permission, Filter } from './d9-permission';
|
|
3
|
+
export type ConditionSubject = 'resource' | 'context.newValue';
|
|
4
|
+
export declare function addWhenClauses(filter: Filter, subject?: ConditionSubject): any;
|
|
5
|
+
export declare function translateToCedar(permission: D9Permission): {
|
|
6
|
+
mainPolicy: PolicyJson;
|
|
7
|
+
fieldPolicy?: PolicyJson;
|
|
8
|
+
validationPolicy?: PolicyJson;
|
|
9
|
+
};
|