@strapi/utils 5.56.0 → 5.58.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 +8 -9
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +6 -7
- package/dist/content-types.mjs.map +1 -1
- package/dist/convert-query-params.d.ts.map +1 -1
- package/dist/convert-query-params.js +33 -34
- package/dist/convert-query-params.js.map +1 -1
- package/dist/convert-query-params.mjs +23 -24
- package/dist/convert-query-params.mjs.map +1 -1
- package/dist/format-yup-error.js +3 -3
- package/dist/format-yup-error.js.map +1 -1
- package/dist/format-yup-error.mjs +1 -1
- package/dist/format-yup-error.mjs.map +1 -1
- package/dist/hooks.js +3 -3
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +2 -2
- package/dist/hooks.mjs.map +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +15 -18
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.mjs +15 -18
- package/dist/pagination.mjs.map +1 -1
- package/dist/policy.d.ts +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +1 -3
- package/dist/policy.js.map +1 -1
- package/dist/policy.mjs +1 -3
- package/dist/policy.mjs.map +1 -1
- package/dist/primitives/objects.d.ts +7 -1
- package/dist/primitives/objects.d.ts.map +1 -1
- package/dist/primitives/objects.js +5 -0
- package/dist/primitives/objects.js.map +1 -1
- package/dist/primitives/objects.mjs +5 -1
- package/dist/primitives/objects.mjs.map +1 -1
- package/dist/primitives/strings.d.ts.map +1 -1
- package/dist/primitives/strings.js +3 -7
- package/dist/primitives/strings.js.map +1 -1
- package/dist/primitives/strings.mjs +3 -7
- package/dist/primitives/strings.mjs.map +1 -1
- package/dist/provider-factory.js +4 -4
- package/dist/provider-factory.js.map +1 -1
- package/dist/provider-factory.mjs +1 -1
- package/dist/provider-factory.mjs.map +1 -1
- package/dist/relations.js +2 -2
- package/dist/relations.js.map +1 -1
- package/dist/relations.mjs +1 -1
- package/dist/relations.mjs.map +1 -1
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +8 -8
- package/dist/sanitize/index.js.map +1 -1
- package/dist/sanitize/index.mjs +7 -7
- package/dist/sanitize/index.mjs.map +1 -1
- package/dist/sanitize/sanitizers.js +10 -10
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +4 -4
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.js +4 -4
- package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs +3 -3
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.js +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.mjs +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.js +9 -9
- package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.mjs +4 -4
- package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -3
- package/dist/security.js.map +1 -1
- package/dist/security.mjs +3 -3
- package/dist/security.mjs.map +1 -1
- package/dist/set-creator-fields.d.ts +4 -1
- package/dist/set-creator-fields.d.ts.map +1 -1
- package/dist/set-creator-fields.js +7 -4
- package/dist/set-creator-fields.js.map +1 -1
- package/dist/set-creator-fields.mjs +7 -4
- package/dist/set-creator-fields.mjs.map +1 -1
- package/dist/traverse/factory.js +8 -8
- package/dist/traverse/factory.js.map +1 -1
- package/dist/traverse/factory.mjs +8 -8
- package/dist/traverse/factory.mjs.map +1 -1
- package/dist/traverse/query-fields.js +7 -7
- package/dist/traverse/query-fields.js.map +1 -1
- package/dist/traverse/query-fields.mjs +3 -3
- package/dist/traverse/query-fields.mjs.map +1 -1
- package/dist/traverse/query-filters.js +12 -12
- package/dist/traverse/query-filters.js.map +1 -1
- package/dist/traverse/query-filters.mjs +7 -7
- 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 +21 -21
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +12 -12
- 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 +16 -16
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +6 -6
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +18 -18
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +16 -16
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +5 -5
- 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 +2 -1
- package/dist/validate/utils.d.ts.map +1 -1
- package/dist/validate/utils.js +4 -4
- package/dist/validate/utils.js.map +1 -1
- package/dist/validate/utils.mjs +4 -4
- package/dist/validate/utils.mjs.map +1 -1
- package/dist/validate/validators.d.ts.map +1 -1
- package/dist/validate/validators.js +17 -9
- package/dist/validate/validators.js.map +1 -1
- package/dist/validate/validators.mjs +14 -6
- package/dist/validate/validators.mjs.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.js +4 -4
- package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.mjs +3 -3
- package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.js +2 -2
- package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.js +6 -6
- package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
- package/dist/validators.js +3 -3
- package/dist/validators.js.map +1 -1
- package/dist/validators.mjs +3 -3
- package/dist/validators.mjs.map +1 -1
- package/dist/yup.d.ts.map +1 -1
- package/dist/yup.js +2 -3
- package/dist/yup.js.map +1 -1
- package/dist/yup.mjs +3 -4
- package/dist/yup.mjs.map +1 -1
- package/package.json +4 -4
package/dist/traverse/factory.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
|
|
5
5
|
const DEFAULT_PATH = {
|
|
6
6
|
raw: null,
|
|
@@ -41,9 +41,9 @@ var traverseFactory = (()=>{
|
|
|
41
41
|
const newPath = {
|
|
42
42
|
...path
|
|
43
43
|
};
|
|
44
|
-
newPath.raw =
|
|
45
|
-
if (
|
|
46
|
-
newPath.attribute =
|
|
44
|
+
newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;
|
|
45
|
+
if (attribute != null) {
|
|
46
|
+
newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;
|
|
47
47
|
}
|
|
48
48
|
// visitors
|
|
49
49
|
const visitorOptions = {
|
|
@@ -65,10 +65,10 @@ var traverseFactory = (()=>{
|
|
|
65
65
|
},
|
|
66
66
|
recurse: traverse
|
|
67
67
|
};
|
|
68
|
-
await visitor(visitorOptions,
|
|
68
|
+
await visitor(visitorOptions, _.pick(transformUtils, [
|
|
69
69
|
'remove',
|
|
70
70
|
'set'
|
|
71
|
-
]
|
|
71
|
+
]));
|
|
72
72
|
const value = utils.get(key, out);
|
|
73
73
|
const createContext = ()=>({
|
|
74
74
|
key,
|
|
@@ -96,10 +96,10 @@ var traverseFactory = (()=>{
|
|
|
96
96
|
const ctx = createContext();
|
|
97
97
|
const pass = await handler.predicate(ctx);
|
|
98
98
|
if (pass) {
|
|
99
|
-
await handler.handler(ctx,
|
|
99
|
+
await handler.handler(ctx, _.pick(transformUtils, [
|
|
100
100
|
'recurse',
|
|
101
101
|
'set'
|
|
102
|
-
]
|
|
102
|
+
]));
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sources":["../../src/traverse/factory.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-loop-func */\nimport { isNil, pick } from 'lodash/fp';\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 = 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 // 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(['remove', 'set'], transformUtils));\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(['recurse', 'set'], transformUtils));\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","isNil","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.js","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":";;;;AAoHA,MAAMA,YAAAA,GAAe;IAAEC,GAAAA,EAAK,IAAA;IAAMC,SAAAA,EAAW;AAAK,CAAA;AAElD,sBAAe,CAAA,IAAA;AACb,IAAA,MAAMC,KAAAA,GAAe;AACnBC,QAAAA,OAAAA,EAAS,EAAE;AACXC,QAAAA,YAAAA,EAAc,EAAE;AAChBC,QAAAA,MAAAA,EAAQ,EAAE;QACVC,QAAAA,EAAU;AACRC,YAAAA,UAAAA,EAAY,EAAE;AACdC,YAAAA,MAAAA,EAAQ;AACV;AACF,KAAA;IAEA,MAAMC,QAAAA,GAAqB,OAAOC,OAAAA,EAASC,OAAAA,EAASC,IAAAA,GAAAA;AAClD,QAAA,MAAM,EAAEC,IAAAA,GAAOd,YAAY,EAAEe,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGL,OAAAA,IAAW,EAAC;;QAGtE,KAAK,MAAM,EAAEM,SAAS,EAAEC,OAAO,EAAE,IAAIhB,KAAAA,CAAME,YAAY,CAAE;AACvD,YAAA,IAAIa,UAAUL,IAAAA,CAAAA,EAAO;gBACnB,OAAOM,OAAAA,CAAQR,OAAAA,EAASC,OAAAA,EAASC,IAAAA,EAAM;oBAAEO,OAAAA,EAASV;AAAS,iBAAA,CAAA;AAC7D,YAAA;AACF,QAAA;;QAGA,MAAMW,MAAAA,GAASlB,KAAAA,CAAMC,OAAO,CAACkB,IAAI,CAAC,CAACD,MAAAA,GAAWA,MAAAA,CAAOH,SAAS,CAACL,IAAAA,CAAAA,CAAAA,EAAQQ,MAAAA;AACvE,QAAA,MAAME,QAAQF,MAAAA,GAASR,IAAAA,CAAAA;;AAGvB,QAAA,IAAI,CAACU,KAAAA,EAAO;YACV,OAAOV,IAAAA;AACT,QAAA;;QAGA,IAAIW,GAAAA,GAAMD,KAAAA,CAAME,SAAS,CAACZ,IAAAA,CAAAA;QAC1B,MAAMa,IAAAA,GAAOH,KAAAA,CAAMG,IAAI,CAACF,GAAAA,CAAAA;QAExB,KAAK,MAAMG,OAAOD,IAAAA,CAAM;AACtB,YAAA,MAAMxB,SAAAA,GAAYc,MAAAA,EAAQR,UAAAA,GAAamB,GAAAA,CAAI;AAE3C,YAAA,MAAMC,OAAAA,GAAU;AAAE,gBAAA,GAAGd;AAAK,aAAA;AAE1Bc,YAAAA,OAAAA,CAAQ3B,GAAG,GAAGa,IAAAA,CAAKb,GAAG,IAAI,IAAA,GAAO0B,GAAAA,GAAM,CAAA,EAAGb,IAAAA,CAAKb,GAAG,CAAC,CAAC,EAAE0B,GAAAA,CAAAA,CAAK;AAE3D,YAAA,IAAIzB,aAAa,IAAA,EAAM;AACrB0B,gBAAAA,OAAAA,CAAQ1B,SAAS,GAAGY,IAAAA,CAAKZ,SAAS,IAAI,IAAA,GAAOyB,GAAAA,GAAM,CAAA,EAAGb,IAAAA,CAAKZ,SAAS,CAAC,CAAC,EAAEyB,GAAAA,CAAAA,CAAK;AAC/E,YAAA;;AAGA,YAAA,MAAME,cAAAA,GAAiC;AACrCF,gBAAAA,GAAAA;gBACAG,KAAAA,EAAOP,KAAAA,CAAMQ,GAAG,CAACJ,GAAAA,EAAKH,GAAAA,CAAAA;AACtBtB,gBAAAA,SAAAA;AACAc,gBAAAA,MAAAA;gBACAF,IAAAA,EAAMc,OAAAA;gBACNf,IAAAA,EAAMW,GAAAA;AACNP,gBAAAA,QAAAA;AACAF,gBAAAA;AACF,aAAA;AAEA,YAAA,MAAMiB,cAAAA,GAAiC;AACrCC,gBAAAA,MAAAA,CAAAA,CAAON,GAAG,EAAA;oBACRH,GAAAA,GAAMD,KAAAA,CAAMU,MAAM,CAACN,GAAAA,EAAKH,GAAAA,CAAAA;AAC1B,gBAAA,CAAA;gBACAU,GAAAA,CAAAA,CAAIP,GAAG,EAAEG,KAAK,EAAA;AACZN,oBAAAA,GAAAA,GAAMD,KAAAA,CAAMW,GAAG,CAACP,GAAAA,EAAKG,KAAAA,EAAON,GAAAA,CAAAA;AAC9B,gBAAA,CAAA;gBACAJ,OAAAA,EAASV;AACX,aAAA;YAEA,MAAMC,OAAAA,CAAQkB,cAAAA,EAAgBM,MAAAA,CAAKH,cAAAA,EAAgB;AAAC,gBAAA,QAAA;AAAU,gBAAA;AAAM,aAAA,CAAA,CAAA;AAEpE,YAAA,MAAMF,KAAAA,GAAQP,KAAAA,CAAMQ,GAAG,CAACJ,GAAAA,EAAKH,GAAAA,CAAAA;YAE7B,MAAMY,aAAAA,GAAgB,KAAgB;AACpCT,oBAAAA,GAAAA;AACAG,oBAAAA,KAAAA;AACA5B,oBAAAA,SAAAA;AACAc,oBAAAA,MAAAA;oBACAF,IAAAA,EAAMc,OAAAA;oBACNf,IAAAA,EAAMW,GAAAA;AACNb,oBAAAA,OAAAA;AACAM,oBAAAA,QAAAA;AACAF,oBAAAA;iBACF,CAAA;;AAGA,YAAA,MAAMsB,SAAAA,GAAYD,aAAAA,EAAAA;YAClB,MAAME,YAAAA,GAAenC,MAAMG,MAAM,CAACiC,IAAI,CAAC,CAACrB,YAAcA,SAAAA,CAAUmB,SAAAA,CAAAA,CAAAA;AAEhE,YAAA,IAAIC,YAAAA,EAAc;AAChB,gBAAA;AACF,YAAA;;AAGA,YAAA,MAAM/B,QAAAA,GAAW;mBAAIJ,KAAAA,CAAMI,QAAQ,CAACE,MAAM;mBAAKN,KAAAA,CAAMI,QAAQ,CAACC;AAAW,aAAA;YAEzE,WAAW,MAAMW,WAAWZ,QAAAA,CAAU;AACpC,gBAAA,MAAMiC,GAAAA,GAAMJ,aAAAA,EAAAA;AACZ,gBAAA,MAAMK,IAAAA,GAAO,MAAMtB,OAAAA,CAAQD,SAAS,CAACsB,GAAAA,CAAAA;AAErC,gBAAA,IAAIC,IAAAA,EAAM;AACR,oBAAA,MAAMtB,OAAAA,CAAQA,OAAO,CAACqB,GAAAA,EAAKL,OAAKH,cAAAA,EAAgB;AAAC,wBAAA,SAAA;AAAW,wBAAA;AAAM,qBAAA,CAAA,CAAA;AACpE,gBAAA;AACF,YAAA;AACF,QAAA;QAEA,OAAOR,GAAAA;AACT,IAAA,CAAA;IAEA,OAAO;AACLd,QAAAA,QAAAA;QAEAgC,SAAAA,CAAAA,CAAaxB,SAAsC,EAAEC,OAAkC,EAAA;YACrFhB,KAAAA,CAAME,YAAY,CAACsC,IAAI,CAAC;AAAEzB,gBAAAA,SAAAA;AAAWC,gBAAAA;AAAQ,aAAA,CAAA;AAC7C,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEAyB,KAAAA,CAAAA,CAAS1B,SAAiC,EAAEG,MAA2B,EAAA;YACrElB,KAAAA,CAAMC,OAAO,CAACuC,IAAI,CAAC;AAAEzB,gBAAAA,SAAAA;AAAWG,gBAAAA;AAAO,aAAA,CAAA;AACvC,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAf,QAAAA,MAAAA,CAAAA,CAAOY,SAAiB,EAAA;YACtBf,KAAAA,CAAMG,MAAM,CAACqC,IAAI,CAACzB,SAAAA,CAAAA;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEA2B,EAAAA,CAAAA,CAAG3B,SAAqC,EAAEC,OAAiC,EAAA;AACzEhB,YAAAA,KAAAA,CAAMI,QAAQ,CAACE,MAAM,CAACkC,IAAI,CAAC;AAAEzB,gBAAAA,SAAAA;AAAWC,gBAAAA;AAAQ,aAAA,CAAA;AAChD,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEA2B,WAAAA,CAAAA,CAAY5B,SAAwC,EAAEC,OAAoC,EAAA;AACxFhB,YAAAA,KAAAA,CAAMI,QAAQ,CAACC,UAAU,CAACmC,IAAI,CAAC;AAAEzB,gBAAAA,SAAAA;AAAWC,gBAAAA;AAAQ,aAAA,CAAA;AACpD,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA4B,QAAAA,UAAAA,CAAAA,CAAW5B,OAAyD,EAAA;YAClE,OAAO,IAAI,CAAC2B,WAAW,CAAC,CAAC,EAAE5C,SAAS,EAAE,GAAKA,SAAAA,EAAW8C,IAAAA,KAAS,UAAA,EAAY7B,OAAAA,CAAAA;AAC7E,QAAA,CAAA;AAEA8B,QAAAA,OAAAA,CAAAA,CAAQ9B,OAAyD,EAAA;YAC/D,OAAO,IAAI,CAAC2B,WAAW,CAAC,CAAC,EAAE5C,SAAS,EAAE,GAAKA,SAAAA,EAAW8C,IAAAA,KAAS,OAAA,EAAS7B,OAAAA,CAAAA;AAC1E,QAAA,CAAA;AAEA+B,QAAAA,WAAAA,CAAAA,CAAY/B,OAAwD,EAAA;YAClE,OAAO,IAAI,CAAC2B,WAAW,CAAC,CAAC,EAAE5C,SAAS,EAAE,GAAKA,SAAAA,EAAW8C,IAAAA,KAAS,WAAA,EAAa7B,OAAAA,CAAAA;AAC9E,QAAA,CAAA;AAEAgC,QAAAA,aAAAA,CAAAA,CAAchC,OAA0D,EAAA;YACtE,OAAO,IAAI,CAAC2B,WAAW,CAAC,CAAC,EAAE5C,SAAS,EAAE,GAAKA,SAAAA,EAAW8C,IAAAA,KAAS,aAAA,EAAe7B,OAAAA,CAAAA;AAChF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { pick } from 'lodash';
|
|
2
2
|
|
|
3
3
|
const DEFAULT_PATH = {
|
|
4
4
|
raw: null,
|
|
@@ -39,9 +39,9 @@ var traverseFactory = (()=>{
|
|
|
39
39
|
const newPath = {
|
|
40
40
|
...path
|
|
41
41
|
};
|
|
42
|
-
newPath.raw =
|
|
43
|
-
if (
|
|
44
|
-
newPath.attribute =
|
|
42
|
+
newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;
|
|
43
|
+
if (attribute != null) {
|
|
44
|
+
newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;
|
|
45
45
|
}
|
|
46
46
|
// visitors
|
|
47
47
|
const visitorOptions = {
|
|
@@ -63,10 +63,10 @@ var traverseFactory = (()=>{
|
|
|
63
63
|
},
|
|
64
64
|
recurse: traverse
|
|
65
65
|
};
|
|
66
|
-
await visitor(visitorOptions, pick([
|
|
66
|
+
await visitor(visitorOptions, pick(transformUtils, [
|
|
67
67
|
'remove',
|
|
68
68
|
'set'
|
|
69
|
-
]
|
|
69
|
+
]));
|
|
70
70
|
const value = utils.get(key, out);
|
|
71
71
|
const createContext = ()=>({
|
|
72
72
|
key,
|
|
@@ -94,10 +94,10 @@ var traverseFactory = (()=>{
|
|
|
94
94
|
const ctx = createContext();
|
|
95
95
|
const pass = await handler.predicate(ctx);
|
|
96
96
|
if (pass) {
|
|
97
|
-
await handler.handler(ctx, pick([
|
|
97
|
+
await handler.handler(ctx, pick(transformUtils, [
|
|
98
98
|
'recurse',
|
|
99
99
|
'set'
|
|
100
|
-
]
|
|
100
|
+
]));
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.mjs","sources":["../../src/traverse/factory.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-loop-func */\nimport { isNil, pick } from 'lodash/fp';\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 = 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 // 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(['remove', 'set'], transformUtils));\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(['recurse', 'set'], transformUtils));\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","isNil","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 { 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,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var factory = require('./factory.js');
|
|
5
5
|
|
|
6
6
|
const isStringArray = (value)=>{
|
|
7
|
-
return
|
|
7
|
+
return Array.isArray(value) && value.every(_.isString);
|
|
8
8
|
};
|
|
9
9
|
const fields = factory()// Intercept array of strings
|
|
10
10
|
// e.g. fields=['title', 'description']
|
|
@@ -12,14 +12,14 @@ const fields = factory()// Intercept array of strings
|
|
|
12
12
|
return Promise.all(fields.map((field)=>recurse(visitor, options, field)));
|
|
13
13
|
})// Intercept comma separated fields (as string)
|
|
14
14
|
// e.g. fields='title,description'
|
|
15
|
-
.intercept((value)=>
|
|
15
|
+
.intercept((value)=>_.isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
|
|
16
16
|
return Promise.all(fields.split(',').map((field)=>recurse(visitor, options, field)));
|
|
17
17
|
})// Return wildcards as is
|
|
18
|
-
.intercept((value)=>
|
|
18
|
+
.intercept((value)=>_.eq('*', value), _.constant('*'))// Parse string values
|
|
19
19
|
// Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
|
|
20
20
|
// thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
|
|
21
|
-
.parse(
|
|
22
|
-
transform:
|
|
21
|
+
.parse(_.isString, ()=>({
|
|
22
|
+
transform: (value)=>value.trim(),
|
|
23
23
|
remove (key, data) {
|
|
24
24
|
return data === key ? undefined : data;
|
|
25
25
|
},
|
|
@@ -35,7 +35,7 @@ const fields = factory()// Intercept array of strings
|
|
|
35
35
|
return key === data ? data : undefined;
|
|
36
36
|
}
|
|
37
37
|
}));
|
|
38
|
-
var traverseQueryFields =
|
|
38
|
+
var traverseQueryFields = _.curry(fields.traverse);
|
|
39
39
|
|
|
40
40
|
module.exports = traverseQueryFields;
|
|
41
41
|
//# sourceMappingURL=query-fields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry,
|
|
1
|
+
{"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isString, eq, constant } from 'lodash';\n\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":";;;;;AAIA,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,OAAAA,CAAM1B,MAAAA,CAAO2B,QAAQ,CAAA;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { isString, eq, constant,
|
|
1
|
+
import { isString, eq, constant, curry } from 'lodash';
|
|
2
2
|
import traverseFactory from './factory.mjs';
|
|
3
3
|
|
|
4
4
|
const isStringArray = (value)=>{
|
|
5
|
-
return isArray(value) && value.every(isString);
|
|
5
|
+
return Array.isArray(value) && value.every(isString);
|
|
6
6
|
};
|
|
7
7
|
const fields = traverseFactory()// Intercept array of strings
|
|
8
8
|
// e.g. fields=['title', 'description']
|
|
@@ -17,7 +17,7 @@ const fields = traverseFactory()// Intercept array of strings
|
|
|
17
17
|
// Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
|
|
18
18
|
// thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
|
|
19
19
|
.parse(isString, ()=>({
|
|
20
|
-
transform: trim,
|
|
20
|
+
transform: (value)=>value.trim(),
|
|
21
21
|
remove (key, data) {
|
|
22
22
|
return data === key ? undefined : data;
|
|
23
23
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry,
|
|
1
|
+
{"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isString, eq, constant } from 'lodash';\n\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":";;;AAIA,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,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var contentTypes = require('../content-types.js');
|
|
5
5
|
var operators = require('../operators.js');
|
|
6
6
|
var factory = require('./factory.js');
|
|
7
7
|
|
|
8
|
-
const isObj = (value)=>
|
|
8
|
+
const isObj = (value)=>_.isObject(value);
|
|
9
9
|
/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */ const isFilterLikeObject = (value, schema)=>Object.keys(value).some((k)=>operators.isOperator(k) || Boolean(schema?.attributes?.[k]));
|
|
10
10
|
const filters = factory().intercept(// Intercept filters arrays and apply the traversal to each one individually
|
|
11
|
-
|
|
11
|
+
Array.isArray, async (visitor, options, filters, { recurse })=>{
|
|
12
12
|
return Promise.all(filters.map((filter, i)=>{
|
|
13
13
|
// In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
|
|
14
14
|
// can have a value array, thus we can update the raw path but not the attribute one
|
|
@@ -20,15 +20,15 @@ fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
20
20
|
...options,
|
|
21
21
|
path: newPath
|
|
22
22
|
}, filter);
|
|
23
|
-
})).then((res)=>res.filter((val)=>!(
|
|
23
|
+
})).then((res)=>res.filter((val)=>!(_.isObject(val) && _.isEmpty(val))));
|
|
24
24
|
}).intercept(// Ignore non object filters and return the value as-is
|
|
25
|
-
(filters)=>!
|
|
25
|
+
(filters)=>!_.isObject(filters), (_, __, filters)=>{
|
|
26
26
|
return filters;
|
|
27
27
|
})// Parse object values
|
|
28
28
|
.parse(isObj, ()=>({
|
|
29
|
-
transform:
|
|
29
|
+
transform: _.cloneDeep,
|
|
30
30
|
remove (key, data) {
|
|
31
|
-
return
|
|
31
|
+
return _.omit(data, key);
|
|
32
32
|
},
|
|
33
33
|
set (key, value, data) {
|
|
34
34
|
return {
|
|
@@ -43,8 +43,8 @@ fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
43
43
|
return data[key];
|
|
44
44
|
}
|
|
45
45
|
}))// Ignore null or undefined values
|
|
46
|
-
.ignore(({ value })=>
|
|
47
|
-
.on(({ attribute })=>
|
|
46
|
+
.ignore(({ value })=>value == null)// Recursion on operators (non attributes)
|
|
47
|
+
.on(({ attribute })=>attribute == null, async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
48
48
|
const parent = {
|
|
49
49
|
key,
|
|
50
50
|
path,
|
|
@@ -56,7 +56,7 @@ fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
56
56
|
// (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).
|
|
57
57
|
// Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on "anything".
|
|
58
58
|
// $not is excluded: its value is always a nested filter map, not an opaque scalar operand.
|
|
59
|
-
if (operators.isOperator(key) && key !== '$not' && isObj(value) && !
|
|
59
|
+
if (operators.isOperator(key) && key !== '$not' && isObj(value) && !Array.isArray(value) && !isFilterLikeObject(value, schema)) {
|
|
60
60
|
set(key, value);
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
@@ -120,7 +120,7 @@ fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
120
120
|
}, value);
|
|
121
121
|
set(key, newValue);
|
|
122
122
|
})// Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.
|
|
123
|
-
.onAttribute(({ attribute, value })=>Boolean(contentTypes.isScalarAttribute(attribute)) && isObj(value) && !
|
|
123
|
+
.onAttribute(({ attribute, value })=>Boolean(contentTypes.isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
124
124
|
const parent = {
|
|
125
125
|
key,
|
|
126
126
|
path,
|
|
@@ -134,7 +134,7 @@ fp.isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
134
134
|
parent
|
|
135
135
|
}, value));
|
|
136
136
|
});
|
|
137
|
-
var traverseQueryFilters =
|
|
137
|
+
var traverseQueryFilters = _.curry(filters.traverse);
|
|
138
138
|
|
|
139
139
|
module.exports = traverseQueryFilters;
|
|
140
140
|
//# 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, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\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 isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // 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 !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) && !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","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","isNil","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 { 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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isObject, isEmpty, cloneDeep, omit, curry } from 'lodash';
|
|
2
2
|
import { isScalarAttribute } from '../content-types.mjs';
|
|
3
3
|
import { isOperator } from '../operators.mjs';
|
|
4
4
|
import traverseFactory from './factory.mjs';
|
|
@@ -6,7 +6,7 @@ import traverseFactory from './factory.mjs';
|
|
|
6
6
|
const isObj = (value)=>isObject(value);
|
|
7
7
|
/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */ const isFilterLikeObject = (value, schema)=>Object.keys(value).some((k)=>isOperator(k) || Boolean(schema?.attributes?.[k]));
|
|
8
8
|
const filters = traverseFactory().intercept(// Intercept filters arrays and apply the traversal to each one individually
|
|
9
|
-
isArray, async (visitor, options, filters, { recurse })=>{
|
|
9
|
+
Array.isArray, async (visitor, options, filters, { recurse })=>{
|
|
10
10
|
return Promise.all(filters.map((filter, i)=>{
|
|
11
11
|
// In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
|
|
12
12
|
// can have a value array, thus we can update the raw path but not the attribute one
|
|
@@ -26,7 +26,7 @@ isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
26
26
|
.parse(isObj, ()=>({
|
|
27
27
|
transform: cloneDeep,
|
|
28
28
|
remove (key, data) {
|
|
29
|
-
return omit(
|
|
29
|
+
return omit(data, key);
|
|
30
30
|
},
|
|
31
31
|
set (key, value, data) {
|
|
32
32
|
return {
|
|
@@ -41,8 +41,8 @@ isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
41
41
|
return data[key];
|
|
42
42
|
}
|
|
43
43
|
}))// Ignore null or undefined values
|
|
44
|
-
.ignore(({ value })=>
|
|
45
|
-
.on(({ attribute })=>
|
|
44
|
+
.ignore(({ value })=>value == null)// Recursion on operators (non attributes)
|
|
45
|
+
.on(({ attribute })=>attribute == null, async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
46
46
|
const parent = {
|
|
47
47
|
key,
|
|
48
48
|
path,
|
|
@@ -54,7 +54,7 @@ isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
54
54
|
// (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).
|
|
55
55
|
// Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on "anything".
|
|
56
56
|
// $not is excluded: its value is always a nested filter map, not an opaque scalar operand.
|
|
57
|
-
if (isOperator(key) && key !== '$not' && isObj(value) && !isArray(value) && !isFilterLikeObject(value, schema)) {
|
|
57
|
+
if (isOperator(key) && key !== '$not' && isObj(value) && !Array.isArray(value) && !isFilterLikeObject(value, schema)) {
|
|
58
58
|
set(key, value);
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
@@ -118,7 +118,7 @@ isArray, async (visitor, options, filters, { recurse })=>{
|
|
|
118
118
|
}, value);
|
|
119
119
|
set(key, newValue);
|
|
120
120
|
})// Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.
|
|
121
|
-
.onAttribute(({ attribute, value })=>Boolean(isScalarAttribute(attribute)) && isObj(value) && !isArray(value), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
121
|
+
.onAttribute(({ attribute, value })=>Boolean(isScalarAttribute(attribute)) && isObj(value) && !Array.isArray(value), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
122
122
|
const parent = {
|
|
123
123
|
key,
|
|
124
124
|
path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport { 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 isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n // 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 !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) && !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","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","isNil","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":";;;;;AAOA,MAAMA,KAAAA,GAAQ,CAACC,KAAAA,GAAqDC,QAAAA,CAASD,KAAAA,CAAAA;AAE7E,iHACA,MAAME,kBAAAA,GAAqB,CAACF,OAAgCG,MAAAA,GAC1DC,MAAAA,CAAOC,IAAI,CAACL,KAAAA,CAAAA,CAAOM,IAAI,CAAC,CAACC,IAAMC,UAAAA,CAAWD,CAAAA,CAAAA,IAAME,QAAQN,MAAAA,EAAQO,UAAAA,GAAaH,CAAAA,CAAE,CAAA,CAAA;AAEjF,MAAMI,OAAAA,GAAUC,eAAAA,EAAAA,CACbC,SAAS;AAERC,OAAAA,EACA,OAAOC,OAAAA,EAASC,OAAAA,EAASL,OAAAA,EAAS,EAAEM,OAAO,EAAE,GAAA;AAC3C,IAAA,OAAOC,QAAQC,GAAG,CAChBR,QAAQS,GAAG,CAAC,CAACC,MAAAA,EAAQC,CAAAA,GAAAA;;;QAGnB,MAAMC,OAAAA,GAAUP,OAAAA,CAAQQ,IAAI,GACxB;AAAE,YAAA,GAAGR,QAAQQ,IAAI;YAAEC,GAAAA,EAAK,CAAA,EAAGT,OAAAA,CAAQQ,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,CAAAA,CAAE,CAAC;AAAE,SAAA,GACpDN,QAAQQ,IAAI;AAEhB,QAAA,OAAOP,QAAQF,OAAAA,EAAS;AAAE,YAAA,GAAGC,OAAO;YAAEQ,IAAAA,EAAMD;SAAQ,EAAGF,MAAAA,CAAAA;AACzD,IAAA,CAAA,CAAA,CAAA,CAEAK,IAAI,CAAC,CAACC,GAAAA,GAAQA,IAAIN,MAAM,CAAC,CAACO,GAAAA,GAAQ,EAAE3B,QAAAA,CAAS2B,GAAAA,CAAAA,IAAQC,QAAQD,GAAAA,CAAG,CAAA,CAAA,CAAA;AACpE,CAAA,CAAA,CAEDf,SAAS;AAER,CAACF,UAAgC,CAACV,QAAAA,CAASU,OAAAA,CAAAA,EAC3C,CAACmB,GAAGC,EAAAA,EAAIpB,OAAAA,GAAAA;IACN,OAAOA,OAAAA;AACT,CAAA,CAEF;CACCqB,KAAK,CAACjC,KAAAA,EAAO,KAAO;QACnBkC,SAAAA,EAAWC,SAAAA;QAEXC,MAAAA,CAAAA,CAAOC,GAAG,EAAEC,IAAI,EAAA;AACd,YAAA,OAAOC,KAAKF,GAAAA,EAAKC,IAAAA,CAAAA;AACnB,QAAA,CAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIH,GAAG,EAAEpC,KAAK,EAAEqC,IAAI,EAAA;YAClB,OAAO;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAACD,MAAMpC;AAAM,aAAA;AACjC,QAAA,CAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKgC,IAAI,EAAA;YACP,OAAOjC,MAAAA,CAAOC,IAAI,CAACgC,IAAAA,CAAAA;AACrB,QAAA,CAAA;QAEAG,GAAAA,CAAAA,CAAIJ,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOA,IAAI,CAACD,GAAAA,CAAI;AAClB,QAAA;AACF,KAAA,EACA;CACCK,MAAM,CAAC,CAAC,EAAEzC,KAAK,EAAE,GAAK0C,KAAAA,CAAM1C,OAC7B;AACC2C,CAAAA,EAAE,CACD,CAAC,EAAEC,SAAS,EAAE,GAAKF,KAAAA,CAAME,SAAAA,CAAAA,EACzB,OAAO,EAAER,GAAG,EAAErB,OAAO,EAAES,IAAI,EAAExB,KAAK,EAAEG,MAAM,EAAE0C,QAAQ,EAAED,SAAS,EAAE,EAAE,EAAEL,GAAG,EAAEtB,OAAO,EAAE,GAAA;AACjF,IAAA,MAAM6B,MAAAA,GAAiB;AAAEV,QAAAA,GAAAA;AAAKZ,QAAAA,IAAAA;AAAMrB,QAAAA,MAAAA;AAAQyC,QAAAA;AAAU,KAAA;;;;;;AAOtD,IAAA,IACEpC,UAAAA,CAAW4B,GAAAA,CAAAA,IACXA,GAAAA,KAAQ,MAAA,IACRrC,KAAAA,CAAMC,KAAAA,CAAAA,IACN,CAACc,OAAAA,CAAQd,KAAAA,CAAAA,IACT,CAACE,kBAAAA,CAAmBF,KAAAA,EAAOG,MAAAA,CAAAA,EAC3B;AACAoC,QAAAA,GAAAA,CAAIH,GAAAA,EAAKpC,KAAAA,CAAAA;AACT,QAAA;AACF,IAAA;IAEAuC,GAAAA,CAAIH,GAAAA,EAAK,MAAMnB,OAAAA,CAAQF,OAAAA,EAAS;AAAEZ,QAAAA,MAAAA;AAAQqB,QAAAA,IAAAA;AAAMqB,QAAAA,QAAAA;AAAUC,QAAAA;KAAO,EAAG9C,KAAAA,CAAAA,CAAAA;AACtE,CAAA,CAEF;CACC+C,UAAU,CACT,OAAO,EAAEX,GAAG,EAAEQ,SAAS,EAAE7B,OAAO,EAAES,IAAI,EAAExB,KAAK,EAAEG,MAAM,EAAE0C,QAAQ,EAAE,EAAE,EAAEN,GAAG,EAAEtB,OAAO,EAAE,GAAA;AACjF,IAAA,MAAM+B,kBAAkBJ,SAAAA,CAAUK,QAAQ,CAACC,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AAEpE,IAAA,IAAIH,eAAAA,EAAiB;AACnB,QAAA;AACF,IAAA;AAEA,IAAA,MAAMF,MAAAA,GAAiB;AAAEV,QAAAA,GAAAA;AAAKZ,QAAAA,IAAAA;AAAMrB,QAAAA,MAAAA;AAAQyC,QAAAA;AAAU,KAAA;IAEtD,MAAMQ,eAAAA,GAAkBR,UAAUS,MAAM;AACxC,IAAA,MAAMC,eAAeT,QAAAA,CAASO,eAAAA,CAAAA;IAE9B,MAAMG,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEZ,MAAAA,EAAQmD,YAAAA;AAAc9B,QAAAA,IAAAA;AAAMqB,QAAAA,QAAAA;AAAUC,QAAAA;KAAO,EAC/C9C,KAAAA,CAAAA;AAGFuC,IAAAA,GAAAA,CAAIH,GAAAA,EAAKmB,QAAAA,CAAAA;AACX,CAAA,CAAA,CAEDC,WAAW,CACV,OAAO,EAAEpB,GAAG,EAAEQ,SAAS,EAAE7B,OAAO,EAAES,IAAI,EAAErB,MAAM,EAAEH,KAAK,EAAE6C,QAAQ,EAAE,EAAE,EAAEN,GAAG,EAAEtB,OAAO,EAAE,GAAA;AACjF,IAAA,MAAM6B,MAAAA,GAAiB;AAAEV,QAAAA,GAAAA;AAAKZ,QAAAA,IAAAA;AAAMrB,QAAAA,MAAAA;AAAQyC,QAAAA;AAAU,KAAA;IACtD,MAAMU,YAAAA,GAAeT,QAAAA,CAASD,SAAAA,CAAUa,SAAS,CAAA;IAEjD,MAAMF,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEZ,MAAAA,EAAQmD,YAAAA;AAAc9B,QAAAA,IAAAA;AAAMqB,QAAAA,QAAAA;AAAUC,QAAAA;KAAO,EAC/C9C,KAAAA,CAAAA;AAGFuC,IAAAA,GAAAA,CAAIH,GAAAA,EAAKmB,QAAAA,CAAAA;AACX,CAAA,CAEF;CACCG,OAAO,CAAC,OAAO,EAAEtB,GAAG,EAAErB,OAAO,EAAES,IAAI,EAAErB,MAAM,EAAEyC,SAAS,EAAE5C,KAAK,EAAE6C,QAAQ,EAAE,EAAE,EAAEN,GAAG,EAAEtB,OAAO,EAAE,GAAA;AAC1F,IAAA,MAAM6B,MAAAA,GAAiB;AAAEV,QAAAA,GAAAA;AAAKZ,QAAAA,IAAAA;AAAMrB,QAAAA,MAAAA;AAAQyC,QAAAA;AAAU,KAAA;AAEtD,IAAA,MAAMQ,eAAAA,GAAkB,qBAAA;AACxB,IAAA,MAAME,eAAeT,QAAAA,CAASO,eAAAA,CAAAA;IAE9B,MAAMG,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEZ,MAAAA,EAAQmD,YAAAA;AAAc9B,QAAAA,IAAAA;AAAMqB,QAAAA,QAAAA;AAAUC,QAAAA;KAAO,EAC/C9C,KAAAA,CAAAA;AAGFuC,IAAAA,GAAAA,CAAIH,GAAAA,EAAKmB,QAAAA,CAAAA;AACX,CAAA,CACA;AACCI,CAAAA,WAAW,CACV,CAAC,EAAEf,SAAS,EAAE5C,KAAK,EAAE,GACnBS,OAAAA,CAAQmD,iBAAAA,CAAkBhB,eAAe7C,KAAAA,CAAMC,KAAAA,CAAAA,IAAU,CAACc,OAAAA,CAAQd,QACpE,OAAO,EAAEoC,GAAG,EAAErB,OAAO,EAAES,IAAI,EAAExB,KAAK,EAAEG,MAAM,EAAE0C,QAAQ,EAAED,SAAS,EAAE,EAAE,EAAEL,GAAG,EAAEtB,OAAO,EAAE,GAAA;AACjF,IAAA,MAAM6B,MAAAA,GAAiB;AAAEV,QAAAA,GAAAA;AAAKZ,QAAAA,IAAAA;AAAMrB,QAAAA,MAAAA;AAAQyC,QAAAA;AAAU,KAAA;IAEtDL,GAAAA,CAAIH,GAAAA,EAAK,MAAMnB,OAAAA,CAAQF,OAAAA,EAAS;AAAEZ,QAAAA,MAAAA;AAAQqB,QAAAA,IAAAA;AAAMqB,QAAAA,QAAAA;AAAUC,QAAAA;KAAO,EAAG9C,KAAAA,CAAAA,CAAAA;AACtE,CAAA,CAAA;AAGJ,2BAAe6D,KAAAA,CAAMlD,OAAAA,CAAQmD,QAAQ,CAAA;;;;"}
|
|
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 +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":";AA6TA,wBAAwC"}
|