@strapi/utils 5.12.1 → 5.12.3
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,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var factory = require('./factory.js');
|
|
5
|
+
|
|
6
|
+
const isStringArray = (value)=>{
|
|
7
|
+
return fp.isArray(value) && value.every(fp.isString);
|
|
8
|
+
};
|
|
9
|
+
const fields = factory()// Intercept array of strings
|
|
10
|
+
// e.g. fields=['title', 'description']
|
|
11
|
+
.intercept(isStringArray, async (visitor, options, fields, { recurse })=>{
|
|
12
|
+
return Promise.all(fields.map((field)=>recurse(visitor, options, field)));
|
|
13
|
+
})// Intercept comma separated fields (as string)
|
|
14
|
+
// e.g. fields='title,description'
|
|
15
|
+
.intercept((value)=>fp.isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
|
|
16
|
+
return Promise.all(fields.split(',').map((field)=>recurse(visitor, options, field)));
|
|
17
|
+
})// Return wildcards as is
|
|
18
|
+
.intercept((value)=>fp.eq('*', value), fp.constant('*'))// Parse string values
|
|
19
|
+
// Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
|
|
20
|
+
// thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
|
|
21
|
+
.parse(fp.isString, ()=>({
|
|
22
|
+
transform: fp.trim,
|
|
23
|
+
remove (key, data) {
|
|
24
|
+
return data === key ? undefined : data;
|
|
25
|
+
},
|
|
26
|
+
set (_key, _value, data) {
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
keys (data) {
|
|
30
|
+
return [
|
|
31
|
+
data
|
|
32
|
+
];
|
|
33
|
+
},
|
|
34
|
+
get (key, data) {
|
|
35
|
+
return key === data ? data : undefined;
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
var traverseQueryFields = fp.curry(fields.traverse);
|
|
39
|
+
|
|
40
|
+
module.exports = traverseQueryFields;
|
|
41
|
+
//# sourceMappingURL=query-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,UAAQD,CAAAA,KAAAA,CAAAA,IAAUA,KAAME,CAAAA,KAAK,CAACC,WAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,SACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,OAAAA,EAASC,SAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAOQ,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAQF,CAAAA,OAAAA,EAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACN,KAA2BG,GAAAA,WAAAA,CAASH,UAAUA,KAAMc,CAAAA,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAASC,EAAAA,OAAAA,EAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAQC,CAAAA,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAKH,CAAAA,CAAAA,GAAG,CAAC,CAACC,KAAUJ,GAAAA,OAAAA,CAAQF,SAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACN,KAA2BgB,GAAAA,KAAAA,CAAG,KAAKhB,KAAQiB,CAAAA,EAAAA,WAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,WAAU,EAAA,KAAO;QACtBgB,SAAWC,EAAAA,OAAAA;QAEXC,MAAOC,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAYD,GAAAA,IAAAA;AACpC,SAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,SAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,SAAA;QAEAM,GAAIP,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAOC,GAAAA,SAAAA;AAC/B;KACF,CAAA,CAAA;AAEF,0BAAeM,QAAAA,CAAM1B,MAAO2B,CAAAA,QAAQ,CAAE;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { isString, eq, constant, trim, curry, isArray } from 'lodash/fp';
|
|
2
|
+
import traverseFactory from './factory.mjs';
|
|
3
|
+
|
|
4
|
+
const isStringArray = (value)=>{
|
|
5
|
+
return isArray(value) && value.every(isString);
|
|
6
|
+
};
|
|
7
|
+
const fields = traverseFactory()// Intercept array of strings
|
|
8
|
+
// e.g. fields=['title', 'description']
|
|
9
|
+
.intercept(isStringArray, async (visitor, options, fields, { recurse })=>{
|
|
10
|
+
return Promise.all(fields.map((field)=>recurse(visitor, options, field)));
|
|
11
|
+
})// Intercept comma separated fields (as string)
|
|
12
|
+
// e.g. fields='title,description'
|
|
13
|
+
.intercept((value)=>isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
|
|
14
|
+
return Promise.all(fields.split(',').map((field)=>recurse(visitor, options, field)));
|
|
15
|
+
})// Return wildcards as is
|
|
16
|
+
.intercept((value)=>eq('*', value), constant('*'))// Parse string values
|
|
17
|
+
// Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
|
|
18
|
+
// thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
|
|
19
|
+
.parse(isString, ()=>({
|
|
20
|
+
transform: trim,
|
|
21
|
+
remove (key, data) {
|
|
22
|
+
return data === key ? undefined : data;
|
|
23
|
+
},
|
|
24
|
+
set (_key, _value, data) {
|
|
25
|
+
return data;
|
|
26
|
+
},
|
|
27
|
+
keys (data) {
|
|
28
|
+
return [
|
|
29
|
+
data
|
|
30
|
+
];
|
|
31
|
+
},
|
|
32
|
+
get (key, data) {
|
|
33
|
+
return key === data ? data : undefined;
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
var traverseQueryFields = curry(fields.traverse);
|
|
37
|
+
|
|
38
|
+
export { traverseQueryFields as default };
|
|
39
|
+
//# sourceMappingURL=query-fields.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,OAAQD,CAAAA,KAAAA,CAAAA,IAAUA,KAAME,CAAAA,KAAK,CAACC,QAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,iBACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,OAAAA,EAASC,SAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAOQ,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAQF,CAAAA,OAAAA,EAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACN,KAA2BG,GAAAA,QAAAA,CAASH,UAAUA,KAAMc,CAAAA,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAASC,EAAAA,OAAAA,EAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAQC,CAAAA,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAKH,CAAAA,CAAAA,GAAG,CAAC,CAACC,KAAUJ,GAAAA,OAAAA,CAAQF,SAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACN,KAA2BgB,GAAAA,EAAAA,CAAG,KAAKhB,KAAQiB,CAAAA,EAAAA,QAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,QAAU,EAAA,KAAO;QACtBgB,SAAWC,EAAAA,IAAAA;QAEXC,MAAOC,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAYD,GAAAA,IAAAA;AACpC,SAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,SAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,SAAA;QAEAM,GAAIP,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAOC,GAAAA,SAAAA;AAC/B;KACF,CAAA,CAAA;AAEF,0BAAeM,KAAAA,CAAM1B,MAAO2B,CAAAA,QAAQ,CAAE;;;;"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var factory = require('./factory.js');
|
|
5
|
+
|
|
6
|
+
const isObj = (value)=>fp.isObject(value);
|
|
7
|
+
const filters = factory().intercept(// Intercept filters arrays and apply the traversal to each one individually
|
|
8
|
+
fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
9
|
+
return Promise.all(filters.map((filter, i)=>{
|
|
10
|
+
// In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
|
|
11
|
+
// can have a value array, thus we can update the raw path but not the attribute one
|
|
12
|
+
const newPath = options.path ? {
|
|
13
|
+
...options.path,
|
|
14
|
+
raw: `${options.path.raw}[${i}]`
|
|
15
|
+
} : options.path;
|
|
16
|
+
return recurse(visitor, {
|
|
17
|
+
...options,
|
|
18
|
+
path: newPath
|
|
19
|
+
}, filter);
|
|
20
|
+
})).then((res)=>res.filter((val)=>!(fp.isObject(val) && fp.isEmpty(val))));
|
|
21
|
+
}).intercept(// Ignore non object filters and return the value as-is
|
|
22
|
+
(filters)=>!fp.isObject(filters), (_, __, filters)=>{
|
|
23
|
+
return filters;
|
|
24
|
+
})// Parse object values
|
|
25
|
+
.parse(isObj, ()=>({
|
|
26
|
+
transform: fp.cloneDeep,
|
|
27
|
+
remove (key, data) {
|
|
28
|
+
return fp.omit(key, data);
|
|
29
|
+
},
|
|
30
|
+
set (key, value, data) {
|
|
31
|
+
return {
|
|
32
|
+
...data,
|
|
33
|
+
[key]: value
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
keys (data) {
|
|
37
|
+
return Object.keys(data);
|
|
38
|
+
},
|
|
39
|
+
get (key, data) {
|
|
40
|
+
return data[key];
|
|
41
|
+
}
|
|
42
|
+
}))// Ignore null or undefined values
|
|
43
|
+
.ignore(({ value })=>fp.isNil(value))// Recursion on operators (non attributes)
|
|
44
|
+
.on(({ attribute })=>fp.isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
45
|
+
const parent = {
|
|
46
|
+
key,
|
|
47
|
+
path,
|
|
48
|
+
schema,
|
|
49
|
+
attribute
|
|
50
|
+
};
|
|
51
|
+
set(key, await recurse(visitor, {
|
|
52
|
+
schema,
|
|
53
|
+
path,
|
|
54
|
+
getModel,
|
|
55
|
+
parent
|
|
56
|
+
}, value));
|
|
57
|
+
})// Handle relation recursion
|
|
58
|
+
.onRelation(async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse })=>{
|
|
59
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
60
|
+
if (isMorphRelation) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const parent = {
|
|
64
|
+
key,
|
|
65
|
+
path,
|
|
66
|
+
schema,
|
|
67
|
+
attribute
|
|
68
|
+
};
|
|
69
|
+
const targetSchemaUID = attribute.target;
|
|
70
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
71
|
+
const newValue = await recurse(visitor, {
|
|
72
|
+
schema: targetSchema,
|
|
73
|
+
path,
|
|
74
|
+
getModel,
|
|
75
|
+
parent
|
|
76
|
+
}, value);
|
|
77
|
+
set(key, newValue);
|
|
78
|
+
}).onComponent(async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse })=>{
|
|
79
|
+
const parent = {
|
|
80
|
+
key,
|
|
81
|
+
path,
|
|
82
|
+
schema,
|
|
83
|
+
attribute
|
|
84
|
+
};
|
|
85
|
+
const targetSchema = getModel(attribute.component);
|
|
86
|
+
const newValue = await recurse(visitor, {
|
|
87
|
+
schema: targetSchema,
|
|
88
|
+
path,
|
|
89
|
+
getModel,
|
|
90
|
+
parent
|
|
91
|
+
}, value);
|
|
92
|
+
set(key, newValue);
|
|
93
|
+
})// Handle media recursion
|
|
94
|
+
.onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse })=>{
|
|
95
|
+
const parent = {
|
|
96
|
+
key,
|
|
97
|
+
path,
|
|
98
|
+
schema,
|
|
99
|
+
attribute
|
|
100
|
+
};
|
|
101
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
102
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
103
|
+
const newValue = await recurse(visitor, {
|
|
104
|
+
schema: targetSchema,
|
|
105
|
+
path,
|
|
106
|
+
getModel,
|
|
107
|
+
parent
|
|
108
|
+
}, value);
|
|
109
|
+
set(key, newValue);
|
|
110
|
+
});
|
|
111
|
+
var traverseQueryFilters = fp.curry(filters.traverse);
|
|
112
|
+
|
|
113
|
+
module.exports = traverseQueryFilters;
|
|
114
|
+
//# sourceMappingURL=query-filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-filters.js","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n });\n\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","filters","traverseFactory","intercept","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","keys","Object","get","ignore","isNil","on","attribute","schema","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","curry","traverse"],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { isArray, isObject, isEmpty, cloneDeep, omit, isNil, curry } from 'lodash/fp';
|
|
2
|
+
import traverseFactory from './factory.mjs';
|
|
3
|
+
|
|
4
|
+
const isObj = (value)=>isObject(value);
|
|
5
|
+
const filters = traverseFactory().intercept(// Intercept filters arrays and apply the traversal to each one individually
|
|
6
|
+
isArray, async (visitor, options, filters, { recurse })=>{
|
|
7
|
+
return Promise.all(filters.map((filter, i)=>{
|
|
8
|
+
// In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
|
|
9
|
+
// can have a value array, thus we can update the raw path but not the attribute one
|
|
10
|
+
const newPath = options.path ? {
|
|
11
|
+
...options.path,
|
|
12
|
+
raw: `${options.path.raw}[${i}]`
|
|
13
|
+
} : options.path;
|
|
14
|
+
return recurse(visitor, {
|
|
15
|
+
...options,
|
|
16
|
+
path: newPath
|
|
17
|
+
}, filter);
|
|
18
|
+
})).then((res)=>res.filter((val)=>!(isObject(val) && isEmpty(val))));
|
|
19
|
+
}).intercept(// Ignore non object filters and return the value as-is
|
|
20
|
+
(filters)=>!isObject(filters), (_, __, filters)=>{
|
|
21
|
+
return filters;
|
|
22
|
+
})// Parse object values
|
|
23
|
+
.parse(isObj, ()=>({
|
|
24
|
+
transform: cloneDeep,
|
|
25
|
+
remove (key, data) {
|
|
26
|
+
return omit(key, data);
|
|
27
|
+
},
|
|
28
|
+
set (key, value, data) {
|
|
29
|
+
return {
|
|
30
|
+
...data,
|
|
31
|
+
[key]: value
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
keys (data) {
|
|
35
|
+
return Object.keys(data);
|
|
36
|
+
},
|
|
37
|
+
get (key, data) {
|
|
38
|
+
return data[key];
|
|
39
|
+
}
|
|
40
|
+
}))// Ignore null or undefined values
|
|
41
|
+
.ignore(({ value })=>isNil(value))// Recursion on operators (non attributes)
|
|
42
|
+
.on(({ attribute })=>isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
43
|
+
const parent = {
|
|
44
|
+
key,
|
|
45
|
+
path,
|
|
46
|
+
schema,
|
|
47
|
+
attribute
|
|
48
|
+
};
|
|
49
|
+
set(key, await recurse(visitor, {
|
|
50
|
+
schema,
|
|
51
|
+
path,
|
|
52
|
+
getModel,
|
|
53
|
+
parent
|
|
54
|
+
}, value));
|
|
55
|
+
})// Handle relation recursion
|
|
56
|
+
.onRelation(async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse })=>{
|
|
57
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
58
|
+
if (isMorphRelation) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const parent = {
|
|
62
|
+
key,
|
|
63
|
+
path,
|
|
64
|
+
schema,
|
|
65
|
+
attribute
|
|
66
|
+
};
|
|
67
|
+
const targetSchemaUID = attribute.target;
|
|
68
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
69
|
+
const newValue = await recurse(visitor, {
|
|
70
|
+
schema: targetSchema,
|
|
71
|
+
path,
|
|
72
|
+
getModel,
|
|
73
|
+
parent
|
|
74
|
+
}, value);
|
|
75
|
+
set(key, newValue);
|
|
76
|
+
}).onComponent(async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse })=>{
|
|
77
|
+
const parent = {
|
|
78
|
+
key,
|
|
79
|
+
path,
|
|
80
|
+
schema,
|
|
81
|
+
attribute
|
|
82
|
+
};
|
|
83
|
+
const targetSchema = getModel(attribute.component);
|
|
84
|
+
const newValue = await recurse(visitor, {
|
|
85
|
+
schema: targetSchema,
|
|
86
|
+
path,
|
|
87
|
+
getModel,
|
|
88
|
+
parent
|
|
89
|
+
}, value);
|
|
90
|
+
set(key, newValue);
|
|
91
|
+
})// Handle media recursion
|
|
92
|
+
.onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse })=>{
|
|
93
|
+
const parent = {
|
|
94
|
+
key,
|
|
95
|
+
path,
|
|
96
|
+
schema,
|
|
97
|
+
attribute
|
|
98
|
+
};
|
|
99
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
100
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
101
|
+
const newValue = await recurse(visitor, {
|
|
102
|
+
schema: targetSchema,
|
|
103
|
+
path,
|
|
104
|
+
getModel,
|
|
105
|
+
parent
|
|
106
|
+
}, value);
|
|
107
|
+
set(key, newValue);
|
|
108
|
+
});
|
|
109
|
+
var traverseQueryFilters = curry(filters.traverse);
|
|
110
|
+
|
|
111
|
+
export { traverseQueryFilters as default };
|
|
112
|
+
//# sourceMappingURL=query-filters.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n });\n\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","filters","traverseFactory","intercept","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","keys","Object","get","ignore","isNil","on","attribute","schema","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","curry","traverse"],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var factory = require('./factory.js');
|
|
5
|
+
var contentTypes = require('../content-types.js');
|
|
6
|
+
|
|
7
|
+
const isKeyword = (keyword)=>{
|
|
8
|
+
return ({ key, attribute })=>{
|
|
9
|
+
return !attribute && keyword === key;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
const isWildcard = (value)=>value === '*';
|
|
13
|
+
const isPopulateString = (value)=>{
|
|
14
|
+
return fp.isString(value) && !isWildcard(value);
|
|
15
|
+
};
|
|
16
|
+
const isStringArray = (value)=>fp.isArray(value) && value.every(fp.isString);
|
|
17
|
+
const isObj = (value)=>fp.isObject(value);
|
|
18
|
+
const populate = factory().intercept(isPopulateString, async (visitor, options, populate, { recurse })=>{
|
|
19
|
+
/**
|
|
20
|
+
* Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)
|
|
21
|
+
* This gives a consistent structure to track the "parent" node of each nested populate clause
|
|
22
|
+
*/ const populateObject = pathsToObjectPopulate([
|
|
23
|
+
populate
|
|
24
|
+
]);
|
|
25
|
+
const traversedPopulate = await recurse(visitor, options, populateObject);
|
|
26
|
+
const [result] = objectPopulateToPaths(traversedPopulate);
|
|
27
|
+
return result;
|
|
28
|
+
})// Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items
|
|
29
|
+
.intercept(isStringArray, async (visitor, options, populate, { recurse })=>{
|
|
30
|
+
const paths = await Promise.all(populate.map((subClause)=>recurse(visitor, options, subClause)));
|
|
31
|
+
return paths.filter((item)=>!fp.isNil(item));
|
|
32
|
+
})// for wildcard, generate custom utilities to modify the values
|
|
33
|
+
.parse(isWildcard, ()=>({
|
|
34
|
+
/**
|
|
35
|
+
* Since value is '*', we don't need to transform it
|
|
36
|
+
*/ transform: fp.identity,
|
|
37
|
+
/**
|
|
38
|
+
* '*' isn't a key/value structure, so regardless
|
|
39
|
+
* of the given key, it returns the data ('*')
|
|
40
|
+
*/ get: (_key, data)=>data,
|
|
41
|
+
/**
|
|
42
|
+
* '*' isn't a key/value structure, so regardless
|
|
43
|
+
* of the given `key`, use `value` as the new `data`
|
|
44
|
+
*/ set: (_key, value)=>value,
|
|
45
|
+
/**
|
|
46
|
+
* '*' isn't a key/value structure, but we need to simulate at least one to enable
|
|
47
|
+
* the data traversal. We're using '' since it represents a falsy string value
|
|
48
|
+
*/ keys: fp.constant([
|
|
49
|
+
''
|
|
50
|
+
]),
|
|
51
|
+
/**
|
|
52
|
+
* Removing '*' means setting it to undefined, regardless of the given key
|
|
53
|
+
*/ remove: fp.constant(undefined)
|
|
54
|
+
}))// Parse string values
|
|
55
|
+
.parse(fp.isString, ()=>{
|
|
56
|
+
const tokenize = fp.split('.');
|
|
57
|
+
const recompose = fp.join('.');
|
|
58
|
+
return {
|
|
59
|
+
transform: fp.trim,
|
|
60
|
+
remove (key, data) {
|
|
61
|
+
const [root] = tokenize(data);
|
|
62
|
+
return root === key ? undefined : data;
|
|
63
|
+
},
|
|
64
|
+
set (key, value, data) {
|
|
65
|
+
const [root] = tokenize(data);
|
|
66
|
+
if (root !== key) {
|
|
67
|
+
return data;
|
|
68
|
+
}
|
|
69
|
+
return fp.isNil(value) || fp.isEmpty(value) ? root : `${root}.${value}`;
|
|
70
|
+
},
|
|
71
|
+
keys (data) {
|
|
72
|
+
const v = fp.first(tokenize(data));
|
|
73
|
+
return v ? [
|
|
74
|
+
v
|
|
75
|
+
] : [];
|
|
76
|
+
},
|
|
77
|
+
get (key, data) {
|
|
78
|
+
const [root, ...rest] = tokenize(data);
|
|
79
|
+
return key === root ? recompose(rest) : undefined;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
})// Parse object values
|
|
83
|
+
.parse(isObj, ()=>({
|
|
84
|
+
transform: fp.cloneDeep,
|
|
85
|
+
remove (key, data) {
|
|
86
|
+
// eslint-disable-next-line no-unused-vars
|
|
87
|
+
const { [key]: ignored, ...rest } = data;
|
|
88
|
+
return rest;
|
|
89
|
+
},
|
|
90
|
+
set (key, value, data) {
|
|
91
|
+
return {
|
|
92
|
+
...data,
|
|
93
|
+
[key]: value
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
keys (data) {
|
|
97
|
+
return Object.keys(data);
|
|
98
|
+
},
|
|
99
|
+
get (key, data) {
|
|
100
|
+
return data[key];
|
|
101
|
+
}
|
|
102
|
+
})).ignore(({ key, attribute })=>{
|
|
103
|
+
// we don't want to recurse using traversePopulate and instead let
|
|
104
|
+
// the visitors recurse with the appropriate traversal (sort, filters, etc...)
|
|
105
|
+
return [
|
|
106
|
+
'sort',
|
|
107
|
+
'filters',
|
|
108
|
+
'fields'
|
|
109
|
+
].includes(key) && !attribute;
|
|
110
|
+
}).on(// Handle recursion on populate."populate"
|
|
111
|
+
isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
112
|
+
const parent = {
|
|
113
|
+
key,
|
|
114
|
+
path,
|
|
115
|
+
schema,
|
|
116
|
+
attribute
|
|
117
|
+
};
|
|
118
|
+
const newValue = await recurse(visitor, {
|
|
119
|
+
schema,
|
|
120
|
+
path,
|
|
121
|
+
getModel,
|
|
122
|
+
parent
|
|
123
|
+
}, value);
|
|
124
|
+
set(key, newValue);
|
|
125
|
+
}).on(isKeyword('on'), async ({ key, visitor, path, value, getModel, parent }, { set, recurse })=>{
|
|
126
|
+
const newOn = {};
|
|
127
|
+
if (!isObj(value)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (const [uid, subPopulate] of Object.entries(value)){
|
|
131
|
+
const model = getModel(uid);
|
|
132
|
+
const newPath = {
|
|
133
|
+
...path,
|
|
134
|
+
raw: `${path.raw}[${uid}]`
|
|
135
|
+
};
|
|
136
|
+
newOn[uid] = await recurse(visitor, {
|
|
137
|
+
schema: model,
|
|
138
|
+
path: newPath,
|
|
139
|
+
getModel,
|
|
140
|
+
parent
|
|
141
|
+
}, subPopulate);
|
|
142
|
+
}
|
|
143
|
+
set(key, newOn);
|
|
144
|
+
})// Handle populate on relation
|
|
145
|
+
.onRelation(async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse })=>{
|
|
146
|
+
if (fp.isNil(value)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const parent = {
|
|
150
|
+
key,
|
|
151
|
+
path,
|
|
152
|
+
schema,
|
|
153
|
+
attribute
|
|
154
|
+
};
|
|
155
|
+
if (contentTypes.isMorphToRelationalAttribute(attribute)) {
|
|
156
|
+
// Don't traverse values that cannot be parsed
|
|
157
|
+
if (!fp.isObject(value) || !('on' in value && fp.isObject(value?.on))) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// If there is a populate fragment defined, traverse it
|
|
161
|
+
const newValue = await recurse(visitor, {
|
|
162
|
+
schema,
|
|
163
|
+
path,
|
|
164
|
+
getModel,
|
|
165
|
+
parent
|
|
166
|
+
}, {
|
|
167
|
+
on: value?.on
|
|
168
|
+
});
|
|
169
|
+
set(key, newValue);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const targetSchemaUID = attribute.target;
|
|
173
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
174
|
+
const newValue = await recurse(visitor, {
|
|
175
|
+
schema: targetSchema,
|
|
176
|
+
path,
|
|
177
|
+
getModel,
|
|
178
|
+
parent
|
|
179
|
+
}, value);
|
|
180
|
+
set(key, newValue);
|
|
181
|
+
})// Handle populate on media
|
|
182
|
+
.onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
|
|
183
|
+
if (fp.isNil(value)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const parent = {
|
|
187
|
+
key,
|
|
188
|
+
path,
|
|
189
|
+
schema,
|
|
190
|
+
attribute
|
|
191
|
+
};
|
|
192
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
193
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
194
|
+
const newValue = await recurse(visitor, {
|
|
195
|
+
schema: targetSchema,
|
|
196
|
+
path,
|
|
197
|
+
getModel,
|
|
198
|
+
parent
|
|
199
|
+
}, value);
|
|
200
|
+
set(key, newValue);
|
|
201
|
+
})// Handle populate on components
|
|
202
|
+
.onComponent(async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set })=>{
|
|
203
|
+
if (fp.isNil(value)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const parent = {
|
|
207
|
+
key,
|
|
208
|
+
path,
|
|
209
|
+
schema,
|
|
210
|
+
attribute
|
|
211
|
+
};
|
|
212
|
+
const targetSchema = getModel(attribute.component);
|
|
213
|
+
const newValue = await recurse(visitor, {
|
|
214
|
+
schema: targetSchema,
|
|
215
|
+
path,
|
|
216
|
+
getModel,
|
|
217
|
+
parent
|
|
218
|
+
}, value);
|
|
219
|
+
set(key, newValue);
|
|
220
|
+
})// Handle populate on dynamic zones
|
|
221
|
+
.onDynamicZone(async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse })=>{
|
|
222
|
+
if (fp.isNil(value) || !fp.isObject(value)) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const parent = {
|
|
226
|
+
key,
|
|
227
|
+
path,
|
|
228
|
+
schema,
|
|
229
|
+
attribute
|
|
230
|
+
};
|
|
231
|
+
// Handle fragment syntax
|
|
232
|
+
if ('on' in value && value.on) {
|
|
233
|
+
const newOn = await recurse(visitor, {
|
|
234
|
+
schema,
|
|
235
|
+
path,
|
|
236
|
+
getModel,
|
|
237
|
+
parent
|
|
238
|
+
}, {
|
|
239
|
+
on: value.on
|
|
240
|
+
});
|
|
241
|
+
set(key, newOn);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
var traverseQueryPopulate = fp.curry(populate.traverse);
|
|
245
|
+
const objectPopulateToPaths = (input)=>{
|
|
246
|
+
const paths = [];
|
|
247
|
+
function traverse(currentObj, parentPath) {
|
|
248
|
+
for (const [key, value] of Object.entries(currentObj)){
|
|
249
|
+
const currentPath = parentPath ? `${parentPath}.${key}` : key;
|
|
250
|
+
if (value === true) {
|
|
251
|
+
paths.push(currentPath);
|
|
252
|
+
} else {
|
|
253
|
+
traverse(value.populate, currentPath);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
traverse(input, '');
|
|
258
|
+
return paths;
|
|
259
|
+
};
|
|
260
|
+
const pathsToObjectPopulate = (input)=>{
|
|
261
|
+
const result = {};
|
|
262
|
+
function traverse(object, keys) {
|
|
263
|
+
const [first, ...rest] = keys;
|
|
264
|
+
if (rest.length === 0) {
|
|
265
|
+
object[first] = true;
|
|
266
|
+
} else {
|
|
267
|
+
if (!object[first] || typeof object[first] === 'boolean') {
|
|
268
|
+
object[first] = {
|
|
269
|
+
populate: {}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
traverse(object[first].populate, rest);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
input.forEach((clause)=>traverse(result, clause.split('.')));
|
|
276
|
+
return result;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
module.exports = traverseQueryPopulate;
|
|
280
|
+
//# sourceMappingURL=query-populate.js.map
|