@cerbos/orm-prisma 4.0.0 → 5.0.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 (203) hide show
  1. package/README.md +611 -460
  2. package/lib/collections.d.ts +30 -0
  3. package/lib/collections.d.ts.map +1 -0
  4. package/lib/collections.js +421 -0
  5. package/lib/collections.js.map +1 -0
  6. package/lib/comparison.d.ts +24 -0
  7. package/lib/comparison.d.ts.map +1 -0
  8. package/lib/comparison.js +731 -0
  9. package/lib/comparison.js.map +1 -0
  10. package/lib/errors.d.ts +13 -0
  11. package/lib/errors.d.ts.map +1 -0
  12. package/lib/errors.js +17 -0
  13. package/lib/errors.js.map +1 -0
  14. package/lib/evaluate.d.ts +5 -0
  15. package/lib/evaluate.d.ts.map +1 -0
  16. package/lib/evaluate.js +118 -0
  17. package/lib/evaluate.js.map +1 -0
  18. package/lib/fields.d.ts +34 -0
  19. package/lib/fields.d.ts.map +1 -0
  20. package/lib/fields.js +253 -0
  21. package/lib/fields.js.map +1 -0
  22. package/lib/functions.d.ts +5 -0
  23. package/lib/functions.d.ts.map +1 -0
  24. package/lib/functions.js +408 -0
  25. package/lib/functions.js.map +1 -0
  26. package/lib/hierarchy.d.ts +6 -0
  27. package/lib/hierarchy.d.ts.map +1 -0
  28. package/lib/hierarchy.js +266 -0
  29. package/lib/hierarchy.js.map +1 -0
  30. package/lib/index.d.ts +91 -8
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +34 -2301
  33. package/lib/index.js.map +1 -1
  34. package/lib/literals.d.ts +20 -0
  35. package/lib/literals.d.ts.map +1 -0
  36. package/lib/literals.js +290 -0
  37. package/lib/literals.js.map +1 -0
  38. package/lib/mapping.d.ts +95 -0
  39. package/lib/mapping.d.ts.map +1 -0
  40. package/lib/mapping.js +316 -0
  41. package/lib/mapping.js.map +1 -0
  42. package/lib/narrowing.d.ts +12 -0
  43. package/lib/narrowing.d.ts.map +1 -0
  44. package/lib/narrowing.js +32 -0
  45. package/lib/narrowing.js.map +1 -0
  46. package/lib/plan.d.ts +49 -0
  47. package/lib/plan.d.ts.map +1 -0
  48. package/lib/plan.js +86 -0
  49. package/lib/plan.js.map +1 -0
  50. package/lib/presence.d.ts +25 -0
  51. package/lib/presence.d.ts.map +1 -0
  52. package/lib/presence.js +82 -0
  53. package/lib/presence.js.map +1 -0
  54. package/lib/regex.d.ts +33 -0
  55. package/lib/regex.d.ts.map +1 -0
  56. package/lib/regex.js +480 -0
  57. package/lib/regex.js.map +1 -0
  58. package/lib/relations.d.ts +58 -0
  59. package/lib/relations.d.ts.map +1 -0
  60. package/lib/relations.js +175 -0
  61. package/lib/relations.js.map +1 -0
  62. package/lib/rewrite.d.ts +36 -0
  63. package/lib/rewrite.d.ts.map +1 -0
  64. package/lib/rewrite.js +366 -0
  65. package/lib/rewrite.js.map +1 -0
  66. package/lib/solve.d.ts +20 -0
  67. package/lib/solve.d.ts.map +1 -0
  68. package/lib/solve.js +77 -0
  69. package/lib/solve.js.map +1 -0
  70. package/lib/strings.d.ts +12 -0
  71. package/lib/strings.d.ts.map +1 -0
  72. package/lib/strings.js +110 -0
  73. package/lib/strings.js.map +1 -0
  74. package/lib/ternary.d.ts +12 -0
  75. package/lib/ternary.d.ts.map +1 -0
  76. package/lib/ternary.js +192 -0
  77. package/lib/ternary.js.map +1 -0
  78. package/lib/timestamp.d.ts +45 -0
  79. package/lib/timestamp.d.ts.map +1 -0
  80. package/lib/timestamp.js +225 -0
  81. package/lib/timestamp.js.map +1 -0
  82. package/lib/translate.d.ts +20 -0
  83. package/lib/translate.d.ts.map +1 -0
  84. package/lib/translate.js +287 -0
  85. package/lib/translate.js.map +1 -0
  86. package/lib/types.d.ts +29 -0
  87. package/lib/types.d.ts.map +1 -0
  88. package/lib/types.js +980 -0
  89. package/lib/types.js.map +1 -0
  90. package/lib/value.d.ts +8 -0
  91. package/lib/value.d.ts.map +1 -0
  92. package/lib/value.js +7 -0
  93. package/lib/value.js.map +1 -0
  94. package/package.json +31 -18
  95. package/src/adversarial.test.ts +488 -488
  96. package/src/collections.ts +738 -0
  97. package/src/comparison.ts +1157 -0
  98. package/src/corpus.ts +597 -0
  99. package/src/errors.ts +12 -0
  100. package/src/evaluate.ts +170 -0
  101. package/src/fields.ts +373 -0
  102. package/src/functions.ts +548 -0
  103. package/src/generated/prisma-adversarial/browser.ts +20 -0
  104. package/src/generated/prisma-adversarial/client.ts +20 -0
  105. package/src/generated/prisma-adversarial/commonInputTypes.ts +116 -127
  106. package/src/generated/prisma-adversarial/internal/class.ts +44 -4
  107. package/src/generated/prisma-adversarial/internal/prismaNamespace.ts +350 -3
  108. package/src/generated/prisma-adversarial/internal/prismaNamespaceBrowser.ts +49 -2
  109. package/src/generated/prisma-adversarial/models/AdversarialBoolListElement.ts +1272 -0
  110. package/src/generated/prisma-adversarial/models/AdversarialInner.ts +1369 -0
  111. package/src/generated/prisma-adversarial/models/AdversarialNumberListElement.ts +1316 -0
  112. package/src/generated/prisma-adversarial/models/AdversarialParent.ts +1474 -0
  113. package/src/generated/prisma-adversarial/models/AdversarialResource.ts +547 -75
  114. package/src/generated/prisma-adversarial/models.ts +4 -0
  115. package/src/generated/prisma-adversarial-mysql/browser.ts +64 -0
  116. package/src/generated/{prisma → prisma-adversarial-mysql}/client.ts +23 -18
  117. package/src/generated/{prisma → prisma-adversarial-mysql}/commonInputTypes.ts +167 -92
  118. package/src/generated/prisma-adversarial-mysql/internal/class.ts +284 -0
  119. package/src/generated/prisma-adversarial-mysql/internal/prismaNamespace.ts +1518 -0
  120. package/src/generated/prisma-adversarial-mysql/internal/prismaNamespaceBrowser.ts +274 -0
  121. package/src/generated/prisma-adversarial-mysql/models/AdversarialBoolListElement.ts +1157 -0
  122. package/src/generated/prisma-adversarial-mysql/models/AdversarialCategory.ts +1286 -0
  123. package/src/generated/prisma-adversarial-mysql/models/AdversarialInner.ts +1247 -0
  124. package/src/generated/prisma-adversarial-mysql/models/AdversarialLabel.ts +1157 -0
  125. package/src/generated/prisma-adversarial-mysql/models/AdversarialNumberListElement.ts +1201 -0
  126. package/src/generated/prisma-adversarial-mysql/models/AdversarialParent.ts +1352 -0
  127. package/src/generated/prisma-adversarial-mysql/models/AdversarialResource.ts +2021 -0
  128. package/src/generated/prisma-adversarial-mysql/models/AdversarialSubCategory.ts +1286 -0
  129. package/src/generated/prisma-adversarial-mysql/models/AdversarialTag.ts +1190 -0
  130. package/src/generated/prisma-adversarial-mysql/models.ts +20 -0
  131. package/src/generated/prisma-adversarial-mysql-v6/index.d.ts +13822 -0
  132. package/src/generated/prisma-adversarial-pg/browser.ts +64 -0
  133. package/src/generated/prisma-adversarial-pg/client.ts +86 -0
  134. package/src/generated/prisma-adversarial-pg/commonInputTypes.ts +345 -0
  135. package/src/generated/prisma-adversarial-pg/enums.ts +15 -0
  136. package/src/generated/prisma-adversarial-pg/internal/class.ts +284 -0
  137. package/src/generated/prisma-adversarial-pg/internal/prismaNamespace.ts +1542 -0
  138. package/src/generated/{prisma → prisma-adversarial-pg}/internal/prismaNamespaceBrowser.ts +72 -43
  139. package/src/generated/prisma-adversarial-pg/models/AdversarialBoolListElement.ts +1275 -0
  140. package/src/generated/prisma-adversarial-pg/models/AdversarialCategory.ts +1404 -0
  141. package/src/generated/prisma-adversarial-pg/models/AdversarialInner.ts +1371 -0
  142. package/src/generated/prisma-adversarial-pg/models/AdversarialLabel.ts +1275 -0
  143. package/src/generated/prisma-adversarial-pg/models/AdversarialNumberListElement.ts +1319 -0
  144. package/src/generated/prisma-adversarial-pg/models/AdversarialParent.ts +1476 -0
  145. package/src/generated/prisma-adversarial-pg/models/AdversarialResource.ts +2139 -0
  146. package/src/generated/prisma-adversarial-pg/models/AdversarialSubCategory.ts +1404 -0
  147. package/src/generated/prisma-adversarial-pg/models/AdversarialTag.ts +1310 -0
  148. package/src/generated/prisma-adversarial-pg/models.ts +20 -0
  149. package/src/generated/prisma-adversarial-pg-v6/client.d.ts +1 -0
  150. package/src/generated/prisma-adversarial-pg-v6/default.d.ts +1 -0
  151. package/src/generated/prisma-adversarial-pg-v6/edge.d.ts +1 -0
  152. package/src/generated/prisma-adversarial-pg-v6/index.d.ts +14918 -0
  153. package/src/generated/prisma-adversarial-pg-v6/runtime/index-browser.d.ts +370 -0
  154. package/src/generated/prisma-adversarial-pg-v6/runtime/library.d.ts +3982 -0
  155. package/src/generated/prisma-adversarial-pg-v6/wasm.d.ts +1 -0
  156. package/src/generated/prisma-adversarial-v6/index.d.ts +6515 -304
  157. package/src/hierarchy.ts +405 -0
  158. package/src/index.ts +134 -3325
  159. package/src/literals.ts +363 -0
  160. package/src/mapping.ts +474 -0
  161. package/src/narrowing.ts +33 -0
  162. package/src/plan.ts +125 -0
  163. package/src/presence.ts +114 -0
  164. package/src/regex.ts +596 -0
  165. package/src/relations.ts +226 -0
  166. package/src/rewrite.ts +524 -0
  167. package/src/solve.ts +96 -0
  168. package/src/strings.ts +152 -0
  169. package/src/ternary.ts +359 -0
  170. package/src/test-setup.adversarial-url.ts +21 -0
  171. package/src/test-setup.adversarial.mysql.v6.ts +13 -0
  172. package/src/test-setup.adversarial.mysql.v7.ts +12 -0
  173. package/src/test-setup.adversarial.pg.v6.ts +13 -0
  174. package/src/test-setup.adversarial.pg.v7.ts +9 -0
  175. package/src/test-setup.adversarial.v7.ts +1 -0
  176. package/src/timestamp.ts +308 -0
  177. package/src/translate.ts +419 -0
  178. package/src/translator.test.ts +766 -0
  179. package/src/types.ts +1310 -0
  180. package/src/value.ts +16 -0
  181. package/src/generated/prisma/browser.ts +0 -59
  182. package/src/generated/prisma/internal/class.ts +0 -274
  183. package/src/generated/prisma/internal/prismaNamespace.ts +0 -1403
  184. package/src/generated/prisma/models/Category.ts +0 -1412
  185. package/src/generated/prisma/models/Label.ts +0 -1276
  186. package/src/generated/prisma/models/NestedResource.ts +0 -1562
  187. package/src/generated/prisma/models/NextLevelNestedResource.ts +0 -1337
  188. package/src/generated/prisma/models/Resource.ts +0 -2196
  189. package/src/generated/prisma/models/SubCategory.ts +0 -1412
  190. package/src/generated/prisma/models/Tag.ts +0 -1276
  191. package/src/generated/prisma/models/User.ts +0 -1503
  192. package/src/generated/prisma/models.ts +0 -19
  193. package/src/generated/prisma-v6/index.d.ts +0 -13726
  194. package/src/index.test.ts +0 -8885
  195. package/src/test-setup.v6.ts +0 -5
  196. package/src/test-setup.v7.ts +0 -7
  197. /package/src/generated/{prisma → prisma-adversarial-mysql}/enums.ts +0 -0
  198. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/client.d.ts +0 -0
  199. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/default.d.ts +0 -0
  200. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/edge.d.ts +0 -0
  201. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/runtime/index-browser.d.ts +0 -0
  202. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/runtime/library.d.ts +0 -0
  203. /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/wasm.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":";AAAA,+FAA+F;AAC/F,2EAA2E;;AAyB3E,8CAuCC;AAOD,4CAsBC;AAxFD,uCAAoF;AAEpF,iCAAwC;AAExC,2CAA4D;AAC5D,qCAAqD;AAErD;;;;;;;;;;;;GAYG;AACH,SAAgB,iBAAiB,CAC/B,QAAiC,EACjC,OAA2B,EAC3B,OAAgB;IAEhB,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,IAAA,qBAAc,EAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,kCAAyB,CAAC,8CAA8C,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,+BAAqB,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;IAE3C,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,kCAAyB,CACjC,wBAAwB,OAAO,CAAC,IAAI,oDAAoD;YACtF,yDAAyD,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,QAAsB,CAAC;IAC3B,IAAI,IAAI,GAAG,SAAS,CAAC;IAErB,IAAI,IAAA,4BAAkB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,QAAQ,GAAG,IAAA,2BAAe,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,QAAQ,GAAG,IAAA,2BAAe,EAAC,SAAS,EAAE;YACpC,CAAC,IAAA,sBAAY,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;SAC7C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAA,2BAAe,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAA,wBAAY,EAAC,QAAQ,CAAC,CAAC;IAEvC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAA,2BAAe,EAAC,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AACrF,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,IAAqB,EACrB,OAA2B;IAE3B,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAEhC,IACE,IAAI,CAAC,QAAQ,KAAK,KAAK;QACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC1B,OAAO,KAAK,SAAS;QACrB,CAAC,IAAA,qBAAc,EAAC,OAAO,CAAC;QACxB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QACpC,IAAA,4BAAkB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAChD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,+BAAqB,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5D,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,2FAA2F;AAC3F,SAAS,qBAAqB,CAC5B,SAAiB,EACjB,QAAkD,EAClD,OAA2B;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5C,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAC/C,CAAC;IAEF,IAAI,OAAO,IAAI,QAAQ,CAAC,2BAA2B,KAAK,SAAS,EAAE,CAAC;QAClE,OAAO,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC;IACrC,CAAC;IAED,OAAO,CACL,CAAC,QAAQ,CAAC,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,KAAK,SAAS,CACnF,CAAC;AACJ,CAAC"}
