@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,142 @@
|
|
|
1
|
+
import { trim, isEmpty, isString, pipe, split, map, flatten, isNil, first, cloneDeep, curry, isObject } from 'lodash/fp';
|
|
2
|
+
import traverseFactory from './factory.mjs';
|
|
3
|
+
|
|
4
|
+
const ORDERS = {
|
|
5
|
+
asc: 'asc',
|
|
6
|
+
desc: 'desc'
|
|
7
|
+
};
|
|
8
|
+
const ORDER_VALUES = Object.values(ORDERS);
|
|
9
|
+
const isSortOrder = (value)=>ORDER_VALUES.includes(value.toLowerCase());
|
|
10
|
+
const isStringArray = (value)=>Array.isArray(value) && value.every(isString);
|
|
11
|
+
const isObjectArray = (value)=>Array.isArray(value) && value.every(isObject);
|
|
12
|
+
const isNestedSorts = (value)=>isString(value) && value.split(',').length > 1;
|
|
13
|
+
const isObj = (value)=>isObject(value);
|
|
14
|
+
const sort = traverseFactory().intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
|
|
15
|
+
isNestedSorts, async (visitor, options, sort, { recurse })=>{
|
|
16
|
+
return Promise.all(sort.split(',').map(trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!isEmpty(part)).join(','));
|
|
17
|
+
}).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
|
|
18
|
+
isStringArray, async (visitor, options, sort, { recurse })=>{
|
|
19
|
+
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
|
|
20
|
+
}).intercept(// Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items
|
|
21
|
+
isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
22
|
+
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
|
|
23
|
+
})// Parse string values
|
|
24
|
+
.parse(isString, ()=>{
|
|
25
|
+
const tokenize = pipe(split('.'), map(split(':')), flatten);
|
|
26
|
+
const recompose = (parts)=>{
|
|
27
|
+
if (parts.length === 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return parts.reduce((acc, part)=>{
|
|
31
|
+
if (isEmpty(part)) {
|
|
32
|
+
return acc;
|
|
33
|
+
}
|
|
34
|
+
if (acc === '') {
|
|
35
|
+
return part;
|
|
36
|
+
}
|
|
37
|
+
return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;
|
|
38
|
+
}, '');
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
transform: trim,
|
|
42
|
+
remove (key, data) {
|
|
43
|
+
const [root] = tokenize(data);
|
|
44
|
+
return root === key ? undefined : data;
|
|
45
|
+
},
|
|
46
|
+
set (key, value, data) {
|
|
47
|
+
const [root] = tokenize(data);
|
|
48
|
+
if (root !== key) {
|
|
49
|
+
return data;
|
|
50
|
+
}
|
|
51
|
+
return isNil(value) ? root : `${root}.${value}`;
|
|
52
|
+
},
|
|
53
|
+
keys (data) {
|
|
54
|
+
const v = first(tokenize(data));
|
|
55
|
+
return v ? [
|
|
56
|
+
v
|
|
57
|
+
] : [];
|
|
58
|
+
},
|
|
59
|
+
get (key, data) {
|
|
60
|
+
const [root, ...rest] = tokenize(data);
|
|
61
|
+
return key === root ? recompose(rest) : undefined;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
})// Parse object values
|
|
65
|
+
.parse(isObj, ()=>({
|
|
66
|
+
transform: cloneDeep,
|
|
67
|
+
remove (key, data) {
|
|
68
|
+
// eslint-disable-next-line no-unused-vars
|
|
69
|
+
const { [key]: ignored, ...rest } = data;
|
|
70
|
+
return rest;
|
|
71
|
+
},
|
|
72
|
+
set (key, value, data) {
|
|
73
|
+
return {
|
|
74
|
+
...data,
|
|
75
|
+
[key]: value
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
keys (data) {
|
|
79
|
+
return Object.keys(data);
|
|
80
|
+
},
|
|
81
|
+
get (key, data) {
|
|
82
|
+
return data[key];
|
|
83
|
+
}
|
|
84
|
+
}))// Handle deep sort on relation
|
|
85
|
+
.onRelation(async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse })=>{
|
|
86
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
87
|
+
if (isMorphRelation) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const parent = {
|
|
91
|
+
key,
|
|
92
|
+
path,
|
|
93
|
+
schema,
|
|
94
|
+
attribute
|
|
95
|
+
};
|
|
96
|
+
const targetSchemaUID = attribute.target;
|
|
97
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
98
|
+
const newValue = await recurse(visitor, {
|
|
99
|
+
schema: targetSchema,
|
|
100
|
+
path,
|
|
101
|
+
getModel,
|
|
102
|
+
parent
|
|
103
|
+
}, value);
|
|
104
|
+
set(key, newValue);
|
|
105
|
+
})// Handle deep sort on media
|
|
106
|
+
.onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
|
|
107
|
+
const parent = {
|
|
108
|
+
key,
|
|
109
|
+
path,
|
|
110
|
+
schema,
|
|
111
|
+
attribute
|
|
112
|
+
};
|
|
113
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
114
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
115
|
+
const newValue = await recurse(visitor, {
|
|
116
|
+
schema: targetSchema,
|
|
117
|
+
path,
|
|
118
|
+
getModel,
|
|
119
|
+
parent
|
|
120
|
+
}, value);
|
|
121
|
+
set(key, newValue);
|
|
122
|
+
})// Handle deep sort on components
|
|
123
|
+
.onComponent(async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set })=>{
|
|
124
|
+
const parent = {
|
|
125
|
+
key,
|
|
126
|
+
path,
|
|
127
|
+
schema,
|
|
128
|
+
attribute
|
|
129
|
+
};
|
|
130
|
+
const targetSchema = getModel(attribute.component);
|
|
131
|
+
const newValue = await recurse(visitor, {
|
|
132
|
+
schema: targetSchema,
|
|
133
|
+
path,
|
|
134
|
+
getModel,
|
|
135
|
+
parent
|
|
136
|
+
}, value);
|
|
137
|
+
set(key, newValue);
|
|
138
|
+
});
|
|
139
|
+
var traverseQuerySort = curry(sort.traverse);
|
|
140
|
+
|
|
141
|
+
export { traverseQuerySort as default };
|
|
142
|
+
//# sourceMappingURL=query-sort.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-sort.mjs","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\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 // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { 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 // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\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 // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\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\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","sort","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var contentTypes = require('./content-types.js');
|
|
5
|
+
|
|
6
|
+
const traverseEntity = async (visitor, options, entity)=>{
|
|
7
|
+
const { path = {
|
|
8
|
+
raw: null,
|
|
9
|
+
attribute: null
|
|
10
|
+
}, schema, getModel } = options;
|
|
11
|
+
let parent = options.parent;
|
|
12
|
+
const traverseMorphRelationTarget = async (visitor, path, entry)=>{
|
|
13
|
+
const targetSchema = getModel(entry.__type);
|
|
14
|
+
const traverseOptions = {
|
|
15
|
+
schema: targetSchema,
|
|
16
|
+
path,
|
|
17
|
+
getModel,
|
|
18
|
+
parent
|
|
19
|
+
};
|
|
20
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
21
|
+
};
|
|
22
|
+
const traverseRelationTarget = (schema)=>async (visitor, path, entry)=>{
|
|
23
|
+
const traverseOptions = {
|
|
24
|
+
schema,
|
|
25
|
+
path,
|
|
26
|
+
getModel,
|
|
27
|
+
parent
|
|
28
|
+
};
|
|
29
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
30
|
+
};
|
|
31
|
+
const traverseMediaTarget = async (visitor, path, entry)=>{
|
|
32
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
33
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
34
|
+
const traverseOptions = {
|
|
35
|
+
schema: targetSchema,
|
|
36
|
+
path,
|
|
37
|
+
getModel,
|
|
38
|
+
parent
|
|
39
|
+
};
|
|
40
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
41
|
+
};
|
|
42
|
+
const traverseComponent = async (visitor, path, schema, entry)=>{
|
|
43
|
+
const traverseOptions = {
|
|
44
|
+
schema,
|
|
45
|
+
path,
|
|
46
|
+
getModel,
|
|
47
|
+
parent
|
|
48
|
+
};
|
|
49
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
50
|
+
};
|
|
51
|
+
const visitDynamicZoneEntry = async (visitor, path, entry)=>{
|
|
52
|
+
const targetSchema = getModel(entry.__component);
|
|
53
|
+
const traverseOptions = {
|
|
54
|
+
schema: targetSchema,
|
|
55
|
+
path,
|
|
56
|
+
getModel,
|
|
57
|
+
parent
|
|
58
|
+
};
|
|
59
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
60
|
+
};
|
|
61
|
+
// End recursion
|
|
62
|
+
if (!fp.isObject(entity) || fp.isNil(schema)) {
|
|
63
|
+
return entity;
|
|
64
|
+
}
|
|
65
|
+
// Don't mutate the original entity object
|
|
66
|
+
// only clone at 1st level as the next level will get clone when traversed
|
|
67
|
+
const copy = fp.clone(entity);
|
|
68
|
+
const visitorUtils = createVisitorUtils({
|
|
69
|
+
data: copy
|
|
70
|
+
});
|
|
71
|
+
const keys = Object.keys(copy);
|
|
72
|
+
for(let i = 0; i < keys.length; i += 1){
|
|
73
|
+
const key = keys[i];
|
|
74
|
+
// Retrieve the attribute definition associated to the key from the schema
|
|
75
|
+
const attribute = schema.attributes[key];
|
|
76
|
+
const newPath = {
|
|
77
|
+
...path
|
|
78
|
+
};
|
|
79
|
+
newPath.raw = fp.isNil(path.raw) ? key : `${path.raw}.${key}`;
|
|
80
|
+
if (!fp.isNil(attribute)) {
|
|
81
|
+
newPath.attribute = fp.isNil(path.attribute) ? key : `${path.attribute}.${key}`;
|
|
82
|
+
}
|
|
83
|
+
// Visit the current attribute
|
|
84
|
+
const visitorOptions = {
|
|
85
|
+
data: copy,
|
|
86
|
+
schema,
|
|
87
|
+
key,
|
|
88
|
+
value: copy[key],
|
|
89
|
+
attribute,
|
|
90
|
+
path: newPath,
|
|
91
|
+
getModel,
|
|
92
|
+
parent
|
|
93
|
+
};
|
|
94
|
+
await visitor(visitorOptions, visitorUtils);
|
|
95
|
+
// Extract the value for the current key (after calling the visitor)
|
|
96
|
+
const value = copy[key];
|
|
97
|
+
// Ignore Nil values or attributes
|
|
98
|
+
if (fp.isNil(value) || fp.isNil(attribute)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// The current attribute becomes the parent once visited
|
|
102
|
+
parent = {
|
|
103
|
+
schema,
|
|
104
|
+
key,
|
|
105
|
+
attribute,
|
|
106
|
+
path: newPath
|
|
107
|
+
};
|
|
108
|
+
if (contentTypes.isRelationalAttribute(attribute)) {
|
|
109
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
110
|
+
const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
|
|
111
|
+
if (fp.isArray(value)) {
|
|
112
|
+
const res = new Array(value.length);
|
|
113
|
+
for(let i = 0; i < value.length; i += 1){
|
|
114
|
+
res[i] = await method(visitor, newPath, value[i]);
|
|
115
|
+
}
|
|
116
|
+
copy[key] = res;
|
|
117
|
+
} else {
|
|
118
|
+
copy[key] = await method(visitor, newPath, value);
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (contentTypes.isMediaAttribute(attribute)) {
|
|
123
|
+
// need to update copy
|
|
124
|
+
if (fp.isArray(value)) {
|
|
125
|
+
const res = new Array(value.length);
|
|
126
|
+
for(let i = 0; i < value.length; i += 1){
|
|
127
|
+
res[i] = await traverseMediaTarget(visitor, newPath, value[i]);
|
|
128
|
+
}
|
|
129
|
+
copy[key] = res;
|
|
130
|
+
} else {
|
|
131
|
+
copy[key] = await traverseMediaTarget(visitor, newPath, value);
|
|
132
|
+
}
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (attribute.type === 'component') {
|
|
136
|
+
const targetSchema = getModel(attribute.component);
|
|
137
|
+
if (fp.isArray(value)) {
|
|
138
|
+
const res = new Array(value.length);
|
|
139
|
+
for(let i = 0; i < value.length; i += 1){
|
|
140
|
+
res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);
|
|
141
|
+
}
|
|
142
|
+
copy[key] = res;
|
|
143
|
+
} else {
|
|
144
|
+
copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (attribute.type === 'dynamiczone' && fp.isArray(value)) {
|
|
149
|
+
const res = new Array(value.length);
|
|
150
|
+
for(let i = 0; i < value.length; i += 1){
|
|
151
|
+
res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);
|
|
152
|
+
}
|
|
153
|
+
copy[key] = res;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return copy;
|
|
158
|
+
};
|
|
159
|
+
const createVisitorUtils = ({ data })=>({
|
|
160
|
+
remove (key) {
|
|
161
|
+
delete data[key];
|
|
162
|
+
},
|
|
163
|
+
set (key, value) {
|
|
164
|
+
data[key] = value;
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
var traverseEntity$1 = fp.curry(traverseEntity);
|
|
168
|
+
|
|
169
|
+
module.exports = traverseEntity$1;
|
|
170
|
+
//# sourceMappingURL=traverse-entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["traverseEntity","visitor","options","entity","path","raw","attribute","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { curry, isObject, isNil, clone, isArray } from 'lodash/fp';
|
|
2
|
+
import { isRelationalAttribute, isMediaAttribute } from './content-types.mjs';
|
|
3
|
+
|
|
4
|
+
const traverseEntity = async (visitor, options, entity)=>{
|
|
5
|
+
const { path = {
|
|
6
|
+
raw: null,
|
|
7
|
+
attribute: null
|
|
8
|
+
}, schema, getModel } = options;
|
|
9
|
+
let parent = options.parent;
|
|
10
|
+
const traverseMorphRelationTarget = async (visitor, path, entry)=>{
|
|
11
|
+
const targetSchema = getModel(entry.__type);
|
|
12
|
+
const traverseOptions = {
|
|
13
|
+
schema: targetSchema,
|
|
14
|
+
path,
|
|
15
|
+
getModel,
|
|
16
|
+
parent
|
|
17
|
+
};
|
|
18
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
19
|
+
};
|
|
20
|
+
const traverseRelationTarget = (schema)=>async (visitor, path, entry)=>{
|
|
21
|
+
const traverseOptions = {
|
|
22
|
+
schema,
|
|
23
|
+
path,
|
|
24
|
+
getModel,
|
|
25
|
+
parent
|
|
26
|
+
};
|
|
27
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
28
|
+
};
|
|
29
|
+
const traverseMediaTarget = async (visitor, path, entry)=>{
|
|
30
|
+
const targetSchemaUID = 'plugin::upload.file';
|
|
31
|
+
const targetSchema = getModel(targetSchemaUID);
|
|
32
|
+
const traverseOptions = {
|
|
33
|
+
schema: targetSchema,
|
|
34
|
+
path,
|
|
35
|
+
getModel,
|
|
36
|
+
parent
|
|
37
|
+
};
|
|
38
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
39
|
+
};
|
|
40
|
+
const traverseComponent = async (visitor, path, schema, entry)=>{
|
|
41
|
+
const traverseOptions = {
|
|
42
|
+
schema,
|
|
43
|
+
path,
|
|
44
|
+
getModel,
|
|
45
|
+
parent
|
|
46
|
+
};
|
|
47
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
48
|
+
};
|
|
49
|
+
const visitDynamicZoneEntry = async (visitor, path, entry)=>{
|
|
50
|
+
const targetSchema = getModel(entry.__component);
|
|
51
|
+
const traverseOptions = {
|
|
52
|
+
schema: targetSchema,
|
|
53
|
+
path,
|
|
54
|
+
getModel,
|
|
55
|
+
parent
|
|
56
|
+
};
|
|
57
|
+
return traverseEntity(visitor, traverseOptions, entry);
|
|
58
|
+
};
|
|
59
|
+
// End recursion
|
|
60
|
+
if (!isObject(entity) || isNil(schema)) {
|
|
61
|
+
return entity;
|
|
62
|
+
}
|
|
63
|
+
// Don't mutate the original entity object
|
|
64
|
+
// only clone at 1st level as the next level will get clone when traversed
|
|
65
|
+
const copy = clone(entity);
|
|
66
|
+
const visitorUtils = createVisitorUtils({
|
|
67
|
+
data: copy
|
|
68
|
+
});
|
|
69
|
+
const keys = Object.keys(copy);
|
|
70
|
+
for(let i = 0; i < keys.length; i += 1){
|
|
71
|
+
const key = keys[i];
|
|
72
|
+
// Retrieve the attribute definition associated to the key from the schema
|
|
73
|
+
const attribute = schema.attributes[key];
|
|
74
|
+
const newPath = {
|
|
75
|
+
...path
|
|
76
|
+
};
|
|
77
|
+
newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;
|
|
78
|
+
if (!isNil(attribute)) {
|
|
79
|
+
newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;
|
|
80
|
+
}
|
|
81
|
+
// Visit the current attribute
|
|
82
|
+
const visitorOptions = {
|
|
83
|
+
data: copy,
|
|
84
|
+
schema,
|
|
85
|
+
key,
|
|
86
|
+
value: copy[key],
|
|
87
|
+
attribute,
|
|
88
|
+
path: newPath,
|
|
89
|
+
getModel,
|
|
90
|
+
parent
|
|
91
|
+
};
|
|
92
|
+
await visitor(visitorOptions, visitorUtils);
|
|
93
|
+
// Extract the value for the current key (after calling the visitor)
|
|
94
|
+
const value = copy[key];
|
|
95
|
+
// Ignore Nil values or attributes
|
|
96
|
+
if (isNil(value) || isNil(attribute)) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// The current attribute becomes the parent once visited
|
|
100
|
+
parent = {
|
|
101
|
+
schema,
|
|
102
|
+
key,
|
|
103
|
+
attribute,
|
|
104
|
+
path: newPath
|
|
105
|
+
};
|
|
106
|
+
if (isRelationalAttribute(attribute)) {
|
|
107
|
+
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
108
|
+
const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
|
|
109
|
+
if (isArray(value)) {
|
|
110
|
+
const res = new Array(value.length);
|
|
111
|
+
for(let i = 0; i < value.length; i += 1){
|
|
112
|
+
res[i] = await method(visitor, newPath, value[i]);
|
|
113
|
+
}
|
|
114
|
+
copy[key] = res;
|
|
115
|
+
} else {
|
|
116
|
+
copy[key] = await method(visitor, newPath, value);
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (isMediaAttribute(attribute)) {
|
|
121
|
+
// need to update copy
|
|
122
|
+
if (isArray(value)) {
|
|
123
|
+
const res = new Array(value.length);
|
|
124
|
+
for(let i = 0; i < value.length; i += 1){
|
|
125
|
+
res[i] = await traverseMediaTarget(visitor, newPath, value[i]);
|
|
126
|
+
}
|
|
127
|
+
copy[key] = res;
|
|
128
|
+
} else {
|
|
129
|
+
copy[key] = await traverseMediaTarget(visitor, newPath, value);
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (attribute.type === 'component') {
|
|
134
|
+
const targetSchema = getModel(attribute.component);
|
|
135
|
+
if (isArray(value)) {
|
|
136
|
+
const res = new Array(value.length);
|
|
137
|
+
for(let i = 0; i < value.length; i += 1){
|
|
138
|
+
res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);
|
|
139
|
+
}
|
|
140
|
+
copy[key] = res;
|
|
141
|
+
} else {
|
|
142
|
+
copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (attribute.type === 'dynamiczone' && isArray(value)) {
|
|
147
|
+
const res = new Array(value.length);
|
|
148
|
+
for(let i = 0; i < value.length; i += 1){
|
|
149
|
+
res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);
|
|
150
|
+
}
|
|
151
|
+
copy[key] = res;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return copy;
|
|
156
|
+
};
|
|
157
|
+
const createVisitorUtils = ({ data })=>({
|
|
158
|
+
remove (key) {
|
|
159
|
+
delete data[key];
|
|
160
|
+
},
|
|
161
|
+
set (key, value) {
|
|
162
|
+
data[key] = value;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
var traverseEntity$1 = curry(traverseEntity);
|
|
166
|
+
|
|
167
|
+
export { traverseEntity$1 as default };
|
|
168
|
+
//# sourceMappingURL=traverse-entity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["traverseEntity","visitor","options","entity","path","raw","attribute","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|