@strapi/utils 5.56.0 → 5.57.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.
Files changed (149) hide show
  1. package/dist/async.js +2 -2
  2. package/dist/async.js.map +1 -1
  3. package/dist/async.mjs +1 -1
  4. package/dist/async.mjs.map +1 -1
  5. package/dist/content-types.d.ts.map +1 -1
  6. package/dist/content-types.js +8 -9
  7. package/dist/content-types.js.map +1 -1
  8. package/dist/content-types.mjs +6 -7
  9. package/dist/content-types.mjs.map +1 -1
  10. package/dist/convert-query-params.d.ts.map +1 -1
  11. package/dist/convert-query-params.js +33 -34
  12. package/dist/convert-query-params.js.map +1 -1
  13. package/dist/convert-query-params.mjs +23 -24
  14. package/dist/convert-query-params.mjs.map +1 -1
  15. package/dist/format-yup-error.js +3 -3
  16. package/dist/format-yup-error.js.map +1 -1
  17. package/dist/format-yup-error.mjs +1 -1
  18. package/dist/format-yup-error.mjs.map +1 -1
  19. package/dist/hooks.js +3 -3
  20. package/dist/hooks.js.map +1 -1
  21. package/dist/hooks.mjs +2 -2
  22. package/dist/hooks.mjs.map +1 -1
  23. package/dist/pagination.d.ts.map +1 -1
  24. package/dist/pagination.js +15 -18
  25. package/dist/pagination.js.map +1 -1
  26. package/dist/pagination.mjs +15 -18
  27. package/dist/pagination.mjs.map +1 -1
  28. package/dist/policy.d.ts +1 -1
  29. package/dist/policy.d.ts.map +1 -1
  30. package/dist/policy.js +1 -3
  31. package/dist/policy.js.map +1 -1
  32. package/dist/policy.mjs +1 -3
  33. package/dist/policy.mjs.map +1 -1
  34. package/dist/primitives/objects.d.ts +7 -1
  35. package/dist/primitives/objects.d.ts.map +1 -1
  36. package/dist/primitives/objects.js +5 -0
  37. package/dist/primitives/objects.js.map +1 -1
  38. package/dist/primitives/objects.mjs +5 -1
  39. package/dist/primitives/objects.mjs.map +1 -1
  40. package/dist/primitives/strings.d.ts.map +1 -1
  41. package/dist/primitives/strings.js +3 -7
  42. package/dist/primitives/strings.js.map +1 -1
  43. package/dist/primitives/strings.mjs +3 -7
  44. package/dist/primitives/strings.mjs.map +1 -1
  45. package/dist/provider-factory.js +4 -4
  46. package/dist/provider-factory.js.map +1 -1
  47. package/dist/provider-factory.mjs +1 -1
  48. package/dist/provider-factory.mjs.map +1 -1
  49. package/dist/relations.js +2 -2
  50. package/dist/relations.js.map +1 -1
  51. package/dist/relations.mjs +1 -1
  52. package/dist/relations.mjs.map +1 -1
  53. package/dist/sanitize/index.d.ts.map +1 -1
  54. package/dist/sanitize/index.js +8 -8
  55. package/dist/sanitize/index.js.map +1 -1
  56. package/dist/sanitize/index.mjs +7 -7
  57. package/dist/sanitize/index.mjs.map +1 -1
  58. package/dist/sanitize/sanitizers.js +10 -10
  59. package/dist/sanitize/sanitizers.js.map +1 -1
  60. package/dist/sanitize/sanitizers.mjs +4 -4
  61. package/dist/sanitize/sanitizers.mjs.map +1 -1
  62. package/dist/sanitize/visitors/remove-disallowed-fields.js +4 -4
  63. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
  64. package/dist/sanitize/visitors/remove-disallowed-fields.mjs +3 -3
  65. package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
  66. package/dist/sanitize/visitors/remove-restricted-fields.js +2 -2
  67. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
  68. package/dist/sanitize/visitors/remove-restricted-fields.mjs +2 -2
  69. package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
  70. package/dist/sanitize/visitors/remove-restricted-relations.js +9 -9
  71. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
  72. package/dist/sanitize/visitors/remove-restricted-relations.mjs +4 -4
  73. package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
  74. package/dist/security.d.ts.map +1 -1
  75. package/dist/security.js +3 -3
  76. package/dist/security.js.map +1 -1
  77. package/dist/security.mjs +3 -3
  78. package/dist/security.mjs.map +1 -1
  79. package/dist/set-creator-fields.d.ts +4 -1
  80. package/dist/set-creator-fields.d.ts.map +1 -1
  81. package/dist/set-creator-fields.js +7 -4
  82. package/dist/set-creator-fields.js.map +1 -1
  83. package/dist/set-creator-fields.mjs +7 -4
  84. package/dist/set-creator-fields.mjs.map +1 -1
  85. package/dist/traverse/factory.js +8 -8
  86. package/dist/traverse/factory.js.map +1 -1
  87. package/dist/traverse/factory.mjs +8 -8
  88. package/dist/traverse/factory.mjs.map +1 -1
  89. package/dist/traverse/query-fields.js +7 -7
  90. package/dist/traverse/query-fields.js.map +1 -1
  91. package/dist/traverse/query-fields.mjs +3 -3
  92. package/dist/traverse/query-fields.mjs.map +1 -1
  93. package/dist/traverse/query-filters.js +12 -12
  94. package/dist/traverse/query-filters.js.map +1 -1
  95. package/dist/traverse/query-filters.mjs +7 -7
  96. package/dist/traverse/query-filters.mjs.map +1 -1
  97. package/dist/traverse/query-populate.d.ts.map +1 -1
  98. package/dist/traverse/query-populate.js +21 -21
  99. package/dist/traverse/query-populate.js.map +1 -1
  100. package/dist/traverse/query-populate.mjs +12 -12
  101. package/dist/traverse/query-populate.mjs.map +1 -1
  102. package/dist/traverse/query-sort.d.ts.map +1 -1
  103. package/dist/traverse/query-sort.js +16 -16
  104. package/dist/traverse/query-sort.js.map +1 -1
  105. package/dist/traverse/query-sort.mjs +6 -6
  106. package/dist/traverse/query-sort.mjs.map +1 -1
  107. package/dist/traverse-entity.d.ts.map +1 -1
  108. package/dist/traverse-entity.js +18 -18
  109. package/dist/traverse-entity.js.map +1 -1
  110. package/dist/traverse-entity.mjs +16 -16
  111. package/dist/traverse-entity.mjs.map +1 -1
  112. package/dist/validate/index.d.ts.map +1 -1
  113. package/dist/validate/index.js +5 -5
  114. package/dist/validate/index.js.map +1 -1
  115. package/dist/validate/index.mjs +3 -3
  116. package/dist/validate/index.mjs.map +1 -1
  117. package/dist/validate/utils.d.ts +2 -1
  118. package/dist/validate/utils.d.ts.map +1 -1
  119. package/dist/validate/utils.js +4 -4
  120. package/dist/validate/utils.js.map +1 -1
  121. package/dist/validate/utils.mjs +4 -4
  122. package/dist/validate/utils.mjs.map +1 -1
  123. package/dist/validate/validators.d.ts.map +1 -1
  124. package/dist/validate/validators.js +17 -9
  125. package/dist/validate/validators.js.map +1 -1
  126. package/dist/validate/validators.mjs +14 -6
  127. package/dist/validate/validators.mjs.map +1 -1
  128. package/dist/validate/visitors/throw-disallowed-fields.js +4 -4
  129. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
  130. package/dist/validate/visitors/throw-disallowed-fields.mjs +3 -3
  131. package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
  132. package/dist/validate/visitors/throw-restricted-fields.js +2 -2
  133. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
  134. package/dist/validate/visitors/throw-restricted-fields.mjs +2 -2
  135. package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
  136. package/dist/validate/visitors/throw-restricted-relations.js +6 -6
  137. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
  138. package/dist/validate/visitors/throw-restricted-relations.mjs +2 -2
  139. package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
  140. package/dist/validators.js +3 -3
  141. package/dist/validators.js.map +1 -1
  142. package/dist/validators.mjs +3 -3
  143. package/dist/validators.mjs.map +1 -1
  144. package/dist/yup.d.ts.map +1 -1
  145. package/dist/yup.js +2 -3
  146. package/dist/yup.js.map +1 -1
  147. package/dist/yup.mjs +3 -4
  148. package/dist/yup.mjs.map +1 -1
  149. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
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 = fp.isNil(path.raw) ? key : `${path.raw}.${key}`;
45
- if (!fp.isNil(attribute)) {
46
- newPath.attribute = fp.isNil(path.attribute) ? key : `${path.attribute}.${key}`;
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, fp.pick([
68
+ await visitor(visitorOptions, _.pick(transformUtils, [
69
69
  'remove',
70
70
  'set'
71
- ], transformUtils));
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, fp.pick([
99
+ await handler.handler(ctx, _.pick(transformUtils, [
100
100
  'recurse',
101
101
  'set'
102
- ], transformUtils));
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":"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"}
@@ -1,4 +1,4 @@
1
- import { isNil, pick } from 'lodash/fp';
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 = isNil(path.raw) ? key : `${path.raw}.${key}`;
43
- if (!isNil(attribute)) {
44
- newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;
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
- ], transformUtils));
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
- ], transformUtils));
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 fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var factory = require('./factory.js');
5
5
 
