@wbce/projen-d9 0.0.27 → 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 +185 -46
- package/API.md +153 -37
- package/CHANGELOG.md +20 -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/.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 +14 -7
- package/lib/cli/commands/init.d.ts +0 -1
- package/lib/cli/commands/init.js +0 -8
- package/lib/cli/commands/save/draft.js +0 -2
- package/node_modules/@types/node/globals.global.d.ts +0 -1
- /package/{lib/cli/commands/save/draft.d.ts → node_modules/pino/.nojekyll} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addWhenClauses = addWhenClauses;
|
|
4
|
+
exports.translateToCedar = translateToCedar;
|
|
5
|
+
/** Local stand-in for lodash's `isPlainObject`, which this package does not depend on. */
|
|
6
|
+
function isPlainObject(value) {
|
|
7
|
+
if (Object.prototype.toString.call(value) !== '[object Object]')
|
|
8
|
+
return false;
|
|
9
|
+
const proto = Object.getPrototypeOf(value);
|
|
10
|
+
return proto === null || proto === Object.prototype;
|
|
11
|
+
}
|
|
12
|
+
function getOperation(key, value) {
|
|
13
|
+
if (key.startsWith('_') && !['_and', '_or', '_none', '_some'].includes(key)) {
|
|
14
|
+
return { operator: key, value };
|
|
15
|
+
}
|
|
16
|
+
else if (isPlainObject(value) === false) {
|
|
17
|
+
return { operator: '_eq', value };
|
|
18
|
+
}
|
|
19
|
+
return getOperation(Object.keys(value)[0], Object.values(value)[0]);
|
|
20
|
+
}
|
|
21
|
+
function getFilterPath(key, value) {
|
|
22
|
+
const path = [key];
|
|
23
|
+
const childKey = Object.keys(value)[0];
|
|
24
|
+
if (typeof childKey === 'string' &&
|
|
25
|
+
childKey.startsWith('_') === true &&
|
|
26
|
+
!['_none', '_some'].includes(childKey)) {
|
|
27
|
+
return path;
|
|
28
|
+
}
|
|
29
|
+
if (isPlainObject(value)) {
|
|
30
|
+
path.push(...getFilterPath(childKey, Object.values(value)[0]));
|
|
31
|
+
}
|
|
32
|
+
return path;
|
|
33
|
+
}
|
|
34
|
+
function addWhenClauses(filter, subject = 'resource') {
|
|
35
|
+
const entries = Object.entries(filter);
|
|
36
|
+
if (!entries.length)
|
|
37
|
+
return;
|
|
38
|
+
const key = entries[0][0];
|
|
39
|
+
const value = entries[0][1];
|
|
40
|
+
if (key === '_or' || key === '_and') {
|
|
41
|
+
if (key === '_or' &&
|
|
42
|
+
value.some((subFilter) => Object.keys(subFilter).length === 0)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const left = value[0];
|
|
46
|
+
const rightVal = value[1];
|
|
47
|
+
const operator = key === '_or' ? '||' : '&&';
|
|
48
|
+
if (rightVal) {
|
|
49
|
+
return {
|
|
50
|
+
[operator]: {
|
|
51
|
+
left: addWhenClauses(left, subject),
|
|
52
|
+
right: addWhenClauses({ [key]: value.slice(1) }, subject),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return addWhenClauses(left, subject);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const filterPath = getFilterPath(key, value);
|
|
61
|
+
const { operator: filterOperator, value: filterValue } = getOperation(key, value);
|
|
62
|
+
if (entries.length > 1) {
|
|
63
|
+
delete filter[key];
|
|
64
|
+
return {
|
|
65
|
+
'&&': {
|
|
66
|
+
left: applyFilterToQuery(filterPath, filterOperator, filterValue, subject),
|
|
67
|
+
right: addWhenClauses(filter, subject),
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return applyFilterToQuery(filterPath, filterOperator, filterValue, subject);
|
|
73
|
+
}
|
|
74
|
+
function applyFilterToQuery(path, operator, compareValue, subjectVar = 'resource') {
|
|
75
|
+
function buildLeft(pathSegments, subj) {
|
|
76
|
+
let node = subj === 'context.newValue'
|
|
77
|
+
? { '.': { left: { Var: 'context' }, attr: 'newValue' } }
|
|
78
|
+
: { Var: 'resource' };
|
|
79
|
+
for (const attr of pathSegments) {
|
|
80
|
+
node = { '.': { left: node, attr } };
|
|
81
|
+
}
|
|
82
|
+
return node;
|
|
83
|
+
}
|
|
84
|
+
const buildRight = (v) => v === '$CURRENT_USER' ? { Var: 'principal' } : { Value: v };
|
|
85
|
+
const left = buildLeft(path, subjectVar);
|
|
86
|
+
const right = buildRight(compareValue);
|
|
87
|
+
let expr = null;
|
|
88
|
+
const baseForParent = path.length <= 1
|
|
89
|
+
? subjectVar === 'context.newValue'
|
|
90
|
+
? { '.': { left: { Var: 'context' }, attr: 'newValue' } }
|
|
91
|
+
: { Var: 'resource' }
|
|
92
|
+
: buildLeft(path.slice(0, -1), subjectVar);
|
|
93
|
+
if (operator === '_null' ||
|
|
94
|
+
(operator === '_nnull' && compareValue === false)) {
|
|
95
|
+
expr = {
|
|
96
|
+
'!': {
|
|
97
|
+
arg: { has: { left: baseForParent, attr: path[path.length - 1] } },
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (operator === '_nnull' ||
|
|
102
|
+
(operator === '_null' && compareValue === false)) {
|
|
103
|
+
expr = { has: { left: baseForParent, attr: path[path.length - 1] } };
|
|
104
|
+
}
|
|
105
|
+
if (compareValue !== undefined && expr === null) {
|
|
106
|
+
if (operator === '_eq')
|
|
107
|
+
expr = { '==': { left, right } };
|
|
108
|
+
if (operator === '_neq')
|
|
109
|
+
expr = { '!=': { left, right } };
|
|
110
|
+
if (operator === '_gt')
|
|
111
|
+
expr = { '>': { left, right } };
|
|
112
|
+
if (operator === '_gte')
|
|
113
|
+
expr = { '>=': { left, right } };
|
|
114
|
+
if (operator === '_lt')
|
|
115
|
+
expr = { '<': { left, right } };
|
|
116
|
+
if (operator === '_lte')
|
|
117
|
+
expr = { '<=': { left, right } };
|
|
118
|
+
if (operator === '_icontains') {
|
|
119
|
+
// Cedar has no case-insensitive matching. Normalize the stored data and use
|
|
120
|
+
// _contains — https://docs.cedarpolicy.com/bestpractices/bp-normalize-data-input.html
|
|
121
|
+
throw new Error('_icontains is not supported in Cedar policies: normalize the data (e.g. lowercase) and use _contains instead');
|
|
122
|
+
}
|
|
123
|
+
if (operator === '_contains') {
|
|
124
|
+
expr = {
|
|
125
|
+
like: {
|
|
126
|
+
left,
|
|
127
|
+
pattern: ['Wildcard', { Literal: compareValue }, 'Wildcard'],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (operator === '_starts_with') {
|
|
132
|
+
expr = { like: { left, pattern: [{ Literal: compareValue }, 'Wildcard'] } };
|
|
133
|
+
}
|
|
134
|
+
if (operator === '_ends_with') {
|
|
135
|
+
expr = { like: { left, pattern: ['Wildcard', { Literal: compareValue }] } };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (expr === null)
|
|
139
|
+
return;
|
|
140
|
+
return expr;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function translateToCedar(permission) {
|
|
144
|
+
const principalConstraint = {
|
|
145
|
+
op: 'in',
|
|
146
|
+
entity: {
|
|
147
|
+
type: 'd9::UserGroup',
|
|
148
|
+
id: permission.roleName,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
const action = {
|
|
152
|
+
op: '==',
|
|
153
|
+
entity: {
|
|
154
|
+
type: `Db::${permission.collection}::Action`,
|
|
155
|
+
id: permission.action,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
const mainConditionBody = addWhenClauses(permission.permissions || {});
|
|
159
|
+
const mainConditions = mainConditionBody
|
|
160
|
+
? [{ kind: 'when', body: mainConditionBody }]
|
|
161
|
+
: [];
|
|
162
|
+
const mainPolicy = {
|
|
163
|
+
effect: 'permit',
|
|
164
|
+
principal: principalConstraint,
|
|
165
|
+
action: action,
|
|
166
|
+
resource: { op: 'All' },
|
|
167
|
+
conditions: mainConditions,
|
|
168
|
+
};
|
|
169
|
+
// Field-level policy only when there is a fields restriction and/or validation
|
|
170
|
+
const fields = permission.fields ?? [];
|
|
171
|
+
const hasFields = fields.length > 0;
|
|
172
|
+
const hasValidationCond = permission.validation && Object.entries(permission.validation).length > 0;
|
|
173
|
+
let fieldPolicy;
|
|
174
|
+
let validationPolicy;
|
|
175
|
+
if (hasFields) {
|
|
176
|
+
const fieldConditions = [];
|
|
177
|
+
fieldConditions.push({
|
|
178
|
+
kind: 'when',
|
|
179
|
+
body: {
|
|
180
|
+
containsAll: {
|
|
181
|
+
left: { Value: fields },
|
|
182
|
+
right: {
|
|
183
|
+
'.': {
|
|
184
|
+
left: { Var: 'context' },
|
|
185
|
+
attr: 'requestedFields',
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
fieldPolicy = {
|
|
192
|
+
effect: 'permit',
|
|
193
|
+
principal: principalConstraint,
|
|
194
|
+
action: action,
|
|
195
|
+
resource: { op: 'All' },
|
|
196
|
+
conditions: fieldConditions,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (hasValidationCond) {
|
|
200
|
+
const validationConditions = [];
|
|
201
|
+
const validationBody = addWhenClauses(permission.validation || {}, 'context.newValue');
|
|
202
|
+
validationConditions.push({ kind: 'when', body: validationBody });
|
|
203
|
+
validationPolicy = {
|
|
204
|
+
effect: 'permit',
|
|
205
|
+
principal: principalConstraint,
|
|
206
|
+
action: action,
|
|
207
|
+
resource: { op: 'All' },
|
|
208
|
+
conditions: validationConditions,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return { mainPolicy, fieldPolicy, validationPolicy };
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItdHJhbnNsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jZWRhci9jZWRhci10cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0Q0Esd0NBcUlDO0FBRUQsNENBd0ZDO0FBeFFELDBGQUEwRjtBQUMxRixTQUFTLGFBQWEsQ0FBQyxLQUFVO0lBQy9CLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGlCQUFpQjtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsR0FBVyxFQUNYLEtBQTBCO0lBRTFCLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztTQUFNLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QU0sY0FBYyxHQUFHLGNBQWMsQ0FDbkMsVUFBVSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQzNCLGtCQUFrQixDQUNuQixDQUFDO1FBQ0Ysb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVsRSxnQkFBZ0IsR0FBRztZQUNqQixNQUFNLEVBQUUsUUFBUTtZQUNoQixTQUFTLEVBQUUsbUJBQTBCO1lBQ3JDLE1BQU0sRUFBRSxNQUFhO1lBQ3JCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUU7WUFDdkIsVUFBVSxFQUFFLG9CQUEyQjtTQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUG9saWN5SnNvbiB9IGZyb20gJ0BjZWRhci1wb2xpY3kvY2VkYXItd2FzbS9ub2RlanMnO1xuaW1wb3J0IHsgRDlQZXJtaXNzaW9uLCBGaWx0ZXIgfSBmcm9tICcuL2Q5LXBlcm1pc3Npb24nO1xuXG4vKiogTG9jYWwgc3RhbmQtaW4gZm9yIGxvZGFzaCdzIGBpc1BsYWluT2JqZWN0YCwgd2hpY2ggdGhpcyBwYWNrYWdlIGRvZXMgbm90IGRlcGVuZCBvbi4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbihcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKTogeyBvcGVyYXRvcjogc3RyaW5nOyB2YWx1ZTogYW55IH0ge1xuICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ18nKSAmJiAhWydfYW5kJywgJ19vcicsICdfbm9uZScsICdfc29tZSddLmluY2x1ZGVzKGtleSkpIHtcbiAgICByZXR1cm4geyBvcGVyYXRvcjoga2V5IGFzIHN0cmluZywgdmFsdWUgfTtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4geyBvcGVyYXRvcjogJ19lcScsIHZhbHVlIH07XG4gIH1cblxuICByZXR1cm4gZ2V0T3BlcmF0aW9uKE9iamVjdC5rZXlzKHZhbHVlKVswXSEsIE9iamVjdC52YWx1ZXModmFsdWUpWzBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsdGVyUGF0aChrZXk6IHN0cmluZywgdmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgY29uc3QgcGF0aCA9IFtrZXldO1xuICBjb25zdCBjaGlsZEtleSA9IE9iamVjdC5rZXlzKHZhbHVlKVswXSE7XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBjaGlsZEtleSA9PT0gJ3N0cmluZycgJiZcbiAgICBjaGlsZEtleS5zdGFydHNXaXRoKCdfJykgPT09IHRydWUgJiZcbiAgICAhWydfbm9uZScsICdfc29tZSddLmluY2x1ZGVzKGNoaWxkS2V5KVxuICApIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHBhdGgucHVzaCguLi5nZXRGaWx0ZXJQYXRoKGNoaWxkS2V5LCBPYmplY3QudmFsdWVzKHZhbHVlKVswXSkpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblN1YmplY3QgPSAncmVzb3VyY2UnIHwgJ2NvbnRleHQubmV3VmFsdWUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkV2hlbkNsYXVzZXMoXG4gIGZpbHRlcjogRmlsdGVyLFxuICBzdWJqZWN0OiBDb25kaXRpb25TdWJqZWN0ID0gJ3Jlc291cmNlJyxcbik6IGFueSB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXIpO1xuICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGtleSA9IGVudHJpZXNbMF1bMF07XG4gIGNvbnN0IHZhbHVlID0gZW50cmllc1swXVsxXTtcblxuICBpZiAoa2V5ID09PSAnX29yJyB8fCBrZXkgPT09ICdfYW5kJykge1xuICAgIGlmIChcbiAgICAgIGtleSA9PT0gJ19vcicgJiZcbiAgICAgIHZhbHVlLnNvbWUoXG4gICAgICAgIChzdWJGaWx0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IE9iamVjdC5rZXlzKHN1YkZpbHRlcikubGVuZ3RoID09PSAwLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0ID0gdmFsdWVbMF07XG4gICAgY29uc3QgcmlnaHRWYWwgPSB2YWx1ZVsxXTtcbiAgICBjb25zdCBvcGVyYXRvciA9IGtleSA9PT0gJ19vcicgPyAnfHwnIDogJyYmJztcbiAgICBpZiAocmlnaHRWYWwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtvcGVyYXRvcl06IHtcbiAgICAgICAgICBsZWZ0OiBhZGRXaGVuQ2xhdXNlcyhsZWZ0LCBzdWJqZWN0KSxcbiAgICAgICAgICByaWdodDogYWRkV2hlbkNsYXVzZXMoeyBba2V5XTogdmFsdWUuc2xpY2UoMSkgfSwgc3ViamVjdCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWRkV2hlbkNsYXVzZXMobGVmdCwgc3ViamVjdCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmlsdGVyUGF0aCA9IGdldEZpbHRlclBhdGgoa2V5LCB2YWx1ZSk7XG4gIGNvbnN0IHsgb3BlcmF0b3I6IGZpbHRlck9wZXJhdG9yLCB2YWx1ZTogZmlsdGVyVmFsdWUgfSA9IGdldE9wZXJhdGlvbihcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICk7XG5cbiAgaWYgKGVudHJpZXMubGVuZ3RoID4gMSkge1xuICAgIGRlbGV0ZSBmaWx0ZXJba2V5XTtcbiAgICByZXR1cm4ge1xuICAgICAgJyYmJzoge1xuICAgICAgICBsZWZ0OiBhcHBseUZpbHRlclRvUXVlcnkoZmlsdGVyUGF0aCwgZmlsdGVyT3BlcmF0b3IsIGZpbHRlclZhbHVlLCBzdWJqZWN0KSxcbiAgICAgICAgcmlnaHQ6IGFkZFdoZW5DbGF1c2VzKGZpbHRlciwgc3ViamVjdCksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFwcGx5RmlsdGVyVG9RdWVyeShmaWx0ZXJQYXRoLCBmaWx0ZXJPcGVyYXRvciwgZmlsdGVyVmFsdWUsIHN1YmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlGaWx0ZXJUb1F1ZXJ5KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgY29tcGFyZVZhbHVlOiBhbnksXG4gICAgc3ViamVjdFZhcjogQ29uZGl0aW9uU3ViamVjdCA9ICdyZXNvdXJjZScsXG4gICkge1xuICAgIGZ1bmN0aW9uIGJ1aWxkTGVmdChwYXRoU2VnbWVudHM6IHN0cmluZ1tdLCBzdWJqOiBDb25kaXRpb25TdWJqZWN0KTogYW55IHtcbiAgICAgIGxldCBub2RlOiBhbnkgPVxuICAgICAgICBzdWJqID09PSAnY29udGV4dC5uZXdWYWx1ZSdcbiAgICAgICAgICA/IHsgJy4nOiB7IGxlZnQ6IHsgVmFyOiAnY29udGV4dCcgYXMgY29uc3QgfSwgYXR0cjogJ25ld1ZhbHVlJyB9IH1cbiAgICAgICAgICA6IHsgVmFyOiAncmVzb3VyY2UnIGFzIGNvbnN0IH07XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgcGF0aFNlZ21lbnRzKSB7XG4gICAgICAgIG5vZGUgPSB7ICcuJzogeyBsZWZ0OiBub2RlLCBhdHRyIH0gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkUmlnaHQgPSAodjogYW55KSA9PlxuICAgICAgdiA9PT0gJyRDVVJSRU5UX1VTRVInID8geyBWYXI6ICdwcmluY2lwYWwnIGFzIGNvbnN0IH0gOiB7IFZhbHVlOiB2IH07XG5cbiAgICBjb25zdCBsZWZ0ID0gYnVpbGRMZWZ0KHBhdGgsIHN1YmplY3RWYXIpO1xuICAgIGNvbnN0IHJpZ2h0ID0gYnVpbGRSaWdodChjb21wYXJlVmFsdWUpO1xuXG4gICAgbGV0IGV4cHI6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdCBiYXNlRm9yUGFyZW50ID1cbiAgICAgIHBhdGgubGVuZ3RoIDw9IDFcbiAgICAgICAgPyBzdWJqZWN0VmFyID09PSAnY29udGV4dC5uZXdWYWx1ZSdcbiAgICAgICAgICA/IHsgJy4nOiB7IGxlZnQ6IHsgVmFyOiAnY29udGV4dCcgYXMgY29uc3QgfSwgYXR0cjogJ25ld1ZhbHVlJyB9IH1cbiAgICAgICAgICA6IHsgVmFyOiAncmVzb3VyY2UnIGFzIGNvbnN0IH1cbiAgICAgICAgOiBidWlsZExlZnQocGF0aC5zbGljZSgwLCAtMSksIHN1YmplY3RWYXIpO1xuXG4gICAgaWYgKFxuICAgICAgb3BlcmF0b3IgPT09ICdfbnVsbCcgfHxcbiAgICAgIChvcGVyYXRvciA9PT0gJ19ubnVsbCcgJiYgY29tcGFyZVZhbHVlID09PSBmYWxzZSlcbiAgICApIHtcbiAgICAgIGV4cHIgPSB7XG4gICAgICAgICchJzoge1xuICAgICAgICAgIGFyZzogeyBoYXM6IHsgbGVmdDogYmFzZUZvclBhcmVudCwgYXR0cjogcGF0aFtwYXRoLmxlbmd0aCAtIDFdISB9IH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBvcGVyYXRvciA9PT0gJ19ubnVsbCcgfHxcbiAgICAgIChvcGVyYXRvciA9PT0gJ19udWxsJyAmJiBjb21wYXJlVmFsdWUgPT09IGZhbHNlKVxuICAgICkge1xuICAgICAgZXhwciA9IHsgaGFzOiB7IGxlZnQ6IGJhc2VGb3JQYXJlbnQsIGF0dHI6IHBhdGhbcGF0aC5sZW5ndGggLSAxXSEgfSB9O1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBleHByID09PSBudWxsKSB7XG4gICAgICBpZiAob3BlcmF0b3IgPT09ICdfZXEnKSBleHByID0geyAnPT0nOiB7IGxlZnQsIHJpZ2h0IH0gfTtcbiAgICAgIGlmIChvcGVyYXRvciA9PT0gJ19uZXEnKSBleHByID0geyAnIT0nOiB7IGxlZnQsIHJpZ2h0IH0gfTtcbiAgICAgIGlmIChvcGVyYXRvciA9PT0gJ19ndCcpIGV4cHIgPSB7ICc+JzogeyBsZWZ0LCByaWdodCB9IH07XG4gICAgICBpZiAob3BlcmF0b3IgPT09ICdfZ3RlJykgZXhwciA9IHsgJz49JzogeyBsZWZ0LCByaWdodCB9IH07XG4gICAgICBpZiAob3BlcmF0b3IgPT09ICdfbHQnKSBleHByID0geyAnPCc6IHsgbGVmdCwgcmlnaHQgfSB9O1xuICAgICAgaWYgKG9wZXJhdG9yID09PSAnX2x0ZScpIGV4cHIgPSB7ICc8PSc6IHsgbGVmdCwgcmlnaHQgfSB9O1xuICAgICAgaWYgKG9wZXJhdG9yID09PSAnX2ljb250YWlucycpIHtcbiAgICAgICAgLy8gQ2VkYXIgaGFzIG5vIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuIE5vcm1hbGl6ZSB0aGUgc3RvcmVkIGRhdGEgYW5kIHVzZVxuICAgICAgICAvLyBfY29udGFpbnMg4oCUIGh0dHBzOi8vZG9jcy5jZWRhcnBvbGljeS5jb20vYmVzdHByYWN0aWNlcy9icC1ub3JtYWxpemUtZGF0YS1pbnB1dC5odG1sXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnX2ljb250YWlucyBpcyBub3Qgc3VwcG9ydGVkIGluIENlZGFyIHBvbGljaWVzOiBub3JtYWxpemUgdGhlIGRhdGEgKGUuZy4gbG93ZXJjYXNlKSBhbmQgdXNlIF9jb250YWlucyBpbnN0ZWFkJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRvciA9PT0gJ19jb250YWlucycpIHtcbiAgICAgICAgZXhwciA9IHtcbiAgICAgICAgICBsaWtlOiB7XG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgcGF0dGVybjogWydXaWxkY2FyZCcsIHsgTGl0ZXJhbDogY29tcGFyZVZhbHVlIH0sICdXaWxkY2FyZCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0b3IgPT09ICdfc3RhcnRzX3dpdGgnKSB7XG4gICAgICAgIGV4cHIgPSB7IGxpa2U6IHsgbGVmdCwgcGF0dGVybjogW3sgTGl0ZXJhbDogY29tcGFyZVZhbHVlIH0sICdXaWxkY2FyZCddIH0gfTtcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRvciA9PT0gJ19lbmRzX3dpdGgnKSB7XG4gICAgICAgIGV4cHIgPSB7IGxpa2U6IHsgbGVmdCwgcGF0dGVybjogWydXaWxkY2FyZCcsIHsgTGl0ZXJhbDogY29tcGFyZVZhbHVlIH1dIH0gfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhwciA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHJldHVybiBleHByO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVUb0NlZGFyKHBlcm1pc3Npb246IEQ5UGVybWlzc2lvbik6IHtcbiAgbWFpblBvbGljeTogUG9saWN5SnNvbjtcbiAgZmllbGRQb2xpY3k/OiBQb2xpY3lKc29uO1xuICB2YWxpZGF0aW9uUG9saWN5PzogUG9saWN5SnNvbjtcbn0ge1xuICBjb25zdCBwcmluY2lwYWxDb25zdHJhaW50ID0ge1xuICAgIG9wOiAnaW4nLFxuICAgIGVudGl0eToge1xuICAgICAgdHlwZTogJ2Q5OjpVc2VyR3JvdXAnLFxuICAgICAgaWQ6IHBlcm1pc3Npb24ucm9sZU5hbWUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBhY3Rpb24gPSB7XG4gICAgb3A6ICc9PScsXG4gICAgZW50aXR5OiB7XG4gICAgICB0eXBlOiBgRGI6OiR7cGVybWlzc2lvbi5jb2xsZWN0aW9ufTo6QWN0aW9uYCxcbiAgICAgIGlkOiBwZXJtaXNzaW9uLmFjdGlvbixcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IG1haW5Db25kaXRpb25Cb2R5ID0gYWRkV2hlbkNsYXVzZXMocGVybWlzc2lvbi5wZXJtaXNzaW9ucyB8fCB7fSk7XG5cbiAgY29uc3QgbWFpbkNvbmRpdGlvbnMgPSBtYWluQ29uZGl0aW9uQm9keVxuICAgID8gW3sga2luZDogJ3doZW4nIGFzIGNvbnN0LCBib2R5OiBtYWluQ29uZGl0aW9uQm9keSB9XVxuICAgIDogW107XG5cbiAgY29uc3QgbWFpblBvbGljeTogUG9saWN5SnNvbiA9IHtcbiAgICBlZmZlY3Q6ICdwZXJtaXQnLFxuICAgIHByaW5jaXBhbDogcHJpbmNpcGFsQ29uc3RyYWludCBhcyBhbnksXG4gICAgYWN0aW9uOiBhY3Rpb24gYXMgYW55LFxuICAgIHJlc291cmNlOiB7IG9wOiAnQWxsJyB9LFxuICAgIGNvbmRpdGlvbnM6IG1haW5Db25kaXRpb25zIGFzIGFueSxcbiAgfTtcblxuICAvLyBGaWVsZC1sZXZlbCBwb2xpY3kgb25seSB3aGVuIHRoZXJlIGlzIGEgZmllbGRzIHJlc3RyaWN0aW9uIGFuZC9vciB2YWxpZGF0aW9uXG4gIGNvbnN0IGZpZWxkcyA9IHBlcm1pc3Npb24uZmllbGRzID8/IFtdO1xuICBjb25zdCBoYXNGaWVsZHMgPSBmaWVsZHMubGVuZ3RoID4gMDtcbiAgY29uc3QgaGFzVmFsaWRhdGlvbkNvbmQgPVxuICAgIHBlcm1pc3Npb24udmFsaWRhdGlvbiAmJiBPYmplY3QuZW50cmllcyhwZXJtaXNzaW9uLnZhbGlkYXRpb24pLmxlbmd0aCA+IDA7XG5cbiAgbGV0IGZpZWxkUG9saWN5OiBQb2xpY3lKc29uIHwgdW5kZWZpbmVkO1xuICBsZXQgdmFsaWRhdGlvblBvbGljeTogUG9saWN5SnNvbiB8IHVuZGVmaW5lZDtcbiAgaWYgKGhhc0ZpZWxkcykge1xuICAgIGNvbnN0IGZpZWxkQ29uZGl0aW9uczogQXJyYXk8eyBraW5kOiAnd2hlbic7IGJvZHk6IGFueSB9PiA9IFtdO1xuXG4gICAgZmllbGRDb25kaXRpb25zLnB1c2goe1xuICAgICAga2luZDogJ3doZW4nLFxuICAgICAgYm9keToge1xuICAgICAgICBjb250YWluc0FsbDoge1xuICAgICAgICAgIGxlZnQ6IHsgVmFsdWU6IGZpZWxkcyB9LFxuICAgICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICAnLic6IHtcbiAgICAgICAgICAgICAgbGVmdDogeyBWYXI6ICdjb250ZXh0JyB9LFxuICAgICAgICAgICAgICBhdHRyOiAncmVxdWVzdGVkRmllbGRzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZmllbGRQb2xpY3kgPSB7XG4gICAgICBlZmZlY3Q6ICdwZXJtaXQnLFxuICAgICAgcHJpbmNpcGFsOiBwcmluY2lwYWxDb25zdHJhaW50IGFzIGFueSxcbiAgICAgIGFjdGlvbjogYWN0aW9uIGFzIGFueSxcbiAgICAgIHJlc291cmNlOiB7IG9wOiAnQWxsJyB9LFxuICAgICAgY29uZGl0aW9uczogZmllbGRDb25kaXRpb25zLFxuICAgIH07XG4gIH1cblxuICBpZiAoaGFzVmFsaWRhdGlvbkNvbmQpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ29uZGl0aW9uczogQXJyYXk8eyBraW5kOiAnd2hlbic7IGJvZHk6IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbkJvZHkgPSBhZGRXaGVuQ2xhdXNlcyhcbiAgICAgIHBlcm1pc3Npb24udmFsaWRhdGlvbiB8fCB7fSxcbiAgICAgICdjb250ZXh0Lm5ld1ZhbHVlJyxcbiAgICApO1xuICAgIHZhbGlkYXRpb25Db25kaXRpb25zLnB1c2goeyBraW5kOiAnd2hlbicsIGJvZHk6IHZhbGlkYXRpb25Cb2R5IH0pO1xuXG4gICAgdmFsaWRhdGlvblBvbGljeSA9IHtcbiAgICAgIGVmZmVjdDogJ3Blcm1pdCcsXG4gICAgICBwcmluY2lwYWw6IHByaW5jaXBhbENvbnN0cmFpbnQgYXMgYW55LFxuICAgICAgYWN0aW9uOiBhY3Rpb24gYXMgYW55LFxuICAgICAgcmVzb3VyY2U6IHsgb3A6ICdBbGwnIH0sXG4gICAgICBjb25kaXRpb25zOiB2YWxpZGF0aW9uQ29uZGl0aW9ucyBhcyBhbnksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IG1haW5Qb2xpY3ksIGZpZWxkUG9saWN5LCB2YWxpZGF0aW9uUG9saWN5IH07XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** The `Filter` type of `@wbce-d9/types`, inlined so the CLI does not depend on it. */
|
|
2
|
+
export type Filter = Record<string, any>;
|
|
3
|
+
/**
|
|
4
|
+
* A d9 permission, shared by both translation directions:
|
|
5
|
+
* - forward (d9-to-cedar): `new D9Permission(row)` parses a CSV row;
|
|
6
|
+
* - reverse (cedar-to-d9): `D9Permission.empty(...)` starts a blank permission that
|
|
7
|
+
* is filled as each `.cedar` file is parsed, then rendered back via `*Cell()`.
|
|
8
|
+
* `id`/`role`/`presets` are CSV-only columns, populated only on the forward side.
|
|
9
|
+
*/
|
|
10
|
+
export declare class D9Permission {
|
|
11
|
+
/** Blank permission to accumulate reconstructed Cedar clauses onto (reverse direction). */
|
|
12
|
+
static empty(roleName: string, collection: string, action: string): D9Permission;
|
|
13
|
+
roleName: string;
|
|
14
|
+
collection: string;
|
|
15
|
+
action: string;
|
|
16
|
+
permissions?: Filter;
|
|
17
|
+
validation?: Filter;
|
|
18
|
+
fields?: string[];
|
|
19
|
+
id?: number;
|
|
20
|
+
role?: string;
|
|
21
|
+
presets?: Record<string, any>;
|
|
22
|
+
/** Parse a `directus_permissions.csv` row. `roleName` is resolved separately from the role UUID. */
|
|
23
|
+
constructor(row: Record<string, string>);
|
|
24
|
+
permissionsCell(): string;
|
|
25
|
+
validationCell(): string;
|
|
26
|
+
fieldsCell(): string;
|
|
27
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.D9Permission = void 0;
|
|
4
|
+
function parseStringFieldToJSON(field) {
|
|
5
|
+
return field?.length ? JSON.parse(field) : undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A d9 permission, shared by both translation directions:
|
|
9
|
+
* - forward (d9-to-cedar): `new D9Permission(row)` parses a CSV row;
|
|
10
|
+
* - reverse (cedar-to-d9): `D9Permission.empty(...)` starts a blank permission that
|
|
11
|
+
* is filled as each `.cedar` file is parsed, then rendered back via `*Cell()`.
|
|
12
|
+
* `id`/`role`/`presets` are CSV-only columns, populated only on the forward side.
|
|
13
|
+
*/
|
|
14
|
+
class D9Permission {
|
|
15
|
+
/** Blank permission to accumulate reconstructed Cedar clauses onto (reverse direction). */
|
|
16
|
+
static empty(roleName, collection, action) {
|
|
17
|
+
const perm = Object.create(D9Permission.prototype);
|
|
18
|
+
perm.roleName = roleName;
|
|
19
|
+
perm.collection = collection;
|
|
20
|
+
perm.action = action;
|
|
21
|
+
return perm;
|
|
22
|
+
}
|
|
23
|
+
/** Parse a `directus_permissions.csv` row. `roleName` is resolved separately from the role UUID. */
|
|
24
|
+
constructor(row) {
|
|
25
|
+
this.collection = row.collection;
|
|
26
|
+
this.action = row.action;
|
|
27
|
+
this.id = Number(row.id);
|
|
28
|
+
this.role = row.role;
|
|
29
|
+
this.permissions = parseStringFieldToJSON(row.permissions);
|
|
30
|
+
this.validation = parseStringFieldToJSON(row.validation);
|
|
31
|
+
this.fields = row.fields?.split(',') || [];
|
|
32
|
+
this.presets = parseStringFieldToJSON(row.presets);
|
|
33
|
+
}
|
|
34
|
+
permissionsCell() {
|
|
35
|
+
return JSON.stringify(this.permissions ?? {});
|
|
36
|
+
}
|
|
37
|
+
validationCell() {
|
|
38
|
+
return JSON.stringify(this.validation ?? {});
|
|
39
|
+
}
|
|
40
|
+
fieldsCell() {
|
|
41
|
+
return this.fields ? this.fields.join(',') : '*';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.D9Permission = D9Permission;
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDktcGVybWlzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvY2VkYXIvZDktcGVybWlzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQWEsWUFBWTtJQUN2QiwyRkFBMkY7SUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FDakIsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsTUFBYztRQUVkLE1BQU0sSUFBSSxHQUFpQixNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFhRCxvR0FBb0c7SUFDcEcsWUFBWSxHQUEyQjtRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVNLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBaERELG9DQWdEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBUaGUgYEZpbHRlcmAgdHlwZSBvZiBgQHdiY2UtZDkvdHlwZXNgLCBpbmxpbmVkIHNvIHRoZSBDTEkgZG9lcyBub3QgZGVwZW5kIG9uIGl0LiAqL1xuZXhwb3J0IHR5cGUgRmlsdGVyID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuZnVuY3Rpb24gcGFyc2VTdHJpbmdGaWVsZFRvSlNPTihmaWVsZD86IHN0cmluZykge1xuICByZXR1cm4gZmllbGQ/Lmxlbmd0aCA/IEpTT04ucGFyc2UoZmllbGQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgZDkgcGVybWlzc2lvbiwgc2hhcmVkIGJ5IGJvdGggdHJhbnNsYXRpb24gZGlyZWN0aW9uczpcbiAqICAtIGZvcndhcmQgKGQ5LXRvLWNlZGFyKTogYG5ldyBEOVBlcm1pc3Npb24ocm93KWAgcGFyc2VzIGEgQ1NWIHJvdztcbiAqICAtIHJldmVyc2UgKGNlZGFyLXRvLWQ5KTogYEQ5UGVybWlzc2lvbi5lbXB0eSguLi4pYCBzdGFydHMgYSBibGFuayBwZXJtaXNzaW9uIHRoYXRcbiAqICAgIGlzIGZpbGxlZCBhcyBlYWNoIGAuY2VkYXJgIGZpbGUgaXMgcGFyc2VkLCB0aGVuIHJlbmRlcmVkIGJhY2sgdmlhIGAqQ2VsbCgpYC5cbiAqIGBpZGAvYHJvbGVgL2BwcmVzZXRzYCBhcmUgQ1NWLW9ubHkgY29sdW1ucywgcG9wdWxhdGVkIG9ubHkgb24gdGhlIGZvcndhcmQgc2lkZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEQ5UGVybWlzc2lvbiB7XG4gIC8qKiBCbGFuayBwZXJtaXNzaW9uIHRvIGFjY3VtdWxhdGUgcmVjb25zdHJ1Y3RlZCBDZWRhciBjbGF1c2VzIG9udG8gKHJldmVyc2UgZGlyZWN0aW9uKS4gKi9cbiAgcHVibGljIHN0YXRpYyBlbXB0eShcbiAgICByb2xlTmFtZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgKTogRDlQZXJtaXNzaW9uIHtcbiAgICBjb25zdCBwZXJtOiBEOVBlcm1pc3Npb24gPSBPYmplY3QuY3JlYXRlKEQ5UGVybWlzc2lvbi5wcm90b3R5cGUpO1xuICAgIHBlcm0ucm9sZU5hbWUgPSByb2xlTmFtZTtcbiAgICBwZXJtLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHBlcm0uYWN0aW9uID0gYWN0aW9uO1xuICAgIHJldHVybiBwZXJtO1xuICB9XG5cbiAgcHVibGljIHJvbGVOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgY29sbGVjdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgYWN0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBwZXJtaXNzaW9ucz86IEZpbHRlcjtcbiAgcHVibGljIHZhbGlkYXRpb24/OiBGaWx0ZXI7XG4gIHB1YmxpYyBmaWVsZHM/OiBzdHJpbmdbXTtcblxuICBwdWJsaWMgaWQ/OiBudW1iZXI7XG4gIHB1YmxpYyByb2xlPzogc3RyaW5nO1xuICBwdWJsaWMgcHJlc2V0cz86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgLyoqIFBhcnNlIGEgYGRpcmVjdHVzX3Blcm1pc3Npb25zLmNzdmAgcm93LiBgcm9sZU5hbWVgIGlzIHJlc29sdmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgcm9sZSBVVUlELiAqL1xuICBjb25zdHJ1Y3Rvcihyb3c6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSByb3cuY29sbGVjdGlvbjtcbiAgICB0aGlzLmFjdGlvbiA9IHJvdy5hY3Rpb247XG4gICAgdGhpcy5pZCA9IE51bWJlcihyb3cuaWQpO1xuICAgIHRoaXMucm9sZSA9IHJvdy5yb2xlO1xuICAgIHRoaXMucGVybWlzc2lvbnMgPSBwYXJzZVN0cmluZ0ZpZWxkVG9KU09OKHJvdy5wZXJtaXNzaW9ucyk7XG4gICAgdGhpcy52YWxpZGF0aW9uID0gcGFyc2VTdHJpbmdGaWVsZFRvSlNPTihyb3cudmFsaWRhdGlvbik7XG4gICAgdGhpcy5maWVsZHMgPSByb3cuZmllbGRzPy5zcGxpdCgnLCcpIHx8IFtdO1xuICAgIHRoaXMucHJlc2V0cyA9IHBhcnNlU3RyaW5nRmllbGRUb0pTT04ocm93LnByZXNldHMpO1xuICB9XG5cbiAgcHVibGljIHBlcm1pc3Npb25zQ2VsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnBlcm1pc3Npb25zID8/IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0aW9uQ2VsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbGlkYXRpb24gPz8ge30pO1xuICB9XG5cbiAgcHVibGljIGZpZWxkc0NlbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZHMgPyB0aGlzLmZpZWxkcy5qb2luKCcsJykgOiAnKic7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PolicyJson } from '@cedar-policy/cedar-wasm/nodejs';
|
|
2
|
+
import { D9Permission } from './d9-permission';
|
|
3
|
+
import { RolesTable } from './roles-table';
|
|
4
|
+
export declare class CedarManager {
|
|
5
|
+
permissionPath: string;
|
|
6
|
+
sqlPath: string;
|
|
7
|
+
fieldsPolicies: Map<string, PolicyJson[]>;
|
|
8
|
+
mainPolicies: Map<string, PolicyJson[]>;
|
|
9
|
+
validationPolicies: Map<string, PolicyJson[]>;
|
|
10
|
+
roles: RolesTable;
|
|
11
|
+
d9Permissions: D9Permission[];
|
|
12
|
+
constructor(opts?: {
|
|
13
|
+
permissionPath?: string;
|
|
14
|
+
sqlPath?: string;
|
|
15
|
+
});
|
|
16
|
+
readPermissionFile(): Promise<void>;
|
|
17
|
+
readRoleFile(): Promise<void>;
|
|
18
|
+
refactoPolicies(policyKey: 'mainPolicies' | 'fieldsPolicies' | 'validationPolicies'): void;
|
|
19
|
+
sortPolicies(policyKey: 'mainPolicies' | 'fieldsPolicies' | 'validationPolicies'): void;
|
|
20
|
+
translateAndSortPermission(): Promise<void>;
|
|
21
|
+
writePoliciesToFile(roleName: string, fileTitle: string, policies: PolicyJson[]): Promise<void>;
|
|
22
|
+
writePolicies(policyKey: 'mainPolicies' | 'fieldsPolicies' | 'validationPolicies', fileName: string): Promise<void>;
|
|
23
|
+
readCsvAndWriteAllFiles(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* CLI action: regenerate the Cedar policy folders from directus_permissions.csv.
|
|
27
|
+
* The folder is wiped first, reproducing what `formatePermission` does in app-api2,
|
|
28
|
+
* so a role removed from the CSV leaves no orphan files.
|
|
29
|
+
*/
|
|
30
|
+
export declare function d9ToCedar(options?: {
|
|
31
|
+
permissionPath?: string;
|
|
32
|
+
sqlPath?: string;
|
|
33
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CedarManager = void 0;
|
|
4
|
+
exports.d9ToCedar = d9ToCedar;
|
|
5
|
+
const promises_1 = require("fs/promises");
|
|
6
|
+
const cedar = require("@cedar-policy/cedar-wasm/nodejs");
|
|
7
|
+
const cedar_format_1 = require("./cedar-format");
|
|
8
|
+
const cedar_translations_1 = require("./cedar-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
|
+
class CedarManager {
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
this.fieldsPolicies = new Map();
|
|
16
|
+
this.mainPolicies = new Map();
|
|
17
|
+
this.validationPolicies = new Map();
|
|
18
|
+
this.d9Permissions = [];
|
|
19
|
+
this.permissionPath = opts?.permissionPath || './permissions';
|
|
20
|
+
this.sqlPath = opts?.sqlPath || './sql/data';
|
|
21
|
+
}
|
|
22
|
+
async readPermissionFile() {
|
|
23
|
+
const permissions = await (0, utils_1.readCsvFile)(`${this.sqlPath}/directus_permissions.csv`);
|
|
24
|
+
this.d9Permissions = permissions.map((p) => new d9_permission_1.D9Permission(p));
|
|
25
|
+
}
|
|
26
|
+
async readRoleFile() {
|
|
27
|
+
this.roles = await roles_table_1.RolesTable.load(this.sqlPath);
|
|
28
|
+
for (const permission of this.d9Permissions) {
|
|
29
|
+
permission.roleName = permission.role
|
|
30
|
+
? this.roles.getNameFromId(permission.role)
|
|
31
|
+
: 'Public';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
refactoPolicies(policyKey) {
|
|
35
|
+
for (const [groupName, policies] of this[policyKey]) {
|
|
36
|
+
const groupedPolicies = new Map();
|
|
37
|
+
for (const policy of policies) {
|
|
38
|
+
const conditionsKey = JSON.stringify(policy.conditions.map((c) => c.body));
|
|
39
|
+
if (!groupedPolicies.has(conditionsKey)) {
|
|
40
|
+
groupedPolicies.set(conditionsKey, []);
|
|
41
|
+
}
|
|
42
|
+
groupedPolicies.get(conditionsKey).push(policy);
|
|
43
|
+
}
|
|
44
|
+
// Combine policies in each group
|
|
45
|
+
const refactored = [];
|
|
46
|
+
for (const group of groupedPolicies.values()) {
|
|
47
|
+
if (group.length === 1) {
|
|
48
|
+
// No optimization needed for single policy
|
|
49
|
+
refactored.push(group[0]);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Multiple policies with same conditions - combine actions
|
|
53
|
+
const actions = group
|
|
54
|
+
.map((p) => p.action.entity)
|
|
55
|
+
.sort((a, b) => `${a.id}${a.type}`.localeCompare(`${b.id}${b.type}`));
|
|
56
|
+
// Create combined policy with "action in [...]"
|
|
57
|
+
const combinedPolicy = {
|
|
58
|
+
effect: group[0].effect,
|
|
59
|
+
principal: group[0].principal,
|
|
60
|
+
action: {
|
|
61
|
+
op: 'in',
|
|
62
|
+
entities: actions,
|
|
63
|
+
},
|
|
64
|
+
resource: group[0].resource,
|
|
65
|
+
conditions: group[0].conditions,
|
|
66
|
+
};
|
|
67
|
+
refactored.push(combinedPolicy);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this[policyKey].set(groupName, refactored);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
sortPolicies(policyKey) {
|
|
74
|
+
for (const [groupName, policies] of this[policyKey]) {
|
|
75
|
+
this[policyKey].set(groupName, policies.sort((p1, p2) => {
|
|
76
|
+
const a1 = p1.action;
|
|
77
|
+
const a2 = p2.action;
|
|
78
|
+
const t1 = (a1.entities?.[0] || a1.entity).type;
|
|
79
|
+
const t2 = (a2.entities?.[0] || a2.entity).type;
|
|
80
|
+
return t1.localeCompare(t2);
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async translateAndSortPermission() {
|
|
85
|
+
for (const permission of this.d9Permissions) {
|
|
86
|
+
const cedarPolicies = await (0, cedar_translations_1.translateToCedar)(permission);
|
|
87
|
+
const mainPolicies = this.mainPolicies.get(permission.roleName) || [];
|
|
88
|
+
this.mainPolicies.set(permission.roleName, [
|
|
89
|
+
...mainPolicies,
|
|
90
|
+
cedarPolicies.mainPolicy,
|
|
91
|
+
]);
|
|
92
|
+
if (cedarPolicies.fieldPolicy) {
|
|
93
|
+
const fieldPolicies = this.fieldsPolicies.get(permission.roleName) || [];
|
|
94
|
+
this.fieldsPolicies.set(permission.roleName, [
|
|
95
|
+
...fieldPolicies,
|
|
96
|
+
cedarPolicies.fieldPolicy,
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
if (cedarPolicies.validationPolicy) {
|
|
100
|
+
const validationPolicies = this.validationPolicies.get(permission.roleName) || [];
|
|
101
|
+
this.validationPolicies.set(permission.roleName, [
|
|
102
|
+
...validationPolicies,
|
|
103
|
+
cedarPolicies.validationPolicy,
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const policyKeys = ['mainPolicies', 'fieldsPolicies', 'validationPolicies'];
|
|
108
|
+
for (const pKey of policyKeys) {
|
|
109
|
+
this.refactoPolicies(pKey);
|
|
110
|
+
this.sortPolicies(pKey);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async writePoliciesToFile(roleName, fileTitle, policies) {
|
|
114
|
+
await (0, promises_1.mkdir)(`${this.permissionPath}/${roleName}`, { recursive: true });
|
|
115
|
+
const policiesText = policies.map(cedar_format_1.policyToCedarText).join('\n\n') + '\n';
|
|
116
|
+
// Our own condition layout must still be valid Cedar.
|
|
117
|
+
const parsed = cedar.policySetTextToParts(policiesText);
|
|
118
|
+
if (parsed.type === 'failure') {
|
|
119
|
+
logger_1.logger.error({ policiesText }, 'generated policies are not valid Cedar');
|
|
120
|
+
throw new Error(parsed.errors);
|
|
121
|
+
}
|
|
122
|
+
await (0, promises_1.writeFile)(`${this.permissionPath}/${roleName}/${fileTitle}`, policiesText);
|
|
123
|
+
}
|
|
124
|
+
async writePolicies(policyKey, fileName) {
|
|
125
|
+
for (const [group, policies] of this[policyKey]) {
|
|
126
|
+
await this.writePoliciesToFile(group, fileName, policies);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async readCsvAndWriteAllFiles() {
|
|
130
|
+
logger_1.logger.info('read permission file');
|
|
131
|
+
await this.readPermissionFile();
|
|
132
|
+
logger_1.logger.info(`found ${this.d9Permissions.length} permissions`);
|
|
133
|
+
logger_1.logger.info('read role file');
|
|
134
|
+
await this.readRoleFile();
|
|
135
|
+
logger_1.logger.info('roles imported');
|
|
136
|
+
logger_1.logger.info('grouping and sorting permissions');
|
|
137
|
+
await this.translateAndSortPermission();
|
|
138
|
+
logger_1.logger.info(`having ${this.mainPolicies.size} main policies and ${this.fieldsPolicies.size} fields policies`);
|
|
139
|
+
logger_1.logger.info('writing cedar policies files');
|
|
140
|
+
await this.writePolicies('mainPolicies', 'authorize.cedar');
|
|
141
|
+
await this.writePolicies('fieldsPolicies', 'check-fields.cedar');
|
|
142
|
+
await this.writePolicies('validationPolicies', 'validate.cedar');
|
|
143
|
+
logger_1.logger.info('files wroten');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.CedarManager = CedarManager;
|
|
147
|
+
/**
|
|
148
|
+
* CLI action: regenerate the Cedar policy folders from directus_permissions.csv.
|
|
149
|
+
* The folder is wiped first, reproducing what `formatePermission` does in app-api2,
|
|
150
|
+
* so a role removed from the CSV leaves no orphan files.
|
|
151
|
+
*/
|
|
152
|
+
async function d9ToCedar(options) {
|
|
153
|
+
const manager = new CedarManager(options);
|
|
154
|
+
await (0, promises_1.rm)(manager.permissionPath, { recursive: true, force: true });
|
|
155
|
+
await manager.readCsvAndWriteAllFiles();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDktdG8tY2VkYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL2Q5LXRvLWNlZGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThMQSw4QkFPQztBQXJNRCwwQ0FBbUQ7QUFDbkQseURBQXlEO0FBRXpELGlEQUFtRDtBQUNuRCw2REFBd0Q7QUFDeEQsbURBQStDO0FBQy9DLCtDQUEyQztBQUMzQyx5Q0FBc0M7QUFDdEMseUNBQTRDO0FBRTVDLE1BQWEsWUFBWTtJQVd2QixZQUFZLElBQW9EO1FBUHpELG1CQUFjLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsaUJBQVksR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwRCx1QkFBa0IsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUcxRCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFHeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEVBQUUsY0FBYyxJQUFJLGVBQWUsQ0FBQztRQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksWUFBWSxDQUFDO0lBQy9DLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxtQkFBVyxFQUNuQyxHQUFHLElBQUksQ0FBQyxPQUFPLDJCQUEyQixDQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLDRCQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVk7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLHdCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sVUFBVSxJQUFJ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QUFVLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxzQkFBc0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGtCQUFrQixDQUNqRyxDQUFDO1FBQ0YsZUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxlQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQTdLRCxvQ0E2S0M7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUcvQjtJQUNDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sSUFBQSxhQUFFLEVBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHJtLCB3cml0ZUZpbGUgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBjZWRhciBmcm9tICdAY2VkYXItcG9saWN5L2NlZGFyLXdhc20vbm9kZWpzJztcbmltcG9ydCB0eXBlIHsgUG9saWN5SnNvbiB9IGZyb20gJ0BjZWRhci1wb2xpY3kvY2VkYXItd2FzbS9ub2RlanMnO1xuaW1wb3J0IHsgcG9saWN5VG9DZWRhclRleHQgfSBmcm9tICcuL2NlZGFyLWZvcm1hdCc7XG5pbXBvcnQgeyB0cmFuc2xhdGVUb0NlZGFyIH0gZnJvbSAnLi9jZWRhci10cmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRDlQZXJtaXNzaW9uIH0gZnJvbSAnLi9kOS1wZXJtaXNzaW9uJztcbmltcG9ydCB7IFJvbGVzVGFibGUgfSBmcm9tICcuL3JvbGVzLXRhYmxlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyByZWFkQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ2VkYXJNYW5hZ2VyIHtcbiAgcHVibGljIHBlcm1pc3Npb25QYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyBzcWxQYXRoOiBzdHJpbmc7XG5cbiAgcHVibGljIGZpZWxkc1BvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgbWFpblBvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgdmFsaWRhdGlvblBvbGljaWVzOiBNYXA8c3RyaW5nLCBQb2xpY3lKc29uW10+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyByb2xlcyE6IFJvbGVzVGFibGU7XG4gIHB1YmxpYyBkOVBlcm1pc3Npb25zOiBEOVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiB7IHBlcm1pc3Npb25QYXRoPzogc3RyaW5nOyBzcWxQYXRoPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnBlcm1pc3Npb25QYXRoID0gb3B0cz8ucGVybWlzc2lvblBhdGggfHwgJy4vcGVybWlzc2lvbnMnO1xuICAgIHRoaXMuc3FsUGF0aCA9IG9wdHM/LnNxbFBhdGggfHwgJy4vc3FsL2RhdGEnO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRQZXJtaXNzaW9uRmlsZSgpIHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHJlYWRDc3ZGaWxlKFxuICAgICAgYCR7dGhpcy5zcWxQYXRofS9kaXJlY3R1c19wZXJtaXNzaW9ucy5jc3ZgLFxuICAgICk7XG4gICAgdGhpcy5kOVBlcm1pc3Npb25zID0gcGVybWlzc2lvbnMubWFwKChwKSA9PiBuZXcgRDlQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkUm9sZUZpbGUoKSB7XG4gICAgdGhpcy5yb2xlcyA9IGF3YWl0IFJvbGVzVGFibGUubG9hZCh0aGlzLnNxbFBhdGgpO1xuICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiB0aGlzLmQ5UGVybWlzc2lvbnMpIHtcbiAgICAgIHBlcm1pc3Npb24ucm9sZU5hbWUgPSBwZXJtaXNzaW9uLnJvbGVcbiAgICAgICAgPyB0aGlzLnJvbGVzLmdldE5hbWVGcm9tSWQocGVybWlzc2lvbi5yb2xlKSFcbiAgICAgICAgOiAnUHVibGljJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmYWN0b1BvbGljaWVzKFxuICAgIHBvbGljeUtleTogJ21haW5Qb2xpY2llcycgfCAnZmllbGRzUG9saWNpZXMnIHwgJ3ZhbGlkYXRpb25Qb2xpY2llcycsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwTmFtZSwgcG9saWNpZXNdIG9mIHRoaXNbcG9saWN5S2V5XSkge1xuICAgICAgY29uc3QgZ3JvdXBlZFBvbGljaWVzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgZm9yIChjb25zdCBwb2xpY3kgb2YgcG9saWNpZXMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uc0tleSA9IEpTT04uc3RyaW5naWZ5KHBvbGljeS5jb25kaXRpb25zLm1hcCgoYykgPT4gYy5ib2R5KSk7XG4gICAgICAgIGlmICghZ3JvdXBlZFBvbGljaWVzLmhhcyhjb25kaXRpb25zS2V5KSkge1xuICAgICAgICAgIGdyb3VwZWRQb2xpY2llcy5zZXQoY29uZGl0aW9uc0tleSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwZWRQb2xpY2llcy5nZXQoY29uZGl0aW9uc0tleSkhLnB1c2gocG9saWN5KTtcbiAgICAgIH1cbiAgICAgIC8vIENvbWJpbmUgcG9saWNpZXMgaW4gZWFjaCBncm91cFxuICAgICAgY29uc3QgcmVmYWN0b3JlZDogYW55W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cGVkUG9saWNpZXMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIE5vIG9wdGltaXphdGlvbiBuZWVkZWQgZm9yIHNpbmdsZSBwb2xpY3lcbiAgICAgICAgICByZWZhY3RvcmVkLnB1c2goZ3JvdXBbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE11bHRpcGxlIHBvbGljaWVzIHdpdGggc2FtZSBjb25kaXRpb25zIC0gY29tYmluZSBhY3Rpb25zXG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGdyb3VwXG4gICAgICAgICAgICAubWFwKChwKSA9PiBwLmFjdGlvbi5lbnRpdHkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYCR7YS5pZH0ke2EudHlwZX1gLmxvY2FsZUNvbXBhcmUoYCR7Yi5pZH0ke2IudHlwZX1gKSk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgY29tYmluZWQgcG9saWN5IHdpdGggXCJhY3Rpb24gaW4gWy4uLl1cIlxuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkUG9saWN5ID0ge1xuICAgICAgICAgICAgZWZmZWN0OiBncm91cFswXS5lZmZlY3QsXG4gICAgICAgICAgICBwcmluY2lwYWw6IGdyb3VwWzBdLnByaW5jaXBhbCxcbiAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICBvcDogJ2luJyxcbiAgICAgICAgICAgICAgZW50aXRpZXM6IGFjdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzb3VyY2U6IGdyb3VwWzBdLnJlc291cmNlLFxuICAgICAgICAgICAgY29uZGl0aW9uczogZ3JvdXBbMF0uY29uZGl0aW9ucyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlZmFjdG9yZWQucHVzaChjb21iaW5lZFBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXNbcG9saWN5S2V5XS5zZXQoZ3JvdXBOYW1lLCByZWZhY3RvcmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc29ydFBvbGljaWVzKFxuICAgIHBvbGljeUtleTogJ21haW5Qb2xpY2llcycgfCAnZmllbGRzUG9saWNpZXMnIHwgJ3ZhbGlkYXRpb25Qb2xpY2llcycsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwTmFtZSwgcG9saWNpZXNdIG9mIHRoaXNbcG9saWN5S2V5XSkge1xuICAgICAgdGhpc1twb2xpY3lLZXldLnNldChcbiAgICAgICAgZ3JvdXBOYW1lLFxuICAgICAgICBwb2xpY2llcy5zb3J0KChwMSwgcDIpID0+IHtcbiAgICAgICAgICBjb25zdCBhMSA9IHAxLmFjdGlvbiBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgYTIgPSBwMi5hY3Rpb24gYXMgYW55O1xuICAgICAgICAgIGNvbnN0IHQxID0gKGExLmVudGl0aWVzPy5bMF0gfHwgYTEuZW50aXR5KS50eXBlO1xuICAgICAgICAgIGNvbnN0IHQyID0gKGEyLmVudGl0aWVzPy5bMF0gfHwgYTIuZW50aXR5KS50eXBlO1xuICAgICAgICAgIHJldHVybiB0MS5sb2NhbGVDb21wYXJlKHQyKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2xhdGVBbmRTb3J0UGVybWlzc2lvbigpIHtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGhpcy5kOVBlcm1pc3Npb25zKSB7XG4gICAgICBjb25zdCBjZWRhclBvbGljaWVzID0gYXdhaXQgdHJhbnNsYXRlVG9DZWRhcihwZXJtaXNzaW9uKTtcbiAgICAgIGNvbnN0IG1haW5Qb2xpY2llcyA9IHRoaXMubWFpblBvbGljaWVzLmdldChwZXJtaXNzaW9uLnJvbGVOYW1lKSB8fCBbXTtcbiAgICAgIHRoaXMubWFpblBvbGljaWVzLnNldChwZXJtaXNzaW9uLnJvbGVOYW1lLCBbXG4gICAgICAgIC4uLm1haW5Qb2xpY2llcyxcbiAgICAgICAgY2VkYXJQb2xpY2llcy5tYWluUG9saWN5LFxuICAgICAgXSk7XG4gICAgICBpZiAoY2VkYXJQb2xpY2llcy5maWVsZFBvbGljeSkge1xuICAgICAgICBjb25zdCBmaWVsZFBvbGljaWVzID0gdGhpcy5maWVsZHNQb2xpY2llcy5nZXQocGVybWlzc2lvbi5yb2xlTmFtZSkgfHwgW107XG4gICAgICAgIHRoaXMuZmllbGRzUG9saWNpZXMuc2V0KHBlcm1pc3Npb24ucm9sZU5hbWUsIFtcbiAgICAgICAgICAuLi5maWVsZFBvbGljaWVzLFxuICAgICAgICAgIGNlZGFyUG9saWNpZXMuZmllbGRQb2xpY3ksXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgaWYgKGNlZGFyUG9saWNpZXMudmFsaWRhdGlvblBvbGljeSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUG9saWNpZXMgPVxuICAgICAgICAgIHRoaXMudmFsaWRhdGlvblBvbGljaWVzLmdldChwZXJtaXNzaW9uLnJvbGVOYW1lKSB8fCBbXTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uUG9saWNpZXMuc2V0KHBlcm1pc3Npb24ucm9sZU5hbWUsIFtcbiAgICAgICAgICAuLi52YWxpZGF0aW9uUG9saWNpZXMsXG4gICAgICAgICAgY2VkYXJQb2xpY2llcy52YWxpZGF0aW9uUG9saWN5LFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcG9saWN5S2V5czogKFxuICAgICAgfCAnbWFpblBvbGljaWVzJ1xuICAgICAgfCAnZmllbGRzUG9saWNpZXMnXG4gICAgICB8ICd2YWxpZGF0aW9uUG9saWNpZXMnXG4gICAgKVtdID0gWydtYWluUG9saWNpZXMnLCAnZmllbGRzUG9saWNpZXMnLCAndmFsaWRhdGlvblBvbGljaWVzJ107XG4gICAgZm9yIChjb25zdCBwS2V5IG9mIHBvbGljeUtleXMpIHtcbiAgICAgIHRoaXMucmVmYWN0b1BvbGljaWVzKHBLZXkpO1xuICAgICAgdGhpcy5zb3J0UG9saWNpZXMocEtleSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHdyaXRlUG9saWNpZXNUb0ZpbGUoXG4gICAgcm9sZU5hbWU6IHN0cmluZyxcbiAgICBmaWxlVGl0bGU6IHN0cmluZyxcbiAgICBwb2xpY2llczogUG9saWN5SnNvbltdLFxuICApIHtcbiAgICBhd2FpdCBta2RpcihgJHt0aGlzLnBlcm1pc3Npb25QYXRofS8ke3JvbGVOYW1lfWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHBvbGljaWVzVGV4dCA9IHBvbGljaWVzLm1hcChwb2xpY3lUb0NlZGFyVGV4dCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgICAvLyBPdXIgb3duIGNvbmRpdGlvbiBsYXlvdXQgbXVzdCBzdGlsbCBiZSB2YWxpZCBDZWRhci5cbiAgICBjb25zdCBwYXJzZWQgPSBjZWRhci5wb2xpY3lTZXRUZXh0VG9QYXJ0cyhwb2xpY2llc1RleHQpO1xuICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBwb2xpY2llc1RleHQgfSwgJ2dlbmVyYXRlZCBwb2xpY2llcyBhcmUgbm90IHZhbGlkIENlZGFyJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkLmVycm9ycyBhcyBhbnkpO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBgJHt0aGlzLnBlcm1pc3Npb25QYXRofS8ke3JvbGVOYW1lfS8ke2ZpbGVUaXRsZX1gLFxuICAgICAgcG9saWNpZXNUZXh0LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd3JpdGVQb2xpY2llcyhcbiAgICBwb2xpY3lLZXk6ICdtYWluUG9saWNpZXMnIHwgJ2ZpZWxkc1BvbGljaWVzJyB8ICd2YWxpZGF0aW9uUG9saWNpZXMnLFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICkge1xuICAgIGZvciAoY29uc3QgW2dyb3VwLCBwb2xpY2llc10gb2YgdGhpc1twb2xpY3lLZXldKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlUG9saWNpZXNUb0ZpbGUoZ3JvdXAsIGZpbGVOYW1lLCBwb2xpY2llcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDc3ZBbmRXcml0ZUFsbEZpbGVzKCkge1xuICAgIGxvZ2dlci5pbmZvKCdyZWFkIHBlcm1pc3Npb24gZmlsZScpO1xuICAgIGF3YWl0IHRoaXMucmVhZFBlcm1pc3Npb25GaWxlKCk7XG4gICAgbG9nZ2VyLmluZm8oYGZvdW5kICR7dGhpcy5kOVBlcm1pc3Npb25zLmxlbmd0aH0gcGVybWlzc2lvbnNgKTtcbiAgICBsb2dnZXIuaW5mbygncmVhZCByb2xlIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRSb2xlRmlsZSgpO1xuICAgIGxvZ2dlci5pbmZvKCdyb2xlcyBpbXBvcnRlZCcpO1xuICAgIGxvZ2dlci5pbmZvKCdncm91cGluZyBhbmQgc29ydGluZyBwZXJtaXNzaW9ucycpO1xuICAgIGF3YWl0IHRoaXMudHJhbnNsYXRlQW5kU29ydFBlcm1pc3Npb24oKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBoYXZpbmcgJHt0aGlzLm1haW5Qb2xpY2llcy5zaXplfSBtYWluIHBvbGljaWVzIGFuZCAke3RoaXMuZmllbGRzUG9saWNpZXMuc2l6ZX0gZmllbGRzIHBvbGljaWVzYCxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKCd3cml0aW5nIGNlZGFyIHBvbGljaWVzIGZpbGVzJyk7XG4gICAgYXdhaXQgdGhpcy53cml0ZVBvbGljaWVzKCdtYWluUG9saWNpZXMnLCAnYXV0aG9yaXplLmNlZGFyJyk7XG4gICAgYXdhaXQgdGhpcy53cml0ZVBvbGljaWVzKCdmaWVsZHNQb2xpY2llcycsICdjaGVjay1maWVsZHMuY2VkYXInKTtcbiAgICBhd2FpdCB0aGlzLndyaXRlUG9saWNpZXMoJ3ZhbGlkYXRpb25Qb2xpY2llcycsICd2YWxpZGF0ZS5jZWRhcicpO1xuICAgIGxvZ2dlci5pbmZvKCdmaWxlcyB3cm90ZW4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENMSSBhY3Rpb246IHJlZ2VuZXJhdGUgdGhlIENlZGFyIHBvbGljeSBmb2xkZXJzIGZyb20gZGlyZWN0dXNfcGVybWlzc2lvbnMuY3N2LlxuICogVGhlIGZvbGRlciBpcyB3aXBlZCBmaXJzdCwgcmVwcm9kdWNpbmcgd2hhdCBgZm9ybWF0ZVBlcm1pc3Npb25gIGRvZXMgaW4gYXBwLWFwaTIsXG4gKiBzbyBhIHJvbGUgcmVtb3ZlZCBmcm9tIHRoZSBDU1YgbGVhdmVzIG5vIG9ycGhhbiBmaWxlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGQ5VG9DZWRhcihvcHRpb25zPzoge1xuICBwZXJtaXNzaW9uUGF0aD86IHN0cmluZztcbiAgc3FsUGF0aD86IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbWFuYWdlciA9IG5ldyBDZWRhck1hbmFnZXIob3B0aW9ucyk7XG4gIGF3YWl0IHJtKG1hbmFnZXIucGVybWlzc2lvblBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWFuYWdlci5yZWFkQ3N2QW5kV3JpdGVBbGxGaWxlcygpO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Role {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
5
|
+
/** Lookup over `directus_roles.csv`, shared by the d9<->cedar managers. */
|
|
6
|
+
export declare class RolesTable {
|
|
7
|
+
static load(sqlPath: string): Promise<RolesTable>;
|
|
8
|
+
byId: Map<string, Role>;
|
|
9
|
+
byName: Map<string, Role>;
|
|
10
|
+
getNameFromId(id: string): string | undefined;
|
|
11
|
+
/** Role UUID for a role name; `''` for the implicit `Public` role. */
|
|
12
|
+
getIdFromName(roleName: string): string | undefined;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RolesTable = void 0;
|
|
4
|
+
const utils_1 = require("../save/utils");
|
|
5
|
+
/** Lookup over `directus_roles.csv`, shared by the d9<->cedar managers. */
|
|
6
|
+
class RolesTable {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.byId = new Map();
|
|
9
|
+
this.byName = new Map();
|
|
10
|
+
}
|
|
11
|
+
static async load(sqlPath) {
|
|
12
|
+
const table = new RolesTable();
|
|
13
|
+
const roles = (await (0, utils_1.readCsvFile)(`${sqlPath}/directus_roles.csv`));
|
|
14
|
+
for (const role of roles) {
|
|
15
|
+
table.byId.set(role.id, role);
|
|
16
|
+
table.byName.set(role.name, role);
|
|
17
|
+
}
|
|
18
|
+
return table;
|
|
19
|
+
}
|
|
20
|
+
getNameFromId(id) {
|
|
21
|
+
return this.byId.get(id)?.name;
|
|
22
|
+
}
|
|
23
|
+
/** Role UUID for a role name; `''` for the implicit `Public` role. */
|
|
24
|
+
getIdFromName(roleName) {
|
|
25
|
+
return roleName === 'Public' ? '' : this.byName.get(roleName)?.id;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.RolesTable = RolesTable;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL3JvbGVzLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUE0QztBQU81QywyRUFBMkU7QUFDM0UsTUFBYSxVQUFVO0lBQXZCO1FBWVMsU0FBSSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBc0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQVUvQyxDQUFDO0lBdEJRLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWU7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBQSxtQkFBVyxFQUFDLEdBQUcsT0FBTyxxQkFBcUIsQ0FBQyxDQUN0QyxDQUFDO1FBQzVCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLTSxhQUFhLENBQUMsRUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELGFBQWEsQ0FBQyxRQUFnQjtRQUNuQyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3BFLENBQUM7Q0FDRjtBQXZCRCxnQ0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG5pbnRlcmZhY2UgUm9sZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqIExvb2t1cCBvdmVyIGBkaXJlY3R1c19yb2xlcy5jc3ZgLCBzaGFyZWQgYnkgdGhlIGQ5PC0+Y2VkYXIgbWFuYWdlcnMuICovXG5leHBvcnQgY2xhc3MgUm9sZXNUYWJsZSB7XG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgbG9hZChzcWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJvbGVzVGFibGU+IHtcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBSb2xlc1RhYmxlKCk7XG4gICAgY29uc3Qgcm9sZXMgPSAoYXdhaXQgcmVhZENzdkZpbGUoYCR7c3FsUGF0aH0vZGlyZWN0dXNfcm9sZXMuY3N2YCkpIGFzIChSb2xlICZcbiAgICAgIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW107XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICB0YWJsZS5ieUlkLnNldChyb2xlLmlkLCByb2xlKTtcbiAgICAgIHRhYmxlLmJ5TmFtZS5zZXQocm9sZS5uYW1lLCByb2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG5cbiAgcHVibGljIGJ5SWQ6IE1hcDxzdHJpbmcsIFJvbGU+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgYnlOYW1lOiBNYXA8c3RyaW5nLCBSb2xlPiA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgZ2V0TmFtZUZyb21JZChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYnlJZC5nZXQoaWQpPy5uYW1lO1xuICB9XG5cbiAgLyoqIFJvbGUgVVVJRCBmb3IgYSByb2xlIG5hbWU7IGAnJ2AgZm9yIHRoZSBpbXBsaWNpdCBgUHVibGljYCByb2xlLiAqL1xuICBwdWJsaWMgZ2V0SWRGcm9tTmFtZShyb2xlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJvbGVOYW1lID09PSAnUHVibGljJyA/ICcnIDogdGhpcy5ieU5hbWUuZ2V0KHJvbGVOYW1lKT8uaWQ7XG4gIH1cbn1cbiJdfQ==
|