@strapi/utils 5.58.0 → 5.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async.js +2 -2
- package/dist/async.js.map +1 -1
- package/dist/async.mjs +1 -1
- package/dist/async.mjs.map +1 -1
- package/dist/content-types.d.ts.map +1 -1
- package/dist/content-types.js +3 -3
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +3 -3
- package/dist/content-types.mjs.map +1 -1
- package/dist/curry.d.ts +26 -0
- package/dist/curry.d.ts.map +1 -0
- package/dist/curry.js +26 -0
- package/dist/curry.js.map +1 -0
- package/dist/curry.mjs +24 -0
- package/dist/curry.mjs.map +1 -0
- package/dist/parse-type.js +7 -7
- package/dist/parse-type.js.map +1 -1
- package/dist/parse-type.mjs +7 -7
- package/dist/parse-type.mjs.map +1 -1
- package/dist/sanitize/sanitizers.d.ts.map +1 -1
- package/dist/sanitize/sanitizers.js +5 -4
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +2 -1
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/traverse/factory.d.ts.map +1 -1
- package/dist/traverse/factory.js +68 -31
- package/dist/traverse/factory.js.map +1 -1
- package/dist/traverse/factory.mjs +68 -31
- package/dist/traverse/factory.mjs.map +1 -1
- package/dist/traverse/query-fields.d.ts.map +1 -1
- package/dist/traverse/query-fields.js +2 -1
- package/dist/traverse/query-fields.js.map +1 -1
- package/dist/traverse/query-fields.mjs +2 -1
- package/dist/traverse/query-fields.mjs.map +1 -1
- package/dist/traverse/query-filters.d.ts.map +1 -1
- package/dist/traverse/query-filters.js +2 -1
- package/dist/traverse/query-filters.js.map +1 -1
- package/dist/traverse/query-filters.mjs +2 -1
- package/dist/traverse/query-filters.mjs.map +1 -1
- package/dist/traverse/query-populate.d.ts.map +1 -1
- package/dist/traverse/query-populate.js +2 -1
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +2 -1
- package/dist/traverse/query-populate.mjs.map +1 -1
- package/dist/traverse/query-sort.d.ts.map +1 -1
- package/dist/traverse/query-sort.js +2 -1
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +2 -1
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +2 -1
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +2 -1
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validate/index.js +3 -3
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/index.mjs +3 -3
- package/dist/validate/index.mjs.map +1 -1
- package/dist/validate/utils.d.ts.map +1 -1
- package/dist/validate/utils.js +2 -9
- package/dist/validate/utils.js.map +1 -1
- package/dist/validate/utils.mjs +2 -9
- package/dist/validate/utils.mjs.map +1 -1
- package/dist/validate/validators.mjs +17 -17
- package/dist/validate/validators.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const DEFAULT_PATH = {
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-loop-func */ const DEFAULT_PATH = {
|
|
4
2
|
raw: null,
|
|
5
3
|
attribute: null
|
|
6
4
|
};
|
|
@@ -34,15 +32,53 @@ var traverseFactory = (()=>{
|
|
|
34
32
|
// main loop
|
|
35
33
|
let out = utils.transform(data);
|
|
36
34
|
const keys = utils.keys(out);
|
|
35
|
+
// Built once per traversal rather than once per key. `state.handlers` is populated
|
|
36
|
+
// while the traversal is being defined and is fixed by the time it runs, so spreading
|
|
37
|
+
// both lists on every key allocated a fresh array to hold the same handlers. This
|
|
38
|
+
// loop runs for every key of every node of every query, which made it one of the
|
|
39
|
+
// hottest allocation sites in a request.
|
|
40
|
+
const handlers = [
|
|
41
|
+
...state.handlers.common,
|
|
42
|
+
...state.handlers.attributes
|
|
43
|
+
];
|
|
44
|
+
// Also hoisted: none of these close over `key` (each method takes it as an argument),
|
|
45
|
+
// so the previous code allocated three closures per key to no end. They still mutate
|
|
46
|
+
// the same `out` binding, so behaviour is unchanged.
|
|
47
|
+
const transformUtils = {
|
|
48
|
+
remove (key) {
|
|
49
|
+
out = utils.remove(key, out);
|
|
50
|
+
},
|
|
51
|
+
set (key, value) {
|
|
52
|
+
out = utils.set(key, value, out);
|
|
53
|
+
},
|
|
54
|
+
recurse: traverse
|
|
55
|
+
};
|
|
56
|
+
// Pre-picked instead of calling lodash `pick` per key, which allocated both the
|
|
57
|
+
// key-list array literal and a fresh result object every time.
|
|
58
|
+
const visitorUtils = {
|
|
59
|
+
remove: transformUtils.remove,
|
|
60
|
+
set: transformUtils.set
|
|
61
|
+
};
|
|
62
|
+
const handlerUtils = {
|
|
63
|
+
set: transformUtils.set,
|
|
64
|
+
recurse: transformUtils.recurse
|
|
65
|
+
};
|
|
37
66
|
for (const key of keys){
|
|
38
67
|
const attribute = schema?.attributes?.[key];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;
|
|
68
|
+
// The attribute segment only grows when the key maps to an attribute; otherwise the
|
|
69
|
+
// parent's value carries through unchanged.
|
|
70
|
+
let attributePath = path.attribute;
|
|
43
71
|
if (attribute != null) {
|
|
44
|
-
|
|
72
|
+
attributePath = path.attribute == null ? key : `${path.attribute}.${key}`;
|
|
45
73
|
}
|
|
74
|
+
// A single literal rather than a spread followed by conditional assignment: the
|
|
75
|
+
// spread produced an object whose hidden class then transitioned on each write.
|
|
76
|
+
// `Path` is closed over `raw` and `attribute` and callers never supply their own,
|
|
77
|
+
// so nothing can be dropped by building it directly.
|
|
78
|
+
const newPath = {
|
|
79
|
+
raw: path.raw == null ? key : `${path.raw}.${key}`,
|
|
80
|
+
attribute: attributePath
|
|
81
|
+
};
|
|
46
82
|
// visitors
|
|
47
83
|
const visitorOptions = {
|
|
48
84
|
key,
|
|
@@ -54,19 +90,16 @@ var traverseFactory = (()=>{
|
|
|
54
90
|
getModel,
|
|
55
91
|
parent
|
|
56
92
|
};
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
await visitor(visitorOptions,
|
|
67
|
-
'remove',
|
|
68
|
-
'set'
|
|
69
|
-
]));
|
|
93
|
+
// Awaited unconditionally. Most visitors are synchronous, and awaiting a
|
|
94
|
+
// non-thenable still schedules a microtask, but skipping that await changes
|
|
95
|
+
// the order of branches that recurse concurrently via Promise.all.
|
|
96
|
+
//
|
|
97
|
+
// That reordering used to drop nested populate in content-manager's
|
|
98
|
+
// getQueryPopulate: a shallow `relation` write replaced the subtree a deeper
|
|
99
|
+
// sibling had written at `relation.populate.component`. #27236 fixed that
|
|
100
|
+
// visitor by merging paths. Re-measuring the skip afterward showed no
|
|
101
|
+
// throughput gain, so the await stays.
|
|
102
|
+
await visitor(visitorOptions, visitorUtils);
|
|
70
103
|
const value = utils.get(key, out);
|
|
71
104
|
const createContext = ()=>({
|
|
72
105
|
key,
|
|
@@ -86,18 +119,22 @@ var traverseFactory = (()=>{
|
|
|
86
119
|
continue;
|
|
87
120
|
}
|
|
88
121
|
// handlers
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
122
|
+
//
|
|
123
|
+
// `for await` over a plain array awaits every element, allocating a promise per
|
|
124
|
+
// handler per key even though the elements are ordinary objects. A plain `for...of`
|
|
125
|
+
// with explicit thenable checks is equivalent for non-promise elements, and the
|
|
126
|
+
// predicates in practice are synchronous.
|
|
127
|
+
for (const handler of handlers){
|
|
94
128
|
const ctx = createContext();
|
|
95
|
-
|
|
129
|
+
// A fresh context per handler is deliberate: a handler may call `set`, which
|
|
130
|
+
// reassigns `out`, and the next handler must observe the updated `data`.
|
|
131
|
+
const predicated = handler.predicate(ctx);
|
|
132
|
+
const pass = predicated != null && typeof predicated.then === 'function' ? await predicated : predicated;
|
|
96
133
|
if (pass) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
134
|
+
const handled = handler.handler(ctx, handlerUtils);
|
|
135
|
+
if (handled != null && typeof handled.then === 'function') {
|
|
136
|
+
await handled;
|
|
137
|
+
}
|
|
101
138
|
}
|
|
102
139
|
}
|
|
103
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.mjs","sources":["../../src/traverse/factory.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-loop-func */\nimport { pick } from 'lodash';\n\nimport {\n AnyAttribute,\n Attribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n Model,\n RelationalAttribute,\n} from '../types';\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface VisitorOptions {\n data: unknown;\n value: unknown;\n schema: Model;\n key: string;\n attribute?: AnyAttribute;\n path: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport type Traverse = (\n visitor: Visitor,\n options: TraverseOptions,\n data: unknown\n) => Promise<unknown>;\n\nexport interface Visitor {\n (visitorOptions: VisitorOptions, opts: Pick<TransformUtils, 'set' | 'remove'>): void;\n}\n\ninterface Interceptor<T = unknown> {\n predicate(data: unknown): data is T;\n handler(\n visitor: Visitor,\n options: TraverseOptions,\n data: T,\n recurseOptions: { recurse: Traverse }\n ): void;\n}\n\ninterface ParseUtils<T> {\n transform(data: T): unknown;\n remove(key: string, data: T): unknown;\n set(key: string, value: unknown, data: T): unknown;\n keys(data: T): string[];\n get(key: string, data: T): unknown;\n}\n\ninterface Parser<T = unknown> {\n predicate(data: unknown): data is T;\n parser(data: T): ParseUtils<T>;\n}\n\ninterface Ignore {\n (ctx: Context): boolean;\n}\n\ninterface AttributeHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\ninterface CommonHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\n\nexport interface TransformUtils {\n remove(key: string): void;\n set(key: string, value: unknown): void;\n recurse: Traverse;\n}\n\ninterface Context<AttributeType = Attribute> {\n key: string;\n value: unknown;\n attribute: AttributeType;\n schema: Model;\n path: Path;\n data: unknown;\n visitor: Visitor;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\ninterface State {\n parsers: Parser[];\n interceptors: Interceptor[];\n ignore: Ignore[];\n handlers: {\n attributes: AttributeHandler[];\n common: CommonHandler[];\n };\n}\n\nconst DEFAULT_PATH = { raw: null, attribute: null } satisfies Path;\n\nexport default () => {\n const state: State = {\n parsers: [],\n interceptors: [],\n ignore: [],\n handlers: {\n attributes: [],\n common: [],\n },\n };\n\n const traverse: Traverse = async (visitor, options, data) => {\n const { path = DEFAULT_PATH, parent, schema, getModel } = options ?? {};\n\n // interceptors\n for (const { predicate, handler } of state.interceptors) {\n if (predicate(data)) {\n return handler(visitor, options, data, { recurse: traverse });\n }\n }\n\n // parsers\n const parser = state.parsers.find((parser) => parser.predicate(data))?.parser;\n const utils = parser?.(data);\n\n // Return the data untouched if we don't know how to traverse it\n if (!utils) {\n return data;\n }\n\n // main loop\n let out = utils.transform(data);\n const keys = utils.keys(out);\n\n for (const key of keys) {\n const attribute = schema?.attributes?.[key];\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // visitors\n const visitorOptions: VisitorOptions = {\n key,\n value: utils.get(key, out),\n attribute,\n schema,\n path: newPath,\n data: out,\n getModel,\n parent,\n };\n\n const transformUtils: TransformUtils = {\n remove(key) {\n out = utils.remove(key, out);\n },\n set(key, value) {\n out = utils.set(key, value, out);\n },\n recurse: traverse,\n };\n\n await visitor(visitorOptions, pick(transformUtils, ['remove', 'set']));\n\n const value = utils.get(key, out);\n\n const createContext = (): Context => ({\n key,\n value,\n attribute,\n schema,\n path: newPath,\n data: out,\n visitor,\n getModel,\n parent,\n });\n\n // ignore\n const ignoreCtx = createContext();\n const shouldIgnore = state.ignore.some((predicate) => predicate(ignoreCtx));\n\n if (shouldIgnore) {\n continue;\n }\n\n // handlers\n const handlers = [...state.handlers.common, ...state.handlers.attributes];\n\n for await (const handler of handlers) {\n const ctx = createContext();\n const pass = await handler.predicate(ctx);\n\n if (pass) {\n await handler.handler(ctx, pick(transformUtils, ['recurse', 'set']));\n }\n }\n }\n\n return out;\n };\n\n return {\n traverse,\n\n intercept<T>(predicate: Interceptor<T>['predicate'], handler: Interceptor<T>['handler']) {\n state.interceptors.push({ predicate, handler });\n return this;\n },\n\n parse<T>(predicate: Parser<T>['predicate'], parser: Parser<T>['parser']) {\n state.parsers.push({ predicate, parser });\n return this;\n },\n\n ignore(predicate: Ignore) {\n state.ignore.push(predicate);\n return this;\n },\n\n on(predicate: CommonHandler['predicate'], handler: CommonHandler['handler']) {\n state.handlers.common.push({ predicate, handler });\n return this;\n },\n\n onAttribute(predicate: AttributeHandler['predicate'], handler: AttributeHandler['handler']) {\n state.handlers.attributes.push({ predicate, handler });\n return this;\n },\n\n onRelation(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'relation', handler);\n },\n\n onMedia(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'media', handler);\n },\n\n onComponent(handler: AttributeHandler<ComponentAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'component', handler);\n },\n\n onDynamicZone(handler: AttributeHandler<DynamicZoneAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'dynamiczone', handler);\n },\n };\n};\n"],"names":["DEFAULT_PATH","raw","attribute","state","parsers","interceptors","ignore","handlers","attributes","common","traverse","visitor","options","data","path","parent","schema","getModel","predicate","handler","recurse","parser","find","utils","out","transform","keys","key","newPath","visitorOptions","value","get","transformUtils","remove","set","pick","createContext","ignoreCtx","shouldIgnore","some","ctx","pass","intercept","push","parse","on","onAttribute","onRelation","type","onMedia","onComponent","onDynamicZone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"factory.mjs","sources":["../../src/traverse/factory.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-loop-func */\nimport {\n AnyAttribute,\n Attribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n Model,\n RelationalAttribute,\n} from '../types';\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface VisitorOptions {\n data: unknown;\n value: unknown;\n schema: Model;\n key: string;\n attribute?: AnyAttribute;\n path: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport type Traverse = (\n visitor: Visitor,\n options: TraverseOptions,\n data: unknown\n) => Promise<unknown>;\n\nexport interface Visitor {\n (visitorOptions: VisitorOptions, opts: Pick<TransformUtils, 'set' | 'remove'>): void;\n}\n\ninterface Interceptor<T = unknown> {\n predicate(data: unknown): data is T;\n handler(\n visitor: Visitor,\n options: TraverseOptions,\n data: T,\n recurseOptions: { recurse: Traverse }\n ): void;\n}\n\ninterface ParseUtils<T> {\n transform(data: T): unknown;\n remove(key: string, data: T): unknown;\n set(key: string, value: unknown, data: T): unknown;\n keys(data: T): string[];\n get(key: string, data: T): unknown;\n}\n\ninterface Parser<T = unknown> {\n predicate(data: unknown): data is T;\n parser(data: T): ParseUtils<T>;\n}\n\ninterface Ignore {\n (ctx: Context): boolean;\n}\n\ninterface AttributeHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\ninterface CommonHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\n\nexport interface TransformUtils {\n remove(key: string): void;\n set(key: string, value: unknown): void;\n recurse: Traverse;\n}\n\ninterface Context<AttributeType = Attribute> {\n key: string;\n value: unknown;\n attribute: AttributeType;\n schema: Model;\n path: Path;\n data: unknown;\n visitor: Visitor;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\ninterface State {\n parsers: Parser[];\n interceptors: Interceptor[];\n ignore: Ignore[];\n handlers: {\n attributes: AttributeHandler[];\n common: CommonHandler[];\n };\n}\n\nconst DEFAULT_PATH = { raw: null, attribute: null } satisfies Path;\n\nexport default () => {\n const state: State = {\n parsers: [],\n interceptors: [],\n ignore: [],\n handlers: {\n attributes: [],\n common: [],\n },\n };\n\n const traverse: Traverse = async (visitor, options, data) => {\n const { path = DEFAULT_PATH, parent, schema, getModel } = options ?? {};\n\n // interceptors\n for (const { predicate, handler } of state.interceptors) {\n if (predicate(data)) {\n return handler(visitor, options, data, { recurse: traverse });\n }\n }\n\n // parsers\n const parser = state.parsers.find((parser) => parser.predicate(data))?.parser;\n const utils = parser?.(data);\n\n // Return the data untouched if we don't know how to traverse it\n if (!utils) {\n return data;\n }\n\n // main loop\n let out = utils.transform(data);\n const keys = utils.keys(out);\n\n // Built once per traversal rather than once per key. `state.handlers` is populated\n // while the traversal is being defined and is fixed by the time it runs, so spreading\n // both lists on every key allocated a fresh array to hold the same handlers. This\n // loop runs for every key of every node of every query, which made it one of the\n // hottest allocation sites in a request.\n const handlers = [...state.handlers.common, ...state.handlers.attributes];\n\n // Also hoisted: none of these close over `key` (each method takes it as an argument),\n // so the previous code allocated three closures per key to no end. They still mutate\n // the same `out` binding, so behaviour is unchanged.\n const transformUtils: TransformUtils = {\n remove(key) {\n out = utils.remove(key, out);\n },\n set(key, value) {\n out = utils.set(key, value, out);\n },\n recurse: traverse,\n };\n\n // Pre-picked instead of calling lodash `pick` per key, which allocated both the\n // key-list array literal and a fresh result object every time.\n const visitorUtils: Pick<TransformUtils, 'set' | 'remove'> = {\n remove: transformUtils.remove,\n set: transformUtils.set,\n };\n const handlerUtils: Pick<TransformUtils, 'set' | 'recurse'> = {\n set: transformUtils.set,\n recurse: transformUtils.recurse,\n };\n\n for (const key of keys) {\n const attribute = schema?.attributes?.[key];\n\n // The attribute segment only grows when the key maps to an attribute; otherwise the\n // parent's value carries through unchanged.\n let attributePath = path.attribute;\n if (attribute != null) {\n attributePath = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // A single literal rather than a spread followed by conditional assignment: the\n // spread produced an object whose hidden class then transitioned on each write.\n // `Path` is closed over `raw` and `attribute` and callers never supply their own,\n // so nothing can be dropped by building it directly.\n const newPath: Path = {\n raw: path.raw == null ? key : `${path.raw}.${key}`,\n attribute: attributePath,\n };\n\n // visitors\n const visitorOptions: VisitorOptions = {\n key,\n value: utils.get(key, out),\n attribute,\n schema,\n path: newPath,\n data: out,\n getModel,\n parent,\n };\n\n // Awaited unconditionally. Most visitors are synchronous, and awaiting a\n // non-thenable still schedules a microtask, but skipping that await changes\n // the order of branches that recurse concurrently via Promise.all.\n //\n // That reordering used to drop nested populate in content-manager's\n // getQueryPopulate: a shallow `relation` write replaced the subtree a deeper\n // sibling had written at `relation.populate.component`. #27236 fixed that\n // visitor by merging paths. Re-measuring the skip afterward showed no\n // throughput gain, so the await stays.\n await visitor(visitorOptions, visitorUtils);\n\n const value = utils.get(key, out);\n\n const createContext = (): Context => ({\n key,\n value,\n attribute,\n schema,\n path: newPath,\n data: out,\n visitor,\n getModel,\n parent,\n });\n\n // ignore\n const ignoreCtx = createContext();\n const shouldIgnore = state.ignore.some((predicate) => predicate(ignoreCtx));\n\n if (shouldIgnore) {\n continue;\n }\n\n // handlers\n //\n // `for await` over a plain array awaits every element, allocating a promise per\n // handler per key even though the elements are ordinary objects. A plain `for...of`\n // with explicit thenable checks is equivalent for non-promise elements, and the\n // predicates in practice are synchronous.\n for (const handler of handlers) {\n const ctx = createContext();\n\n // A fresh context per handler is deliberate: a handler may call `set`, which\n // reassigns `out`, and the next handler must observe the updated `data`.\n const predicated = handler.predicate(ctx) as unknown;\n const pass =\n predicated != null && typeof (predicated as PromiseLike<boolean>).then === 'function'\n ? await (predicated as PromiseLike<boolean>)\n : predicated;\n\n if (pass) {\n const handled = handler.handler(ctx, handlerUtils) as unknown;\n\n if (handled != null && typeof (handled as PromiseLike<void>).then === 'function') {\n await handled;\n }\n }\n }\n }\n\n return out;\n };\n\n return {\n traverse,\n\n intercept<T>(predicate: Interceptor<T>['predicate'], handler: Interceptor<T>['handler']) {\n state.interceptors.push({ predicate, handler });\n return this;\n },\n\n parse<T>(predicate: Parser<T>['predicate'], parser: Parser<T>['parser']) {\n state.parsers.push({ predicate, parser });\n return this;\n },\n\n ignore(predicate: Ignore) {\n state.ignore.push(predicate);\n return this;\n },\n\n on(predicate: CommonHandler['predicate'], handler: CommonHandler['handler']) {\n state.handlers.common.push({ predicate, handler });\n return this;\n },\n\n onAttribute(predicate: AttributeHandler['predicate'], handler: AttributeHandler['handler']) {\n state.handlers.attributes.push({ predicate, handler });\n return this;\n },\n\n onRelation(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'relation', handler);\n },\n\n onMedia(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'media', handler);\n },\n\n onComponent(handler: AttributeHandler<ComponentAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'component', handler);\n },\n\n onDynamicZone(handler: AttributeHandler<DynamicZoneAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'dynamiczone', handler);\n },\n };\n};\n"],"names":["DEFAULT_PATH","raw","attribute","state","parsers","interceptors","ignore","handlers","attributes","common","traverse","visitor","options","data","path","parent","schema","getModel","predicate","handler","recurse","parser","find","utils","out","transform","keys","transformUtils","remove","key","set","value","visitorUtils","handlerUtils","attributePath","newPath","visitorOptions","get","createContext","ignoreCtx","shouldIgnore","some","ctx","predicated","pass","then","handled","intercept","push","parse","on","onAttribute","onRelation","type","onMedia","onComponent","onDynamicZone"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-fields.d.ts","sourceRoot":"","sources":["../../src/traverse/query-fields.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"query-fields.d.ts","sourceRoot":"","sources":["../../src/traverse/query-fields.ts"],"names":[],"mappings":";AAgDA,wBAAsC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
|
+
var curry = require('../curry.js');
|
|
4
5
|
var factory = require('./factory.js');
|
|
5
6
|
|
|
6
7
|
const isStringArray = (value)=>{
|
|
@@ -35,7 +36,7 @@ const fields = factory()// Intercept array of strings
|
|
|
35
36
|
return key === data ? data : undefined;
|
|
36
37
|
}
|
|
37
38
|
}));
|
|
38
|
-
var traverseQueryFields =
|
|
39
|
+
var traverseQueryFields = curry.curry(fields.traverse);
|
|
39
40
|
|
|
40
41
|
module.exports = traverseQueryFields;
|
|
41
42
|
//# sourceMappingURL=query-fields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { isString, eq, constant } from 'lodash';\n\nimport { curry } from '../curry';\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return Array.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: (value) => value.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","Array","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":";;;;;;AAKA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,MAAMC,OAAO,CAACF,KAAAA,CAAAA,IAAUA,KAAAA,CAAMG,KAAK,CAACC,UAAAA,CAAAA;AAC7C,CAAA;AAEA,MAAMC,MAAAA,GAASC,SACb;AACA;CACCC,SAAS,CAACR,eAAe,OAAOS,OAAAA,EAASC,SAASJ,MAAAA,EAAQ,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAAA,CAAOQ,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASK,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACP,KAAAA,GAA2BI,UAAAA,CAASJ,UAAUA,KAAAA,CAAMe,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAAAA,EAASC,OAAAA,EAASJ,MAAAA,EAAQ,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAA,CAAA,CAAKH,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAAA,CAAQF,SAASC,OAAAA,EAASK,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACP,KAAAA,GAA2BiB,IAAAA,CAAG,KAAKjB,KAAAA,CAAAA,EAAQkB,UAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,UAAAA,EAAU,KAAO;QACtBgB,SAAAA,EAAW,CAACpB,KAAAA,GAAUA,KAAAA,CAAMqB,IAAI,EAAA;QAEhCC,MAAAA,CAAAA,CAAOC,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAAA,GAAYD,IAAAA;AACpC,QAAA,CAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,QAAA,CAAA;QAEAM,GAAAA,CAAAA,CAAIP,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAAA,GAAOC,SAAAA;AAC/B,QAAA;KACF,CAAA,CAAA;AAEF,0BAAeM,WAAAA,CAAM1B,MAAAA,CAAO2B,QAAQ,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { isString, eq, constant } from 'lodash';\n\nimport { curry } from '../curry';\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return Array.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: (value) => value.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","Array","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":";;;;AAKA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,MAAMC,OAAO,CAACF,KAAAA,CAAAA,IAAUA,KAAAA,CAAMG,KAAK,CAACC,QAAAA,CAAAA;AAC7C,CAAA;AAEA,MAAMC,MAAAA,GAASC,iBACb;AACA;CACCC,SAAS,CAACR,eAAe,OAAOS,OAAAA,EAASC,SAASJ,MAAAA,EAAQ,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAAA,CAAOQ,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASK,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACP,KAAAA,GAA2BI,QAAAA,CAASJ,UAAUA,KAAAA,CAAMe,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAAAA,EAASC,OAAAA,EAASJ,MAAAA,EAAQ,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAA,CAAA,CAAKH,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAAA,CAAQF,SAASC,OAAAA,EAASK,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACP,KAAAA,GAA2BiB,EAAAA,CAAG,KAAKjB,KAAAA,CAAAA,EAAQkB,QAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,QAAAA,EAAU,KAAO;QACtBgB,SAAAA,EAAW,CAACpB,KAAAA,GAAUA,KAAAA,CAAMqB,IAAI,EAAA;QAEhCC,MAAAA,CAAAA,CAAOC,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAAA,GAAYD,IAAAA;AACpC,QAAA,CAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,QAAA,CAAA;QAEAM,GAAAA,CAAAA,CAAIP,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAAA,GAAOC,SAAAA;AAC/B,QAAA;KACF,CAAA,CAAA;AAEF,0BAAeM,KAAAA,CAAM1B,MAAAA,CAAO2B,QAAQ,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-filters.d.ts","sourceRoot":"","sources":["../../src/traverse/query-filters.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"query-filters.d.ts","sourceRoot":"","sources":["../../src/traverse/query-filters.ts"],"names":[],"mappings":";AAsJA,wBAAuC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
|
+
var curry = require('../curry.js');
|
|
4
5
|
var contentTypes = require('../content-types.js');
|
|
5
6
|
var operators = require('../operators.js');
|
|
6
7
|
var factory = require('./factory.js');
|
|
@@ -134,7 +135,7 @@ Array.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
134
135
|
parent
|
|
135
136
|
}, value));
|
|
136
137
|
});
|
|
137
|
-
var traverseQueryFilters =
|
|
138
|
+
var traverseQueryFilters = curry.curry(filters.traverse);
|
|
138
139
|
|
|
139
140
|
module.exports = traverseQueryFilters;
|
|
140
141
|
//# sourceMappingURL=query-filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-filters.js","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, cloneDeep, omit } from 'lodash';\n\nimport { isScalarAttribute } from '../content-types';\nimport { isOperator } from '../operators';\nimport traverseFactory, { type Parent } from './factory';\nimport type { Model } from '../types';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */\nconst isFilterLikeObject = (value: Record<string, unknown>, schema?: Model) =>\n Object.keys(value).some((k) => isOperator(k) || Boolean(schema?.attributes?.[k]));\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n Array.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(data, key);\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 }) => value == null)\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => attribute == null,\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // Operator operands that are plain objects (not arrays) are only traversed when they look like\n // filter subtrees (nested operators or schema attributes). Otherwise treat as opaque operands\n // (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).\n // Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on \"anything\".\n // $not is excluded: its value is always a nested filter map, not an opaque scalar operand.\n if (\n isOperator(key) &&\n key !== '$not' &&\n isObj(value) &&\n !Array.isArray(value) &&\n !isFilterLikeObject(value, schema)\n ) {\n set(key, value);\n return;\n }\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 // Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.\n .onAttribute(\n ({ attribute, value }) =>\n Boolean(isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value),\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","isFilterLikeObject","schema","Object","keys","some","k","isOperator","Boolean","attributes","filters","traverseFactory","intercept","Array","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","get","ignore","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-filters.js","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { isObject, isEmpty, cloneDeep, omit } from 'lodash';\n\nimport { curry } from '../curry';\nimport { isScalarAttribute } from '../content-types';\nimport { isOperator } from '../operators';\nimport traverseFactory, { type Parent } from './factory';\nimport type { Model } from '../types';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */\nconst isFilterLikeObject = (value: Record<string, unknown>, schema?: Model) =>\n Object.keys(value).some((k) => isOperator(k) || Boolean(schema?.attributes?.[k]));\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n Array.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(data, key);\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 }) => value == null)\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => attribute == null,\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // Operator operands that are plain objects (not arrays) are only traversed when they look like\n // filter subtrees (nested operators or schema attributes). Otherwise treat as opaque operands\n // (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).\n // Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on \"anything\".\n // $not is excluded: its value is always a nested filter map, not an opaque scalar operand.\n if (\n isOperator(key) &&\n key !== '$not' &&\n isObj(value) &&\n !Array.isArray(value) &&\n !isFilterLikeObject(value, schema)\n ) {\n set(key, value);\n return;\n }\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 // Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.\n .onAttribute(\n ({ attribute, value }) =>\n Boolean(isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value),\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","isFilterLikeObject","schema","Object","keys","some","k","isOperator","Boolean","attributes","filters","traverseFactory","intercept","Array","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","get","ignore","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { isObject, isEmpty, cloneDeep, omit
|
|
1
|
+
import { isObject, isEmpty, cloneDeep, omit } from 'lodash';
|
|
2
|
+
import { curry } from '../curry.mjs';
|
|
2
3
|
import { isScalarAttribute } from '../content-types.mjs';
|
|
3
4
|
import { isOperator } from '../operators.mjs';
|
|
4
5
|
import traverseFactory from './factory.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, cloneDeep, omit } from 'lodash';\n\nimport { isScalarAttribute } from '../content-types';\nimport { isOperator } from '../operators';\nimport traverseFactory, { type Parent } from './factory';\nimport type { Model } from '../types';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */\nconst isFilterLikeObject = (value: Record<string, unknown>, schema?: Model) =>\n Object.keys(value).some((k) => isOperator(k) || Boolean(schema?.attributes?.[k]));\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n Array.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(data, key);\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 }) => value == null)\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => attribute == null,\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // Operator operands that are plain objects (not arrays) are only traversed when they look like\n // filter subtrees (nested operators or schema attributes). Otherwise treat as opaque operands\n // (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).\n // Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on \"anything\".\n // $not is excluded: its value is always a nested filter map, not an opaque scalar operand.\n if (\n isOperator(key) &&\n key !== '$not' &&\n isObj(value) &&\n !Array.isArray(value) &&\n !isFilterLikeObject(value, schema)\n ) {\n set(key, value);\n return;\n }\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 // Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.\n .onAttribute(\n ({ attribute, value }) =>\n Boolean(isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value),\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","isFilterLikeObject","schema","Object","keys","some","k","isOperator","Boolean","attributes","filters","traverseFactory","intercept","Array","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","get","ignore","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { isObject, isEmpty, cloneDeep, omit } from 'lodash';\n\nimport { curry } from '../curry';\nimport { isScalarAttribute } from '../content-types';\nimport { isOperator } from '../operators';\nimport traverseFactory, { type Parent } from './factory';\nimport type { Model } from '../types';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */\nconst isFilterLikeObject = (value: Record<string, unknown>, schema?: Model) =>\n Object.keys(value).some((k) => isOperator(k) || Boolean(schema?.attributes?.[k]));\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n Array.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(data, key);\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 }) => value == null)\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => attribute == null,\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // Operator operands that are plain objects (not arrays) are only traversed when they look like\n // filter subtrees (nested operators or schema attributes). Otherwise treat as opaque operands\n // (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).\n // Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on \"anything\".\n // $not is excluded: its value is always a nested filter map, not an opaque scalar operand.\n if (\n isOperator(key) &&\n key !== '$not' &&\n isObj(value) &&\n !Array.isArray(value) &&\n !isFilterLikeObject(value, schema)\n ) {\n set(key, value);\n return;\n }\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 // Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.\n .onAttribute(\n ({ attribute, value }) =>\n Boolean(isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value),\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","isFilterLikeObject","schema","Object","keys","some","k","isOperator","Boolean","attributes","filters","traverseFactory","intercept","Array","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","get","ignore","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";AA8TA,wBAAwC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
|
+
var curry = require('../curry.js');
|
|
4
5
|
var factory = require('./factory.js');
|
|
5
6
|
var contentTypes = require('../content-types.js');
|
|
6
7
|
var errors = require('../errors.js');
|
|
@@ -282,7 +283,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
282
283
|
set(key, newOn);
|
|
283
284
|
}
|
|
284
285
|
});
|
|
285
|
-
var traverseQueryPopulate =
|
|
286
|
+
var traverseQueryPopulate = curry.curry(populate.traverse);
|
|
286
287
|
const objectPopulateToPaths = (input)=>{
|
|
287
288
|
const paths = [];
|
|
288
289
|
function traverse(currentObj, parentPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.js","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import { curry, isString, isEmpty, isObject, constant, identity, cloneDeep } from 'lodash';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n return false;\n }\n\n const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n if (!hasConsecutiveNumericKeys) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n throw new ValidationError(\n `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n );\n};\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // Dot notation cannot represent polymorphic `on` fragments. Keep the object form\n // when a visitor adds one, rather than trying to serialize it as nested `populate`.\n return paths ? paths[0] : traversedPopulate;\n })\n // Array of strings ['foo', 'bar.baz'] => traverse as one object, then serialize when possible\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const populateObject = pathsToObjectPopulate(populate);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // A string array cannot hold polymorphic `on` fragments. Return the sanitized object\n // as a whole when one is present, so consumers receive a valid populate representation.\n return paths ?? traversedPopulate;\n })\n .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n throwQsArrayLimitPopulateError(Object.keys(populate).length);\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = (value: string) => value.split('.');\n const recompose = (parts: string[]) => parts.join('.');\n\n return {\n transform: (value) => value.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 value == null || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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 .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, { ...value, ...(newValue as Record<string, unknown>) });\n\n return;\n }\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 populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\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 populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\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 // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (value == null || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] | undefined => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string): boolean {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n const nestedPopulate = (value as { populate?: PopulateObject }).populate;\n\n if (!nestedPopulate || !traverse(nestedPopulate, currentPath)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n if (!traverse(input, '')) {\n return undefined;\n }\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","Array","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","paths","objectPopulateToPaths","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","parts","join","trim","root","isEmpty","v","rest","cloneDeep","ignored","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","nestedPopulate","result","object","first","forEach","clause"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-populate.js","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import { isString, isEmpty, isObject, constant, identity, cloneDeep } from 'lodash';\n\nimport { curry } from '../curry';\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n return false;\n }\n\n const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n if (!hasConsecutiveNumericKeys) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n throw new ValidationError(\n `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n );\n};\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // Dot notation cannot represent polymorphic `on` fragments. Keep the object form\n // when a visitor adds one, rather than trying to serialize it as nested `populate`.\n return paths ? paths[0] : traversedPopulate;\n })\n // Array of strings ['foo', 'bar.baz'] => traverse as one object, then serialize when possible\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const populateObject = pathsToObjectPopulate(populate);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // A string array cannot hold polymorphic `on` fragments. Return the sanitized object\n // as a whole when one is present, so consumers receive a valid populate representation.\n return paths ?? traversedPopulate;\n })\n .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n throwQsArrayLimitPopulateError(Object.keys(populate).length);\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = (value: string) => value.split('.');\n const recompose = (parts: string[]) => parts.join('.');\n\n return {\n transform: (value) => value.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 value == null || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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 .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, { ...value, ...(newValue as Record<string, unknown>) });\n\n return;\n }\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 populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\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 populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\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 // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (value == null || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] | undefined => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string): boolean {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n const nestedPopulate = (value as { populate?: PopulateObject }).populate;\n\n if (!nestedPopulate || !traverse(nestedPopulate, currentPath)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n if (!traverse(input, '')) {\n return undefined;\n }\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","Array","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","paths","objectPopulateToPaths","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","parts","join","trim","root","isEmpty","v","rest","cloneDeep","ignored","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","nestedPopulate","result","object","first","forEach","clause"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { identity, constant, isString, isEmpty, cloneDeep, isObject
|
|
1
|
+
import { identity, constant, isString, isEmpty, cloneDeep, isObject } from 'lodash';
|
|
2
|
+
import { curry } from '../curry.mjs';
|
|
2
3
|
import traverseFactory from './factory.mjs';
|
|
3
4
|
import { isMorphToRelationalAttribute } from '../content-types.mjs';
|
|
4
5
|
import { ValidationError } from '../errors.mjs';
|