@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.
Files changed (422) hide show
  1. package/.jsii +185 -46
  2. package/API.md +153 -37
  3. package/CHANGELOG.md +20 -0
  4. package/README.md +10 -3
  5. package/docs/D9-plumbing.md +189 -0
  6. package/lib/cli/atlas.d.ts +10 -0
  7. package/lib/cli/atlas.js +65 -0
  8. package/lib/cli/commands/cedar/cedar-format.d.ts +7 -0
  9. package/lib/cli/commands/cedar/cedar-format.js +75 -0
  10. package/lib/cli/commands/cedar/cedar-to-d9-translations.d.ts +12 -0
  11. package/lib/cli/commands/cedar/cedar-to-d9-translations.js +130 -0
  12. package/lib/cli/commands/cedar/cedar-to-d9.d.ts +57 -0
  13. package/lib/cli/commands/cedar/cedar-to-d9.js +221 -0
  14. package/lib/cli/commands/cedar/cedar-translations.d.ts +9 -0
  15. package/lib/cli/commands/cedar/cedar-translations.js +213 -0
  16. package/lib/cli/commands/cedar/d9-permission.d.ts +27 -0
  17. package/lib/cli/commands/cedar/d9-permission.js +45 -0
  18. package/lib/cli/commands/cedar/d9-to-cedar.d.ts +33 -0
  19. package/lib/cli/commands/cedar/d9-to-cedar.js +157 -0
  20. package/lib/cli/commands/cedar/roles-table.d.ts +14 -0
  21. package/lib/cli/commands/cedar/roles-table.js +29 -0
  22. package/lib/cli/commands/save/apply-snapshot.js +39 -30
  23. package/lib/cli/commands/save/check-unsaved.d.ts +9 -0
  24. package/lib/cli/commands/save/check-unsaved.js +81 -0
  25. package/lib/cli/commands/save/env.d.ts +33 -0
  26. package/lib/cli/commands/save/env.js +109 -0
  27. package/lib/cli/commands/save/save-snapshot.d.ts +9 -0
  28. package/lib/cli/commands/save/save-snapshot.js +232 -0
  29. package/lib/cli/commands/save/sync-files.d.ts +5 -0
  30. package/lib/cli/commands/save/sync-files.js +46 -0
  31. package/lib/cli/commands/save/transfer.d.ts +18 -0
  32. package/lib/cli/commands/save/transfer.js +96 -0
  33. package/lib/cli/commands/save/utils.d.ts +5 -0
  34. package/lib/cli/commands/save/utils.js +33 -3
  35. package/lib/cli/commands/sync.js +4 -3
  36. package/lib/cli/index.js +65 -25
  37. package/lib/cli/logger.d.ts +2 -0
  38. package/lib/cli/logger.js +10 -0
  39. package/lib/cli/plumbing-config.d.ts +11 -0
  40. package/lib/cli/plumbing-config.js +13 -0
  41. package/lib/index.d.ts +44 -5
  42. package/lib/index.js +54 -41
  43. package/node_modules/@cedar-policy/cedar-wasm/README.md +181 -0
  44. package/node_modules/@cedar-policy/cedar-wasm/esm/README.md +181 -0
  45. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.d.ts +427 -0
  46. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.js +9 -0
  47. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.js +434 -0
  48. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm +0 -0
  49. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm.d.ts +34 -0
  50. package/node_modules/@cedar-policy/cedar-wasm/esm/package.json +23 -0
  51. package/node_modules/@cedar-policy/cedar-wasm/nodejs/README.md +181 -0
  52. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.d.ts +427 -0
  53. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.js +463 -0
  54. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm +0 -0
  55. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm.d.ts +34 -0
  56. package/node_modules/@cedar-policy/cedar-wasm/nodejs/package.json +18 -0
  57. package/node_modules/@cedar-policy/cedar-wasm/package.json +53 -0
  58. package/node_modules/@cedar-policy/cedar-wasm/web/README.md +181 -0
  59. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.d.ts +486 -0
  60. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.js +534 -0
  61. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm +0 -0
  62. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm.d.ts +34 -0
  63. package/node_modules/@cedar-policy/cedar-wasm/web/package.json +21 -0
  64. package/node_modules/@types/node/README.md +5 -6
  65. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  66. package/node_modules/@types/node/assert.d.ts +1040 -79
  67. package/node_modules/@types/node/async_hooks.d.ts +476 -119
  68. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  69. package/node_modules/@types/node/buffer.d.ts +1925 -13
  70. package/node_modules/@types/node/child_process.d.ts +1204 -235
  71. package/node_modules/@types/node/cluster.d.ts +455 -137
  72. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  73. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  74. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  75. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  76. package/node_modules/@types/node/console.d.ts +450 -1
  77. package/node_modules/@types/node/constants.d.ts +20 -447
  78. package/node_modules/@types/node/crypto.d.ts +3962 -600
  79. package/node_modules/@types/node/dgram.d.ts +515 -33
  80. package/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
  81. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  82. package/node_modules/@types/node/dns.d.ts +798 -247
  83. package/node_modules/@types/node/domain.d.ts +164 -10
  84. package/node_modules/@types/node/events.d.ts +954 -25
  85. package/node_modules/@types/node/fs/promises.d.ts +1295 -0
  86. package/node_modules/@types/node/fs.d.ts +3463 -1569
  87. package/node_modules/@types/node/globals.d.ts +98 -1277
  88. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  89. package/node_modules/@types/node/http.d.ts +1933 -300
  90. package/node_modules/@types/node/http2.d.ts +1946 -254
  91. package/node_modules/@types/node/https.d.ts +557 -134
  92. package/node_modules/@types/node/index.d.ts +54 -48
  93. package/node_modules/@types/node/inspector.d.ts +227 -3014
  94. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  95. package/node_modules/@types/node/module.d.ts +890 -2
  96. package/node_modules/@types/node/net.d.ts +872 -105
  97. package/node_modules/@types/node/os.d.ts +452 -209
  98. package/node_modules/@types/node/package.json +78 -128
  99. package/node_modules/@types/node/path.d.ts +196 -155
  100. package/node_modules/@types/node/perf_hooks.d.ts +829 -120
  101. package/node_modules/@types/node/process.d.ts +2072 -3
  102. package/node_modules/@types/node/punycode.d.ts +69 -27
  103. package/node_modules/@types/node/querystring.d.ts +132 -9
  104. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  105. package/node_modules/@types/node/readline.d.ts +485 -49
  106. package/node_modules/@types/node/repl.d.ts +121 -83
  107. package/node_modules/@types/node/sea.d.ts +153 -0
  108. package/node_modules/@types/node/sqlite.d.ts +721 -0
  109. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  110. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  111. package/node_modules/@types/node/stream/web.d.ts +622 -0
  112. package/node_modules/@types/node/stream.d.ts +1470 -140
  113. package/node_modules/@types/node/string_decoder.d.ts +64 -4
  114. package/node_modules/@types/node/test.d.ts +2163 -0
  115. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  116. package/node_modules/@types/node/timers.d.ts +284 -13
  117. package/node_modules/@types/node/tls.d.ts +850 -244
  118. package/node_modules/@types/node/trace_events.d.ts +147 -11
  119. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  120. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  121. package/node_modules/@types/node/ts5.6/index.d.ts +97 -0
  122. package/node_modules/@types/node/tty.d.ts +160 -18
  123. package/node_modules/@types/node/url.d.ts +890 -53
  124. package/node_modules/@types/node/util.d.ts +2566 -160
  125. package/node_modules/@types/node/v8.d.ts +806 -83
  126. package/node_modules/@types/node/vm.d.ts +932 -44
  127. package/node_modules/@types/node/wasi.d.ts +148 -22
  128. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  129. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  130. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  131. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  132. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  133. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  134. package/node_modules/@types/node/worker_threads.d.ts +657 -80
  135. package/node_modules/@types/node/zlib.d.ts +510 -119
  136. package/node_modules/pino/.prettierignore +1 -0
  137. package/node_modules/pino/CNAME +1 -0
  138. package/node_modules/pino/CONTRIBUTING.md +34 -0
  139. package/node_modules/pino/LICENSE +21 -0
  140. package/node_modules/pino/README.md +177 -0
  141. package/node_modules/pino/SECURITY.md +103 -0
  142. package/node_modules/pino/benchmarks/basic.bench.js +95 -0
  143. package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
  144. package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
  145. package/node_modules/pino/benchmarks/child.bench.js +62 -0
  146. package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
  147. package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
  148. package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
  149. package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  150. package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
  151. package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
  152. package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
  153. package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
  154. package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
  155. package/node_modules/pino/benchmarks/multistream.js +98 -0
  156. package/node_modules/pino/benchmarks/object.bench.js +82 -0
  157. package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
  158. package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
  159. package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
  160. package/node_modules/pino/bin.js +6 -0
  161. package/node_modules/pino/browser.js +607 -0
  162. package/node_modules/pino/build/sync-version.js +25 -0
  163. package/node_modules/pino/docs/api.md +1664 -0
  164. package/node_modules/pino/docs/asynchronous.md +55 -0
  165. package/node_modules/pino/docs/benchmarks.md +55 -0
  166. package/node_modules/pino/docs/browser.md +341 -0
  167. package/node_modules/pino/docs/bundling.md +40 -0
  168. package/node_modules/pino/docs/child-loggers.md +116 -0
  169. package/node_modules/pino/docs/diagnostics.md +16 -0
  170. package/node_modules/pino/docs/ecosystem.md +87 -0
  171. package/node_modules/pino/docs/help.md +353 -0
  172. package/node_modules/pino/docs/lts.md +93 -0
  173. package/node_modules/pino/docs/pretty.md +38 -0
  174. package/node_modules/pino/docs/redaction.md +130 -0
  175. package/node_modules/pino/docs/transports.md +1447 -0
  176. package/node_modules/pino/docs/web.md +306 -0
  177. package/node_modules/pino/eslint.config.js +36 -0
  178. package/node_modules/pino/examples/basic.js +43 -0
  179. package/node_modules/pino/examples/transport.js +68 -0
  180. package/node_modules/pino/favicon.ico +0 -0
  181. package/node_modules/pino/file.js +12 -0
  182. package/node_modules/pino/inc-version.sh +42 -0
  183. package/node_modules/pino/index.html +55 -0
  184. package/node_modules/pino/lib/caller.js +40 -0
  185. package/node_modules/pino/lib/constants.js +28 -0
  186. package/node_modules/pino/lib/deprecations.js +8 -0
  187. package/node_modules/pino/lib/levels.js +241 -0
  188. package/node_modules/pino/lib/meta.js +3 -0
  189. package/node_modules/pino/lib/multistream.js +211 -0
  190. package/node_modules/pino/lib/proto.js +256 -0
  191. package/node_modules/pino/lib/redaction.js +119 -0
  192. package/node_modules/pino/lib/symbols.js +76 -0
  193. package/node_modules/pino/lib/time.js +39 -0
  194. package/node_modules/pino/lib/tools.js +427 -0
  195. package/node_modules/pino/lib/transport-stream.js +56 -0
  196. package/node_modules/pino/lib/transport.js +302 -0
  197. package/node_modules/pino/lib/worker.js +197 -0
  198. package/node_modules/pino/package.json +112 -0
  199. package/node_modules/pino/pino.d.ts +881 -0
  200. package/node_modules/pino/pino.js +259 -0
  201. package/node_modules/pino/test/basic.test.js +952 -0
  202. package/node_modules/pino/test/broken-pipe.test.js +59 -0
  203. package/node_modules/pino/test/browser-bindings.test.js +114 -0
  204. package/node_modules/pino/test/browser-child.test.js +132 -0
  205. package/node_modules/pino/test/browser-disabled.test.js +87 -0
  206. package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
  207. package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
  208. package/node_modules/pino/test/browser-levels.test.js +241 -0
  209. package/node_modules/pino/test/browser-redaction.test.js +264 -0
  210. package/node_modules/pino/test/browser-serializers.test.js +352 -0
  211. package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
  212. package/node_modules/pino/test/browser-timestamp.test.js +88 -0
  213. package/node_modules/pino/test/browser-transmit.test.js +417 -0
  214. package/node_modules/pino/test/browser.test.js +698 -0
  215. package/node_modules/pino/test/caller.test.js +20 -0
  216. package/node_modules/pino/test/complex-objects.test.js +36 -0
  217. package/node_modules/pino/test/crlf.test.js +34 -0
  218. package/node_modules/pino/test/custom-levels.test.js +267 -0
  219. package/node_modules/pino/test/diagnostics.test.js +107 -0
  220. package/node_modules/pino/test/error-key.test.js +37 -0
  221. package/node_modules/pino/test/error.test.js +403 -0
  222. package/node_modules/pino/test/escaping.test.js +110 -0
  223. package/node_modules/pino/test/esm/esm.mjs +14 -0
  224. package/node_modules/pino/test/esm/index.test.js +21 -0
  225. package/node_modules/pino/test/esm/named-exports.mjs +29 -0
  226. package/node_modules/pino/test/exit.test.js +79 -0
  227. package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
  228. package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
  229. package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
  230. package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
  231. package/node_modules/pino/test/fixtures/console-transport.js +13 -0
  232. package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
  233. package/node_modules/pino/test/fixtures/default-exit.js +8 -0
  234. package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
  235. package/node_modules/pino/test/fixtures/eval/index.js +13 -0
  236. package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
  237. package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
  238. package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
  239. package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
  240. package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
  241. package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
  242. package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
  243. package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
  244. package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
  245. package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
  246. package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
  247. package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
  248. package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
  249. package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
  250. package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
  251. package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
  252. package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
  253. package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
  254. package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
  255. package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
  256. package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
  257. package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
  258. package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
  259. package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
  260. package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
  261. package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
  262. package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
  263. package/node_modules/pino/test/fixtures/transport/index.js +12 -0
  264. package/node_modules/pino/test/fixtures/transport/package.json +5 -0
  265. package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  266. package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
  267. package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
  268. package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
  269. package/node_modules/pino/test/fixtures/transport-main.js +9 -0
  270. package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
  271. package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
  272. package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
  273. package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
  274. package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
  275. package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
  276. package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
  277. package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
  278. package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
  279. package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
  280. package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
  281. package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
  282. package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  283. package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
  284. package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
  285. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  286. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  287. package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  288. package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
  289. package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
  290. package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
  291. package/node_modules/pino/test/formatters.test.js +364 -0
  292. package/node_modules/pino/test/helper.d.ts +4 -0
  293. package/node_modules/pino/test/helper.js +159 -0
  294. package/node_modules/pino/test/hooks.test.js +114 -0
  295. package/node_modules/pino/test/http.test.js +214 -0
  296. package/node_modules/pino/test/internals/version.test.js +17 -0
  297. package/node_modules/pino/test/is-level-enabled.test.js +179 -0
  298. package/node_modules/pino/test/jest/basic.spec.js +10 -0
  299. package/node_modules/pino/test/levels.test.js +810 -0
  300. package/node_modules/pino/test/metadata.test.js +120 -0
  301. package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
  302. package/node_modules/pino/test/mixin.test.js +241 -0
  303. package/node_modules/pino/test/multistream.test.js +793 -0
  304. package/node_modules/pino/test/redact.test.js +923 -0
  305. package/node_modules/pino/test/serializers.test.js +257 -0
  306. package/node_modules/pino/test/smoke.js +59 -0
  307. package/node_modules/pino/test/stdout-protection.test.js +41 -0
  308. package/node_modules/pino/test/syncfalse.test.js +186 -0
  309. package/node_modules/pino/test/timestamp-nano.test.js +37 -0
  310. package/node_modules/pino/test/timestamp.test.js +124 -0
  311. package/node_modules/pino/test/transport/big.test.js +42 -0
  312. package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
  313. package/node_modules/pino/test/transport/caller.test.js +24 -0
  314. package/node_modules/pino/test/transport/core.test.js +818 -0
  315. package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
  316. package/node_modules/pino/test/transport/crash.test.js +36 -0
  317. package/node_modules/pino/test/transport/module-link.test.js +241 -0
  318. package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
  319. package/node_modules/pino/test/transport/node-options.test.js +116 -0
  320. package/node_modules/pino/test/transport/pipeline.test.js +137 -0
  321. package/node_modules/pino/test/transport/preload.test.js +54 -0
  322. package/node_modules/pino/test/transport/repl.test.js +15 -0
  323. package/node_modules/pino/test/transport/sync-false.test.js +79 -0
  324. package/node_modules/pino/test/transport/sync-true.test.js +57 -0
  325. package/node_modules/pino/test/transport/targets.test.js +48 -0
  326. package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
  327. package/node_modules/pino/test/transport-stream.test.js +40 -0
  328. package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
  329. package/node_modules/pino/test/types/pino-import.tst.js +73 -0
  330. package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
  331. package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
  332. package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
  333. package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
  334. package/node_modules/pino/test/types/pino.ts +98 -0
  335. package/node_modules/pino/test/types/pino.tst.ts +681 -0
  336. package/node_modules/pino/test/types/tsconfig.json +10 -0
  337. package/node_modules/pino/tsconfig.json +14 -0
  338. package/node_modules/pino-pretty/.borp.yaml +6 -0
  339. package/node_modules/pino-pretty/.editorconfig +13 -0
  340. package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
  341. package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
  342. package/node_modules/pino-pretty/LICENSE +21 -0
  343. package/node_modules/pino-pretty/Readme.md +425 -0
  344. package/node_modules/pino-pretty/SECURITY.md +146 -0
  345. package/node_modules/pino-pretty/benchmark.js +105 -0
  346. package/node_modules/pino-pretty/bin.js +113 -0
  347. package/node_modules/pino-pretty/demo.png +0 -0
  348. package/node_modules/pino-pretty/docs/help.md +24 -0
  349. package/node_modules/pino-pretty/eslint.config.js +5 -0
  350. package/node_modules/pino-pretty/help/help.txt +68 -0
  351. package/node_modules/pino-pretty/index.d.ts +227 -0
  352. package/node_modules/pino-pretty/index.js +234 -0
  353. package/node_modules/pino-pretty/lib/colors.js +134 -0
  354. package/node_modules/pino-pretty/lib/colors.test.js +132 -0
  355. package/node_modules/pino-pretty/lib/constants.js +55 -0
  356. package/node_modules/pino-pretty/lib/pretty.js +171 -0
  357. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
  358. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
  359. package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
  360. package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
  361. package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
  362. package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
  363. package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
  364. package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
  365. package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
  366. package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
  367. package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
  368. package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
  369. package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
  370. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
  371. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
  372. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
  373. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
  374. package/node_modules/pino-pretty/lib/utils/index.js +108 -0
  375. package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
  376. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
  377. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
  378. package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
  379. package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
  380. package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
  381. package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
  382. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
  383. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
  384. package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
  385. package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
  386. package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
  387. package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
  388. package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
  389. package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
  390. package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
  391. package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
  392. package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
  393. package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
  394. package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
  395. package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
  396. package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
  397. package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
  398. package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
  399. package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
  400. package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
  401. package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
  402. package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
  403. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
  404. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
  405. package/node_modules/pino-pretty/package.json +64 -0
  406. package/node_modules/pino-pretty/test/basic.test.js +1305 -0
  407. package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
  408. package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
  409. package/node_modules/pino-pretty/test/cli.test.js +360 -0
  410. package/node_modules/pino-pretty/test/crlf.test.js +33 -0
  411. package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
  412. package/node_modules/pino-pretty/test/example/example.js +33 -0
  413. package/node_modules/pino-pretty/test/helper.js +19 -0
  414. package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
  415. package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
  416. package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
  417. package/package.json +14 -7
  418. package/lib/cli/commands/init.d.ts +0 -1
  419. package/lib/cli/commands/init.js +0 -8
  420. package/lib/cli/commands/save/draft.js +0 -2
  421. package/node_modules/@types/node/globals.global.d.ts +0 -1
  422. /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==