package/lib/regex.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { PlanExpressionOperand } from "@cerbos/core";
2
+ import type { PrismaFilter } from "./index";
3
+ import type { TranslationContext } from "./mapping";
4
+ /** One position of an expanded pattern: a literal character, `.` (not a newline), or `.*`. */
5
+ type Token = {
6
+ char: string;
7
+ } | {
8
+ any: true;
9
+ } | {
10
+ star: true;
11
+ };
12
+ /**
13
+ * A pattern RE2 itself rejects, as the parser below sees it. Whether RE2 rejects a pattern is
14
+ * decided by re2js (isInvalidPattern), not by this parser, whose refusals are always safe.
15
+ */
16
+ export declare class InvalidRegexError extends Error {
17
+ }
18
+ type Expansion = {
19
+ begin: boolean;
20
+ end: boolean;
21
+ tokens: Token[];
22
+ };
23
+ /** The pattern as alternatives, each anchored at its ends or not. */
24
+ export declare function expandPattern(pattern: string): Expansion[];
25
+ /**
26
+ * Whether the pattern is one RE2 rejects, so that `matches()` raises an error on every row: what
27
+ * re2js, a port of RE2, refuses to compile. A pattern this adapter cannot translate is not invalid;
28
+ * it is refused when translated.
29
+ */
30
+ export declare function isInvalidPattern(pattern: string): boolean;
31
+ export declare function handleMatchesOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
32
+ export {};
33
+ //# sourceMappingURL=regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../src/regex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAA0B,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAU5E,8FAA8F;AAC9F,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAU/D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AA4U/C,KAAK,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AA8DnE,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAuB1D;AA8ED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAaD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CA0Cd"}
package/lib/regex.js ADDED
@@ -0,0 +1,480 @@
1
+ "use strict";
2
+ // `matches(column, "pattern")` for the RE2 patterns whose language a boolean combination of LIKE
3
+ // filters decides exactly. Everything else is refused.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.InvalidRegexError = void 0;
6
+ exports.expandPattern = expandPattern;
7
+ exports.isInvalidPattern = isInvalidPattern;
8
+ exports.handleMatchesOperator = handleMatchesOperator;
9
+ const re2js_1 = require("re2js");
10
+ const fields_1 = require("./fields");
11
+ const mapping_1 = require("./mapping");
12
+ const plan_1 = require("./plan");
13
+ const errors_1 = require("./errors");
14
+ const narrowing_1 = require("./narrowing");
15
+ /** Past this many alternatives, a pattern is refused rather than spelled out. */
16
+ const MAX_ALTERNATIVES = 256;
17
+ /**
18
+ * A pattern RE2 itself rejects, as the parser below sees it. Whether RE2 rejects a pattern is
19
+ * decided by re2js (isInvalidPattern), not by this parser, whose refusals are always safe.
20
+ */
21
+ class InvalidRegexError extends Error {
22
+ }
23
+ exports.InvalidRegexError = InvalidRegexError;
24
+ function refuse(pattern, why) {
25
+ throw new errors_1.UnsupportedQueryPlanError(`Cannot translate matches() with pattern ${JSON.stringify(pattern)}: ${why}. Prisma has no ` +
26
+ "regex filter; only patterns a combination of LIKE filters decides exactly are translated");
27
+ }
28
+ const DIGITS = [..."0123456789"];
29
+ /**
30
+ * A repetition count, `{n}`, `{n,}` or `{n,m}`; any other brace is a literal to RE2. A count is
31
+ * read as Go's `regexp/syntax` `parseInt` reads it, which takes no leading zero: `a{01}` is `a`
32
+ * then the text "{01}".
33
+ */
34
+ const REPEAT = /^\{(0|[1-9]\d*)(,(0|[1-9]\d*)?)?\}/;
35
+ /** RE2's bound on the copies a counted repetition, nested ones included, may make. */
36
+ const MAX_REPEAT = 1000;
37
+ /**
38
+ * Go's `repeatIsValid`: each repetition divides the budget by its count (its maximum, or its
39
+ * minimum when unbounded), and a count beyond what is left is invalid: `(a{2}){600}`.
40
+ */
41
+ function repeatIsValid(node, budget) {
42
+ switch (node.kind) {
43
+ case "repeat": {
44
+ if (node.max === 0)
45
+ return true;
46
+ const count = node.max === Infinity ? node.min : node.max;
47
+ if (count > budget)
48
+ return false;
49
+ return repeatIsValid(node.node, count === 0 ? budget : Math.floor(budget / count));
50
+ }
51
+ case "alt":
52
+ return node.branches.every((branch) => branch.every((inner) => repeatIsValid(inner, budget)));
53
+ default:
54
+ return true;
55
+ }
56
+ }
57
+ /** RE2's simple case folding over ASCII letters: `k` and `s` fold with a non-ASCII sign too. */
58
+ function foldOrbit(char) {
59
+ const lower = char.toLowerCase();
60
+ if (!/^[a-z]$/.test(lower))
61
+ return [char];
62
+ const orbit = [lower, lower.toUpperCase()];
63
+ if (lower === "k")
64
+ orbit.push("K");
65
+ if (lower === "s")
66
+ orbit.push("ſ");
67
+ return orbit;
68
+ }
69
+ /** A recursive-descent parser over the pattern's code points (RE2 matches code points). */
70
+ class Parser {
71
+ pattern;
72
+ index = 0;
73
+ caseInsensitive = false;
74
+ chars;
75
+ constructor(pattern) {
76
+ this.pattern = pattern;
77
+ this.chars = Array.from(pattern);
78
+ }
79
+ parse() {
80
+ if (this.pattern.startsWith("(?i)")) {
81
+ this.caseInsensitive = true;
82
+ this.index = 4;
83
+ }
84
+ const branches = this.alternation();
85
+ if (this.index !== this.chars.length)
86
+ refuse(this.pattern, "unbalanced parenthesis");
87
+ return branches;
88
+ }
89
+ peek(offset = 0) {
90
+ return this.chars[this.index + offset];
91
+ }
92
+ rest() {
93
+ return this.chars.slice(this.index).join("");
94
+ }
95
+ next() {
96
+ return this.chars[this.index++];
97
+ }
98
+ alternation() {
99
+ const branches = [this.sequence()];
100
+ while (this.peek() === "|") {
101
+ this.index++;
102
+ branches.push(this.sequence());
103
+ }
104
+ return branches;
105
+ }
106
+ sequence() {
107
+ const nodes = [];
108
+ for (let char = this.peek(); char !== undefined && char !== "|" && char !== ")"; char = this.peek()) {
109
+ nodes.push(this.quantified(this.atom()));
110
+ }
111
+ return nodes;
112
+ }
113
+ quantified(node) {
114
+ const char = this.peek();
115
+ let min;
116
+ let max;
117
+ if (char === "*" || char === "+" || char === "?") {
118
+ this.index++;
119
+ [min, max] = char === "*" ? [0, Infinity] : char === "+" ? [1, Infinity] : [0, 1];
120
+ }
121
+ else if (char === "{") {
122
+ const match = REPEAT.exec(this.rest());
123
+ // RE2 reads a brace that does not open a repetition as a literal.
124
+ if (match === null)
125
+ return node;
126
+ this.index += Array.from(match[0]).length;
127
+ min = Number(match[1]);
128
+ max = match[2] === undefined ? min : match[3] === undefined ? Infinity : Number(match[3]);
129
+ if (min > MAX_REPEAT || (max !== Infinity && (max > MAX_REPEAT || max < min))) {
130
+ throw new InvalidRegexError("invalid repeat count");
131
+ }
132
+ }
133
+ else {
134
+ return node;
135
+ }
136
+ const next = this.peek();
137
+ if (next === "?")
138
+ refuse(this.pattern, "non-greedy repetition");
139
+ if (next === "*" || next === "+" || (next === "{" && REPEAT.test(this.rest()))) {
140
+ throw new InvalidRegexError("invalid nested repetition");
141
+ }
142
+ if (node.kind === "begin" || node.kind === "end") {
143
+ refuse(this.pattern, "a repeated anchor");
144
+ }
145
+ const repeat = { kind: "repeat", node, min, max };
146
+ if (!repeatIsValid(repeat, MAX_REPEAT))
147
+ throw new InvalidRegexError("invalid repeat count");
148
+ return repeat;
149
+ }
150
+ atom() {
151
+ const char = this.next();
152
+ switch (char) {
153
+ case "^":
154
+ return { kind: "begin" };
155
+ case "$":
156
+ return { kind: "end" };
157
+ case ".":
158
+ return { kind: "any" };
159
+ case "(": {
160
+ if (this.peek() === "?") {
161
+ const rest = this.rest();
162
+ if (/^\?(=|!|<=|<!)/.test(rest))
163
+ throw new InvalidRegexError("lookaround");
164
+ if (rest.startsWith("?:")) {
165
+ this.index += 2;
166
+ }
167
+ else {
168
+ refuse(this.pattern, "a group flag");
169
+ }
170
+ }
171
+ const branches = this.alternation();
172
+ if (this.peek() !== ")")
173
+ refuse(this.pattern, "unbalanced parenthesis");
174
+ this.index++;
175
+ return { kind: "alt", branches };
176
+ }
177
+ case "[":
178
+ return this.characterClass();
179
+ case "\\":
180
+ return this.escape();
181
+ case "*":
182
+ case "+":
183
+ case "?":
184
+ throw new InvalidRegexError("missing argument to repetition operator");
185
+ case "{":
186
+ // A count with nothing before it to repeat; a brace that is not a count stays a literal.
187
+ if (REPEAT.test(`{${this.rest()}`)) {
188
+ throw new InvalidRegexError("missing argument to repetition operator");
189
+ }
190
+ return this.literal(char);
191
+ default:
192
+ return this.literal(char);
193
+ }
194
+ }
195
+ literal(char) {
196
+ if (this.caseInsensitive && /[^\x00-\x7F]/.test(char)) {
197
+ refuse(this.pattern, "case-insensitive matching of a non-ASCII character");
198
+ }
199
+ return { kind: "char", chars: this.caseInsensitive ? foldOrbit(char) : [char] };
200
+ }
201
+ escape() {
202
+ const char = this.next();
203
+ if (char === undefined)
204
+ throw new InvalidRegexError("trailing backslash");
205
+ if (char === "d")
206
+ return { kind: "char", chars: DIGITS };
207
+ const octal = this.octalEscape(char);
208
+ if (octal !== undefined)
209
+ return this.literal(octal);
210
+ if (/[A-Za-z0-9]/.test(char))
211
+ refuse(this.pattern, `the escape \\${char}`);
212
+ return this.literal(char);
213
+ }
214
+ /**
215
+ * The character of an octal escape whose first digit was just read, as Go's regexp/syntax reads
216
+ * it: `\0` on its own, and `\1` to `\7` only when another octal digit follows (alone, each is
217
+ * a backreference, which RE2 rejects); up to three digits in all. `\11` is a tab.
218
+ */
219
+ octalEscape(first) {
220
+ const isOctal = (c) => c !== undefined && c >= "0" && c <= "7";
221
+ if (!isOctal(first)) {
222
+ if (/[89]/.test(first))
223
+ throw new InvalidRegexError(`invalid escape sequence: \\${first}`);
224
+ return undefined;
225
+ }
226
+ if (first !== "0" && !isOctal(this.peek())) {
227
+ throw new InvalidRegexError(`invalid escape sequence: \\${first}`);
228
+ }
229
+ let code = Number(first);
230
+ for (let digits = 1; digits < 3 && isOctal(this.peek()); digits++) {
231
+ code = code * 8 + Number(this.next());
232
+ }
233
+ return String.fromCodePoint(code);
234
+ }
235
+ characterClass() {
236
+ if (this.peek() === "^")
237
+ refuse(this.pattern, "a negated character class");
238
+ const chars = new Set();
239
+ let first = true;
240
+ for (;;) {
241
+ const char = this.next();
242
+ if (char === undefined)
243
+ throw new InvalidRegexError("missing closing ]");
244
+ if (char === "]" && !first)
245
+ break;
246
+ first = false;
247
+ if (char === "[" && this.rest().startsWith(":digit:]")) {
248
+ this.index += ":digit:]".length;
249
+ DIGITS.forEach((digit) => chars.add(digit));
250
+ continue;
251
+ }
252
+ if (char === "[" && this.peek() === ":")
253
+ refuse(this.pattern, "a POSIX class other than digit");
254
+ let from = char;
255
+ if (char === "\\") {
256
+ const escaped = this.next();
257
+ if (escaped === undefined)
258
+ throw new InvalidRegexError("trailing backslash");
259
+ if (escaped === "d") {
260
+ DIGITS.forEach((digit) => chars.add(digit));
261
+ continue;
262
+ }
263
+ const octal = this.octalEscape(escaped);
264
+ if (octal !== undefined) {
265
+ from = octal;
266
+ }
267
+ else {
268
+ if (/[A-Za-z0-9]/.test(escaped))
269
+ refuse(this.pattern, `the escape \\${escaped}`);
270
+ from = escaped;
271
+ }
272
+ }
273
+ if (this.peek() === "-" && this.peek(1) !== "]") {
274
+ this.index++;
275
+ const to = this.next();
276
+ if (to === undefined || to === "\\")
277
+ refuse(this.pattern, "an escaped class range");
278
+ const start = from.codePointAt(0);
279
+ const end = to.codePointAt(0);
280
+ if (end < start)
281
+ throw new InvalidRegexError("invalid character class range");
282
+ if (end - start > 128)
283
+ refuse(this.pattern, "a wide character range");
284
+ for (let code = start; code <= end; code++)
285
+ chars.add(String.fromCodePoint(code));
286
+ continue;
287
+ }
288
+ chars.add(from);
289
+ }
290
+ const members = [...chars].flatMap((char) => {
291
+ if (this.caseInsensitive && /[^\x00-\x7F]/.test(char)) {
292
+ refuse(this.pattern, "case-insensitive matching of a non-ASCII character");
293
+ }
294
+ return this.caseInsensitive ? foldOrbit(char) : [char];
295
+ });
296
+ return { kind: "char", chars: [...new Set(members)] };
297
+ }
298
+ }
299
+ function product(pattern, left, right) {
300
+ if (left.length * right.length > MAX_ALTERNATIVES) {
301
+ refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
302
+ }
303
+ return left.flatMap((l) => right.map((r) => [...l, ...r]));
304
+ }
305
+ /** Every token sequence `nodes` (holding no anchor) can match. */
306
+ function expand(pattern, nodes) {
307
+ let sequences = [[]];
308
+ for (const node of nodes) {
309
+ sequences = product(pattern, sequences, expandNode(pattern, node));
310
+ }
311
+ return sequences;
312
+ }
313
+ function expandNode(pattern, node) {
314
+ switch (node.kind) {
315
+ case "char":
316
+ return node.chars.map((char) => [{ char }]);
317
+ case "any":
318
+ return [[{ any: true }]];
319
+ case "alt": {
320
+ const all = node.branches.flatMap((branch) => expand(pattern, branch));
321
+ if (all.length > MAX_ALTERNATIVES)
322
+ refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
323
+ return all;
324
+ }
325
+ case "repeat": {
326
+ if (node.max === Infinity) {
327
+ if (node.node.kind !== "any")
328
+ refuse(pattern, "unbounded repetition of anything but .");
329
+ return [[...Array.from({ length: node.min }, () => ({ any: true })), { star: true }]];
330
+ }
331
+ const unit = expandNode(pattern, node.node);
332
+ const results = [];
333
+ let power = [[]];
334
+ for (let count = 0; count <= node.max; count++) {
335
+ if (count >= node.min)
336
+ results.push(...power);
337
+ if (results.length > MAX_ALTERNATIVES)
338
+ refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
339
+ if (count < node.max)
340
+ power = product(pattern, power, unit);
341
+ }
342
+ return results;
343
+ }
344
+ default:
345
+ refuse(pattern, "an anchor inside a group or away from the pattern's ends");
346
+ }
347
+ }
348
+ /** The pattern as alternatives, each anchored at its ends or not. */
349
+ function expandPattern(pattern) {
350
+ const branches = new Parser(pattern).parse();
351
+ const expansions = [];
352
+ for (const branch of branches) {
353
+ let nodes = branch;
354
+ const begin = nodes[0]?.kind === "begin";
355
+ if (begin)
356
+ nodes = nodes.slice(1);
357
+ const end = nodes[nodes.length - 1]?.kind === "end";
358
+ if (end)
359
+ nodes = nodes.slice(0, -1);
360
+ for (const tokens of expand(pattern, nodes)) {
361
+ expansions.push({ begin, end, tokens });
362
+ if (expansions.length > MAX_ALTERNATIVES) {
363
+ refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
364
+ }
365
+ }
366
+ }
367
+ return expansions;
368
+ }
369
+ // -- the filter ----------------------------------------------------------------------------------
370
+ const LIKE_METACHARACTERS = /[%_\\]/;
371
+ /**
372
+ * One alternative as a filter on the column. Without a wildcard it is `equals`, `startsWith`,
373
+ * `endsWith` or `contains` as its anchors say. With one, only a pattern anchored at both ends is
374
+ * translated: a LIKE of `_` for `.` and `%` for `.*`, and no newline anywhere in the value — the
375
+ * literal characters are not newlines, so every newline in a match falls in a wildcard, which RE2's
376
+ * `.` does not match.
377
+ */
378
+ function alternativeFilter(pattern, fieldRef, { begin, end, tokens }) {
379
+ const characters = tokens.flatMap((token) => ("char" in token ? [token.char] : []));
380
+ const literal = characters.length === tokens.length ? characters.join("") : undefined;
381
+ if (literal !== undefined && begin && end) {
382
+ return (0, fields_1.buildFieldFilter)(fieldRef, "equals", literal);
383
+ }
384
+ const likeText = tokens
385
+ .map((token) => ("char" in token ? token.char : "any" in token ? "_" : "%"))
386
+ .join("");
387
+ // A prefix is matched as a range, so it needs no escaping (see buildPrefixFilter).
388
+ if (literal !== undefined && begin)
389
+ return (0, fields_1.buildPrefixFilter)(fieldRef, literal);
390
+ const literals = tokens.flatMap((token) => ("char" in token ? [token.char] : []));
391
+ if (literals.some((char) => LIKE_METACHARACTERS.test(char))) {
392
+ refuse(pattern, "a literal LIKE metacharacter (%, _ or \\), which Prisma does not escape");
393
+ }
394
+ if (literal !== undefined) {
395
+ return (0, fields_1.buildFieldFilter)(fieldRef, end ? "endsWith" : "contains", literal);
396
+ }
397
+ if (!begin || !end) {
398
+ refuse(pattern, "a wildcard in a pattern not anchored at both ends");
399
+ }
400
+ if (literals.includes("\n"))
401
+ refuse(pattern, "a literal newline beside a wildcard");
402
+ const noNewline = { NOT: (0, fields_1.buildFieldFilter)(fieldRef, "contains", "\n") };
403
+ const segments = likeText.split("%");
404
+ if (segments.length === 1) {
405
+ // Exactly the pattern's length: it matches as a prefix, and one more character never fits.
406
+ return {
407
+ AND: [
408
+ (0, fields_1.buildFieldFilter)(fieldRef, "startsWith", likeText),
409
+ { NOT: (0, fields_1.buildFieldFilter)(fieldRef, "startsWith", `${likeText}_`) },
410
+ noNewline,
411
+ ],
412
+ };
413
+ }
414
+ if (segments.length > 2)
415
+ refuse(pattern, "more than one .* in one alternative");
416
+ // `A.*B`: A at the start, B at the end, and room for both without overlapping.
417
+ const [head, tail] = (0, narrowing_1.pair)(segments);
418
+ const filters = [];
419
+ if (head !== "")
420
+ filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", head));
421
+ if (tail !== "")
422
+ filters.push((0, fields_1.buildFieldFilter)(fieldRef, "endsWith", tail));
423
+ if (head !== "" && tail !== "") {
424
+ filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", "_".repeat(Array.from(head).length + Array.from(tail).length)));
425
+ }
426
+ if (filters.length === 0)
427
+ filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", ""));
428
+ return { AND: [...filters, noNewline] };
429
+ }
430
+ /**
431
+ * Whether the pattern is one RE2 rejects, so that `matches()` raises an error on every row: what
432
+ * re2js, a port of RE2, refuses to compile. A pattern this adapter cannot translate is not invalid;
433
+ * it is refused when translated.
434
+ */
435
+ function isInvalidPattern(pattern) {
436
+ return re2Rejection(pattern) !== undefined;
437
+ }
438
+ /** RE2's reason for rejecting the pattern, or undefined when it compiles. */
439
+ function re2Rejection(pattern) {
440
+ try {
441
+ re2js_1.RE2JS.compile(pattern);
442
+ return undefined;
443
+ }
444
+ catch (error) {
445
+ return error instanceof Error ? error.message : String(error);
446
+ }
447
+ }
448
+ function handleMatchesOperator(operands, context) {
449
+ const [receiver, patternOperand] = operands;
450
+ if (operands.length !== 2 ||
451
+ receiver === undefined ||
452
+ !(0, plan_1.isNamedOperand)(receiver) ||
453
+ patternOperand === undefined ||
454
+ !(0, plan_1.isValueOperand)(patternOperand) ||
455
+ !(0, narrowing_1.isString)(patternOperand.value)) {
456
+ throw new errors_1.UnsupportedQueryPlanError("matches() is translated only for a column receiver and a literal pattern");
457
+ }
458
+ const pattern = patternOperand.value;
459
+ const fieldRef = (0, mapping_1.resolveFieldReference)(receiver.name, context);
460
+ if (!(0, mapping_1.isResolvedFieldReference)(fieldRef)) {
461
+ throw new errors_1.UnsupportedQueryPlanError("matches() requires a column receiver");
462
+ }
463
+ (0, fields_1.assertStringField)(fieldRef, "matches");
464
+ const rejection = re2Rejection(pattern);
465
+ if (rejection !== undefined)
466
+ refuse(pattern, `RE2 rejects it (${rejection})`);
467
+ let expansions;
468
+ try {
469
+ expansions = expandPattern(pattern);
470
+ }
471
+ catch (error) {
472
+ if (error instanceof InvalidRegexError) {
473
+ refuse(pattern, `RE2 rejects it (${error.message})`);
474
+ }
475
+ throw error;
476
+ }
477
+ const filters = expansions.map((expansion) => alternativeFilter(pattern, fieldRef, expansion));
478
+ return filters.length === 1 ? filters[0] : { OR: filters };
479
+ }
480
+ //# sourceMappingURL=regex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.js","sourceRoot":"","sources":["../src/regex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { PlanExpressionOperand } from "@cerbos/core";
2
+ import type { PrismaFilter } from "./index";
3
+ import type { RelationConfig, TranslationContext } from "./mapping";
4
+ /** The Prisma operator that reaches into a relation for an existence test. */
5
+ export declare function relationOperator(relation: RelationConfig): string;
6
+ /**
7
+ * One relation-scoped filter (`{ tags: { some: … } }`), narrowed by the store-side predicate the
8
+ * caller declared on the mapping.
9
+ *
10
+ * Every nested relation filter the adapter emits goes through here, so a declared
11
+ * `subqueryFilter` reaches the collection macros, the membership shapes, the emptiness checks and
12
+ * the hop-existence guard alike. Adding a new relation shape means routing it through here, or
13
+ * the declaration silently stops applying to it.
14
+ *
15
+ * `every` is the one operator that cannot simply absorb the predicate. `{ every: AND(W, P) }`
16
+ * would REQUIRE every record to satisfy W, which is the opposite of "ignore the records W hides",
17
+ * so it is rewritten to `{ none: AND(W, NOT P) }` — no visible record violates P. Both agree with
18
+ * `every` when nothing is declared, and both stay vacuously true over an empty relation.
19
+ */
20
+ export declare function relationFilter(relation: RelationConfig, operator: string, inner: PrismaFilter): PrismaFilter;
21
+ /**
22
+ * `filter` nested through every relation in `relations`, outermost first, each reached with its
23
+ * existence operator (`is` for to-one, `some` for to-many). No relations leaves it unchanged.
24
+ */
25
+ export declare function wrapInRelations(relations: RelationConfig[] | undefined, filter: PrismaFilter): PrismaFilter;
26
+ /**
27
+ * "Every intermediate hop of a dotted path exists", as a Prisma filter.
28
+ *
29
+ * CEL cannot dot through a list, so each intermediate segment of `a.b.c` is a to-ONE
30
+ * parent: absent, the caller sends no attribute and CEL raises a missing-path error, which
31
+ * denies. `NOT { categories: { some: { subCategories: { some: P } } } }` is TRUE for a row
32
+ * with no category at all, so the negation returns rows the PDP denies — the parent must be
33
+ * required separately (cerbos/query-plan-adapters#309).
34
+ *
35
+ * Returns undefined when the reference has no intermediate hop, so a direct relation keeps
36
+ * its empty-collection semantics (`!tags.exists(...)` over zero tags is still TRUE).
37
+ */
38
+ export declare function buildLeadingHopsExistFilter(head: RelationConfig, restRelations: RelationConfig[]): PrismaFilter | undefined;
39
+ /**
40
+ * `{ NOT: filter }` for a filter translated from a plan sub-expression.
41
+ *
42
+ * An unconditional filter (`{}`, which the hierarchy operators return for a relationship that
43
+ * holds between two constants) cannot be negated this way: Prisma drops an empty condition, so
44
+ * `{ NOT: {} }` is true and matches every row, where the negation of an unconditional condition
45
+ * matches none. Prisma has no field-free false condition to emit instead, so the shape is refused.
46
+ */
47
+ export declare function negateFilter(filter: PrismaFilter): PrismaFilter;
48
+ /**
49
+ * `{ NOT: filter }`, with every to-one hop `operand` dots through required OUTSIDE the
50
+ * negation so an absent parent stays denied (see buildExpressionHopsExistFilter).
51
+ */
52
+ export declare function negateRequiringHops(operand: PlanExpressionOperand, filter: PrismaFilter, context: TranslationContext): PrismaFilter;
53
+ /**
54
+ * Whether negating `expr` needs a hop requirement (see buildExpressionHopsExistFilter): it dots
55
+ * through at least one to-one hop, which is absent on a parentless row.
56
+ */
57
+ export declare function referencesRequiredHop(expr: PlanExpressionOperand, context: TranslationContext): boolean;
58
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAIpE,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GAClB,YAAY,CAoBd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,EACvC,MAAM,EAAE,YAAY,GACnB,YAAY,CAQd;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,cAAc,EAAE,GAC9B,YAAY,GAAG,SAAS,CAO1B;AA6ED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAS/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAKd;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAET"}