@wbce/projen-d9 0.0.28 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/.jsii +184 -45
  2. package/API.md +153 -37
  3. package/CHANGELOG.md +13 -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/.nojekyll +0 -0
  137. package/node_modules/pino/.prettierignore +1 -0
  138. package/node_modules/pino/CNAME +1 -0
  139. package/node_modules/pino/CONTRIBUTING.md +34 -0
  140. package/node_modules/pino/LICENSE +21 -0
  141. package/node_modules/pino/README.md +177 -0
  142. package/node_modules/pino/SECURITY.md +103 -0
  143. package/node_modules/pino/benchmarks/basic.bench.js +95 -0
  144. package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
  145. package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
  146. package/node_modules/pino/benchmarks/child.bench.js +62 -0
  147. package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
  148. package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
  149. package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
  150. package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  151. package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
  152. package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
  153. package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
  154. package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
  155. package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
  156. package/node_modules/pino/benchmarks/multistream.js +98 -0
  157. package/node_modules/pino/benchmarks/object.bench.js +82 -0
  158. package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
  159. package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
  160. package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
  161. package/node_modules/pino/bin.js +6 -0
  162. package/node_modules/pino/browser.js +607 -0
  163. package/node_modules/pino/build/sync-version.js +25 -0
  164. package/node_modules/pino/docs/api.md +1664 -0
  165. package/node_modules/pino/docs/asynchronous.md +55 -0
  166. package/node_modules/pino/docs/benchmarks.md +55 -0
  167. package/node_modules/pino/docs/browser.md +341 -0
  168. package/node_modules/pino/docs/bundling.md +40 -0
  169. package/node_modules/pino/docs/child-loggers.md +116 -0
  170. package/node_modules/pino/docs/diagnostics.md +16 -0
  171. package/node_modules/pino/docs/ecosystem.md +87 -0
  172. package/node_modules/pino/docs/help.md +353 -0
  173. package/node_modules/pino/docs/lts.md +93 -0
  174. package/node_modules/pino/docs/pretty.md +38 -0
  175. package/node_modules/pino/docs/redaction.md +130 -0
  176. package/node_modules/pino/docs/transports.md +1447 -0
  177. package/node_modules/pino/docs/web.md +306 -0
  178. package/node_modules/pino/eslint.config.js +36 -0
  179. package/node_modules/pino/examples/basic.js +43 -0
  180. package/node_modules/pino/examples/transport.js +68 -0
  181. package/node_modules/pino/favicon.ico +0 -0
  182. package/node_modules/pino/file.js +12 -0
  183. package/node_modules/pino/inc-version.sh +42 -0
  184. package/node_modules/pino/index.html +55 -0
  185. package/node_modules/pino/lib/caller.js +40 -0
  186. package/node_modules/pino/lib/constants.js +28 -0
  187. package/node_modules/pino/lib/deprecations.js +8 -0
  188. package/node_modules/pino/lib/levels.js +241 -0
  189. package/node_modules/pino/lib/meta.js +3 -0
  190. package/node_modules/pino/lib/multistream.js +211 -0
  191. package/node_modules/pino/lib/proto.js +256 -0
  192. package/node_modules/pino/lib/redaction.js +119 -0
  193. package/node_modules/pino/lib/symbols.js +76 -0
  194. package/node_modules/pino/lib/time.js +39 -0
  195. package/node_modules/pino/lib/tools.js +427 -0
  196. package/node_modules/pino/lib/transport-stream.js +56 -0
  197. package/node_modules/pino/lib/transport.js +302 -0
  198. package/node_modules/pino/lib/worker.js +197 -0
  199. package/node_modules/pino/package.json +112 -0
  200. package/node_modules/pino/pino.d.ts +881 -0
  201. package/node_modules/pino/pino.js +259 -0
  202. package/node_modules/pino/test/basic.test.js +952 -0
  203. package/node_modules/pino/test/broken-pipe.test.js +59 -0
  204. package/node_modules/pino/test/browser-bindings.test.js +114 -0
  205. package/node_modules/pino/test/browser-child.test.js +132 -0
  206. package/node_modules/pino/test/browser-disabled.test.js +87 -0
  207. package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
  208. package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
  209. package/node_modules/pino/test/browser-levels.test.js +241 -0
  210. package/node_modules/pino/test/browser-redaction.test.js +264 -0
  211. package/node_modules/pino/test/browser-serializers.test.js +352 -0
  212. package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
  213. package/node_modules/pino/test/browser-timestamp.test.js +88 -0
  214. package/node_modules/pino/test/browser-transmit.test.js +417 -0
  215. package/node_modules/pino/test/browser.test.js +698 -0
  216. package/node_modules/pino/test/caller.test.js +20 -0
  217. package/node_modules/pino/test/complex-objects.test.js +36 -0
  218. package/node_modules/pino/test/crlf.test.js +34 -0
  219. package/node_modules/pino/test/custom-levels.test.js +267 -0
  220. package/node_modules/pino/test/diagnostics.test.js +107 -0
  221. package/node_modules/pino/test/error-key.test.js +37 -0
  222. package/node_modules/pino/test/error.test.js +403 -0
  223. package/node_modules/pino/test/escaping.test.js +110 -0
  224. package/node_modules/pino/test/esm/esm.mjs +14 -0
  225. package/node_modules/pino/test/esm/index.test.js +21 -0
  226. package/node_modules/pino/test/esm/named-exports.mjs +29 -0
  227. package/node_modules/pino/test/exit.test.js +79 -0
  228. package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
  229. package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
  230. package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
  231. package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
  232. package/node_modules/pino/test/fixtures/console-transport.js +13 -0
  233. package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
  234. package/node_modules/pino/test/fixtures/default-exit.js +8 -0
  235. package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
  236. package/node_modules/pino/test/fixtures/eval/index.js +13 -0
  237. package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
  238. package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
  239. package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
  240. package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
  241. package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
  242. package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
  243. package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
  244. package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
  245. package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
  246. package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
  247. package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
  248. package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
  249. package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
  250. package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
  251. package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
  252. package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
  253. package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
  254. package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
  255. package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
  256. package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
  257. package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
  258. package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
  259. package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
  260. package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
  261. package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
  262. package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
  263. package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
  264. package/node_modules/pino/test/fixtures/transport/index.js +12 -0
  265. package/node_modules/pino/test/fixtures/transport/package.json +5 -0
  266. package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  267. package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
  268. package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
  269. package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
  270. package/node_modules/pino/test/fixtures/transport-main.js +9 -0
  271. package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
  272. package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
  273. package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
  274. package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
  275. package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
  276. package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
  277. package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
  278. package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
  279. package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
  280. package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
  281. package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
  282. package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
  283. package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  284. package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
  285. package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
  286. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  287. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  288. package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  289. package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
  290. package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
  291. package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
  292. package/node_modules/pino/test/formatters.test.js +364 -0
  293. package/node_modules/pino/test/helper.d.ts +4 -0
  294. package/node_modules/pino/test/helper.js +159 -0
  295. package/node_modules/pino/test/hooks.test.js +114 -0
  296. package/node_modules/pino/test/http.test.js +214 -0
  297. package/node_modules/pino/test/internals/version.test.js +17 -0
  298. package/node_modules/pino/test/is-level-enabled.test.js +179 -0
  299. package/node_modules/pino/test/jest/basic.spec.js +10 -0
  300. package/node_modules/pino/test/levels.test.js +810 -0
  301. package/node_modules/pino/test/metadata.test.js +120 -0
  302. package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
  303. package/node_modules/pino/test/mixin.test.js +241 -0
  304. package/node_modules/pino/test/multistream.test.js +793 -0
  305. package/node_modules/pino/test/redact.test.js +923 -0
  306. package/node_modules/pino/test/serializers.test.js +257 -0
  307. package/node_modules/pino/test/smoke.js +59 -0
  308. package/node_modules/pino/test/stdout-protection.test.js +41 -0
  309. package/node_modules/pino/test/syncfalse.test.js +186 -0
  310. package/node_modules/pino/test/timestamp-nano.test.js +37 -0
  311. package/node_modules/pino/test/timestamp.test.js +124 -0
  312. package/node_modules/pino/test/transport/big.test.js +42 -0
  313. package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
  314. package/node_modules/pino/test/transport/caller.test.js +24 -0
  315. package/node_modules/pino/test/transport/core.test.js +818 -0
  316. package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
  317. package/node_modules/pino/test/transport/crash.test.js +36 -0
  318. package/node_modules/pino/test/transport/module-link.test.js +241 -0
  319. package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
  320. package/node_modules/pino/test/transport/node-options.test.js +116 -0
  321. package/node_modules/pino/test/transport/pipeline.test.js +137 -0
  322. package/node_modules/pino/test/transport/preload.test.js +54 -0
  323. package/node_modules/pino/test/transport/repl.test.js +15 -0
  324. package/node_modules/pino/test/transport/sync-false.test.js +79 -0
  325. package/node_modules/pino/test/transport/sync-true.test.js +57 -0
  326. package/node_modules/pino/test/transport/targets.test.js +48 -0
  327. package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
  328. package/node_modules/pino/test/transport-stream.test.js +40 -0
  329. package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
  330. package/node_modules/pino/test/types/pino-import.tst.js +73 -0
  331. package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
  332. package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
  333. package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
  334. package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
  335. package/node_modules/pino/test/types/pino.ts +98 -0
  336. package/node_modules/pino/test/types/pino.tst.ts +681 -0
  337. package/node_modules/pino/test/types/tsconfig.json +10 -0
  338. package/node_modules/pino/tsconfig.json +14 -0
  339. package/node_modules/pino-pretty/.borp.yaml +6 -0
  340. package/node_modules/pino-pretty/.editorconfig +13 -0
  341. package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
  342. package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
  343. package/node_modules/pino-pretty/LICENSE +21 -0
  344. package/node_modules/pino-pretty/Readme.md +425 -0
  345. package/node_modules/pino-pretty/SECURITY.md +146 -0
  346. package/node_modules/pino-pretty/benchmark.js +105 -0
  347. package/node_modules/pino-pretty/bin.js +113 -0
  348. package/node_modules/pino-pretty/demo.png +0 -0
  349. package/node_modules/pino-pretty/docs/help.md +24 -0
  350. package/node_modules/pino-pretty/eslint.config.js +5 -0
  351. package/node_modules/pino-pretty/help/help.txt +68 -0
  352. package/node_modules/pino-pretty/index.d.ts +227 -0
  353. package/node_modules/pino-pretty/index.js +234 -0
  354. package/node_modules/pino-pretty/lib/colors.js +134 -0
  355. package/node_modules/pino-pretty/lib/colors.test.js +132 -0
  356. package/node_modules/pino-pretty/lib/constants.js +55 -0
  357. package/node_modules/pino-pretty/lib/pretty.js +171 -0
  358. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
  359. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
  360. package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
  361. package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
  362. package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
  363. package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
  364. package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
  365. package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
  366. package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
  367. package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
  368. package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
  369. package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
  370. package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
  371. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
  372. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
  373. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
  374. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
  375. package/node_modules/pino-pretty/lib/utils/index.js +108 -0
  376. package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
  377. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
  378. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
  379. package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
  380. package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
  381. package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
  382. package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
  383. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
  384. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
  385. package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
  386. package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
  387. package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
  388. package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
  389. package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
  390. package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
  391. package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
  392. package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
  393. package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
  394. package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
  395. package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
  396. package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
  397. package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
  398. package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
  399. package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
  400. package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
  401. package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
  402. package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
  403. package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
  404. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
  405. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
  406. package/node_modules/pino-pretty/package.json +64 -0
  407. package/node_modules/pino-pretty/test/basic.test.js +1305 -0
  408. package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
  409. package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
  410. package/node_modules/pino-pretty/test/cli.test.js +360 -0
  411. package/node_modules/pino-pretty/test/crlf.test.js +33 -0
  412. package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
  413. package/node_modules/pino-pretty/test/example/example.js +33 -0
  414. package/node_modules/pino-pretty/test/helper.js +19 -0
  415. package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
  416. package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
  417. package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
  418. package/package.json +12 -5
  419. package/lib/cli/commands/init.d.ts +0 -1
  420. package/lib/cli/commands/init.js +0 -8
  421. package/node_modules/@types/node/globals.global.d.ts +0 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.policyToCedarText = policyToCedarText;
