@strapi/utils 5.12.0 → 5.12.2

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 (233) hide show
  1. package/dist/async.js +28 -0
  2. package/dist/async.js.map +1 -0
  3. package/dist/async.mjs +24 -0
  4. package/dist/async.mjs.map +1 -0
  5. package/dist/content-types.js +201 -0
  6. package/dist/content-types.js.map +1 -0
  7. package/dist/content-types.mjs +167 -0
  8. package/dist/content-types.mjs.map +1 -0
  9. package/dist/convert-query-params.js +512 -0
  10. package/dist/convert-query-params.js.map +1 -0
  11. package/dist/convert-query-params.mjs +510 -0
  12. package/dist/convert-query-params.mjs.map +1 -0
  13. package/dist/env-helper.js +81 -0
  14. package/dist/env-helper.js.map +1 -0
  15. package/dist/env-helper.mjs +79 -0
  16. package/dist/env-helper.mjs.map +1 -0
  17. package/dist/errors.js +104 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/errors.mjs +88 -0
  20. package/dist/errors.mjs.map +1 -0
  21. package/dist/file.js +57 -0
  22. package/dist/file.js.map +1 -0
  23. package/dist/file.mjs +50 -0
  24. package/dist/file.mjs.map +1 -0
  25. package/dist/format-yup-error.js +19 -0
  26. package/dist/format-yup-error.js.map +1 -0
  27. package/dist/format-yup-error.mjs +17 -0
  28. package/dist/format-yup-error.mjs.map +1 -0
  29. package/dist/hooks.js +86 -0
  30. package/dist/hooks.js.map +1 -0
  31. package/dist/hooks.mjs +80 -0
  32. package/dist/hooks.mjs.map +1 -0
  33. package/dist/import-default.js +9 -0
  34. package/dist/import-default.js.map +1 -0
  35. package/dist/import-default.mjs +7 -0
  36. package/dist/import-default.mjs.map +1 -0
  37. package/dist/index.js +54 -4358
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +48 -4317
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/machine-id.js +17 -0
  42. package/dist/machine-id.js.map +1 -0
  43. package/dist/machine-id.mjs +15 -0
  44. package/dist/machine-id.mjs.map +1 -0
  45. package/dist/operators.js +79 -0
  46. package/dist/operators.js.map +1 -0
  47. package/dist/operators.mjs +76 -0
  48. package/dist/operators.mjs.map +1 -0
  49. package/dist/package-manager.js +36 -0
  50. package/dist/package-manager.js.map +1 -0
  51. package/dist/package-manager.mjs +33 -0
  52. package/dist/package-manager.mjs.map +1 -0
  53. package/dist/pagination.js +163 -0
  54. package/dist/pagination.js.map +1 -0
  55. package/dist/pagination.mjs +159 -0
  56. package/dist/pagination.mjs.map +1 -0
  57. package/dist/parse-type.js +140 -0
  58. package/dist/parse-type.js.map +1 -0
  59. package/dist/parse-type.mjs +118 -0
  60. package/dist/parse-type.mjs.map +1 -0
  61. package/dist/policy.js +33 -0
  62. package/dist/policy.js.map +1 -0
  63. package/dist/policy.mjs +30 -0
  64. package/dist/policy.mjs.map +1 -0
  65. package/dist/primitives/arrays.js +7 -0
  66. package/dist/primitives/arrays.js.map +1 -0
  67. package/dist/primitives/arrays.mjs +5 -0
  68. package/dist/primitives/arrays.mjs.map +1 -0
  69. package/dist/primitives/dates.js +11 -0
  70. package/dist/primitives/dates.js.map +1 -0
  71. package/dist/primitives/dates.mjs +9 -0
  72. package/dist/primitives/dates.mjs.map +1 -0
  73. package/dist/primitives/objects.js +13 -0
  74. package/dist/primitives/objects.js.map +1 -0
  75. package/dist/primitives/objects.mjs +11 -0
  76. package/dist/primitives/objects.mjs.map +1 -0
  77. package/dist/primitives/strings.js +49 -0
  78. package/dist/primitives/strings.js.map +1 -0
  79. package/dist/primitives/strings.mjs +38 -0
  80. package/dist/primitives/strings.mjs.map +1 -0
  81. package/dist/print-value.js +42 -0
  82. package/dist/print-value.js.map +1 -0
  83. package/dist/print-value.mjs +40 -0
  84. package/dist/print-value.mjs.map +1 -0
  85. package/dist/provider-factory.js +82 -0
  86. package/dist/provider-factory.js.map +1 -0
  87. package/dist/provider-factory.mjs +80 -0
  88. package/dist/provider-factory.mjs.map +1 -0
  89. package/dist/relations.js +54 -0
  90. package/dist/relations.js.map +1 -0
  91. package/dist/relations.mjs +45 -0
  92. package/dist/relations.mjs.map +1 -0
  93. package/dist/sanitize/index.js +195 -0
  94. package/dist/sanitize/index.js.map +1 -0
  95. package/dist/sanitize/index.mjs +194 -0
  96. package/dist/sanitize/index.mjs.map +1 -0
  97. package/dist/sanitize/sanitizers.js +173 -0
  98. package/dist/sanitize/sanitizers.js.map +1 -0
  99. package/dist/sanitize/sanitizers.mjs +166 -0
  100. package/dist/sanitize/sanitizers.mjs.map +1 -0
  101. package/dist/sanitize/visitors/expand-wildcard-populate.js +20 -0
  102. package/dist/sanitize/visitors/expand-wildcard-populate.js.map +1 -0
  103. package/dist/sanitize/visitors/expand-wildcard-populate.mjs +18 -0
  104. package/dist/sanitize/visitors/expand-wildcard-populate.mjs.map +1 -0
  105. package/dist/sanitize/visitors/index.js +22 -0
  106. package/dist/sanitize/visitors/index.js.map +1 -0
  107. package/dist/sanitize/visitors/index.mjs +9 -0
  108. package/dist/sanitize/visitors/index.mjs.map +1 -0
  109. package/dist/sanitize/visitors/remove-disallowed-fields.js +87 -0
  110. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -0
  111. package/dist/sanitize/visitors/remove-disallowed-fields.mjs +85 -0
  112. package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -0
  113. package/dist/sanitize/visitors/remove-dynamic-zones.js +12 -0
  114. package/dist/sanitize/visitors/remove-dynamic-zones.js.map +1 -0
  115. package/dist/sanitize/visitors/remove-dynamic-zones.mjs +10 -0
  116. package/dist/sanitize/visitors/remove-dynamic-zones.mjs.map +1 -0
  117. package/dist/sanitize/visitors/remove-morph-to-relations.js +12 -0
  118. package/dist/sanitize/visitors/remove-morph-to-relations.js.map +1 -0
  119. package/dist/sanitize/visitors/remove-morph-to-relations.mjs +10 -0
  120. package/dist/sanitize/visitors/remove-morph-to-relations.mjs.map +1 -0
  121. package/dist/sanitize/visitors/remove-password.js +10 -0
  122. package/dist/sanitize/visitors/remove-password.js.map +1 -0
  123. package/dist/sanitize/visitors/remove-password.mjs +8 -0
  124. package/dist/sanitize/visitors/remove-password.mjs.map +1 -0
  125. package/dist/sanitize/visitors/remove-private.js +16 -0
  126. package/dist/sanitize/visitors/remove-private.js.map +1 -0
  127. package/dist/sanitize/visitors/remove-private.mjs +14 -0
  128. package/dist/sanitize/visitors/remove-private.mjs.map +1 -0
  129. package/dist/sanitize/visitors/remove-restricted-fields.js +28 -0
  130. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -0
  131. package/dist/sanitize/visitors/remove-restricted-fields.mjs +26 -0
  132. package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -0
  133. package/dist/sanitize/visitors/remove-restricted-relations.js +116 -0
  134. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -0
  135. package/dist/sanitize/visitors/remove-restricted-relations.mjs +114 -0
  136. package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -0
  137. package/dist/set-creator-fields.js +18 -0
  138. package/dist/set-creator-fields.js.map +1 -0
  139. package/dist/set-creator-fields.mjs +16 -0
  140. package/dist/set-creator-fields.mjs.map +1 -0
  141. package/dist/template.js +18 -0
  142. package/dist/template.js.map +1 -0
  143. package/dist/template.mjs +15 -0
  144. package/dist/template.mjs.map +1 -0
  145. package/dist/traverse/factory.js +158 -0
  146. package/dist/traverse/factory.js.map +1 -0
  147. package/dist/traverse/factory.mjs +156 -0
  148. package/dist/traverse/factory.mjs.map +1 -0
  149. package/dist/traverse/index.js +14 -0
  150. package/dist/traverse/index.js.map +1 -0
  151. package/dist/traverse/index.mjs +5 -0
  152. package/dist/traverse/index.mjs.map +1 -0
  153. package/dist/traverse/query-fields.js +41 -0
  154. package/dist/traverse/query-fields.js.map +1 -0
  155. package/dist/traverse/query-fields.mjs +39 -0
  156. package/dist/traverse/query-fields.mjs.map +1 -0
  157. package/dist/traverse/query-filters.js +114 -0
  158. package/dist/traverse/query-filters.js.map +1 -0
  159. package/dist/traverse/query-filters.mjs +112 -0
  160. package/dist/traverse/query-filters.mjs.map +1 -0
  161. package/dist/traverse/query-populate.js +280 -0
  162. package/dist/traverse/query-populate.js.map +1 -0
  163. package/dist/traverse/query-populate.mjs +278 -0
  164. package/dist/traverse/query-populate.mjs.map +1 -0
  165. package/dist/traverse/query-sort.js +144 -0
  166. package/dist/traverse/query-sort.js.map +1 -0
  167. package/dist/traverse/query-sort.mjs +142 -0
  168. package/dist/traverse/query-sort.mjs.map +1 -0
  169. package/dist/traverse-entity.js +170 -0
  170. package/dist/traverse-entity.js.map +1 -0
  171. package/dist/traverse-entity.mjs +168 -0
  172. package/dist/traverse-entity.mjs.map +1 -0
  173. package/dist/validate/index.js +218 -0
  174. package/dist/validate/index.js.map +1 -0
  175. package/dist/validate/index.mjs +217 -0
  176. package/dist/validate/index.mjs.map +1 -0
  177. package/dist/validate/utils.js +27 -0
  178. package/dist/validate/utils.js.map +1 -0
  179. package/dist/validate/utils.mjs +24 -0
  180. package/dist/validate/utils.mjs.map +1 -0
  181. package/dist/validate/validators.js +369 -0
  182. package/dist/validate/validators.js.map +1 -0
  183. package/dist/validate/validators.mjs +356 -0
  184. package/dist/validate/validators.mjs.map +1 -0
  185. package/dist/validate/visitors/index.js +22 -0
  186. package/dist/validate/visitors/index.js.map +1 -0
  187. package/dist/validate/visitors/index.mjs +9 -0
  188. package/dist/validate/visitors/index.mjs.map +1 -0
  189. package/dist/validate/visitors/throw-disallowed-fields.js +91 -0
  190. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -0
  191. package/dist/validate/visitors/throw-disallowed-fields.mjs +89 -0
  192. package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -0
  193. package/dist/validate/visitors/throw-dynamic-zones.js +16 -0
  194. package/dist/validate/visitors/throw-dynamic-zones.js.map +1 -0
  195. package/dist/validate/visitors/throw-dynamic-zones.mjs +14 -0
  196. package/dist/validate/visitors/throw-dynamic-zones.mjs.map +1 -0
  197. package/dist/validate/visitors/throw-morph-to-relations.js +16 -0
  198. package/dist/validate/visitors/throw-morph-to-relations.js.map +1 -0
  199. package/dist/validate/visitors/throw-morph-to-relations.mjs +14 -0
  200. package/dist/validate/visitors/throw-morph-to-relations.mjs.map +1 -0
  201. package/dist/validate/visitors/throw-password.js +15 -0
  202. package/dist/validate/visitors/throw-password.js.map +1 -0
  203. package/dist/validate/visitors/throw-password.mjs +13 -0
  204. package/dist/validate/visitors/throw-password.mjs.map +1 -0
  205. package/dist/validate/visitors/throw-private.js +20 -0
  206. package/dist/validate/visitors/throw-private.js.map +1 -0
  207. package/dist/validate/visitors/throw-private.mjs +18 -0
  208. package/dist/validate/visitors/throw-private.mjs.map +1 -0
  209. package/dist/validate/visitors/throw-restricted-fields.js +36 -0
  210. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -0
  211. package/dist/validate/visitors/throw-restricted-fields.mjs +34 -0
  212. package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -0
  213. package/dist/validate/visitors/throw-restricted-relations.js +125 -0
  214. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -0
  215. package/dist/validate/visitors/throw-restricted-relations.mjs +123 -0
  216. package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -0
  217. package/dist/validate/visitors/throw-unrecognized-fields.js +66 -0
  218. package/dist/validate/visitors/throw-unrecognized-fields.js.map +1 -0
  219. package/dist/validate/visitors/throw-unrecognized-fields.mjs +64 -0
  220. package/dist/validate/visitors/throw-unrecognized-fields.mjs.map +1 -0
  221. package/dist/validators.js +60 -0
  222. package/dist/validators.js.map +1 -0
  223. package/dist/validators.mjs +37 -0
  224. package/dist/validators.mjs.map +1 -0
  225. package/dist/yup.js +101 -0
  226. package/dist/yup.js.map +1 -0
  227. package/dist/yup.mjs +74 -0
  228. package/dist/yup.mjs.map +1 -0
  229. package/dist/zod.js +31 -0
  230. package/dist/zod.js.map +1 -0
  231. package/dist/zod.mjs +29 -0
  232. package/dist/zod.mjs.map +1 -0
  233. package/package.json +3 -3
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ // Code copied from the yup library (https://github.com/jquense/yup)
4
+ // https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts
5
+ const { toString } = Object.prototype;
6
+ const errorToString = Error.prototype.toString;
7
+ const regExpToString = RegExp.prototype.toString;
8
+ const symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : ()=>'';
9
+ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
10
+ function printNumber(val) {
11
+ // eslint-disable-next-line eqeqeq
12
+ if (val != +val) return 'NaN';
13
+ const isNegativeZero = val === 0 && 1 / val < 0;
14
+ return isNegativeZero ? '-0' : `${val}`;
15
+ }
16
+ function printSimpleValue(val, quoteStrings = false) {
17
+ if (val == null || val === true || val === false) return `${val}`;
18
+ if (typeof val === 'number') return printNumber(val);
19
+ if (typeof val === 'string') return quoteStrings ? `"${val}"` : val;
20
+ if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;
21
+ if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
22
+ const tag = toString.call(val).slice(8, -1);
23
+ if (tag === 'Date') {
24
+ const v = val;
25
+ return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();
26
+ }
27
+ if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;
28
+ if (tag === 'RegExp') return regExpToString.call(val);
29
+ return null;
30
+ }
31
+ function printValue(value, quoteStrings) {
32
+ const result = printSimpleValue(value, quoteStrings);
33
+ if (result !== null) return result;
34
+ return JSON.stringify(value, function replacer(key, value) {
35
+ const result = printSimpleValue(this[key], quoteStrings);
36
+ if (result !== null) return result;
37
+ return value;
38
+ }, 2);
39
+ }
40
+
41
+ exports.printValue = printValue;
42
+ //# sourceMappingURL=print-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-value.js","sources":["../src/print-value.ts"],"sourcesContent":["// Code copied from the yup library (https://github.com/jquense/yup)\n// https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts\n\nconst { toString } = Object.prototype;\nconst errorToString = Error.prototype.toString;\nconst regExpToString = RegExp.prototype.toString;\nconst symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';\n\nconst SYMBOL_REGEXP = /^Symbol\\((.*)\\)(.*)$/;\n\nfunction printNumber(val: number) {\n // eslint-disable-next-line eqeqeq\n if (val != +val) return 'NaN';\n const isNegativeZero = val === 0 && 1 / val < 0;\n return isNegativeZero ? '-0' : `${val}`;\n}\n\nfunction printSimpleValue(val: unknown, quoteStrings = false) {\n if (val == null || val === true || val === false) return `${val}`;\n\n if (typeof val === 'number') return printNumber(val);\n if (typeof val === 'string') return quoteStrings ? `\"${val}\"` : val;\n if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');\n\n const tag = toString.call(val).slice(8, -1);\n\n if (tag === 'Date') {\n const v = val as Date;\n return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();\n }\n if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;\n if (tag === 'RegExp') return regExpToString.call(val);\n\n return null;\n}\n\nfunction printValue(value: unknown, quoteStrings: boolean) {\n const result = printSimpleValue(value, quoteStrings);\n if (result !== null) return result;\n\n return JSON.stringify(\n value,\n function replacer(key, value) {\n const result = printSimpleValue(this[key], quoteStrings);\n if (result !== null) return result;\n return value;\n },\n 2\n );\n}\n\nexport { printValue };\n"],"names":["toString","Object","prototype","errorToString","Error","regExpToString","RegExp","symbolToString","Symbol","SYMBOL_REGEXP","printNumber","val","isNegativeZero","printSimpleValue","quoteStrings","name","call","replace","tag","slice","v","Number","isNaN","getTime","toISOString","printValue","value","result","JSON","stringify","replacer","key"],"mappings":";;AAAA;AACA;AAEA,MAAM,EAAEA,QAAQ,EAAE,GAAGC,OAAOC,SAAS;AACrC,MAAMC,aAAgBC,GAAAA,KAAAA,CAAMF,SAAS,CAACF,QAAQ;AAC9C,MAAMK,cAAiBC,GAAAA,MAAAA,CAAOJ,SAAS,CAACF,QAAQ;AAChD,MAAMO,cAAAA,GAAiB,OAAOC,MAAW,KAAA,WAAA,GAAcA,OAAON,SAAS,CAACF,QAAQ,GAAG,IAAM,EAAA;AAEzF,MAAMS,aAAgB,GAAA,sBAAA;AAEtB,SAASC,YAAYC,GAAW,EAAA;;IAE9B,IAAIA,GAAAA,IAAO,CAACA,GAAAA,EAAK,OAAO,KAAA;AACxB,IAAA,MAAMC,cAAiBD,GAAAA,GAAAA,KAAQ,CAAK,IAAA,CAAA,GAAIA,GAAM,GAAA,CAAA;AAC9C,IAAA,OAAOC,cAAiB,GAAA,IAAA,GAAO,CAAC,EAAED,IAAI,CAAC;AACzC;AAEA,SAASE,gBAAiBF,CAAAA,GAAY,EAAEG,YAAAA,GAAe,KAAK,EAAA;IAC1D,IAAIH,GAAAA,IAAO,IAAQA,IAAAA,GAAAA,KAAQ,IAAQA,IAAAA,GAAAA,KAAQ,OAAO,OAAO,CAAC,EAAEA,GAAAA,CAAI,CAAC;AAEjE,IAAA,IAAI,OAAOA,GAAAA,KAAQ,QAAU,EAAA,OAAOD,WAAYC,CAAAA,GAAAA,CAAAA;IAChD,IAAI,OAAOA,GAAQ,KAAA,QAAA,EAAU,OAAOG,YAAAA,GAAe,CAAC,CAAC,EAAEH,GAAAA,CAAI,CAAC,CAAC,GAAGA,GAAAA;AAChE,IAAA,IAAI,OAAOA,GAAAA,KAAQ,UAAY,EAAA,OAAO,CAAC,UAAU,EAAEA,GAAAA,CAAII,IAAI,IAAI,WAAY,CAAA,CAAC,CAAC;IAC7E,IAAI,OAAOJ,GAAQ,KAAA,QAAA,EAAU,OAAOJ,cAAAA,CAAeS,IAAI,CAACL,GAAAA,CAAAA,CAAKM,OAAO,CAACR,aAAe,EAAA,YAAA,CAAA;IAEpF,MAAMS,GAAAA,GAAMlB,SAASgB,IAAI,CAACL,KAAKQ,KAAK,CAAC,GAAG,CAAC,CAAA,CAAA;AAEzC,IAAA,IAAID,QAAQ,MAAQ,EAAA;AAClB,QAAA,MAAME,CAAIT,GAAAA,GAAAA;AACV,QAAA,OAAOU,MAAOC,CAAAA,KAAK,CAACF,CAAAA,CAAEG,OAAO,EAAA,CAAA,GAAM,CAAC,EAAEH,CAAE,CAAA,CAAC,GAAGA,CAAAA,CAAEI,WAAW,EAAA;AAC3D;AACA,IAAA,IAAIN,GAAQ,KAAA,OAAA,IAAWP,GAAeP,YAAAA,KAAAA,EAAO,OAAO,CAAC,CAAC,EAAED,aAAca,CAAAA,IAAI,CAACL,GAAAA,CAAAA,CAAK,CAAC,CAAC;AAClF,IAAA,IAAIO,GAAQ,KAAA,QAAA,EAAU,OAAOb,cAAAA,CAAeW,IAAI,CAACL,GAAAA,CAAAA;IAEjD,OAAO,IAAA;AACT;AAEA,SAASc,UAAAA,CAAWC,KAAc,EAAEZ,YAAqB,EAAA;IACvD,MAAMa,MAAAA,GAASd,iBAAiBa,KAAOZ,EAAAA,YAAAA,CAAAA;IACvC,IAAIa,MAAAA,KAAW,MAAM,OAAOA,MAAAA;IAE5B,OAAOC,IAAAA,CAAKC,SAAS,CACnBH,KAAAA,EACA,SAASI,QAASC,CAAAA,GAAG,EAAEL,KAAK,EAAA;AAC1B,QAAA,MAAMC,MAASd,GAAAA,gBAAAA,CAAiB,IAAI,CAACkB,IAAI,EAAEjB,YAAAA,CAAAA;QAC3C,IAAIa,MAAAA,KAAW,MAAM,OAAOA,MAAAA;QAC5B,OAAOD,KAAAA;KAET,EAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,40 @@
1
+ // Code copied from the yup library (https://github.com/jquense/yup)
2
+ // https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts
3
+ const { toString } = Object.prototype;
4
+ const errorToString = Error.prototype.toString;
5
+ const regExpToString = RegExp.prototype.toString;
6
+ const symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : ()=>'';
7
+ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
8
+ function printNumber(val) {
9
+ // eslint-disable-next-line eqeqeq
10
+ if (val != +val) return 'NaN';
11
+ const isNegativeZero = val === 0 && 1 / val < 0;
12
+ return isNegativeZero ? '-0' : `${val}`;
13
+ }
14
+ function printSimpleValue(val, quoteStrings = false) {
15
+ if (val == null || val === true || val === false) return `${val}`;
16
+ if (typeof val === 'number') return printNumber(val);
17
+ if (typeof val === 'string') return quoteStrings ? `"${val}"` : val;
18
+ if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;
19
+ if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
20
+ const tag = toString.call(val).slice(8, -1);
21
+ if (tag === 'Date') {
22
+ const v = val;
23
+ return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();
24
+ }
25
+ if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;
26
+ if (tag === 'RegExp') return regExpToString.call(val);
27
+ return null;
28
+ }
29
+ function printValue(value, quoteStrings) {
30
+ const result = printSimpleValue(value, quoteStrings);
31
+ if (result !== null) return result;
32
+ return JSON.stringify(value, function replacer(key, value) {
33
+ const result = printSimpleValue(this[key], quoteStrings);
34
+ if (result !== null) return result;
35
+ return value;
36
+ }, 2);
37
+ }
38
+
39
+ export { printValue };
40
+ //# sourceMappingURL=print-value.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-value.mjs","sources":["../src/print-value.ts"],"sourcesContent":["// Code copied from the yup library (https://github.com/jquense/yup)\n// https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts\n\nconst { toString } = Object.prototype;\nconst errorToString = Error.prototype.toString;\nconst regExpToString = RegExp.prototype.toString;\nconst symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';\n\nconst SYMBOL_REGEXP = /^Symbol\\((.*)\\)(.*)$/;\n\nfunction printNumber(val: number) {\n // eslint-disable-next-line eqeqeq\n if (val != +val) return 'NaN';\n const isNegativeZero = val === 0 && 1 / val < 0;\n return isNegativeZero ? '-0' : `${val}`;\n}\n\nfunction printSimpleValue(val: unknown, quoteStrings = false) {\n if (val == null || val === true || val === false) return `${val}`;\n\n if (typeof val === 'number') return printNumber(val);\n if (typeof val === 'string') return quoteStrings ? `\"${val}\"` : val;\n if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');\n\n const tag = toString.call(val).slice(8, -1);\n\n if (tag === 'Date') {\n const v = val as Date;\n return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();\n }\n if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;\n if (tag === 'RegExp') return regExpToString.call(val);\n\n return null;\n}\n\nfunction printValue(value: unknown, quoteStrings: boolean) {\n const result = printSimpleValue(value, quoteStrings);\n if (result !== null) return result;\n\n return JSON.stringify(\n value,\n function replacer(key, value) {\n const result = printSimpleValue(this[key], quoteStrings);\n if (result !== null) return result;\n return value;\n },\n 2\n );\n}\n\nexport { printValue };\n"],"names":["toString","Object","prototype","errorToString","Error","regExpToString","RegExp","symbolToString","Symbol","SYMBOL_REGEXP","printNumber","val","isNegativeZero","printSimpleValue","quoteStrings","name","call","replace","tag","slice","v","Number","isNaN","getTime","toISOString","printValue","value","result","JSON","stringify","replacer","key"],"mappings":"AAAA;AACA;AAEA,MAAM,EAAEA,QAAQ,EAAE,GAAGC,OAAOC,SAAS;AACrC,MAAMC,aAAgBC,GAAAA,KAAAA,CAAMF,SAAS,CAACF,QAAQ;AAC9C,MAAMK,cAAiBC,GAAAA,MAAAA,CAAOJ,SAAS,CAACF,QAAQ;AAChD,MAAMO,cAAAA,GAAiB,OAAOC,MAAW,KAAA,WAAA,GAAcA,OAAON,SAAS,CAACF,QAAQ,GAAG,IAAM,EAAA;AAEzF,MAAMS,aAAgB,GAAA,sBAAA;AAEtB,SAASC,YAAYC,GAAW,EAAA;;IAE9B,IAAIA,GAAAA,IAAO,CAACA,GAAAA,EAAK,OAAO,KAAA;AACxB,IAAA,MAAMC,cAAiBD,GAAAA,GAAAA,KAAQ,CAAK,IAAA,CAAA,GAAIA,GAAM,GAAA,CAAA;AAC9C,IAAA,OAAOC,cAAiB,GAAA,IAAA,GAAO,CAAC,EAAED,IAAI,CAAC;AACzC;AAEA,SAASE,gBAAiBF,CAAAA,GAAY,EAAEG,YAAAA,GAAe,KAAK,EAAA;IAC1D,IAAIH,GAAAA,IAAO,IAAQA,IAAAA,GAAAA,KAAQ,IAAQA,IAAAA,GAAAA,KAAQ,OAAO,OAAO,CAAC,EAAEA,GAAAA,CAAI,CAAC;AAEjE,IAAA,IAAI,OAAOA,GAAAA,KAAQ,QAAU,EAAA,OAAOD,WAAYC,CAAAA,GAAAA,CAAAA;IAChD,IAAI,OAAOA,GAAQ,KAAA,QAAA,EAAU,OAAOG,YAAAA,GAAe,CAAC,CAAC,EAAEH,GAAAA,CAAI,CAAC,CAAC,GAAGA,GAAAA;AAChE,IAAA,IAAI,OAAOA,GAAAA,KAAQ,UAAY,EAAA,OAAO,CAAC,UAAU,EAAEA,GAAAA,CAAII,IAAI,IAAI,WAAY,CAAA,CAAC,CAAC;IAC7E,IAAI,OAAOJ,GAAQ,KAAA,QAAA,EAAU,OAAOJ,cAAAA,CAAeS,IAAI,CAACL,GAAAA,CAAAA,CAAKM,OAAO,CAACR,aAAe,EAAA,YAAA,CAAA;IAEpF,MAAMS,GAAAA,GAAMlB,SAASgB,IAAI,CAACL,KAAKQ,KAAK,CAAC,GAAG,CAAC,CAAA,CAAA;AAEzC,IAAA,IAAID,QAAQ,MAAQ,EAAA;AAClB,QAAA,MAAME,CAAIT,GAAAA,GAAAA;AACV,QAAA,OAAOU,MAAOC,CAAAA,KAAK,CAACF,CAAAA,CAAEG,OAAO,EAAA,CAAA,GAAM,CAAC,EAAEH,CAAE,CAAA,CAAC,GAAGA,CAAAA,CAAEI,WAAW,EAAA;AAC3D;AACA,IAAA,IAAIN,GAAQ,KAAA,OAAA,IAAWP,GAAeP,YAAAA,KAAAA,EAAO,OAAO,CAAC,CAAC,EAAED,aAAca,CAAAA,IAAI,CAACL,GAAAA,CAAAA,CAAK,CAAC,CAAC;AAClF,IAAA,IAAIO,GAAQ,KAAA,QAAA,EAAU,OAAOb,cAAAA,CAAeW,IAAI,CAACL,GAAAA,CAAAA;IAEjD,OAAO,IAAA;AACT;AAEA,SAASc,UAAAA,CAAWC,KAAc,EAAEZ,YAAqB,EAAA;IACvD,MAAMa,MAAAA,GAASd,iBAAiBa,KAAOZ,EAAAA,YAAAA,CAAAA;IACvC,IAAIa,MAAAA,KAAW,MAAM,OAAOA,MAAAA;IAE5B,OAAOC,IAAAA,CAAKC,SAAS,CACnBH,KAAAA,EACA,SAASI,QAASC,CAAAA,GAAG,EAAEL,KAAK,EAAA;AAC1B,QAAA,MAAMC,MAASd,GAAAA,gBAAAA,CAAiB,IAAI,CAACkB,IAAI,EAAEjB,YAAAA,CAAAA;QAC3C,IAAIa,MAAAA,KAAW,MAAM,OAAOA,MAAAA;QAC5B,OAAOD,KAAAA;KAET,EAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var hooks = require('./hooks.js');
5
+
6
+ /**
7
+ * Creates a new object containing various hooks used by the providers
8
+ */ const createProviderHooksMap = ()=>({
9
+ // Register events
10
+ willRegister: hooks.createAsyncSeriesHook(),
11
+ didRegister: hooks.createAsyncParallelHook(),
12
+ // Delete events
13
+ willDelete: hooks.createAsyncParallelHook(),
14
+ didDelete: hooks.createAsyncParallelHook()
15
+ });
16
+ /**
17
+ * A Provider factory
18
+ */ const providerFactory = (options = {})=>{
19
+ const { throwOnDuplicates = true } = options;
20
+ const state = {
21
+ hooks: createProviderHooksMap(),
22
+ registry: new Map()
23
+ };
24
+ return {
25
+ hooks: state.hooks,
26
+ async register (key, item) {
27
+ if (throwOnDuplicates && this.has(key)) {
28
+ throw new Error(`Duplicated item key: ${key}`);
29
+ }
30
+ await state.hooks.willRegister.call({
31
+ key,
32
+ value: item
33
+ });
34
+ state.registry.set(key, item);
35
+ await state.hooks.didRegister.call({
36
+ key,
37
+ value: fp.cloneDeep(item)
38
+ });
39
+ return this;
40
+ },
41
+ async delete (key) {
42
+ if (this.has(key)) {
43
+ const item = this.get(key);
44
+ await state.hooks.willDelete.call({
45
+ key,
46
+ value: fp.cloneDeep(item)
47
+ });
48
+ state.registry.delete(key);
49
+ await state.hooks.didDelete.call({
50
+ key,
51
+ value: fp.cloneDeep(item)
52
+ });
53
+ }
54
+ return this;
55
+ },
56
+ get (key) {
57
+ return state.registry.get(key);
58
+ },
59
+ values () {
60
+ return Array.from(state.registry.values());
61
+ },
62
+ keys () {
63
+ return Array.from(state.registry.keys());
64
+ },
65
+ has (key) {
66
+ return state.registry.has(key);
67
+ },
68
+ size () {
69
+ return state.registry.size;
70
+ },
71
+ async clear () {
72
+ const keys = this.keys();
73
+ for (const key of keys){
74
+ await this.delete(key);
75
+ }
76
+ return this;
77
+ }
78
+ };
79
+ };
80
+
81
+ module.exports = providerFactory;
82
+ //# sourceMappingURL=provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.js","sources":["../src/provider-factory.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport {\n createAsyncSeriesHook,\n createAsyncParallelHook,\n AsyncSeriesHook,\n AsyncParallelHook,\n} from './hooks';\n\nexport interface ProviderHooksMap {\n willRegister: AsyncSeriesHook;\n didRegister: AsyncParallelHook;\n willDelete: AsyncParallelHook;\n didDelete: AsyncParallelHook;\n}\n\n/**\n * Creates a new object containing various hooks used by the providers\n */\nconst createProviderHooksMap = (): ProviderHooksMap => ({\n // Register events\n willRegister: createAsyncSeriesHook(),\n didRegister: createAsyncParallelHook(),\n // Delete events\n willDelete: createAsyncParallelHook(),\n didDelete: createAsyncParallelHook(),\n});\n\nexport interface Options {\n throwOnDuplicates?: boolean;\n}\n\ntype Item = Record<string, unknown>;\n\nexport interface Provider<T = unknown> {\n hooks: ProviderHooksMap;\n register(key: string, item: T): Promise<Provider>;\n delete(key: string): Promise<Provider>;\n get(key: string): T | undefined;\n values(): T[];\n keys(): string[];\n has(key: string): boolean;\n size(): number;\n clear(): Promise<Provider<T>>;\n}\n\nexport type ProviderFactory<T> = (options?: Options) => Provider<T>;\n\n/**\n * A Provider factory\n */\nconst providerFactory = <T = Item>(options: Options = {}): Provider<T> => {\n const { throwOnDuplicates = true } = options;\n\n const state = {\n hooks: createProviderHooksMap(),\n registry: new Map<string, T>(),\n };\n\n return {\n hooks: state.hooks,\n\n async register(key: string, item: T) {\n if (throwOnDuplicates && this.has(key)) {\n throw new Error(`Duplicated item key: ${key}`);\n }\n\n await state.hooks.willRegister.call({ key, value: item });\n\n state.registry.set(key, item);\n\n await state.hooks.didRegister.call({ key, value: cloneDeep(item) });\n\n return this;\n },\n\n async delete(key: string) {\n if (this.has(key)) {\n const item = this.get(key);\n\n await state.hooks.willDelete.call({ key, value: cloneDeep(item) });\n\n state.registry.delete(key);\n\n await state.hooks.didDelete.call({ key, value: cloneDeep(item) });\n }\n\n return this;\n },\n\n get(key: string) {\n return state.registry.get(key);\n },\n\n values() {\n return Array.from(state.registry.values());\n },\n\n keys() {\n return Array.from(state.registry.keys());\n },\n\n has(key: string) {\n return state.registry.has(key);\n },\n\n size() {\n return state.registry.size;\n },\n\n async clear() {\n const keys = this.keys();\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return this;\n },\n };\n};\n\nexport default providerFactory;\n"],"names":["createProviderHooksMap","willRegister","createAsyncSeriesHook","didRegister","createAsyncParallelHook","willDelete","didDelete","providerFactory","options","throwOnDuplicates","state","hooks","registry","Map","register","key","item","has","Error","call","value","set","cloneDeep","delete","get","values","Array","from","keys","size","clear"],"mappings":";;;;;AAeA;;IAGA,MAAMA,sBAAyB,GAAA,KAAyB;;QAEtDC,YAAcC,EAAAA,2BAAAA,EAAAA;QACdC,WAAaC,EAAAA,6BAAAA,EAAAA;;QAEbC,UAAYD,EAAAA,6BAAAA,EAAAA;QACZE,SAAWF,EAAAA,6BAAAA;KACb,CAAA;AAsBA;;AAEC,IACKG,MAAAA,eAAAA,GAAkB,CAAWC,OAAAA,GAAmB,EAAE,GAAA;AACtD,IAAA,MAAM,EAAEC,iBAAAA,GAAoB,IAAI,EAAE,GAAGD,OAAAA;AAErC,IAAA,MAAME,KAAQ,GAAA;QACZC,KAAOX,EAAAA,sBAAAA,EAAAA;AACPY,QAAAA,QAAAA,EAAU,IAAIC,GAAAA;AAChB,KAAA;IAEA,OAAO;AACLF,QAAAA,KAAAA,EAAOD,MAAMC,KAAK;QAElB,MAAMG,QAAAA,CAAAA,CAASC,GAAW,EAAEC,IAAO,EAAA;AACjC,YAAA,IAAIP,iBAAqB,IAAA,IAAI,CAACQ,GAAG,CAACF,GAAM,CAAA,EAAA;AACtC,gBAAA,MAAM,IAAIG,KAAM,CAAA,CAAC,qBAAqB,EAAEH,IAAI,CAAC,CAAA;AAC/C;AAEA,YAAA,MAAML,MAAMC,KAAK,CAACV,YAAY,CAACkB,IAAI,CAAC;AAAEJ,gBAAAA,GAAAA;gBAAKK,KAAOJ,EAAAA;AAAK,aAAA,CAAA;AAEvDN,YAAAA,KAAAA,CAAME,QAAQ,CAACS,GAAG,CAACN,GAAKC,EAAAA,IAAAA,CAAAA;AAExB,YAAA,MAAMN,MAAMC,KAAK,CAACR,WAAW,CAACgB,IAAI,CAAC;AAAEJ,gBAAAA,GAAAA;AAAKK,gBAAAA,KAAAA,EAAOE,YAAUN,CAAAA,IAAAA;AAAM,aAAA,CAAA;AAEjE,YAAA,OAAO,IAAI;AACb,SAAA;AAEA,QAAA,MAAMO,QAAOR,GAAW,EAAA;AACtB,YAAA,IAAI,IAAI,CAACE,GAAG,CAACF,GAAM,CAAA,EAAA;AACjB,gBAAA,MAAMC,IAAO,GAAA,IAAI,CAACQ,GAAG,CAACT,GAAAA,CAAAA;AAEtB,gBAAA,MAAML,MAAMC,KAAK,CAACN,UAAU,CAACc,IAAI,CAAC;AAAEJ,oBAAAA,GAAAA;AAAKK,oBAAAA,KAAAA,EAAOE,YAAUN,CAAAA,IAAAA;AAAM,iBAAA,CAAA;gBAEhEN,KAAME,CAAAA,QAAQ,CAACW,MAAM,CAACR,GAAAA,CAAAA;AAEtB,gBAAA,MAAML,MAAMC,KAAK,CAACL,SAAS,CAACa,IAAI,CAAC;AAAEJ,oBAAAA,GAAAA;AAAKK,oBAAAA,KAAAA,EAAOE,YAAUN,CAAAA,IAAAA;AAAM,iBAAA,CAAA;AACjE;AAEA,YAAA,OAAO,IAAI;AACb,SAAA;AAEAQ,QAAAA,GAAAA,CAAAA,CAAIT,GAAW,EAAA;AACb,YAAA,OAAOL,KAAME,CAAAA,QAAQ,CAACY,GAAG,CAACT,GAAAA,CAAAA;AAC5B,SAAA;AAEAU,QAAAA,MAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOC,MAAMC,IAAI,CAACjB,KAAME,CAAAA,QAAQ,CAACa,MAAM,EAAA,CAAA;AACzC,SAAA;AAEAG,QAAAA,IAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOF,MAAMC,IAAI,CAACjB,KAAME,CAAAA,QAAQ,CAACgB,IAAI,EAAA,CAAA;AACvC,SAAA;AAEAX,QAAAA,GAAAA,CAAAA,CAAIF,GAAW,EAAA;AACb,YAAA,OAAOL,KAAME,CAAAA,QAAQ,CAACK,GAAG,CAACF,GAAAA,CAAAA;AAC5B,SAAA;AAEAc,QAAAA,IAAAA,CAAAA,GAAAA;YACE,OAAOnB,KAAAA,CAAME,QAAQ,CAACiB,IAAI;AAC5B,SAAA;QAEA,MAAMC,KAAAA,CAAAA,GAAAA;YACJ,MAAMF,IAAAA,GAAO,IAAI,CAACA,IAAI,EAAA;YAEtB,KAAK,MAAMb,OAAOa,IAAM,CAAA;gBACtB,MAAM,IAAI,CAACL,MAAM,CAACR,GAAAA,CAAAA;AACpB;AAEA,YAAA,OAAO,IAAI;AACb;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,80 @@
1
+ import { cloneDeep } from 'lodash/fp';
2
+ import { createAsyncSeriesHook, createAsyncParallelHook } from './hooks.mjs';
3
+
4
+ /**
5
+ * Creates a new object containing various hooks used by the providers
6
+ */ const createProviderHooksMap = ()=>({
7
+ // Register events
8
+ willRegister: createAsyncSeriesHook(),
9
+ didRegister: createAsyncParallelHook(),
10
+ // Delete events
11
+ willDelete: createAsyncParallelHook(),
12
+ didDelete: createAsyncParallelHook()
13
+ });
14
+ /**
15
+ * A Provider factory
16
+ */ const providerFactory = (options = {})=>{
17
+ const { throwOnDuplicates = true } = options;
18
+ const state = {
19
+ hooks: createProviderHooksMap(),
20
+ registry: new Map()
21
+ };
22
+ return {
23
+ hooks: state.hooks,
24
+ async register (key, item) {
25
+ if (throwOnDuplicates && this.has(key)) {
26
+ throw new Error(`Duplicated item key: ${key}`);
27
+ }
28
+ await state.hooks.willRegister.call({
29
+ key,
30
+ value: item
31
+ });
32
+ state.registry.set(key, item);
33
+ await state.hooks.didRegister.call({
34
+ key,
35
+ value: cloneDeep(item)
36
+ });
37
+ return this;
38
+ },
39
+ async delete (key) {
40
+ if (this.has(key)) {
41
+ const item = this.get(key);
42
+ await state.hooks.willDelete.call({
43
+ key,
44
+ value: cloneDeep(item)
45
+ });
46
+ state.registry.delete(key);
47
+ await state.hooks.didDelete.call({
48
+ key,
49
+ value: cloneDeep(item)
50
+ });
51
+ }
52
+ return this;
53
+ },
54
+ get (key) {
55
+ return state.registry.get(key);
56
+ },
57
+ values () {
58
+ return Array.from(state.registry.values());
59
+ },
60
+ keys () {
61
+ return Array.from(state.registry.keys());
62
+ },
63
+ has (key) {
64
+ return state.registry.has(key);
65
+ },
66
+ size () {
67
+ return state.registry.size;
68
+ },
69
+ async clear () {
70
+ const keys = this.keys();
71
+ for (const key of keys){
72
+ await this.delete(key);
73
+ }
74
+ return this;
75
+ }
76
+ };
77
+ };
78
+
79
+ export { providerFactory as default };
80
+ //# sourceMappingURL=provider-factory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.mjs","sources":["../src/provider-factory.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport {\n createAsyncSeriesHook,\n createAsyncParallelHook,\n AsyncSeriesHook,\n AsyncParallelHook,\n} from './hooks';\n\nexport interface ProviderHooksMap {\n willRegister: AsyncSeriesHook;\n didRegister: AsyncParallelHook;\n willDelete: AsyncParallelHook;\n didDelete: AsyncParallelHook;\n}\n\n/**\n * Creates a new object containing various hooks used by the providers\n */\nconst createProviderHooksMap = (): ProviderHooksMap => ({\n // Register events\n willRegister: createAsyncSeriesHook(),\n didRegister: createAsyncParallelHook(),\n // Delete events\n willDelete: createAsyncParallelHook(),\n didDelete: createAsyncParallelHook(),\n});\n\nexport interface Options {\n throwOnDuplicates?: boolean;\n}\n\ntype Item = Record<string, unknown>;\n\nexport interface Provider<T = unknown> {\n hooks: ProviderHooksMap;\n register(key: string, item: T): Promise<Provider>;\n delete(key: string): Promise<Provider>;\n get(key: string): T | undefined;\n values(): T[];\n keys(): string[];\n has(key: string): boolean;\n size(): number;\n clear(): Promise<Provider<T>>;\n}\n\nexport type ProviderFactory<T> = (options?: Options) => Provider<T>;\n\n/**\n * A Provider factory\n */\nconst providerFactory = <T = Item>(options: Options = {}): Provider<T> => {\n const { throwOnDuplicates = true } = options;\n\n const state = {\n hooks: createProviderHooksMap(),\n registry: new Map<string, T>(),\n };\n\n return {\n hooks: state.hooks,\n\n async register(key: string, item: T) {\n if (throwOnDuplicates && this.has(key)) {\n throw new Error(`Duplicated item key: ${key}`);\n }\n\n await state.hooks.willRegister.call({ key, value: item });\n\n state.registry.set(key, item);\n\n await state.hooks.didRegister.call({ key, value: cloneDeep(item) });\n\n return this;\n },\n\n async delete(key: string) {\n if (this.has(key)) {\n const item = this.get(key);\n\n await state.hooks.willDelete.call({ key, value: cloneDeep(item) });\n\n state.registry.delete(key);\n\n await state.hooks.didDelete.call({ key, value: cloneDeep(item) });\n }\n\n return this;\n },\n\n get(key: string) {\n return state.registry.get(key);\n },\n\n values() {\n return Array.from(state.registry.values());\n },\n\n keys() {\n return Array.from(state.registry.keys());\n },\n\n has(key: string) {\n return state.registry.has(key);\n },\n\n size() {\n return state.registry.size;\n },\n\n async clear() {\n const keys = this.keys();\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return this;\n },\n };\n};\n\nexport default providerFactory;\n"],"names":["createProviderHooksMap","willRegister","createAsyncSeriesHook","didRegister","createAsyncParallelHook","willDelete","didDelete","providerFactory","options","throwOnDuplicates","state","hooks","registry","Map","register","key","item","has","Error","call","value","set","cloneDeep","delete","get","values","Array","from","keys","size","clear"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var contentTypes = require('./content-types.js');
5
+
6
+ const MANY_RELATIONS = [
7
+ 'oneToMany',
8
+ 'manyToMany'
9
+ ];
10
+ const getRelationalFields = (contentType)=>{
11
+ return Object.keys(contentType.attributes).filter((attributeName)=>{
12
+ return contentType.attributes[attributeName].type === 'relation';
13
+ });
14
+ };
15
+ const isOneToAny = (attribute)=>contentTypes.isRelationalAttribute(attribute) && [
16
+ 'oneToOne',
17
+ 'oneToMany'
18
+ ].includes(attribute.relation);
19
+ const isManyToAny = (attribute)=>contentTypes.isRelationalAttribute(attribute) && [
20
+ 'manyToMany',
21
+ 'manyToOne'
22
+ ].includes(attribute.relation);
23
+ const isAnyToOne = (attribute)=>contentTypes.isRelationalAttribute(attribute) && [
24
+ 'oneToOne',
25
+ 'manyToOne'
26
+ ].includes(attribute.relation);
27
+ const isAnyToMany = (attribute)=>contentTypes.isRelationalAttribute(attribute) && [
28
+ 'oneToMany',
29
+ 'manyToMany'
30
+ ].includes(attribute.relation);
31
+ const isPolymorphic = (attribute)=>[
32
+ 'morphOne',
33
+ 'morphMany',
34
+ 'morphToOne',
35
+ 'morphToMany'
36
+ ].includes(attribute.relation);
37
+ const constants = {
38
+ MANY_RELATIONS
39
+ };
40
+ // Valid keys in the `options` property of relations reordering
41
+ // The value for each key must be a function that returns true if it is a valid value
42
+ const VALID_RELATION_ORDERING_KEYS = {
43
+ strict: fp.isBoolean
44
+ };
45
+
46
+ exports.VALID_RELATION_ORDERING_KEYS = VALID_RELATION_ORDERING_KEYS;
47
+ exports.constants = constants;
48
+ exports.getRelationalFields = getRelationalFields;
49
+ exports.isAnyToMany = isAnyToMany;
50
+ exports.isAnyToOne = isAnyToOne;
51
+ exports.isManyToAny = isManyToAny;
52
+ exports.isOneToAny = isOneToAny;
53
+ exports.isPolymorphic = isPolymorphic;
54
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sources":["../src/relations.ts"],"sourcesContent":["import { isBoolean } from 'lodash/fp';\nimport type { Attribute, Model } from './types';\n\nimport { isRelationalAttribute } from './content-types';\n\nconst MANY_RELATIONS = ['oneToMany', 'manyToMany'];\n\nexport const getRelationalFields = (contentType: Model) => {\n return Object.keys(contentType.attributes).filter((attributeName) => {\n return contentType.attributes[attributeName].type === 'relation';\n });\n};\n\nexport const isOneToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'oneToMany'].includes(attribute.relation);\n\nexport const isManyToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['manyToMany', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToOne = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToMany = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToMany', 'manyToMany'].includes(attribute.relation);\n\nexport const isPolymorphic = (attribute: any): any =>\n ['morphOne', 'morphMany', 'morphToOne', 'morphToMany'].includes(attribute.relation);\n\nexport const constants = {\n MANY_RELATIONS,\n};\n\n// Valid keys in the `options` property of relations reordering\n// The value for each key must be a function that returns true if it is a valid value\nexport const VALID_RELATION_ORDERING_KEYS: { [key: string]: (value: any) => boolean } = {\n strict: isBoolean,\n};\n"],"names":["MANY_RELATIONS","getRelationalFields","contentType","Object","keys","attributes","filter","attributeName","type","isOneToAny","attribute","isRelationalAttribute","includes","relation","isManyToAny","isAnyToOne","isAnyToMany","isPolymorphic","constants","VALID_RELATION_ORDERING_KEYS","strict","isBoolean"],"mappings":";;;;;AAKA,MAAMA,cAAiB,GAAA;AAAC,IAAA,WAAA;AAAa,IAAA;AAAa,CAAA;AAE3C,MAAMC,sBAAsB,CAACC,WAAAA,GAAAA;IAClC,OAAOC,MAAAA,CAAOC,IAAI,CAACF,WAAAA,CAAYG,UAAU,CAAEC,CAAAA,MAAM,CAAC,CAACC,aAAAA,GAAAA;AACjD,QAAA,OAAOL,YAAYG,UAAU,CAACE,aAAc,CAAA,CAACC,IAAI,KAAK,UAAA;AACxD,KAAA,CAAA;AACF;AAEaC,MAAAA,UAAAA,GAAa,CAACC,SAAAA,GACzBC,mCAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,UAAA;AAAY,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAE9EC,MAAAA,WAAAA,GAAc,CAACJ,SAAAA,GAC1BC,mCAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,YAAA;AAAc,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAEhFE,MAAAA,UAAAA,GAAa,CAACL,SAAAA,GACzBC,mCAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,UAAA;AAAY,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAE9EG,MAAAA,WAAAA,GAAc,CAACN,SAAAA,GAC1BC,mCAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,WAAA;AAAa,QAAA;AAAa,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAEtF,MAAMI,aAAgB,GAAA,CAACP,SAC5B,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA,WAAA;AAAa,QAAA,YAAA;AAAc,QAAA;AAAc,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;MAEvEK,SAAY,GAAA;AACvBlB,IAAAA;AACF;AAEA;AACA;MACamB,4BAA2E,GAAA;IACtFC,MAAQC,EAAAA;AACV;;;;;;;;;;;"}
@@ -0,0 +1,45 @@
1
+ import { isBoolean } from 'lodash/fp';
2
+ import { isRelationalAttribute } from './content-types.mjs';
3
+
4
+ const MANY_RELATIONS = [
5
+ 'oneToMany',
6
+ 'manyToMany'
7
+ ];
8
+ const getRelationalFields = (contentType)=>{
9
+ return Object.keys(contentType.attributes).filter((attributeName)=>{
10
+ return contentType.attributes[attributeName].type === 'relation';
11
+ });
12
+ };
13
+ const isOneToAny = (attribute)=>isRelationalAttribute(attribute) && [
14
+ 'oneToOne',
15
+ 'oneToMany'
16
+ ].includes(attribute.relation);
17
+ const isManyToAny = (attribute)=>isRelationalAttribute(attribute) && [
18
+ 'manyToMany',
19
+ 'manyToOne'
20
+ ].includes(attribute.relation);
21
+ const isAnyToOne = (attribute)=>isRelationalAttribute(attribute) && [
22
+ 'oneToOne',
23
+ 'manyToOne'
24
+ ].includes(attribute.relation);
25
+ const isAnyToMany = (attribute)=>isRelationalAttribute(attribute) && [
26
+ 'oneToMany',
27
+ 'manyToMany'
28
+ ].includes(attribute.relation);
29
+ const isPolymorphic = (attribute)=>[
30
+ 'morphOne',
31
+ 'morphMany',
32
+ 'morphToOne',
33
+ 'morphToMany'
34
+ ].includes(attribute.relation);
35
+ const constants = {
36
+ MANY_RELATIONS
37
+ };
38
+ // Valid keys in the `options` property of relations reordering
39
+ // The value for each key must be a function that returns true if it is a valid value
40
+ const VALID_RELATION_ORDERING_KEYS = {
41
+ strict: isBoolean
42
+ };
43
+
44
+ export { VALID_RELATION_ORDERING_KEYS, constants, getRelationalFields, isAnyToMany, isAnyToOne, isManyToAny, isOneToAny, isPolymorphic };
45
+ //# sourceMappingURL=relations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.mjs","sources":["../src/relations.ts"],"sourcesContent":["import { isBoolean } from 'lodash/fp';\nimport type { Attribute, Model } from './types';\n\nimport { isRelationalAttribute } from './content-types';\n\nconst MANY_RELATIONS = ['oneToMany', 'manyToMany'];\n\nexport const getRelationalFields = (contentType: Model) => {\n return Object.keys(contentType.attributes).filter((attributeName) => {\n return contentType.attributes[attributeName].type === 'relation';\n });\n};\n\nexport const isOneToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'oneToMany'].includes(attribute.relation);\n\nexport const isManyToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['manyToMany', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToOne = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToMany = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToMany', 'manyToMany'].includes(attribute.relation);\n\nexport const isPolymorphic = (attribute: any): any =>\n ['morphOne', 'morphMany', 'morphToOne', 'morphToMany'].includes(attribute.relation);\n\nexport const constants = {\n MANY_RELATIONS,\n};\n\n// Valid keys in the `options` property of relations reordering\n// The value for each key must be a function that returns true if it is a valid value\nexport const VALID_RELATION_ORDERING_KEYS: { [key: string]: (value: any) => boolean } = {\n strict: isBoolean,\n};\n"],"names":["MANY_RELATIONS","getRelationalFields","contentType","Object","keys","attributes","filter","attributeName","type","isOneToAny","attribute","isRelationalAttribute","includes","relation","isManyToAny","isAnyToOne","isAnyToMany","isPolymorphic","constants","VALID_RELATION_ORDERING_KEYS","strict","isBoolean"],"mappings":";;;AAKA,MAAMA,cAAiB,GAAA;AAAC,IAAA,WAAA;AAAa,IAAA;AAAa,CAAA;AAE3C,MAAMC,sBAAsB,CAACC,WAAAA,GAAAA;IAClC,OAAOC,MAAAA,CAAOC,IAAI,CAACF,WAAAA,CAAYG,UAAU,CAAEC,CAAAA,MAAM,CAAC,CAACC,aAAAA,GAAAA;AACjD,QAAA,OAAOL,YAAYG,UAAU,CAACE,aAAc,CAAA,CAACC,IAAI,KAAK,UAAA;AACxD,KAAA,CAAA;AACF;AAEaC,MAAAA,UAAAA,GAAa,CAACC,SAAAA,GACzBC,sBAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,UAAA;AAAY,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAE9EC,MAAAA,WAAAA,GAAc,CAACJ,SAAAA,GAC1BC,sBAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,YAAA;AAAc,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAEhFE,MAAAA,UAAAA,GAAa,CAACL,SAAAA,GACzBC,sBAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,UAAA;AAAY,QAAA;AAAY,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAE9EG,MAAAA,WAAAA,GAAc,CAACN,SAAAA,GAC1BC,sBAAsBD,SAAc,CAAA,IAAA;AAAC,QAAA,WAAA;AAAa,QAAA;AAAa,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;AAEtF,MAAMI,aAAgB,GAAA,CAACP,SAC5B,GAAA;AAAC,QAAA,UAAA;AAAY,QAAA,WAAA;AAAa,QAAA,YAAA;AAAc,QAAA;AAAc,KAAA,CAACE,QAAQ,CAACF,SAAUG,CAAAA,QAAQ;MAEvEK,SAAY,GAAA;AACvBlB,IAAAA;AACF;AAEA;AACA;MACamB,4BAA2E,GAAA;IACtFC,MAAQC,EAAAA;AACV;;;;"}
@@ -0,0 +1,195 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var contentTypes = require('../content-types.js');
5
+ var async = require('../async.js');
6
+ var index = require('./visitors/index.js');
7
+ var sanitizers = require('./sanitizers.js');
8
+ var traverseEntity = require('../traverse-entity.js');
9
+ var queryFilters = require('../traverse/query-filters.js');
10
+ var querySort = require('../traverse/query-sort.js');
11
+ var queryPopulate = require('../traverse/query-populate.js');
12
+ require('../traverse/query-fields.js');
13
+ var removeRestrictedFields = require('./visitors/remove-restricted-fields.js');
14
+ var removeRestrictedRelations = require('./visitors/remove-restricted-relations.js');
15
+
16
+ const createAPISanitizers = (opts)=>{
17
+ const { getModel } = opts;
18
+ const sanitizeInput = (data, schema, { auth } = {})=>{
19
+ if (!schema) {
20
+ throw new Error('Missing schema in sanitizeInput');
21
+ }
22
+ if (fp.isArray(data)) {
23
+ return Promise.all(data.map((entry)=>sanitizeInput(entry, schema, {
24
+ auth
25
+ })));
26
+ }
27
+ const nonWritableAttributes = contentTypes.getNonWritableAttributes(schema);
28
+ const transforms = [
29
+ // Remove first level ID in inputs
30
+ fp.omit(contentTypes.constants.ID_ATTRIBUTE),
31
+ fp.omit(contentTypes.constants.DOC_ID_ATTRIBUTE),
32
+ // Remove non-writable attributes
33
+ traverseEntity(removeRestrictedFields(nonWritableAttributes), {
34
+ schema,
35
+ getModel
36
+ })
37
+ ];
38
+ if (auth) {
39
+ // Remove restricted relations
40
+ transforms.push(traverseEntity(removeRestrictedRelations(auth), {
41
+ schema,
42
+ getModel
43
+ }));
44
+ }
45
+ // Apply sanitizers from registry if exists
46
+ opts?.sanitizers?.input?.forEach((sanitizer)=>transforms.push(sanitizer(schema)));
47
+ return async.pipe(...transforms)(data);
48
+ };
49
+ const sanitizeOutput = async (data, schema, { auth } = {})=>{
50
+ if (!schema) {
51
+ throw new Error('Missing schema in sanitizeOutput');
52
+ }
53
+ if (fp.isArray(data)) {
54
+ const res = new Array(data.length);
55
+ for(let i = 0; i < data.length; i += 1){
56
+ res[i] = await sanitizeOutput(data[i], schema, {
57
+ auth
58
+ });
59
+ }
60
+ return res;
61
+ }
62
+ const transforms = [
63
+ (data)=>sanitizers.defaultSanitizeOutput({
64
+ schema,
65
+ getModel
66
+ }, data)
67
+ ];
68
+ if (auth) {
69
+ transforms.push(traverseEntity(removeRestrictedRelations(auth), {
70
+ schema,
71
+ getModel
72
+ }));
73
+ }
74
+ // Apply sanitizers from registry if exists
75
+ opts?.sanitizers?.output?.forEach((sanitizer)=>transforms.push(sanitizer(schema)));
76
+ return async.pipe(...transforms)(data);
77
+ };
78
+ const sanitizeQuery = async (query, schema, { auth } = {})=>{
79
+ if (!schema) {
80
+ throw new Error('Missing schema in sanitizeQuery');
81
+ }
82
+ const { filters, sort, fields, populate } = query;
83
+ const sanitizedQuery = fp.cloneDeep(query);
84
+ if (filters) {
85
+ Object.assign(sanitizedQuery, {
86
+ filters: await sanitizeFilters(filters, schema, {
87
+ auth
88
+ })
89
+ });
90
+ }
91
+ if (sort) {
92
+ Object.assign(sanitizedQuery, {
93
+ sort: await sanitizeSort(sort, schema, {
94
+ auth
95
+ })
96
+ });
97
+ }
98
+ if (fields) {
99
+ Object.assign(sanitizedQuery, {
100
+ fields: await sanitizeFields(fields, schema)
101
+ });
102
+ }
103
+ if (populate) {
104
+ Object.assign(sanitizedQuery, {
105
+ populate: await sanitizePopulate(populate, schema)
106
+ });
107
+ }
108
+ return sanitizedQuery;
109
+ };
110
+ const sanitizeFilters = (filters, schema, { auth } = {})=>{
111
+ if (!schema) {
112
+ throw new Error('Missing schema in sanitizeFilters');
113
+ }
114
+ if (fp.isArray(filters)) {
115
+ return Promise.all(filters.map((filter)=>sanitizeFilters(filter, schema, {
116
+ auth
117
+ })));
118
+ }
119
+ const transforms = [
120
+ sanitizers.defaultSanitizeFilters({
121
+ schema,
122
+ getModel
123
+ })
124
+ ];
125
+ if (auth) {
126
+ transforms.push(queryFilters(removeRestrictedRelations(auth), {
127
+ schema,
128
+ getModel
129
+ }));
130
+ }
131
+ return async.pipe(...transforms)(filters);
132
+ };
133
+ const sanitizeSort = (sort, schema, { auth } = {})=>{
134
+ if (!schema) {
135
+ throw new Error('Missing schema in sanitizeSort');
136
+ }
137
+ const transforms = [
138
+ sanitizers.defaultSanitizeSort({
139
+ schema,
140
+ getModel
141
+ })
142
+ ];
143
+ if (auth) {
144
+ transforms.push(querySort(removeRestrictedRelations(auth), {
145
+ schema,
146
+ getModel
147
+ }));
148
+ }
149
+ return async.pipe(...transforms)(sort);
150
+ };
151
+ const sanitizeFields = (fields, schema)=>{
152
+ if (!schema) {
153
+ throw new Error('Missing schema in sanitizeFields');
154
+ }
155
+ const transforms = [
156
+ sanitizers.defaultSanitizeFields({
157
+ schema,
158
+ getModel
159
+ })
160
+ ];
161
+ return async.pipe(...transforms)(fields);
162
+ };
163
+ const sanitizePopulate = (populate, schema, { auth } = {})=>{
164
+ if (!schema) {
165
+ throw new Error('Missing schema in sanitizePopulate');
166
+ }
167
+ const transforms = [
168
+ sanitizers.defaultSanitizePopulate({
169
+ schema,
170
+ getModel
171
+ })
172
+ ];
173
+ if (auth) {
174
+ transforms.push(queryPopulate(removeRestrictedRelations(auth), {
175
+ schema,
176
+ getModel
177
+ }));
178
+ }
179
+ return async.pipe(...transforms)(populate);
180
+ };
181
+ return {
182
+ input: sanitizeInput,
183
+ output: sanitizeOutput,
184
+ query: sanitizeQuery,
185
+ filters: sanitizeFilters,
186
+ sort: sanitizeSort,
187
+ fields: sanitizeFields,
188
+ populate: sanitizePopulate
189
+ };
190
+ };
191
+
192
+ exports.visitors = index;
193
+ exports.sanitizers = sanitizers;
194
+ exports.createAPISanitizers = createAPISanitizers;
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/sanitize/index.ts"],"sourcesContent":["import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit } from 'lodash/fp';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\n\nexport interface Options {\n auth?: unknown;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (data: unknown, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(data.map((entry) => sanitizeInput(entry, schema, { auth })));\n }\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res = new Array(data.length);\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (sort) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n"],"names":["createAPISanitizers","opts","getModel","sanitizeInput","data","schema","auth","Error","isArray","Promise","all","map","entry","nonWritableAttributes","getNonWritableAttributes","transforms","omit","constants","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","traverseEntity","visitors","push","sanitizers","input","forEach","sanitizer","pipeAsync","sanitizeOutput","res","Array","length","i","output","sanitizeQuery","query","filters","sort","fields","populate","sanitizedQuery","cloneDeep","Object","assign","sanitizeFilters","sanitizeSort","sanitizeFields","sanitizePopulate","filter","traverseQueryFilters","traverseQuerySort","traverseQueryPopulate"],"mappings":"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"}