6
6
  const isStringArray = (value)=>{
7
- return fp.isArray(value) && value.every(fp.isString);
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)=>fp.isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
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)=>fp.eq('*', value), fp.constant('*'))// Parse string values
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(fp.isString, ()=>({
22
- transform: fp.trim,
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 = fp.curry(fields.traverse);
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, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,UAAAA,CAAQD,KAAAA,CAAAA,IAAUA,KAAAA,CAAME,KAAK,CAACC,WAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,SACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,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,CAACN,KAAAA,GAA2BG,WAAAA,CAASH,UAAUA,KAAAA,CAAMc,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,CAACN,KAAAA,GAA2BgB,KAAAA,CAAG,KAAKhB,KAAAA,CAAAA,EAAQiB,WAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,WAAAA,EAAU,KAAO;QACtBgB,SAAAA,EAAWC,OAAAA;QAEXC,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,QAAAA,CAAM1B,MAAAA,CAAO2B,QAAQ,CAAA;;;;"}
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, trim, curry, isArray } from 'lodash/fp';
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, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,OAAAA,CAAQD,KAAAA,CAAAA,IAAUA,KAAAA,CAAME,KAAK,CAACC,QAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,iBACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,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,CAACN,KAAAA,GAA2BG,QAAAA,CAASH,UAAUA,KAAAA,CAAMc,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,CAACN,KAAAA,GAA2BgB,EAAAA,CAAG,KAAKhB,KAAAA,CAAAA,EAAQiB,QAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,QAAAA,EAAU,KAAO;QACtBgB,SAAAA,EAAWC,IAAAA;QAEXC,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
+ {"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 fp = require('lodash/fp');
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)=>fp.isObject(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
- fp.isArray, async (visitor, options, filters, { recurse })=>{
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)=>!(fp.isObject(val) && fp.isEmpty(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)=>!fp.isObject(filters), (_, __, filters)=>{
25
+ (filters)=>!_.isObject(filters), (_, __, filters)=>{
26
26
  return filters;
27
27
  })// Parse object values
28
28
  .parse(isObj, ()=>({
29
- transform: fp.cloneDeep,
29
+ transform: _.cloneDeep,
30
30
  remove (key, data) {
31
- return fp.omit(key, data);
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 })=>fp.isNil(value))// Recursion on operators (non attributes)
47
- .on(({ attribute })=>fp.isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
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) && !fp.isArray(value) && !isFilterLikeObject(value, schema)) {
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) && !fp.isArray(value), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
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 = fp.curry(filters.traverse);
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 { isArray, isObject, isEmpty, cloneDeep, omit, isNil, curry } from 'lodash/fp';
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(key, data);
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 })=>isNil(value))// Recursion on operators (non attributes)
45
- .on(({ attribute })=>isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
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":"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"}
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":";AA2UA,wBAAwC"}
1
+ {"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";AA6TA,wBAAwC"}