4
+ const cedar = require("@cedar-policy/cedar-wasm/nodejs");
5
+ const logger_1 = require("../../logger");
6
+ /** Width of one logical level: the operator column (`|| `) plus the base gap. */
7
+ const LEVEL_INDENT = ' '.repeat(5);
8
+ function booleanOperator(expr) {
9
+ const key = Object.keys(expr)[0];
10
+ return key === '&&' || key === '||' ? key : undefined;
11
+ }
12
+ /** Cedar's text for a policy with `All` scopes and a single `when` clause. */
13
+ const LEAF_PREFIX = 'permit(principal, action, resource) when { ';
14
+ const LEAF_SUFFIX = ' };';
15
+ /** Any non-boolean expression, printed by Cedar itself. */
16
+ function leafToText(expr) {
17
+ const result = cedar.policyToText({
18
+ effect: 'permit',
19
+ principal: { op: 'All' },
20
+ action: { op: 'All' },
21
+ resource: { op: 'All' },
22
+ conditions: [{ kind: 'when', body: expr }],
23
+ });
24
+ if (result.type === 'failure') {
25
+ logger_1.logger.error({ expr }, 'failed to transform expression into text');
26
+ throw new Error(result.errors);
27
+ }
28
+ return result.text.slice(LEAF_PREFIX.length, -LEAF_SUFFIX.length);
29
+ }
30
+ /**
31
+ * Lines of `expr` within a group of `parent`, each starting with a 3-character
32
+ * operator column; a nested group (other operator) goes one level deeper in parentheses.
33
+ */
34
+ function toLines(expr, parent) {
35
+ const operator = booleanOperator(expr);
36
+ if (!operator)
37
+ return [` ${leafToText(expr)}`];
38
+ // the top level (no parent) is a group without parentheses
39
+ if (parent && operator !== parent) {
40
+ return [' (', ...toLines(expr, operator).map((line) => LEVEL_INDENT + line), ' )'];
41
+ }
42
+ // the operator joins the two sides, on the line where the right side starts
43
+ const [first, ...rest] = toLines(expr[operator].right, operator);
44
+ return [...toLines(expr[operator].left, operator), `${operator} ${first.slice(3)}`, ...rest];
45
+ }
46
+ /**
47
+ * Cedar's formatter for the policy head, our own layout for the conditions:
48
+ * operands of one logical level share an indentation, each nested level adds one,
49
+ * and the `&&` / `||` operator leads the line.
50
+ */
51
+ function policyToCedarText(policy) {
52
+ const head = cedar.policyToText({ ...policy, conditions: [] });
53
+ if (head.type === 'failure') {
54
+ logger_1.logger.error({ policy }, 'failed to transform policy into text');
55
+ throw new Error(head.errors);
56
+ }
57
+ const formattedHead = cedar.formatPolicies({
58
+ policyText: head.text,
59
+ lineWidth: 100,
60
+ indentWidth: 2,
61
+ });
62
+ if (formattedHead.type === 'failure') {
63
+ throw new Error(formattedHead);
64
+ }
65
+ // a policy without conditions is formatted as `…;\n`
66
+ const lines = [formattedHead.formatted_policy.slice(0, -2)];
67
+ // translateToCedar writes at most one `when` clause
68
+ const [condition] = policy.conditions;
69
+ if (condition) {
70
+ const when = toLines(condition.body);
71
+ lines.push(['when {', ...when.map((line) => ` ${line}`), '}'].join('\n'));
72
+ }
73
+ return lines.join('\n') + ';';
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jZWRhci9jZWRhci1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxREEsOENBeUJDO0FBOUVELHlEQUF5RDtBQUV6RCx5Q0FBc0M7QUFFdEMsaUZBQWlGO0FBQ2pGLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbkMsU0FBUyxlQUFlLENBQUMsSUFBUztJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sV0FBVyxHQUFHLDZDQUE2QyxDQUFDO0FBQ2xFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQiwyREFBMkQ7QUFDM0QsU0FBUyxVQUFVLENBQUMsSUFBUztJQUMzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDeEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNyQixRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ3ZCLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLGVBQU0sQ0FBQyxL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QUFDLENBQy9ELENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2VkYXIgZnJvbSAnQGNlZGFyLXBvbGljeS9jZWRhci13YXNtL25vZGVqcyc7XG5pbXBvcnQgdHlwZSB7IFBvbGljeUpzb24gfSBmcm9tICdAY2VkYXItcG9saWN5L2NlZGFyLXdhc20vbm9kZWpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5cbi8qKiBXaWR0aCBvZiBvbmUgbG9naWNhbCBsZXZlbDogdGhlIG9wZXJhdG9yIGNvbHVtbiAoYHx8IGApIHBsdXMgdGhlIGJhc2UgZ2FwLiAqL1xuY29uc3QgTEVWRUxfSU5ERU5UID0gJyAnLnJlcGVhdCg1KTtcblxuZnVuY3Rpb24gYm9vbGVhbk9wZXJhdG9yKGV4cHI6IGFueSk6ICcmJicgfCAnfHwnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZXhwcilbMF07XG4gIHJldHVybiBrZXkgPT09ICcmJicgfHwga2V5ID09PSAnfHwnID8ga2V5IDogdW5kZWZpbmVkO1xufVxuXG4vKiogQ2VkYXIncyB0ZXh0IGZvciBhIHBvbGljeSB3aXRoIGBBbGxgIHNjb3BlcyBhbmQgYSBzaW5nbGUgYHdoZW5gIGNsYXVzZS4gKi9cbmNvbnN0IExFQUZfUFJFRklYID0gJ3Blcm1pdChwcmluY2lwYWwsIGFjdGlvbiwgcmVzb3VyY2UpIHdoZW4geyAnO1xuY29uc3QgTEVBRl9TVUZGSVggPSAnIH07JztcblxuLyoqIEFueSBub24tYm9vbGVhbiBleHByZXNzaW9uLCBwcmludGVkIGJ5IENlZGFyIGl0c2VsZi4gKi9cbmZ1bmN0aW9uIGxlYWZUb1RleHQoZXhwcjogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gY2VkYXIucG9saWN5VG9UZXh0KHtcbiAgICBlZmZlY3Q6ICdwZXJtaXQnLFxuICAgIHByaW5jaXBhbDogeyBvcDogJ0FsbCcgfSxcbiAgICBhY3Rpb246IHsgb3A6ICdBbGwnIH0sXG4gICAgcmVzb3VyY2U6IHsgb3A6ICdBbGwnIH0sXG4gICAgY29uZGl0aW9uczogW3sga2luZDogJ3doZW4nLCBib2R5OiBleHByIH1dLFxuICB9KTtcbiAgaWYgKHJlc3VsdC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBleHByIH0sICdmYWlsZWQgdG8gdHJhbnNmb3JtIGV4cHJlc3Npb24gaW50byB0ZXh0Jyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvcnMgYXMgYW55KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnRleHQuc2xpY2UoTEVBRl9QUkVGSVgubGVuZ3RoLCAtTEVBRl9TVUZGSVgubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBMaW5lcyBvZiBgZXhwcmAgd2l0aGluIGEgZ3JvdXAgb2YgYHBhcmVudGAsIGVhY2ggc3RhcnRpbmcgd2l0aCBhIDMtY2hhcmFjdGVyXG4gKiBvcGVyYXRvciBjb2x1bW47IGEgbmVzdGVkIGdyb3VwIChvdGhlciBvcGVyYXRvcikgZ29lcyBvbmUgbGV2ZWwgZGVlcGVyIGluIHBhcmVudGhlc2VzLlxuICovXG5mdW5jdGlvbiB0b0xpbmVzKGV4cHI6IGFueSwgcGFyZW50Pzogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBvcGVyYXRvciA9IGJvb2xlYW5PcGVyYXRvcihleHByKTtcbiAgaWYgKCFvcGVyYXRvcikgcmV0dXJuIFtgICAgJHtsZWFmVG9UZXh0KGV4cHIpfWBdO1xuICAvLyB0aGUgdG9wIGxldmVsIChubyBwYXJlbnQpIGlzIGEgZ3JvdXAgd2l0aG91dCBwYXJlbnRoZXNlc1xuICBpZiAocGFyZW50ICYmIG9wZXJhdG9yICE9PSBwYXJlbnQpIHtcbiAgICByZXR1cm4gWycgICAoJywgLi4udG9MaW5lcyhleHByLCBvcGVyYXRvcikubWFwKChsaW5lKSA9PiBMRVZFTF9JTkRFTlQgKyBsaW5lKSwgJyAgICknXTtcbiAgfVxuICAvLyB0aGUgb3BlcmF0b3Igam9pbnMgdGhlIHR3byBzaWRlcywgb24gdGhlIGxpbmUgd2hlcmUgdGhlIHJpZ2h0IHNpZGUgc3RhcnRzXG4gIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSB0b0xpbmVzKGV4cHJbb3BlcmF0b3JdLnJpZ2h0LCBvcGVyYXRvcik7XG4gIHJldHVybiBbLi4udG9MaW5lcyhleHByW29wZXJhdG9yXS5sZWZ0LCBvcGVyYXRvciksIGAke29wZXJhdG9yfSAke2ZpcnN0IS5zbGljZSgzKX1gLCAuLi5yZXN0XTtcbn1cblxuLyoqXG4gKiBDZWRhcidzIGZvcm1hdHRlciBmb3IgdGhlIHBvbGljeSBoZWFkLCBvdXIgb3duIGxheW91dCBmb3IgdGhlIGNvbmRpdGlvbnM6XG4gKiBvcGVyYW5kcyBvZiBvbmUgbG9naWNhbCBsZXZlbCBzaGFyZSBhbiBpbmRlbnRhdGlvbiwgZWFjaCBuZXN0ZWQgbGV2ZWwgYWRkcyBvbmUsXG4gKiBhbmQgdGhlIGAmJmAgLyBgfHxgIG9wZXJhdG9yIGxlYWRzIHRoZSBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9saWN5VG9DZWRhclRleHQocG9saWN5OiBQb2xpY3lKc29uKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZCA9IGNlZGFyLnBvbGljeVRvVGV4dCh7IC4uLnBvbGljeSwgY29uZGl0aW9uczogW10gfSk7XG4gIGlmIChoZWFkLnR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgIGxvZ2dlci5lcnJvcih7IHBvbGljeSB9LCAnZmFpbGVkIHRvIHRyYW5zZm9ybSBwb2xpY3kgaW50byB0ZXh0Jyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGhlYWQuZXJyb3JzIGFzIGFueSk7XG4gIH1cbiAgY29uc3QgZm9ybWF0dGVkSGVhZCA9IGNlZGFyLmZvcm1hdFBvbGljaWVzKHtcbiAgICBwb2xpY3lUZXh0OiBoZWFkLnRleHQsXG4gICAgbGluZVdpZHRoOiAxMDAsXG4gICAgaW5kZW50V2lkdGg6IDIsXG4gIH0pO1xuICBpZiAoZm9ybWF0dGVkSGVhZC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0dGVkSGVhZCBhcyBhbnkpO1xuICB9XG4gIC8vIGEgcG9saWN5IHdpdGhvdXQgY29uZGl0aW9ucyBpcyBmb3JtYXR0ZWQgYXMgYOKApjtcXG5gXG4gIGNvbnN0IGxpbmVzID0gW2Zvcm1hdHRlZEhlYWQuZm9ybWF0dGVkX3BvbGljeS5zbGljZSgwLCAtMildO1xuICAvLyB0cmFuc2xhdGVUb0NlZGFyIHdyaXRlcyBhdCBtb3N0IG9uZSBgd2hlbmAgY2xhdXNlXG4gIGNvbnN0IFtjb25kaXRpb25dID0gcG9saWN5LmNvbmRpdGlvbnM7XG4gIGlmIChjb25kaXRpb24pIHtcbiAgICBjb25zdCB3aGVuID0gdG9MaW5lcyhjb25kaXRpb24uYm9keSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIFsnd2hlbiB7JywgLi4ud2hlbi5tYXAoKGxpbmUpID0+IGAgICR7bGluZX1gKSwgJ30nXS5qb2luKCdcXG4nKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKSArICc7Jztcbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { ConditionSubject } from './cedar-translations';
2
+ import type { Filter } from './d9-permission';
3
+ /** Inverse of `addWhenClauses`: a Cedar Expr tree back into a D9 filter. */
4
+ export declare function exprToFilter(expr?: any, subject?: ConditionSubject): Filter;
5
+ /** Field list from a check-fields policy's `containsAll` clause. */
6
+ export declare function extractFields(expr: any): string[];
7
+ /** Inverse of `refactoPolicies`: expand `action in [...]` into one tuple each. */
8
+ export declare function expandPolicy(policy: any): Array<{
9
+ collection: string;
10
+ action: string;
11
+ conditions: any[];
12
+ }>;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exprToFilter = exprToFilter;
4
+ exports.extractFields = extractFields;
5
+ exports.expandPolicy = expandPolicy;
6
+ function rightToValue(right) {
7
+ if (right?.Var === 'principal')
8
+ return '$CURRENT_USER';
9
+ if (right?.Value !== undefined)
10
+ return right.Value;
11
+ throw new Error(`Unsupported right-hand Cedar expression: ${JSON.stringify(right)}`);
12
+ }
13
+ function pathToFilter(node, subject, leaf) {
14
+ let acc = leaf;
15
+ let cur = node;
16
+ if (subject === 'context.newValue') {
17
+ while (cur && cur['.']) {
18
+ const { left, attr } = cur['.'];
19
+ // Reached the `context.newValue` base: stop without wrapping `newValue`.
20
+ if (attr === 'newValue' && left?.Var === 'context')
21
+ return acc;
22
+ acc = { [attr]: acc };
23
+ cur = left;
24
+ }
25
+ throw new Error(`Unexpected context.newValue base path: ${JSON.stringify(node)}`);
26
+ }
27
+ while (cur && cur['.']) {
28
+ acc = { [cur['.'].attr]: acc };
29
+ cur = cur['.'].left;
30
+ }
31
+ if (!(cur && cur.Var === 'resource')) {
32
+ throw new Error(`Unexpected resource base path: ${JSON.stringify(node)}`);
33
+ }
34
+ return acc;
35
+ }
36
+ function patternToOperation(pattern) {
37
+ // Cedar splits a `like` pattern into per-character Literal elements.
38
+ const value = pattern
39
+ .filter((p) => p !== 'Wildcard')
40
+ .map((p) => p.Literal)
41
+ .join('');
42
+ const startsWildcard = pattern[0] === 'Wildcard';
43
+ const endsWildcard = pattern[pattern.length - 1] === 'Wildcard';
44
+ if (startsWildcard && endsWildcard)
45
+ return { operator: '_contains', value };
46
+ if (endsWildcard)
47
+ return { operator: '_starts_with', value };
48
+ if (startsWildcard)
49
+ return { operator: '_ends_with', value };
50
+ throw new Error(`Unsupported like pattern: ${JSON.stringify(pattern)}`);
51
+ }
52
+ const COMPARISON_OPS = {
53
+ '==': '_eq',
54
+ '!=': '_neq',
55
+ '>': '_gt',
56
+ '>=': '_gte',
57
+ '<': '_lt',
58
+ '<=': '_lte',
59
+ };
60
+ /** Inverse of `addWhenClauses`: a Cedar Expr tree back into a D9 filter. */
61
+ function exprToFilter(expr, subject = 'resource') {
62
+ if (!expr)
63
+ return {};
64
+ const key = Object.keys(expr)[0];
65
+ const node = expr[key];
66
+ if (key === '&&' || key === '||') {
67
+ const operator = key === '&&' ? '_and' : '_or';
68
+ const left = exprToFilter(node.left, subject);
69
+ const right = exprToFilter(node.right, subject);
70
+ const operands = [left[operator] ?? left, right[operator] ?? right].flat();
71
+ return { [operator]: operands };
72
+ }
73
+ if (key === 'has') {
74
+ return pathToFilter(node.left, subject, { [node.attr]: { _nnull: true } });
75
+ }
76
+ if (key === '!') {
77
+ const arg = node.arg;
78
+ if (arg && arg.has) {
79
+ return pathToFilter(arg.has.left, subject, {
80
+ [arg.has.attr]: { _null: true },
81
+ });
82
+ }
83
+ throw new Error(`Unsupported negation expression: ${JSON.stringify(expr)}`);
84
+ }
85
+ if (key === 'like') {
86
+ const { operator, value } = patternToOperation(node.pattern);
87
+ return pathToFilter(node.left, subject, { [operator]: value });
88
+ }
89
+ if (key in COMPARISON_OPS) {
90
+ return pathToFilter(node.left, subject, {
91
+ [COMPARISON_OPS[key]]: rightToValue(node.right),
92
+ });
93
+ }
94
+ throw new Error(`Unsupported Cedar expression operator: ${key}`);
95
+ }
96
+ /** Field list from a check-fields policy's `containsAll` clause. */
97
+ function extractFields(expr) {
98
+ const left = expr?.containsAll?.left;
99
+ // A literal array is normalized by Cedar into a Set of Value elements.
100
+ if (Array.isArray(left?.Set))
101
+ return left.Set.map((e) => e.Value);
102
+ if (Array.isArray(left?.Value))
103
+ return left.Value;
104
+ throw new Error(`Unexpected check-fields policy shape: ${JSON.stringify(expr)}`);
105
+ }
106
+ /** Inverse of `refactoPolicies`: expand `action in [...]` into one tuple each. */
107
+ function expandPolicy(policy) {
108
+ const action = policy.action;
109
+ let entities = [];
110
+ if (action.op === '==') {
111
+ entities = [action.entity];
112
+ }
113
+ else if (action.op === 'in') {
114
+ // Cedar parses a single-element `action in [X]` as `{ op: 'in', entity }`
115
+ entities = action.entities ?? [action.entity];
116
+ }
117
+ else {
118
+ // returning no tuple would silently remove the matching rows from the CSV
119
+ throw new Error(`Unexpected action constraint: ${JSON.stringify(action)}`);
120
+ }
121
+ return entities.map((e) => {
122
+ const ent = e;
123
+ return {
124
+ collection: ent.type.replace(/^Db::/, '').replace(/::Action$/, ''),
125
+ action: ent.id,
126
+ conditions: policy.conditions ?? [],
127
+ };
128
+ });
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItdG8tZDktdHJhbnNsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jZWRhci9jZWRhci10by1kOS10cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvRUEsb0NBMENDO0FBR0Qsc0NBUUM7QUFHRCxvQ0FzQkM7QUE3SUQsU0FBUyxZQUFZLENBQUMsS0FBVTtJQUM5QixJQUFJLEtBQUssRUFBRSxHQUFHLEtBQUssV0FBVztRQUFFLE9BQU8sZUFBZSxDQUFDO0lBQ3ZELElBQUksS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsNENBQTRDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDcEUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsSUFBUyxFQUNULE9BQXlCLEVBQ3pCLElBQXlCO0lBRXpCLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFFZixJQUFJLE9BQU8sS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLHlFQUF5RTtZQUN6RSxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxTQUFTO2dCQUFFLE9BQU8sR0FBRyxDQUFDO1lBQy9ELEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDdEIsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLElB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O1FBQzlCLDBFQUEwRTtRQUMxRSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO1NBQU0sQ0FBQztRQUNOLDBFQUEwRTtRQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxHQUFHLEdBQUcsQ0FBYyxDQUFDO1FBQzNCLE9BQU87WUFDTCxVQUFVLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNkLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7U0FDcEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmRpdGlvblN1YmplY3QgfSBmcm9tICcuL2NlZGFyLXRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEZpbHRlciB9IGZyb20gJy4vZDktcGVybWlzc2lvbic7XG5cbnR5cGUgRW50aXR5UmVmID0geyB0eXBlOiBzdHJpbmc7IGlkOiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gcmlnaHRUb1ZhbHVlKHJpZ2h0OiBhbnkpOiBhbnkge1xuICBpZiAocmlnaHQ/LlZhciA9PT0gJ3ByaW5jaXBhbCcpIHJldHVybiAnJENVUlJFTlRfVVNFUic7XG4gIGlmIChyaWdodD8uVmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJpZ2h0LlZhbHVlO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuc3VwcG9ydGVkIHJpZ2h0LWhhbmQgQ2VkYXIgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShyaWdodCl9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGF0aFRvRmlsdGVyKFxuICBub2RlOiBhbnksXG4gIHN1YmplY3Q6IENvbmRpdGlvblN1YmplY3QsXG4gIGxlYWY6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pOiBGaWx0ZXIge1xuICBsZXQgYWNjOiBhbnkgPSBsZWFmO1xuICBsZXQgY3VyID0gbm9kZTtcblxuICBpZiAoc3ViamVjdCA9PT0gJ2NvbnRleHQubmV3VmFsdWUnKSB7XG4gICAgd2hpbGUgKGN1ciAmJiBjdXJbJy4nXSkge1xuICAgICAgY29uc3QgeyBsZWZ0LCBhdHRyIH0gPSBjdXJbJy4nXTtcbiAgICAgIC8vIFJlYWNoZWQgdGhlIGBjb250ZXh0Lm5ld1ZhbHVlYCBiYXNlOiBzdG9wIHdpdGhvdXQgd3JhcHBpbmcgYG5ld1ZhbHVlYC5cbiAgICAgIGlmIChhdHRyID09PSAnbmV3VmFsdWUnICYmIGxlZnQ/LlZhciA9PT0gJ2NvbnRleHQnKSByZXR1cm4gYWNjO1xuICAgICAgYWNjID0geyBbYXR0cl06IGFjYyB9O1xuICAgICAgY3VyID0gbGVmdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgY29udGV4dC5uZXdWYWx1ZSBiYXNlIHBhdGg6ICR7SlNPTi5zdHJpbmdpZnkobm9kZSl9YCxcbiAgICApO1xuICB9XG5cbiAgd2hpbGUgKGN1ciAmJiBjdXJbJy4nXSkge1xuICAgIGFjYyA9IHsgW2N1clsnLiddLmF0dHJdOiBhY2MgfTtcbiAgICBjdXIgPSBjdXJbJy4nXS5sZWZ0O1xuICB9XG4gIGlmICghKGN1ciAmJiBjdXIuVmFyID09PSAncmVzb3VyY2UnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNvdXJjZSBiYXNlIHBhdGg6ICR7SlNPTi5zdHJpbmdpZnkobm9kZSl9YCk7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn1cblxuZnVuY3Rpb24gcGF0dGVyblRvT3BlcmF0aW9uKHBhdHRlcm46IGFueVtdKTogeyBvcGVyYXRvcjogc3RyaW5nOyB2YWx1ZTogYW55IH0ge1xuICAvLyBDZWRhciBzcGxpdHMgYSBgbGlrZWAgcGF0dGVybiBpbnRvIHBlci1jaGFyYWN0ZXIgTGl0ZXJhbCBlbGVtZW50cy5cbiAgY29uc3QgdmFsdWUgPSBwYXR0ZXJuXG4gICAgLmZpbHRlcigocCkgPT4gcCAhPT0gJ1dpbGRjYXJkJylcbiAgICAubWFwKChwKSA9PiBwLkxpdGVyYWwpXG4gICAgLmpvaW4oJycpO1xuICBjb25zdCBzdGFydHNXaWxkY2FyZCA9IHBhdHRlcm5bMF0gPT09ICdXaWxkY2FyZCc7XG4gIGNvbnN0IGVuZHNXaWxkY2FyZCA9IHBhdHRlcm5bcGF0dGVybi5sZW5ndGggLSAxXSA9PT0gJ1dpbGRjYXJkJztcbiAgaWYgKHN0YXJ0c1dpbGRjYXJkICYmIGVuZHNXaWxkY2FyZCkgcmV0dXJuIHsgb3BlcmF0b3I6ICdfY29udGFpbnMnLCB2YWx1ZSB9O1xuICBpZiAoZW5kc1dpbGRjYXJkKSByZXR1cm4geyBvcGVyYXRvcjogJ19zdGFydHNfd2l0aCcsIHZhbHVlIH07XG4gIGlmIChzdGFydHNXaWxkY2FyZCkgcmV0dXJuIHsgb3BlcmF0b3I6ICdfZW5kc193aXRoJywgdmFsdWUgfTtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsaWtlIHBhdHRlcm46ICR7SlNPTi5zdHJpbmdpZnkocGF0dGVybil9YCk7XG59XG5cbmNvbnN0IENPTVBBUklTT05fT1BTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnPT0nOiAnX2VxJyxcbiAgJyE9JzogJ19uZXEnLFxuICAnPic6ICdfZ3QnLFxuICAnPj0nOiAnX2d0ZScsXG4gICc8JzogJ19sdCcsXG4gICc8PSc6ICdfbHRlJyxcbn07XG5cbi8qKiBJbnZlcnNlIG9mIGBhZGRXaGVuQ2xhdXNlc2A6IGEgQ2VkYXIgRXhwciB0cmVlIGJhY2sgaW50byBhIEQ5IGZpbHRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHByVG9GaWx0ZXIoXG4gIGV4cHI/OiBhbnksXG4gIHN1YmplY3Q6IENvbmRpdGlvblN1YmplY3QgPSAncmVzb3VyY2UnLFxuKTogRmlsdGVyIHtcbiAgaWYgKCFleHByKSByZXR1cm4ge307XG4gIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGV4cHIpWzBdITtcbiAgY29uc3Qgbm9kZSA9IChleHByIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG5cbiAgaWYgKGtleSA9PT0gJyYmJyB8fCBrZXkgPT09ICd8fCcpIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IGtleSA9PT0gJyYmJyA/ICdfYW5kJyA6ICdfb3InO1xuICAgIGNvbnN0IGxlZnQgPSBleHByVG9GaWx0ZXIobm9kZS5sZWZ0LCBzdWJqZWN0KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IHJpZ2h0ID0gZXhwclRvRmlsdGVyKG5vZGUucmlnaHQsIHN1YmplY3QpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3Qgb3BlcmFuZHMgPSBbbGVmdFtvcGVyYXRvcl0gPz8gbGVmdCwgcmlnaHRbb3BlcmF0b3JdID8/IHJpZ2h0XS5mbGF0KCk7XG4gICAgcmV0dXJuIHsgW29wZXJhdG9yXTogb3BlcmFuZHMgfSBhcyBGaWx0ZXI7XG4gIH1cblxuICBpZiAoa2V5ID09PSAnaGFzJykge1xuICAgIHJldHVybiBwYXRoVG9GaWx0ZXIobm9kZS5sZWZ0LCBzdWJqZWN0LCB7IFtub2RlLmF0dHJdOiB7IF9ubnVsbDogdHJ1ZSB9IH0pO1xuICB9XG5cbiAgaWYgKGtleSA9PT0gJyEnKSB7XG4gICAgY29uc3QgYXJnID0gbm9kZS5hcmc7XG4gICAgaWYgKGFyZyAmJiBhcmcuaGFzKSB7XG4gICAgICByZXR1cm4gcGF0aFRvRmlsdGVyKGFyZy5oYXMubGVmdCwgc3ViamVjdCwge1xuICAgICAgICBbYXJnLmhhcy5hdHRyXTogeyBfbnVsbDogdHJ1ZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbmVnYXRpb24gZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHByKX1gKTtcbiAgfVxuXG4gIGlmIChrZXkgPT09ICdsaWtlJykge1xuICAgIGNvbnN0IHsgb3BlcmF0b3IsIHZhbHVlIH0gPSBwYXR0ZXJuVG9PcGVyYXRpb24obm9kZS5wYXR0ZXJuKTtcbiAgICByZXR1cm4gcGF0aFRvRmlsdGVyKG5vZGUubGVmdCwgc3ViamVjdCwgeyBbb3BlcmF0b3JdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGlmIChrZXkgaW4gQ09NUEFSSVNPTl9PUFMpIHtcbiAgICByZXR1cm4gcGF0aFRvRmlsdGVyKG5vZGUubGVmdCwgc3ViamVjdCwge1xuICAgICAgW0NPTVBBUklTT05fT1BTW2tleV0hXTogcmlnaHRUb1ZhbHVlKG5vZGUucmlnaHQpLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBDZWRhciBleHByZXNzaW9uIG9wZXJhdG9yOiAke2tleX1gKTtcbn1cblxuLyoqIEZpZWxkIGxpc3QgZnJvbSBhIGNoZWNrLWZpZWxkcyBwb2xpY3kncyBgY29udGFpbnNBbGxgIGNsYXVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RmllbGRzKGV4cHI6IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGVmdCA9IGV4cHI/LmNvbnRhaW5zQWxsPy5sZWZ0O1xuICAvLyBBIGxpdGVyYWwgYXJyYXkgaXMgbm9ybWFsaXplZCBieSBDZWRhciBpbnRvIGEgU2V0IG9mIFZhbHVlIGVsZW1lbnRzLlxuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0Py5TZXQpKSByZXR1cm4gbGVmdC5TZXQubWFwKChlOiBhbnkpID0+IGUuVmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0Py5WYWx1ZSkpIHJldHVybiBsZWZ0LlZhbHVlO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuZXhwZWN0ZWQgY2hlY2stZmllbGRzIHBvbGljeSBzaGFwZTogJHtKU09OLnN0cmluZ2lmeShleHByKX1gLFxuICApO1xufVxuXG4vKiogSW52ZXJzZSBvZiBgcmVmYWN0b1BvbGljaWVzYDogZXhwYW5kIGBhY3Rpb24gaW4gWy4uLl1gIGludG8gb25lIHR1cGxlIGVhY2guICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kUG9saWN5KFxuICBwb2xpY3k6IGFueSxcbik6IEFycmF5PHsgY29sbGVjdGlvbjogc3RyaW5nOyBhY3Rpb246IHN0cmluZzsgY29uZGl0aW9uczogYW55W10gfT4ge1xuICBjb25zdCBhY3Rpb24gPSBwb2xpY3kuYWN0aW9uO1xuICBsZXQgZW50aXRpZXM6IGFueVtdID0gW107XG4gIGlmIChhY3Rpb24ub3AgPT09ICc9PScpIHtcbiAgICBlbnRpdGllcyA9IFthY3Rpb24uZW50aXR5XTtcbiAgfSBlbHNlIGlmIChhY3Rpb24ub3AgPT09ICdpbicpIHtcbiAgICAvLyBDZWRhciBwYXJzZXMgYSBzaW5nbGUtZWxlbWVudCBgYWN0aW9uIGluIFtYXWAgYXMgYHsgb3A6ICdpbicsIGVudGl0eSB9YFxuICAgIGVudGl0aWVzID0gYWN0aW9uLmVudGl0aWVzID8/IFthY3Rpb24uZW50aXR5XTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXR1cm5pbmcgbm8gdHVwbGUgd291bGQgc2lsZW50bHkgcmVtb3ZlIHRoZSBtYXRjaGluZyByb3dzIGZyb20gdGhlIENTVlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhY3Rpb24gY29uc3RyYWludDogJHtKU09OLnN0cmluZ2lmeShhY3Rpb24pfWApO1xuICB9XG4gIHJldHVybiBlbnRpdGllcy5tYXAoKGUpID0+IHtcbiAgICBjb25zdCBlbnQgPSBlIGFzIEVudGl0eVJlZjtcbiAgICByZXR1cm4ge1xuICAgICAgY29sbGVjdGlvbjogZW50LnR5cGUucmVwbGFjZSgvXkRiOjovLCAnJykucmVwbGFjZSgvOjpBY3Rpb24kLywgJycpLFxuICAgICAgYWN0aW9uOiBlbnQuaWQsXG4gICAgICBjb25kaXRpb25zOiBwb2xpY3kuY29uZGl0aW9ucyA/PyBbXSxcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,57 @@
1
+ import { D9Permission } from './d9-permission';
2
+ import { RolesTable } from './roles-table';
3
+ /** Map keyed by a tuple of strings (Map indexes arrays by identity, hence the join). */
4
+ declare class TupleKeyMap<Value> {
5
+ private readonly createValue?;
6
+ private readonly entries;
7
+ /** `createValue` is required to use {@link getOrCreate}; omit it for a plain get/set map. */
8
+ constructor(createValue?: ((parts: string[]) => Value) | undefined);
9
+ private keyOf;
10
+ get(parts: string[]): Value | undefined;
11
+ set(parts: string[], value: Value): void;
12
+ delete(parts: string[]): void;
13
+ /** Return the value for `parts`, creating and storing it via the factory if absent. */
14
+ getOrCreate(parts: string[]): Value;
15
+ values(): Value[];
16
+ }
17
+ /**
18
+ * Reverse of d9-to-cedar: reads the per-role Cedar policy files back into D9
19
+ * permission rows and merges them into directus_permissions.csv. The original
20
+ * CSV stays the source of truth for the columns Cedar does not carry (`id`,
21
+ * `role` UUID, `presets`); only `permissions`/`fields`/`validation` are rewritten.
22
+ */
23
+ export declare class CedarToD9Manager {
24
+ permissionPath: string;
25
+ sqlPath: string;
26
+ outputPath: string;
27
+ roles: RolesTable;
28
+ baseRowsByTuple: TupleKeyMap<Record<string, string>>;
29
+ header: string[];
30
+ nextId: number;
31
+ reconstructed: D9Permission[];
32
+ constructor(opts?: {
33
+ permissionPath?: string;
34
+ sqlPath?: string;
35
+ outputPath?: string;
36
+ });
37
+ readBasePermissionFile(): Promise<void>;
38
+ readRoleFile(): Promise<void>;
39
+ /** Read one `.cedar` file into expanded (collection, action, conditions) tuples. */
40
+ parseCedarFile(filePath: string): Promise<Array<{
41
+ collection: string;
42
+ action: string;
43
+ conditions: any[];
44
+ }>>;
45
+ parseRoleFolder(roleName: string): Promise<D9Permission[]>;
46
+ parseAllFolders(): Promise<void>;
47
+ mergeIntoRows(): void;
48
+ writeOutput(): Promise<void>;
49
+ readCedarAndWriteCsv(): Promise<void>;
50
+ }
51
+ /** CLI action: merge Cedar policies back into directus_permissions.csv. */
52
+ export declare function cedarToD9(options?: {
53
+ permissionPath?: string;
54
+ sqlPath?: string;
55
+ outputPath?: string;
56
+ }): Promise<void>;
57
+ export {};
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CedarToD9Manager = void 0;
4
+ exports.cedarToD9 = cedarToD9;
5
+ const fs_1 = require("fs");
6
+ const promises_1 = require("fs/promises");
7
+ const cedar = require("@cedar-policy/cedar-wasm/nodejs");
8
+ const cedar_to_d9_translations_1 = require("./cedar-to-d9-translations");
9
+ const d9_permission_1 = require("./d9-permission");
10
+ const roles_table_1 = require("./roles-table");
11
+ const logger_1 = require("../../logger");
12
+ const utils_1 = require("../save/utils");
13
+ /** Map keyed by a tuple of strings (Map indexes arrays by identity, hence the join). */
14
+ class TupleKeyMap {
15
+ /** `createValue` is required to use {@link getOrCreate}; omit it for a plain get/set map. */
16
+ constructor(createValue) {
17
+ this.createValue = createValue;
18
+ this.entries = new Map();
19
+ }
20
+ keyOf(parts) {
21
+ return parts.join(' ');
22
+ }
23
+ get(parts) {
24
+ return this.entries.get(this.keyOf(parts));
25
+ }
26
+ set(parts, value) {
27
+ this.entries.set(this.keyOf(parts), value);
28
+ }
29
+ delete(parts) {
30
+ this.entries.delete(this.keyOf(parts));
31
+ }
32
+ /** Return the value for `parts`, creating and storing it via the factory if absent. */
33
+ getOrCreate(parts) {
34
+ const key = this.keyOf(parts);
35
+ let value = this.entries.get(key);
36
+ if (value === undefined) {
37
+ if (!this.createValue) {
38
+ throw new Error('TupleKeyMap.getOrCreate called without a factory');
39
+ }
40
+ value = this.createValue(parts);
41
+ this.entries.set(key, value);
42
+ }
43
+ return value;
44
+ }
45
+ values() {
46
+ return [...this.entries.values()];
47
+ }
48
+ }
49
+ /**
50
+ * Reverse of d9-to-cedar: reads the per-role Cedar policy files back into D9
51
+ * permission rows and merges them into directus_permissions.csv. The original
52
+ * CSV stays the source of truth for the columns Cedar does not carry (`id`,
53
+ * `role` UUID, `presets`); only `permissions`/`fields`/`validation` are rewritten.
54
+ */
55
+ class CedarToD9Manager {
56
+ constructor(opts) {
57
+ // Rows keyed by (role, collection, action); the map's values (insertion order)
58
+ // are what gets written back out, so it is the single source of truth for rows.
59
+ this.baseRowsByTuple = new TupleKeyMap();
60
+ this.header = [];
61
+ this.nextId = 0;
62
+ this.reconstructed = [];
63
+ this.permissionPath = opts?.permissionPath || './permissions';
64
+ this.sqlPath = opts?.sqlPath || './sql/data';
65
+ this.outputPath =
66
+ opts?.outputPath || `${this.sqlPath}/directus_permissions.csv`;
67
+ }
68
+ async readBasePermissionFile() {
69
+ const filePath = `${this.sqlPath}/directus_permissions.csv`;
70
+ const rows = await (0, utils_1.readCsvFile)(filePath);
71
+ const firstLine = await (0, utils_1.readFirstLineOfFile)(filePath);
72
+ this.header = firstLine.split(',').map((column) => column.trim());
73
+ for (const row of rows) {
74
+ this.baseRowsByTuple.set([row.role, row.collection, row.action], row);
75
+ const id = Number(row.id);
76
+ if (Number.isFinite(id) && id > this.nextId)
77
+ this.nextId = id;
78
+ }
79
+ }
80
+ async readRoleFile() {
81
+ this.roles = await roles_table_1.RolesTable.load(this.sqlPath);
82
+ }
83
+ /** Read one `.cedar` file into expanded (collection, action, conditions) tuples. */
84
+ async parseCedarFile(filePath) {
85
+ if (!(0, fs_1.existsSync)(filePath)) {
86
+ return []; // a role may not have every .cedar file (e.g. no validate.cedar)
87
+ }
88
+ const text = (await (0, promises_1.readFile)(filePath)).toString();
89
+ const parts = cedar.policySetTextToParts(text);
90
+ if (parts.type === 'failure') {
91
+ logger_1.logger.error(`failed to split policy set ${filePath}`);
92
+ throw new Error(parts.errors);
93
+ }
94
+ const tuples = [];
95
+ for (const policyText of parts.policies) {
96
+ const parsed = cedar.policyToJson(policyText);
97
+ if (parsed.type === 'failure') {
98
+ logger_1.logger.error({ policyText }, `failed to parse policy in ${filePath}`);
99
+ throw new Error(parsed.errors);
100
+ }
101
+ tuples.push(...(0, cedar_to_d9_translations_1.expandPolicy)(parsed.json));
102
+ }
103
+ return tuples;
104
+ }
105
+ async parseRoleFolder(roleName) {
106
+ // A (collection, action) tuple can appear across authorize/check-fields/validate,
107
+ // so the map creates one permission per tuple and we accumulate clauses onto it.
108
+ const byTuple = new TupleKeyMap(([collection, action]) => d9_permission_1.D9Permission.empty(roleName, collection, action));
109
+ const folder = `${this.permissionPath}/${roleName}`;
110
+ const authorizeTuples = await this.parseCedarFile(`${folder}/authorize.cedar`);
111
+ for (const tuple of authorizeTuples) {
112
+ byTuple.getOrCreate([tuple.collection, tuple.action]).permissions =
113
+ (0, cedar_to_d9_translations_1.exprToFilter)(tuple.conditions[0]?.body, 'resource');
114
+ }
115
+ const fieldTuples = await this.parseCedarFile(`${folder}/check-fields.cedar`);
116
+ for (const tuple of fieldTuples) {
117
+ if (tuple.conditions.length) {
118
+ byTuple.getOrCreate([tuple.collection, tuple.action]).fields =
119
+ (0, cedar_to_d9_translations_1.extractFields)(tuple.conditions[0].body);
120
+ }
121
+ }
122
+ const validateTuples = await this.parseCedarFile(`${folder}/validate.cedar`);
123
+ for (const tuple of validateTuples) {
124
+ if (tuple.conditions.length) {
125
+ byTuple.getOrCreate([tuple.collection, tuple.action]).validation =
126
+ (0, cedar_to_d9_translations_1.exprToFilter)(tuple.conditions[0].body, 'context.newValue');
127
+ }
128
+ }
129
+ return byTuple.values();
130
+ }
131
+ async parseAllFolders() {
132
+ const entries = await (0, promises_1.readdir)(this.permissionPath, { withFileTypes: true });
133
+ for (const entry of entries) {
134
+ if (!entry.isDirectory())
135
+ continue;
136
+ this.reconstructed.push(...(await this.parseRoleFolder(entry.name)));
137
+ }
138
+ }
139
+ mergeIntoRows() {
140
+ let merged = 0;
141
+ let updated = 0;
142
+ let added = 0;
143
+ let removed = 0;
144
+ const seen = new TupleKeyMap();
145
+ for (const perm of this.reconstructed) {
146
+ const roleId = this.roles.getIdFromName(perm.roleName);
147
+ if (!roleId && perm.roleName !== 'Public') {
148
+ // In V2, instead of throwing an error, we could create a new role in the CSV.
149
+ // But for now, we expect the roles to be pre-defined in the CSV.
150
+ // This is a sanity check: the role should exist in the CSV, otherwise something is wrong.
151
+ throw new Error(`role "${perm.roleName}" (from ${this.permissionPath}) not found in directus_roles.csv`);
152
+ }
153
+ seen.set([roleId, perm.collection, perm.action], true);
154
+ const row = this.baseRowsByTuple.get([roleId, perm.collection, perm.action]);
155
+ if (!row) {
156
+ // New tuple added in the Cedar files; the role exists, so create a row.
157
+ const newRow = {
158
+ id: String(++this.nextId),
159
+ role: roleId,
160
+ collection: perm.collection,
161
+ action: perm.action,
162
+ permissions: perm.permissionsCell(),
163
+ validation: perm.validationCell(),
164
+ fields: perm.fieldsCell(),
165
+ presets: '',
166
+ };
167
+ this.baseRowsByTuple.set([roleId, perm.collection, perm.action], newRow);
168
+ logger_1.logger.info(`added ${perm.roleName}/${perm.collection}/${perm.action} (id ${newRow.id})`);
169
+ added++;
170
+ merged++;
171
+ continue;
172
+ }
173
+ // The Cedar policies are the source of truth: overwrite the three
174
+ // derivable columns directly (the round-trip is meaning-preserving, so
175
+ // this only reshapes representation, e.g. `{_and:[x]}` -> `x`).
176
+ row.permissions = perm.permissionsCell();
177
+ row.validation = perm.validationCell();
178
+ row.fields = perm.fieldsCell();
179
+ updated++;
180
+ merged++;
181
+ }
182
+ // Every row is written to authorize.cedar by d9-to-cedar, so a row no longer
183
+ // produced by the Cedar files has been removed from them.
184
+ for (const row of this.baseRowsByTuple.values()) {
185
+ const tuple = [row.role, row.collection, row.action];
186
+ if (seen.get(tuple))
187
+ continue;
188
+ this.baseRowsByTuple.delete(tuple);
189
+ const roleName = row.role ? this.roles.getNameFromId(row.role) : 'Public';
190
+ logger_1.logger.info(`removed ${roleName}/${row.collection}/${row.action} (id ${row.id})`);
191
+ removed++;
192
+ }
193
+ logger_1.logger.info(`merged ${merged} permissions, ${updated} row(s) updated, ${added} new row(s) added, ${removed} row(s) removed`);
194
+ }
195
+ async writeOutput() {
196
+ await (0, utils_1.writeCsvFile)(this.outputPath, this.header, this.baseRowsByTuple.values());
197
+ logger_1.logger.info(`wrote ${this.outputPath}`);
198
+ }
199
+ async readCedarAndWriteCsv() {
200
+ logger_1.logger.info('reading base permission file');
201
+ await this.readBasePermissionFile();
202
+ logger_1.logger.info(`found ${this.baseRowsByTuple.values().length} base permissions`);
203
+ logger_1.logger.info('reading role file');
204
+ await this.readRoleFile();
205
+ logger_1.logger.info('parsing cedar policy folders');
206
+ await this.parseAllFolders();
207
+ logger_1.logger.info(`reconstructed ${this.reconstructed.length} permissions from cedar`);
208
+ logger_1.logger.info('merging into base rows');
209
+ this.mergeIntoRows();
210
+ logger_1.logger.info('writing csv');
211
+ await this.writeOutput();
212
+ logger_1.logger.info('done');
213
+ }
214
+ }
215
+ exports.CedarToD9Manager = CedarToD9Manager;
216
+ /** CLI action: merge Cedar policies back into directus_permissions.csv. */
217
+ async function cedarToD9(options) {
218
+ const manager = new CedarToD9Manager(options);
219
+ await manager.readCedarAndWriteCsv();
220
+ }
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VkYXItdG8tZDkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NlZGFyL2NlZGFyLXRvLWQ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdSQSw4QkFPQztBQXZSRCwyQkFBZ0M7QUFDaEMsMENBQWdEO0FBQ2hELHlEQUF5RDtBQUN6RCx5RUFJb0M7QUFDcEMsbURBQStDO0FBQy9DLCtDQUEyQztBQUMzQyx5Q0FBc0M7QUFDdEMseUNBQStFO0FBRS9FLHdGQUF3RjtBQUN4RixNQUFNLFdBQVc7SUFHZiw2RkFBNkY7SUFDN0YsWUFBNkIsV0FBd0M7UUFBeEMsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBSHBELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUdvQixDQUFDO0lBRWpFLEtBQUssQ0FBQyxLQUFlO1FBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRU0sR0FBRyxDQUFDLEtBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLEdBQUcsQ0FBQyxLQUFlLEVBQUUsS0FBWTtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHVGQUF1RjtJQUNoRixXQUFXLENBQUMsS0FBZTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FB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Z05DO0FBRUQsMkVBQTJFO0FBQ3BFLEtBQUssVUFBVSxTQUFTLENBQUMsT0FJL0I7SUFDQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgcmVhZGRpciB9IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIGNlZGFyIGZyb20gJ0BjZWRhci1wb2xpY3kvY2VkYXItd2FzbS9ub2RlanMnO1xuaW1wb3J0IHtcbiAgZXhwYW5kUG9saWN5LFxuICBleHByVG9GaWx0ZXIsXG4gIGV4dHJhY3RGaWVsZHMsXG59IGZyb20gJy4vY2VkYXItdG8tZDktdHJhbnNsYXRpb25zJztcbmltcG9ydCB7IEQ5UGVybWlzc2lvbiB9IGZyb20gJy4vZDktcGVybWlzc2lvbic7XG5pbXBvcnQgeyBSb2xlc1RhYmxlIH0gZnJvbSAnLi9yb2xlcy10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVhZENzdkZpbGUsIHJlYWRGaXJzdExpbmVPZkZpbGUsIHdyaXRlQ3N2RmlsZSB9IGZyb20gJy4uL3NhdmUvdXRpbHMnO1xuXG4vKiogTWFwIGtleWVkIGJ5IGEgdHVwbGUgb2Ygc3RyaW5ncyAoTWFwIGluZGV4ZXMgYXJyYXlzIGJ5IGlkZW50aXR5LCBoZW5jZSB0aGUgam9pbikuICovXG5jbGFzcyBUdXBsZUtleU1hcDxWYWx1ZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgVmFsdWU+KCk7XG5cbiAgLyoqIGBjcmVhdGVWYWx1ZWAgaXMgcmVxdWlyZWQgdG8gdXNlIHtAbGluayBnZXRPckNyZWF0ZX07IG9taXQgaXQgZm9yIGEgcGxhaW4gZ2V0L3NldCBtYXAuICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVmFsdWU/OiAocGFydHM6IHN0cmluZ1tdKSA9PiBWYWx1ZSkge31cblxuICBwcml2YXRlIGtleU9mKHBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQocGFydHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGhpcy5rZXlPZihwYXJ0cykpO1xuICB9XG5cbiAgcHVibGljIHNldChwYXJ0czogc3RyaW5nW10sIHZhbHVlOiBWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5zZXQodGhpcy5rZXlPZihwYXJ0cyksIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZSh0aGlzLmtleU9mKHBhcnRzKSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYHBhcnRzYCwgY3JlYXRpbmcgYW5kIHN0b3JpbmcgaXQgdmlhIHRoZSBmYWN0b3J5IGlmIGFic2VudC4gKi9cbiAgcHVibGljIGdldE9yQ3JlYXRlKHBhcnRzOiBzdHJpbmdbXSk6IFZhbHVlIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleU9mKHBhcnRzKTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdGhpcy5jcmVhdGVWYWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R1cGxlS2V5TWFwLmdldE9yQ3JlYXRlIGNhbGxlZCB3aXRob3V0IGEgZmFjdG9yeScpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0aGlzLmNyZWF0ZVZhbHVlKHBhcnRzKTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMoKTogVmFsdWVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVudHJpZXMudmFsdWVzKCldO1xuICB9XG59XG5cbi8qKlxuICogUmV2ZXJzZSBvZiBkOS10by1jZWRhcjogcmVhZHMgdGhlIHBlci1yb2xlIENlZGFyIHBvbGljeSBmaWxlcyBiYWNrIGludG8gRDlcbiAqIHBlcm1pc3Npb24gcm93cyBhbmQgbWVyZ2VzIHRoZW0gaW50byBkaXJlY3R1c19wZXJtaXNzaW9ucy5jc3YuIFRoZSBvcmlnaW5hbFxuICogQ1NWIHN0YXlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjb2x1bW5zIENlZGFyIGRvZXMgbm90IGNhcnJ5IChgaWRgLFxuICogYHJvbGVgIFVVSUQsIGBwcmVzZXRzYCk7IG9ubHkgYHBlcm1pc3Npb25zYC9gZmllbGRzYC9gdmFsaWRhdGlvbmAgYXJlIHJld3JpdHRlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENlZGFyVG9EOU1hbmFnZXIge1xuICBwdWJsaWMgcGVybWlzc2lvblBhdGg6IHN0cmluZztcbiAgcHVibGljIHNxbFBhdGg6IHN0cmluZztcbiAgcHVibGljIG91dHB1dFBhdGg6IHN0cmluZztcblxuICBwdWJsaWMgcm9sZXMhOiBSb2xlc1RhYmxlO1xuICAvLyBSb3dzIGtleWVkIGJ5IChyb2xlLCBjb2xsZWN0aW9uLCBhY3Rpb24pOyB0aGUgbWFwJ3MgdmFsdWVzIChpbnNlcnRpb24gb3JkZXIpXG4gIC8vIGFyZSB3aGF0IGdldHMgd3JpdHRlbiBiYWNrIG91dCwgc28gaXQgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJvd3MuXG4gIHB1YmxpYyBiYXNlUm93c0J5VHVwbGUgPSBuZXcgVHVwbGVLZXlNYXA8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgcHVibGljIGhlYWRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIG5leHRJZCA9IDA7XG4gIHB1YmxpYyByZWNvbnN0cnVjdGVkOiBEOVBlcm1pc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM/OiB7XG4gICAgcGVybWlzc2lvblBhdGg/OiBzdHJpbmc7XG4gICAgc3FsUGF0aD86IHN0cmluZztcbiAgICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wZXJtaXNzaW9uUGF0aCA9IG9wdHM/LnBlcm1pc3Npb25QYXRoIHx8ICcuL3Blcm1pc3Npb25zJztcbiAgICB0aGlzLnNxbFBhdGggPSBvcHRzPy5zcWxQYXRoIHx8ICcuL3NxbC9kYXRhJztcbiAgICB0aGlzLm91dHB1dFBhdGggPVxuICAgICAgb3B0cz8ub3V0cHV0UGF0aCB8fCBgJHt0aGlzLnNxbFBhdGh9L2RpcmVjdHVzX3Blcm1pc3Npb25zLmNzdmA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEJhc2VQZXJtaXNzaW9uRmlsZSgpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke3RoaXMuc3FsUGF0aH0vZGlyZWN0dXNfcGVybWlzc2lvbnMuY3N2YDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVhZENzdkZpbGUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGZpcnN0TGluZSA9IGF3YWl0IHJlYWRGaXJzdExpbmVPZkZpbGUoZmlsZVBhdGgpO1xuICAgIHRoaXMuaGVhZGVyID0gZmlyc3RMaW5lLnNwbGl0KCcsJykubWFwKChjb2x1bW4pID0+IGNvbHVtbi50cmltKCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgdGhpcy5iYXNlUm93c0J5VHVwbGUuc2V0KFtyb3cucm9sZSwgcm93LmNvbGxlY3Rpb24sIHJvdy5hY3Rpb25dLCByb3cpO1xuICAgICAgY29uc3QgaWQgPSBOdW1iZXIocm93LmlkKTtcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoaWQpICYmIGlkID4gdGhpcy5uZXh0SWQpIHRoaXMubmV4dElkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRSb2xlRmlsZSgpIHtcbiAgICB0aGlzLnJvbGVzID0gYXdhaXQgUm9sZXNUYWJsZS5sb2FkKHRoaXMuc3FsUGF0aCk7XG4gIH1cblxuICAvKiogUmVhZCBvbmUgYC5jZWRhcmAgZmlsZSBpbnRvIGV4cGFuZGVkIChjb2xsZWN0aW9uLCBhY3Rpb24sIGNvbmRpdGlvbnMpIHR1cGxlcy4gKi9cbiAgcHVibGljIGFzeW5jIHBhcnNlQ2VkYXJGaWxlKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICk6IFByb21pc2U8QXJyYXk8eyBjb2xsZWN0aW9uOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nOyBjb25kaXRpb25zOiBhbnlbXSB9Pj4ge1xuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gYSByb2xlIG1heSBub3QgaGF2ZSBldmVyeSAuY2VkYXIgZmlsZSAoZS5nLiBubyB2YWxpZGF0ZS5jZWRhcilcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IChhd2FpdCByZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGFydHMgPSBjZWRhci5wb2xpY3lTZXRUZXh0VG9QYXJ0cyh0ZXh0KTtcbiAgICBpZiAocGFydHMudHlwZSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBzcGxpdCBwb2xpY3kgc2V0ICR7ZmlsZVBhdGh9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocGFydHMuZXJyb3JzIGFzIGFueSk7XG4gICAgfVxuICAgIGNvbnN0IHR1cGxlczogQXJyYXk8e1xuICAgICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICBjb25kaXRpb25zOiBhbnlbXTtcbiAgICB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9saWN5VGV4dCBvZiBwYXJ0cy5wb2xpY2llcykge1xuICAgICAgY29uc3QgcGFyc2VkID0gY2VkYXIucG9saWN5VG9Kc29uKHBvbGljeVRleHQpO1xuICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHsgcG9saWN5VGV4dCB9LCBgZmFpbGVkIHRvIHBhcnNlIHBvbGljeSBpbiAke2ZpbGVQYXRofWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VkLmVycm9ycyBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgdHVwbGVzLnB1c2goLi4uZXhwYW5kUG9saWN5KHBhcnNlZC5qc29uKSk7XG4gICAgfVxuICAgIHJldHVybiB0dXBsZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGFyc2VSb2xlRm9sZGVyKHJvbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEQ5UGVybWlzc2lvbltdPiB7XG4gICAgLy8gQSAoY29sbGVjdGlvbiwgYWN0aW9uKSB0dXBsZSBjYW4gYXBwZWFyIGFjcm9zcyBhdXRob3JpemUvY2hlY2stZmllbGRzL3ZhbGlkYXRlLFxuICAgIC8vIHNvIHRoZSBtYXAgY3JlYXRlcyBvbmUgcGVybWlzc2lvbiBwZXIgdHVwbGUgYW5kIHdlIGFjY3VtdWxhdGUgY2xhdXNlcyBvbnRvIGl0LlxuICAgIGNvbnN0IGJ5VHVwbGUgPSBuZXcgVHVwbGVLZXlNYXA8RDlQZXJtaXNzaW9uPigoW2NvbGxlY3Rpb24sIGFjdGlvbl0pID0+XG4gICAgICBEOVBlcm1pc3Npb24uZW1wdHkocm9sZU5hbWUsIGNvbGxlY3Rpb24sIGFjdGlvbiksXG4gICAgKTtcblxuICAgIGNvbnN0IGZvbGRlciA9IGAke3RoaXMucGVybWlzc2lvblBhdGh9LyR7cm9sZU5hbWV9YDtcblxuICAgIGNvbnN0IGF1dGhvcml6ZVR1cGxlcyA9IGF3YWl0IHRoaXMucGFyc2VDZWRhckZpbGUoXG4gICAgICBgJHtmb2xkZXJ9L2F1dGhvcml6ZS5jZWRhcmAsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHR1cGxlIG9mIGF1dGhvcml6ZVR1cGxlcykge1xuICAgICAgYnlUdXBsZS5nZXRPckNyZWF0ZShbdHVwbGUuY29sbGVjdGlvbiwgdHVwbGUuYWN0aW9uXSkucGVybWlzc2lvbnMgPVxuICAgICAgICBleHByVG9GaWx0ZXIodHVwbGUuY29uZGl0aW9uc1swXT8uYm9keSwgJ3Jlc291cmNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRUdXBsZXMgPSBhd2FpdCB0aGlzLnBhcnNlQ2VkYXJGaWxlKGAke2ZvbGRlcn0vY2hlY2stZmllbGRzLmNlZGFyYCk7XG4gICAgZm9yIChjb25zdCB0dXBsZSBvZiBmaWVsZFR1cGxlcykge1xuICAgICAgaWYgKHR1cGxlLmNvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGJ5VHVwbGUuZ2V0T3JDcmVhdGUoW3R1cGxlLmNvbGxlY3Rpb24sIHR1cGxlLmFjdGlvbl0pLmZpZWxkcyA9XG4gICAgICAgICAgZXh0cmFjdEZpZWxkcyh0dXBsZS5jb25kaXRpb25zWzBdLmJvZHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlVHVwbGVzID0gYXdhaXQgdGhpcy5wYXJzZUNlZGFyRmlsZShgJHtmb2xkZXJ9L3ZhbGlkYXRlLmNlZGFyYCk7XG4gICAgZm9yIChjb25zdCB0dXBsZSBvZiB2YWxpZGF0ZVR1cGxlcykge1xuICAgICAgaWYgKHR1cGxlLmNvbmRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGJ5VHVwbGUuZ2V0T3JDcmVhdGUoW3R1cGxlLmNvbGxlY3Rpb24sIHR1cGxlLmFjdGlvbl0pLnZhbGlkYXRpb24gPVxuICAgICAgICAgIGV4cHJUb0ZpbHRlcih0dXBsZS5jb25kaXRpb25zWzBdLmJvZHksICdjb250ZXh0Lm5ld1ZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5VHVwbGUudmFsdWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGFyc2VBbGxGb2xkZXJzKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKHRoaXMucGVybWlzc2lvblBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG4gICAgICB0aGlzLnJlY29uc3RydWN0ZWQucHVzaCguLi4oYXdhaXQgdGhpcy5wYXJzZVJvbGVGb2xkZXIoZW50cnkubmFtZSkpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VJbnRvUm93cygpIHtcbiAgICBsZXQgbWVyZ2VkID0gMDtcbiAgICBsZXQgdXBkYXRlZCA9IDA7XG4gICAgbGV0IGFkZGVkID0gMDtcbiAgICBsZXQgcmVtb3ZlZCA9IDA7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBUdXBsZUtleU1hcDx0cnVlPigpO1xuXG4gICAgZm9yIChjb25zdCBwZXJtIG9mIHRoaXMucmVjb25zdHJ1Y3RlZCkge1xuICAgICAgY29uc3Qgcm9sZUlkID0gdGhpcy5yb2xlcy5nZXRJZEZyb21OYW1lKHBlcm0ucm9sZU5hbWUpO1xuICAgICAgaWYgKCFyb2xlSWQgJiYgcGVybS5yb2xlTmFtZSAhPT0gJ1B1YmxpYycpIHtcbiAgICAgICAgLy8gSW4gVjIsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IsIHdlIGNvdWxkIGNyZWF0ZSBhIG5ldyByb2xlIGluIHRoZSBDU1YuXG4gICAgICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSBleHBlY3QgdGhlIHJvbGVzIHRvIGJlIHByZS1kZWZpbmVkIGluIHRoZSBDU1YuXG4gICAgICAgIC8vIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2s6IHRoZSByb2xlIHNob3VsZCBleGlzdCBpbiB0aGUgQ1NWLCBvdGhlcndpc2Ugc29tZXRoaW5nIGlzIHdyb25nLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHJvbGUgXCIke3Blcm0ucm9sZU5hbWV9XCIgKGZyb20gJHt0aGlzLnBlcm1pc3Npb25QYXRofSkgbm90IGZvdW5kIGluIGRpcmVjdHVzX3JvbGVzLmNzdmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNlZW4uc2V0KFtyb2xlSWQhLCBwZXJtLmNvbGxlY3Rpb24sIHBlcm0uYWN0aW9uXSwgdHJ1ZSk7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLmJhc2VSb3dzQnlUdXBsZS5nZXQoW3JvbGVJZCEsIHBlcm0uY29sbGVjdGlvbiwgcGVybS5hY3Rpb25dKTtcbiAgICAgIGlmICghcm93KSB7XG4gICAgICAgIC8vIE5ldyB0dXBsZSBhZGRlZCBpbiB0aGUgQ2VkYXIgZmlsZXM7IHRoZSByb2xlIGV4aXN0cywgc28gY3JlYXRlIGEgcm93LlxuICAgICAgICBjb25zdCBuZXdSb3c6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgaWQ6IFN0cmluZygrK3RoaXMubmV4dElkKSxcbiAgICAgICAgICByb2xlOiByb2xlSWQhLFxuICAgICAgICAgIGNvbGxlY3Rpb246IHBlcm0uY29sbGVjdGlvbixcbiAgICAgICAgICBhY3Rpb246IHBlcm0uYWN0aW9uLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBwZXJtLnBlcm1pc3Npb25zQ2VsbCgpLFxuICAgICAgICAgIHZhbGlkYXRpb246IHBlcm0udmFsaWRhdGlvbkNlbGwoKSxcbiAgICAgICAgICBmaWVsZHM6IHBlcm0uZmllbGRzQ2VsbCgpLFxuICAgICAgICAgIHByZXNldHM6ICcnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhc2VSb3dzQnlUdXBsZS5zZXQoW3JvbGVJZCEsIHBlcm0uY29sbGVjdGlvbiwgcGVybS5hY3Rpb25dLCBuZXdSb3cpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgYWRkZWQgJHtwZXJtLnJvbGVOYW1lfS8ke3Blcm0uY29sbGVjdGlvbn0vJHtwZXJtLmFjdGlvbn0gKGlkICR7bmV3Um93LmlkfSlgLFxuICAgICAgICApO1xuICAgICAgICBhZGRlZCsrO1xuICAgICAgICBtZXJnZWQrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBDZWRhciBwb2xpY2llcyBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aDogb3ZlcndyaXRlIHRoZSB0aHJlZVxuICAgICAgLy8gZGVyaXZhYmxlIGNvbHVtbnMgZGlyZWN0bHkgKHRoZSByb3VuZC10cmlwIGlzIG1lYW5pbmctcHJlc2VydmluZywgc29cbiAgICAgIC8vIHRoaXMgb25seSByZXNoYXBlcyByZXByZXNlbnRhdGlvbiwgZS5nLiBge19hbmQ6W3hdfWAgLT4gYHhgKS5cbiAgICAgIHJvdy5wZXJtaXNzaW9ucyA9IHBlcm0ucGVybWlzc2lvbnNDZWxsKCk7XG4gICAgICByb3cudmFsaWRhdGlvbiA9IHBlcm0udmFsaWRhdGlvbkNlbGwoKTtcbiAgICAgIHJvdy5maWVsZHMgPSBwZXJtLmZpZWxkc0NlbGwoKTtcbiAgICAgIHVwZGF0ZWQrKztcbiAgICAgIG1lcmdlZCsrO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IHJvdyBpcyB3cml0dGVuIHRvIGF1dGhvcml6ZS5jZWRhciBieSBkOS10by1jZWRhciwgc28gYSByb3cgbm8gbG9uZ2VyXG4gICAgLy8gcHJvZHVjZWQgYnkgdGhlIENlZGFyIGZpbGVzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGVtLlxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuYmFzZVJvd3NCeVR1cGxlLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB0dXBsZSA9IFtyb3cucm9sZSwgcm93LmNvbGxlY3Rpb24sIHJvdy5hY3Rpb25dO1xuICAgICAgaWYgKHNlZW4uZ2V0KHR1cGxlKSkgY29udGludWU7XG4gICAgICB0aGlzLmJhc2VSb3dzQnlUdXBsZS5kZWxldGUodHVwbGUpO1xuICAgICAgY29uc3Qgcm9sZU5hbWUgPSByb3cucm9sZSA/IHRoaXMucm9sZXMuZ2V0TmFtZUZyb21JZChyb3cucm9sZSkgOiAnUHVibGljJztcbiAgICAgIGxvZ2dlci5pbmZvKGByZW1vdmVkICR7cm9sZU5hbWV9LyR7cm93LmNvbGxlY3Rpb259LyR7cm93LmFjdGlvbn0gKGlkICR7cm93LmlkfSlgKTtcbiAgICAgIHJlbW92ZWQrKztcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBtZXJnZWQgJHttZXJnZWR9IHBlcm1pc3Npb25zLCAke3VwZGF0ZWR9IHJvdyhzKSB1cGRhdGVkLCAke2FkZGVkfSBuZXcgcm93KHMpIGFkZGVkLCAke3JlbW92ZWR9IHJvdyhzKSByZW1vdmVkYCxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdyaXRlT3V0cHV0KCkge1xuICAgIGF3YWl0IHdyaXRlQ3N2RmlsZShcbiAgICAgIHRoaXMub3V0cHV0UGF0aCxcbiAgICAgIHRoaXMuaGVhZGVyLFxuICAgICAgdGhpcy5iYXNlUm93c0J5VHVwbGUudmFsdWVzKCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhgd3JvdGUgJHt0aGlzLm91dHB1dFBhdGh9YCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZENlZGFyQW5kV3JpdGVDc3YoKSB7XG4gICAgbG9nZ2VyLmluZm8oJ3JlYWRpbmcgYmFzZSBwZXJtaXNzaW9uIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRCYXNlUGVybWlzc2lvbkZpbGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgZm91bmQgJHt0aGlzLmJhc2VSb3dzQnlUdXBsZS52YWx1ZXMoKS5sZW5ndGh9IGJhc2UgcGVybWlzc2lvbnNgKTtcbiAgICBsb2dnZXIuaW5mbygncmVhZGluZyByb2xlIGZpbGUnKTtcbiAgICBhd2FpdCB0aGlzLnJlYWRSb2xlRmlsZSgpO1xuICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nIGNlZGFyIHBvbGljeSBmb2xkZXJzJyk7XG4gICAgYXdhaXQgdGhpcy5wYXJzZUFsbEZvbGRlcnMoKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGByZWNvbnN0cnVjdGVkICR7dGhpcy5yZWNvbnN0cnVjdGVkLmxlbmd0aH0gcGVybWlzc2lvbnMgZnJvbSBjZWRhcmAsXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbygnbWVyZ2luZyBpbnRvIGJhc2Ugcm93cycpO1xuICAgIHRoaXMubWVyZ2VJbnRvUm93cygpO1xuICAgIGxvZ2dlci5pbmZvKCd3cml0aW5nIGNzdicpO1xuICAgIGF3YWl0IHRoaXMud3JpdGVPdXRwdXQoKTtcbiAgICBsb2dnZXIuaW5mbygnZG9uZScpO1xuICB9XG5cbn1cblxuLyoqIENMSSBhY3Rpb246IG1lcmdlIENlZGFyIHBvbGljaWVzIGJhY2sgaW50byBkaXJlY3R1c19wZXJtaXNzaW9ucy5jc3YuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2VkYXJUb0Q5KG9wdGlvbnM/OiB7XG4gIHBlcm1pc3Npb25QYXRoPzogc3RyaW5nO1xuICBzcWxQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5hZ2VyID0gbmV3IENlZGFyVG9EOU1hbmFnZXIob3B0aW9ucyk7XG4gIGF3YWl0IG1hbmFnZXIucmVhZENlZGFyQW5kV3JpdGVDc3YoKTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import type { PolicyJson } from '@cedar-policy/cedar-wasm/nodejs';
2
+ import { D9Permission, Filter } from './d9-permission';
3
+ export type ConditionSubject = 'resource' | 'context.newValue';
4
+ export declare function addWhenClauses(filter: Filter, subject?: ConditionSubject): any;
5
+ export declare function translateToCedar(permission: D9Permission): {
6
+ mainPolicy: PolicyJson;
7
+ fieldPolicy?: PolicyJson;
8
+ validationPolicy?: PolicyJson;
9
+ };