@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.
- package/dist/async.js +28 -0
- package/dist/async.js.map +1 -0
- package/dist/async.mjs +24 -0
- package/dist/async.mjs.map +1 -0
- package/dist/content-types.js +201 -0
- package/dist/content-types.js.map +1 -0
- package/dist/content-types.mjs +167 -0
- package/dist/content-types.mjs.map +1 -0
- package/dist/convert-query-params.js +512 -0
- package/dist/convert-query-params.js.map +1 -0
- package/dist/convert-query-params.mjs +510 -0
- package/dist/convert-query-params.mjs.map +1 -0
- package/dist/env-helper.js +81 -0
- package/dist/env-helper.js.map +1 -0
- package/dist/env-helper.mjs +79 -0
- package/dist/env-helper.mjs.map +1 -0
- package/dist/errors.js +104 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.mjs +88 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/file.js +57 -0
- package/dist/file.js.map +1 -0
- package/dist/file.mjs +50 -0
- package/dist/file.mjs.map +1 -0
- package/dist/format-yup-error.js +19 -0
- package/dist/format-yup-error.js.map +1 -0
- package/dist/format-yup-error.mjs +17 -0
- package/dist/format-yup-error.mjs.map +1 -0
- package/dist/hooks.js +86 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +80 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/import-default.js +9 -0
- package/dist/import-default.js.map +1 -0
- package/dist/import-default.mjs +7 -0
- package/dist/import-default.mjs.map +1 -0
- package/dist/index.js +54 -4358
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -4317
- package/dist/index.mjs.map +1 -1
- package/dist/machine-id.js +17 -0
- package/dist/machine-id.js.map +1 -0
- package/dist/machine-id.mjs +15 -0
- package/dist/machine-id.mjs.map +1 -0
- package/dist/operators.js +79 -0
- package/dist/operators.js.map +1 -0
- package/dist/operators.mjs +76 -0
- package/dist/operators.mjs.map +1 -0
- package/dist/package-manager.js +36 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/package-manager.mjs +33 -0
- package/dist/package-manager.mjs.map +1 -0
- package/dist/pagination.js +163 -0
- package/dist/pagination.js.map +1 -0
- package/dist/pagination.mjs +159 -0
- package/dist/pagination.mjs.map +1 -0
- package/dist/parse-type.js +140 -0
- package/dist/parse-type.js.map +1 -0
- package/dist/parse-type.mjs +118 -0
- package/dist/parse-type.mjs.map +1 -0
- package/dist/policy.js +33 -0
- package/dist/policy.js.map +1 -0
- package/dist/policy.mjs +30 -0
- package/dist/policy.mjs.map +1 -0
- package/dist/primitives/arrays.js +7 -0
- package/dist/primitives/arrays.js.map +1 -0
- package/dist/primitives/arrays.mjs +5 -0
- package/dist/primitives/arrays.mjs.map +1 -0
- package/dist/primitives/dates.js +11 -0
- package/dist/primitives/dates.js.map +1 -0
- package/dist/primitives/dates.mjs +9 -0
- package/dist/primitives/dates.mjs.map +1 -0
- package/dist/primitives/objects.js +13 -0
- package/dist/primitives/objects.js.map +1 -0
- package/dist/primitives/objects.mjs +11 -0
- package/dist/primitives/objects.mjs.map +1 -0
- package/dist/primitives/strings.js +49 -0
- package/dist/primitives/strings.js.map +1 -0
- package/dist/primitives/strings.mjs +38 -0
- package/dist/primitives/strings.mjs.map +1 -0
- package/dist/print-value.js +42 -0
- package/dist/print-value.js.map +1 -0
- package/dist/print-value.mjs +40 -0
- package/dist/print-value.mjs.map +1 -0
- package/dist/provider-factory.js +82 -0
- package/dist/provider-factory.js.map +1 -0
- package/dist/provider-factory.mjs +80 -0
- package/dist/provider-factory.mjs.map +1 -0
- package/dist/relations.js +54 -0
- package/dist/relations.js.map +1 -0
- package/dist/relations.mjs +45 -0
- package/dist/relations.mjs.map +1 -0
- package/dist/sanitize/index.js +195 -0
- package/dist/sanitize/index.js.map +1 -0
- package/dist/sanitize/index.mjs +194 -0
- package/dist/sanitize/index.mjs.map +1 -0
- package/dist/sanitize/sanitizers.js +173 -0
- package/dist/sanitize/sanitizers.js.map +1 -0
- package/dist/sanitize/sanitizers.mjs +166 -0
- package/dist/sanitize/sanitizers.mjs.map +1 -0
- package/dist/sanitize/visitors/expand-wildcard-populate.js +20 -0
- package/dist/sanitize/visitors/expand-wildcard-populate.js.map +1 -0
- package/dist/sanitize/visitors/expand-wildcard-populate.mjs +18 -0
- package/dist/sanitize/visitors/expand-wildcard-populate.mjs.map +1 -0
- package/dist/sanitize/visitors/index.js +22 -0
- package/dist/sanitize/visitors/index.js.map +1 -0
- package/dist/sanitize/visitors/index.mjs +9 -0
- package/dist/sanitize/visitors/index.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-disallowed-fields.js +87 -0
- package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -0
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs +85 -0
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-dynamic-zones.js +12 -0
- package/dist/sanitize/visitors/remove-dynamic-zones.js.map +1 -0
- package/dist/sanitize/visitors/remove-dynamic-zones.mjs +10 -0
- package/dist/sanitize/visitors/remove-dynamic-zones.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-morph-to-relations.js +12 -0
- package/dist/sanitize/visitors/remove-morph-to-relations.js.map +1 -0
- package/dist/sanitize/visitors/remove-morph-to-relations.mjs +10 -0
- package/dist/sanitize/visitors/remove-morph-to-relations.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-password.js +10 -0
- package/dist/sanitize/visitors/remove-password.js.map +1 -0
- package/dist/sanitize/visitors/remove-password.mjs +8 -0
- package/dist/sanitize/visitors/remove-password.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-private.js +16 -0
- package/dist/sanitize/visitors/remove-private.js.map +1 -0
- package/dist/sanitize/visitors/remove-private.mjs +14 -0
- package/dist/sanitize/visitors/remove-private.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-restricted-fields.js +28 -0
- package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -0
- package/dist/sanitize/visitors/remove-restricted-fields.mjs +26 -0
- package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -0
- package/dist/sanitize/visitors/remove-restricted-relations.js +116 -0
- package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -0
- package/dist/sanitize/visitors/remove-restricted-relations.mjs +114 -0
- package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -0
- package/dist/set-creator-fields.js +18 -0
- package/dist/set-creator-fields.js.map +1 -0
- package/dist/set-creator-fields.mjs +16 -0
- package/dist/set-creator-fields.mjs.map +1 -0
- package/dist/template.js +18 -0
- package/dist/template.js.map +1 -0
- package/dist/template.mjs +15 -0
- package/dist/template.mjs.map +1 -0
- package/dist/traverse/factory.js +158 -0
- package/dist/traverse/factory.js.map +1 -0
- package/dist/traverse/factory.mjs +156 -0
- package/dist/traverse/factory.mjs.map +1 -0
- package/dist/traverse/index.js +14 -0
- package/dist/traverse/index.js.map +1 -0
- package/dist/traverse/index.mjs +5 -0
- package/dist/traverse/index.mjs.map +1 -0
- package/dist/traverse/query-fields.js +41 -0
- package/dist/traverse/query-fields.js.map +1 -0
- package/dist/traverse/query-fields.mjs +39 -0
- package/dist/traverse/query-fields.mjs.map +1 -0
- package/dist/traverse/query-filters.js +114 -0
- package/dist/traverse/query-filters.js.map +1 -0
- package/dist/traverse/query-filters.mjs +112 -0
- package/dist/traverse/query-filters.mjs.map +1 -0
- package/dist/traverse/query-populate.js +280 -0
- package/dist/traverse/query-populate.js.map +1 -0
- package/dist/traverse/query-populate.mjs +278 -0
- package/dist/traverse/query-populate.mjs.map +1 -0
- package/dist/traverse/query-sort.js +144 -0
- package/dist/traverse/query-sort.js.map +1 -0
- package/dist/traverse/query-sort.mjs +142 -0
- package/dist/traverse/query-sort.mjs.map +1 -0
- package/dist/traverse-entity.js +170 -0
- package/dist/traverse-entity.js.map +1 -0
- package/dist/traverse-entity.mjs +168 -0
- package/dist/traverse-entity.mjs.map +1 -0
- package/dist/validate/index.js +218 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/index.mjs +217 -0
- package/dist/validate/index.mjs.map +1 -0
- package/dist/validate/utils.js +27 -0
- package/dist/validate/utils.js.map +1 -0
- package/dist/validate/utils.mjs +24 -0
- package/dist/validate/utils.mjs.map +1 -0
- package/dist/validate/validators.js +369 -0
- package/dist/validate/validators.js.map +1 -0
- package/dist/validate/validators.mjs +356 -0
- package/dist/validate/validators.mjs.map +1 -0
- package/dist/validate/visitors/index.js +22 -0
- package/dist/validate/visitors/index.js.map +1 -0
- package/dist/validate/visitors/index.mjs +9 -0
- package/dist/validate/visitors/index.mjs.map +1 -0
- package/dist/validate/visitors/throw-disallowed-fields.js +91 -0
- package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -0
- package/dist/validate/visitors/throw-disallowed-fields.mjs +89 -0
- package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -0
- package/dist/validate/visitors/throw-dynamic-zones.js +16 -0
- package/dist/validate/visitors/throw-dynamic-zones.js.map +1 -0
- package/dist/validate/visitors/throw-dynamic-zones.mjs +14 -0
- package/dist/validate/visitors/throw-dynamic-zones.mjs.map +1 -0
- package/dist/validate/visitors/throw-morph-to-relations.js +16 -0
- package/dist/validate/visitors/throw-morph-to-relations.js.map +1 -0
- package/dist/validate/visitors/throw-morph-to-relations.mjs +14 -0
- package/dist/validate/visitors/throw-morph-to-relations.mjs.map +1 -0
- package/dist/validate/visitors/throw-password.js +15 -0
- package/dist/validate/visitors/throw-password.js.map +1 -0
- package/dist/validate/visitors/throw-password.mjs +13 -0
- package/dist/validate/visitors/throw-password.mjs.map +1 -0
- package/dist/validate/visitors/throw-private.js +20 -0
- package/dist/validate/visitors/throw-private.js.map +1 -0
- package/dist/validate/visitors/throw-private.mjs +18 -0
- package/dist/validate/visitors/throw-private.mjs.map +1 -0
- package/dist/validate/visitors/throw-restricted-fields.js +36 -0
- package/dist/validate/visitors/throw-restricted-fields.js.map +1 -0
- package/dist/validate/visitors/throw-restricted-fields.mjs +34 -0
- package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -0
- package/dist/validate/visitors/throw-restricted-relations.js +125 -0
- package/dist/validate/visitors/throw-restricted-relations.js.map +1 -0
- package/dist/validate/visitors/throw-restricted-relations.mjs +123 -0
- package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -0
- package/dist/validate/visitors/throw-unrecognized-fields.js +66 -0
- package/dist/validate/visitors/throw-unrecognized-fields.js.map +1 -0
- package/dist/validate/visitors/throw-unrecognized-fields.mjs +64 -0
- package/dist/validate/visitors/throw-unrecognized-fields.mjs.map +1 -0
- package/dist/validators.js +60 -0
- package/dist/validators.js.map +1 -0
- package/dist/validators.mjs +37 -0
- package/dist/validators.mjs.map +1 -0
- package/dist/yup.js +101 -0
- package/dist/yup.js.map +1 -0
- package/dist/yup.mjs +74 -0
- package/dist/yup.mjs.map +1 -0
- package/dist/zod.js +31 -0
- package/dist/zod.js.map +1 -0
- package/dist/zod.mjs +29 -0
- package/dist/zod.mjs.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|