@strapi/utils 5.33.4 → 5.34.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/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export { default as providerFactory } from './provider-factory';
5
5
  export { default as traverseEntity } from './traverse-entity';
6
6
  export { default as importDefault } from './import-default';
7
7
  export { generateInstallId } from './install-id';
8
+ export { createModelCache } from './model-cache';
8
9
  export { validateYupSchema, validateYupSchemaSync } from './validators';
9
10
  export { isOperator, isOperatorOfType } from './operators';
10
11
  export * as queryParams from './convert-query-params';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ var providerFactory = require('./provider-factory.js');
7
7
  var traverseEntity = require('./traverse-entity.js');
8
8
  var importDefault = require('./import-default.js');
9
9
  var installId = require('./install-id.js');
10
+ var modelCache = require('./model-cache.js');
10
11
  var validators = require('./validators.js');
11
12
  var operators = require('./operators.js');
12
13
  var convertQueryParams = require('./convert-query-params.js');
@@ -45,6 +46,7 @@ exports.providerFactory = providerFactory;
45
46
  exports.traverseEntity = traverseEntity;
46
47
  exports.importDefault = importDefault;
47
48
  exports.generateInstallId = installId.generateInstallId;
49
+ exports.createModelCache = modelCache.createModelCache;
48
50
  exports.validateYupSchema = validators.validateYupSchema;
49
51
  exports.validateYupSchemaSync = validators.validateYupSchemaSync;
50
52
  exports.isOperator = operators.isOperator;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ export { default as providerFactory } from './provider-factory.mjs';
5
5
  export { default as traverseEntity } from './traverse-entity.mjs';
6
6
  export { default as importDefault } from './import-default.mjs';
7
7
  export { generateInstallId } from './install-id.mjs';
8
+ export { createModelCache } from './model-cache.mjs';
8
9
  export { validateYupSchema, validateYupSchemaSync } from './validators.mjs';
9
10
  export { isOperator, isOperatorOfType } from './operators.mjs';
10
11
  import * as convertQueryParams from './convert-query-params.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,19 @@
1
+ import type { Model } from './types';
2
+ /**
3
+ * Model cache to prevent redundant getModel() calls during populate traversal.
4
+ *
5
+ * Models don't change at runtime (changes require server restart), so caching
6
+ * is safe. Current scoping (per-request) provides isolation and predictable
7
+ * memory behavior.
8
+ */
9
+ /**
10
+ * Creates cache for getModel() calls.
11
+ *
12
+ * @param getModelFn - The underlying getModel function to cache
13
+ * @returns An object with cached getModel function and clear method
14
+ */
15
+ export declare const createModelCache: (getModelFn: (uid: any) => Model) => {
16
+ getModel(uid: any): Model;
17
+ clear(): void;
18
+ };
19
+ //# sourceMappingURL=model-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../src/model-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;GAMG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,eACf,CACV,GAAG,EACH,GAAG,KACA,KAAK;kBAKM,GAAG,GAAG,KAAK;;CAc5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Model cache to prevent redundant getModel() calls during populate traversal.
5
+ *
6
+ * Models don't change at runtime (changes require server restart), so caching
7
+ * is safe. Current scoping (per-request) provides isolation and predictable
8
+ * memory behavior.
9
+ */ /**
10
+ * Creates cache for getModel() calls.
11
+ *
12
+ * @param getModelFn - The underlying getModel function to cache
13
+ * @returns An object with cached getModel function and clear method
14
+ */ const createModelCache = (getModelFn)=>{
15
+ const cache = new Map();
16
+ return {
17
+ getModel (uid) {
18
+ const cached = cache.get(uid);
19
+ if (cached) {
20
+ return cached;
21
+ }
22
+ const model = getModelFn(uid);
23
+ cache.set(uid, model);
24
+ return model;
25
+ },
26
+ clear () {
27
+ cache.clear();
28
+ }
29
+ };
30
+ };
31
+
32
+ exports.createModelCache = createModelCache;
33
+ //# sourceMappingURL=model-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-cache.js","sources":["../src/model-cache.ts"],"sourcesContent":["import type { Model } from './types';\n\n/**\n * Model cache to prevent redundant getModel() calls during populate traversal.\n *\n * Models don't change at runtime (changes require server restart), so caching\n * is safe. Current scoping (per-request) provides isolation and predictable\n * memory behavior.\n */\n\n/**\n * Creates cache for getModel() calls.\n *\n * @param getModelFn - The underlying getModel function to cache\n * @returns An object with cached getModel function and clear method\n */\nexport const createModelCache = (\n getModelFn: (\n uid: // TODO should use the type from @strapi/types but this package doesn't depend on it\n any\n ) => Model\n) => {\n const cache = new Map<string, Model>();\n\n return {\n getModel(uid: any): Model {\n const cached = cache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = getModelFn(uid);\n cache.set(uid, model);\n return model;\n },\n clear() {\n cache.clear();\n },\n };\n};\n"],"names":["createModelCache","getModelFn","cache","Map","getModel","uid","cached","get","model","set","clear"],"mappings":";;AAEA;;;;;;;;;;;IAcaA,MAAAA,gBAAAA,GAAmB,CAC9BC,UAAAA,GAAAA;AAKA,IAAA,MAAMC,QAAQ,IAAIC,GAAAA,EAAAA;IAElB,OAAO;AACLC,QAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;YACf,MAAMC,MAAAA,GAASJ,KAAMK,CAAAA,GAAG,CAACF,GAAAA,CAAAA;AACzB,YAAA,IAAIC,MAAQ,EAAA;gBACV,OAAOA,MAAAA;AACT;AAEA,YAAA,MAAME,QAAQP,UAAWI,CAAAA,GAAAA,CAAAA;YACzBH,KAAMO,CAAAA,GAAG,CAACJ,GAAKG,EAAAA,KAAAA,CAAAA;YACf,OAAOA,KAAAA;AACT,SAAA;AACAE,QAAAA,KAAAA,CAAAA,GAAAA;AACER,YAAAA,KAAAA,CAAMQ,KAAK,EAAA;AACb;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Model cache to prevent redundant getModel() calls during populate traversal.
3
+ *
4
+ * Models don't change at runtime (changes require server restart), so caching
5
+ * is safe. Current scoping (per-request) provides isolation and predictable
6
+ * memory behavior.
7
+ */ /**
8
+ * Creates cache for getModel() calls.
9
+ *
10
+ * @param getModelFn - The underlying getModel function to cache
11
+ * @returns An object with cached getModel function and clear method
12
+ */ const createModelCache = (getModelFn)=>{
13
+ const cache = new Map();
14
+ return {
15
+ getModel (uid) {
16
+ const cached = cache.get(uid);
17
+ if (cached) {
18
+ return cached;
19
+ }
20
+ const model = getModelFn(uid);
21
+ cache.set(uid, model);
22
+ return model;
23
+ },
24
+ clear () {
25
+ cache.clear();
26
+ }
27
+ };
28
+ };
29
+
30
+ export { createModelCache };
31
+ //# sourceMappingURL=model-cache.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-cache.mjs","sources":["../src/model-cache.ts"],"sourcesContent":["import type { Model } from './types';\n\n/**\n * Model cache to prevent redundant getModel() calls during populate traversal.\n *\n * Models don't change at runtime (changes require server restart), so caching\n * is safe. Current scoping (per-request) provides isolation and predictable\n * memory behavior.\n */\n\n/**\n * Creates cache for getModel() calls.\n *\n * @param getModelFn - The underlying getModel function to cache\n * @returns An object with cached getModel function and clear method\n */\nexport const createModelCache = (\n getModelFn: (\n uid: // TODO should use the type from @strapi/types but this package doesn't depend on it\n any\n ) => Model\n) => {\n const cache = new Map<string, Model>();\n\n return {\n getModel(uid: any): Model {\n const cached = cache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = getModelFn(uid);\n cache.set(uid, model);\n return model;\n },\n clear() {\n cache.clear();\n },\n };\n};\n"],"names":["createModelCache","getModelFn","cache","Map","getModel","uid","cached","get","model","set","clear"],"mappings":"AAEA;;;;;;;;;;;IAcaA,MAAAA,gBAAAA,GAAmB,CAC9BC,UAAAA,GAAAA;AAKA,IAAA,MAAMC,QAAQ,IAAIC,GAAAA,EAAAA;IAElB,OAAO;AACLC,QAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;YACf,MAAMC,MAAAA,GAASJ,KAAMK,CAAAA,GAAG,CAACF,GAAAA,CAAAA;AACzB,YAAA,IAAIC,MAAQ,EAAA;gBACV,OAAOA,MAAAA;AACT;AAEA,YAAA,MAAME,QAAQP,UAAWI,CAAAA,GAAAA,CAAAA;YACzBH,KAAMO,CAAAA,GAAG,CAACJ,GAAKG,EAAAA,KAAAA,CAAAA;YACf,OAAOA,KAAAA;AACT,SAAA;AACAE,QAAAA,KAAAA,CAAAA,GAAAA;AACER,YAAAA,KAAAA,CAAMQ,KAAK,EAAA;AACb;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGpE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;CACf;AAwLD,QAAA,MAAM,kBAAkB,aAAc;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE;gBACtC,MAAM;aAIT,MAAM,SAAS,IAAI;CAG5B,CAAC;;AAEH,wBAAqC"}
1
+ {"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAoBpE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;CACf;AA6LD,QAAA,MAAM,kBAAkB,aAAc;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE;gBACtC,MAAM;aAIT,MAAM,SAAS,IAAI;CAG5B,CAAC;;AAEH,wBAAqC"}
@@ -3,6 +3,19 @@
3
3
  var fp = require('lodash/fp');
4
4
  var contentTypes = require('./content-types.js');
5
5
 
6
+ /**
7
+ * Execute promises in parallel but throw errors in array index order.
8
+ */ const parallelWithOrderedErrors = async (promises)=>{
9
+ const results = await Promise.allSettled(promises);
10
+ // Throw first error in array index order (matches sequential behavior)
11
+ for(let i = 0; i < results.length; i += 1){
12
+ const result = results[i];
13
+ if (result.status === 'rejected') {
14
+ throw result.reason;
15
+ }
16
+ }
17
+ return results.map((r)=>r.value);
18
+ };
6
19
  const traverseEntity = async (visitor, options, entity)=>{
7
20
  const { path = {
8
21
  raw: null,
@@ -110,15 +123,14 @@ const traverseEntity = async (visitor, options, entity)=>{
110
123
  const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
111
124
  const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
112
125
  if (fp.isArray(value)) {
113
- const res = new Array(value.length);
114
- for(let i = 0; i < value.length; i += 1){
126
+ // Process array items in parallel with ordered error handling
127
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
115
128
  const arrayPath = {
116
129
  ...newPath,
117
130
  rawWithIndices: fp.isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
118
131
  };
119
- res[i] = await method(visitor, arrayPath, value[i]);
120
- }
121
- copy[key] = res;
132
+ return method(visitor, arrayPath, item);
133
+ }));
122
134
  } else {
123
135
  copy[key] = await method(visitor, newPath, value);
124
136
  }
@@ -131,17 +143,15 @@ const traverseEntity = async (visitor, options, entity)=>{
131
143
  attribute,
132
144
  path: newPath
133
145
  };
134
- // need to update copy
135
146
  if (fp.isArray(value)) {
136
- const res = new Array(value.length);
137
- for(let i = 0; i < value.length; i += 1){
147
+ // Process media array items in parallel with ordered error handling
148
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
138
149
  const arrayPath = {
139
150
  ...newPath,
140
151
  rawWithIndices: fp.isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
141
152
  };
142
- res[i] = await traverseMediaTarget(visitor, arrayPath, value[i]);
143
- }
144
- copy[key] = res;
153
+ return traverseMediaTarget(visitor, arrayPath, item);
154
+ }));
145
155
  } else {
146
156
  copy[key] = await traverseMediaTarget(visitor, newPath, value);
147
157
  }
@@ -156,15 +166,14 @@ const traverseEntity = async (visitor, options, entity)=>{
156
166
  };
157
167
  const targetSchema = getModel(attribute.component);
158
168
  if (fp.isArray(value)) {
159
- const res = new Array(value.length);
160
- for(let i = 0; i < value.length; i += 1){
169
+ // Process component array items in parallel with ordered error handling
170
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
161
171
  const arrayPath = {
162
172
  ...newPath,
163
173
  rawWithIndices: fp.isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
164
174
  };
165
- res[i] = await traverseComponent(visitor, arrayPath, targetSchema, value[i]);
166
- }
167
- copy[key] = res;
175
+ return traverseComponent(visitor, arrayPath, targetSchema, item);
176
+ }));
168
177
  } else {
169
178
  copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
170
179
  }
@@ -177,15 +186,14 @@ const traverseEntity = async (visitor, options, entity)=>{
177
186
  attribute,
178
187
  path: newPath
179
188
  };
180
- const res = new Array(value.length);
181
- for(let i = 0; i < value.length; i += 1){
189
+ // Process dynamic zone items in parallel with ordered error handling
190
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
182
191
  const arrayPath = {
183
192
  ...newPath,
184
193
  rawWithIndices: fp.isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
185
194
  };
186
- res[i] = await visitDynamicZoneEntry(visitor, arrayPath, value[i]);
187
- }
188
- copy[key] = res;
195
+ return visitDynamicZoneEntry(visitor, arrayPath, item);
196
+ }));
189
197
  continue;
190
198
  }
191
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null, rawWithIndices: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await method(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await traverseMediaTarget(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await traverseComponent(visitor, arrayPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await visitDynamicZoneEntry(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
1
+ {"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null, rawWithIndices: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":";;;;;AAKA;;IAGA,MAAMA,4BAA4B,OAAUC,QAAAA,GAAAA;AAC1C,IAAA,MAAMC,OAAU,GAAA,MAAMC,OAAQC,CAAAA,UAAU,CAACH,QAAAA,CAAAA;;IAGzC,IAAK,IAAII,IAAI,CAAGA,EAAAA,CAAAA,GAAIH,QAAQI,MAAM,EAAED,KAAK,CAAG,CAAA;QAC1C,MAAME,MAAAA,GAASL,OAAO,CAACG,CAAE,CAAA;QACzB,IAAIE,MAAAA,CAAOC,MAAM,KAAK,UAAY,EAAA;AAChC,YAAA,MAAMD,OAAOE,MAAM;AACrB;AACF;AAEA,IAAA,OAAOP,QAAQQ,GAAG,CAAC,CAACC,CAAM,GAACA,EAAgCC,KAAK,CAAA;AAClE,CAAA;AAqCA,MAAMC,cAAAA,GAAiB,OAAOC,OAAAA,EAAkBC,OAA0BC,EAAAA,MAAAA,GAAAA;AACxE,IAAA,MAAM,EAAEC,IAAO,GAAA;QAAEC,GAAK,EAAA,IAAA;QAAMC,SAAW,EAAA,IAAA;QAAMC,cAAgB,EAAA;AAAK,KAAC,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGP,OAAAA;IAE1F,IAAIQ,MAAAA,GAASR,QAAQQ,MAAM;IAE3B,MAAMC,2BAAAA,GAA8B,OAAOV,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;QACvE,MAAMC,YAAAA,GAAeJ,QAASG,CAAAA,KAAAA,CAAME,MAAM,CAAA;AAE1C,QAAA,MAAMC,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;AAEA,IAAA,MAAMI,sBACJ,GAAA,CAACR,MAAkB,GAAA,OAAOP,SAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;AACtD,YAAA,MAAMG,eAAmC,GAAA;AAAEP,gBAAAA,MAAAA;AAAQJ,gBAAAA,IAAAA;AAAMK,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAO,aAAA;YAE1E,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,SAAA;IAEF,MAAMK,mBAAAA,GAAsB,OAAOhB,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;AAC/D,QAAA,MAAMM,eAAkB,GAAA,qBAAA;AACxB,QAAA,MAAML,eAAeJ,QAASS,CAAAA,eAAAA,CAAAA;AAE9B,QAAA,MAAMH,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;AAEA,IAAA,MAAMO,iBAAoB,GAAA,OAAOlB,OAAkBG,EAAAA,IAAAA,EAAYI,MAAeI,EAAAA,KAAAA,GAAAA;AAC5E,QAAA,MAAMG,eAAmC,GAAA;AAAEP,YAAAA,MAAAA;AAAQJ,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAE1E,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;IAEA,MAAMQ,qBAAAA,GAAwB,OAAOnB,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;QACjE,MAAMC,YAAAA,GAAeJ,QAASG,CAAAA,KAAAA,CAAMS,WAAW,CAAA;AAC/C,QAAA,MAAMN,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;;AAGA,IAAA,IAAI,CAACU,WAAAA,CAASnB,MAAWoB,CAAAA,IAAAA,QAAAA,CAAMf,MAAS,CAAA,EAAA;QACtC,OAAOL,MAAAA;AACT;;;AAIA,IAAA,MAAMqB,OAAOC,QAAMtB,CAAAA,MAAAA,CAAAA;AACnB,IAAA,MAAMuB,eAAeC,kBAAmB,CAAA;QAAEC,IAAMJ,EAAAA;AAAK,KAAA,CAAA;IAErD,MAAMK,IAAAA,GAAOC,MAAOD,CAAAA,IAAI,CAACL,IAAAA,CAAAA;IACzB,IAAK,IAAIhC,IAAI,CAAGA,EAAAA,CAAAA,GAAIqC,KAAKpC,MAAM,EAAED,KAAK,CAAG,CAAA;QACvC,MAAMuC,GAAAA,GAAMF,IAAI,CAACrC,CAAE,CAAA;;AAEnB,QAAA,MAAMc,SAAYE,GAAAA,MAAAA,CAAOwB,UAAU,CAACD,GAAI,CAAA;AAExC,QAAA,MAAME,OAAU,GAAA;AAAE,YAAA,GAAG7B;AAAK,SAAA;AAE1B6B,QAAAA,OAAAA,CAAQ5B,GAAG,GAAGkB,QAAMnB,CAAAA,IAAAA,CAAKC,GAAG,CAAA,GAAI0B,GAAM,GAAA,CAAA,EAAG3B,IAAKC,CAAAA,GAAG,CAAC,CAAC,EAAE0B,GAAK,CAAA,CAAA;AAC1DE,QAAAA,OAAAA,CAAQ1B,cAAc,GAAGgB,QAAMnB,CAAAA,IAAAA,CAAKG,cAAc,CAAA,GAAIwB,GAAM,GAAA,CAAA,EAAG3B,IAAKG,CAAAA,cAAc,CAAC,CAAC,EAAEwB,GAAK,CAAA,CAAA;QAE3F,IAAI,CAACR,SAAMjB,SAAY,CAAA,EAAA;AACrB2B,YAAAA,OAAAA,CAAQ3B,SAAS,GAAGiB,QAAMnB,CAAAA,IAAAA,CAAKE,SAAS,CAAA,GAAIyB,GAAM,GAAA,CAAA,EAAG3B,IAAKE,CAAAA,SAAS,CAAC,CAAC,EAAEyB,GAAK,CAAA,CAAA;AAC9E;;AAGA,QAAA,MAAMG,cAAiC,GAAA;YACrCN,IAAMJ,EAAAA,IAAAA;AACNhB,YAAAA,MAAAA;AACAuB,YAAAA,GAAAA;YACAhC,KAAOyB,EAAAA,IAAI,CAACO,GAAI,CAAA;AAChBzB,YAAAA,SAAAA;YACAF,IAAM6B,EAAAA,OAAAA;AACNxB,YAAAA,QAAAA;AACAC,YAAAA;AACF,SAAA;AAEA,QAAA,MAAMT,QAAQiC,cAAgBR,EAAAA,YAAAA,CAAAA;;QAG9B,MAAM3B,KAAAA,GAAQyB,IAAI,CAACO,GAAI,CAAA;;QAGvB,IAAIR,QAAAA,CAAMxB,KAAUwB,CAAAA,IAAAA,QAAAA,CAAMjB,SAAY,CAAA,EAAA;AACpC,YAAA;AACF;AAEA,QAAA,IAAI6B,mCAAsB7B,SAAY,CAAA,EAAA;YACpCI,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;AACjD,YAAA,MAAMG,kBAAkB9B,SAAU+B,CAAAA,QAAQ,CAACC,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AAEpE,YAAA,MAAMC,SAASJ,eACXzB,GAAAA,2BAAAA,GACAK,sBAAuBP,CAAAA,QAAAA,CAASH,UAAUmC,MAAM,CAAA,CAAA;AAEpD,YAAA,IAAIC,WAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,QAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAOgD,MAAAA,CAAOvC,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACpC,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMS,MAAAA,CAAOvC,SAASgC,OAASlC,EAAAA,KAAAA,CAAAA;AAC7C;AAEA,YAAA;AACF;AAEA,QAAA,IAAI8C,8BAAiBvC,SAAY,CAAA,EAAA;YAC/BI,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;AAEjD,YAAA,IAAIS,WAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,QAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAOyB,mBAAAA,CAAoBhB,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACjD,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMd,mBAAAA,CAAoBhB,SAASgC,OAASlC,EAAAA,KAAAA,CAAAA;AAC1D;AAEA,YAAA;AACF;QAEA,IAAIO,SAAAA,CAAUwC,IAAI,KAAK,WAAa,EAAA;YAClCpC,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;YACjD,MAAMpB,YAAAA,GAAeJ,QAASH,CAAAA,SAAAA,CAAUyC,SAAS,CAAA;AAEjD,YAAA,IAAIL,WAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,QAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAO2B,iBAAAA,CAAkBlB,OAAS2C,EAAAA,SAAAA,EAAW/B,YAAc8B,EAAAA,IAAAA,CAAAA;AAC7D,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMZ,iBAAkBlB,CAAAA,OAAAA,EAASgC,SAASpB,YAAcd,EAAAA,KAAAA,CAAAA;AACtE;AAEA,YAAA;AACF;AAEA,QAAA,IAAIO,SAAUwC,CAAAA,IAAI,KAAK,aAAA,IAAiBJ,WAAQ3C,KAAQ,CAAA,EAAA;YACtDW,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;;YAGjDT,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,gBAAA,MAAMoD,SAAY,GAAA;AAChB,oBAAA,GAAGX,OAAO;AACV1B,oBAAAA,cAAAA,EAAgBgB,QAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,iBAAA;gBACA,OAAO4B,qBAAAA,CAAsBnB,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACnD,aAAA,CAAA,CAAA;AAGF,YAAA;AACF;AACF;IAEA,OAAOnB,IAAAA;AACT,CAAA;AAEA,MAAMG,qBAAqB,CAAC,EAAEC,IAAI,EAAkB,IAAM;AACxDoB,QAAAA,MAAAA,CAAAA,CAAOjB,GAAW,EAAA;YAChB,OAAOH,IAAI,CAACG,GAAI,CAAA;AAClB,SAAA;QAEAkB,GAAIlB,CAAAA,CAAAA,GAAW,EAAEhC,KAAW,EAAA;YAC1B6B,IAAI,CAACG,IAAI,GAAGhC,KAAAA;AACd;KACF,CAAA;AAEA,uBAAemD,SAAMlD,cAAgB,CAAA;;;;"}
@@ -1,6 +1,19 @@
1
1
  import { curry, isObject, isNil, clone, isArray } from 'lodash/fp';
2
2
  import { isRelationalAttribute, isMediaAttribute } from './content-types.mjs';
3
3
 
4
+ /**
5
+ * Execute promises in parallel but throw errors in array index order.
6
+ */ const parallelWithOrderedErrors = async (promises)=>{
7
+ const results = await Promise.allSettled(promises);
8
+ // Throw first error in array index order (matches sequential behavior)
9
+ for(let i = 0; i < results.length; i += 1){
10
+ const result = results[i];
11
+ if (result.status === 'rejected') {
12
+ throw result.reason;
13
+ }
14
+ }
15
+ return results.map((r)=>r.value);
16
+ };
4
17
  const traverseEntity = async (visitor, options, entity)=>{
5
18
  const { path = {
6
19
  raw: null,
@@ -108,15 +121,14 @@ const traverseEntity = async (visitor, options, entity)=>{
108
121
  const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
109
122
  const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
110
123
  if (isArray(value)) {
111
- const res = new Array(value.length);
112
- for(let i = 0; i < value.length; i += 1){
124
+ // Process array items in parallel with ordered error handling
125
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
113
126
  const arrayPath = {
114
127
  ...newPath,
115
128
  rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
116
129
  };
117
- res[i] = await method(visitor, arrayPath, value[i]);
118
- }
119
- copy[key] = res;
130
+ return method(visitor, arrayPath, item);
131
+ }));
120
132
  } else {
121
133
  copy[key] = await method(visitor, newPath, value);
122
134
  }
@@ -129,17 +141,15 @@ const traverseEntity = async (visitor, options, entity)=>{
129
141
  attribute,
130
142
  path: newPath
131
143
  };
132
- // need to update copy
133
144
  if (isArray(value)) {
134
- const res = new Array(value.length);
135
- for(let i = 0; i < value.length; i += 1){
145
+ // Process media array items in parallel with ordered error handling
146
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
136
147
  const arrayPath = {
137
148
  ...newPath,
138
149
  rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
139
150
  };
140
- res[i] = await traverseMediaTarget(visitor, arrayPath, value[i]);
141
- }
142
- copy[key] = res;
151
+ return traverseMediaTarget(visitor, arrayPath, item);
152
+ }));
143
153
  } else {
144
154
  copy[key] = await traverseMediaTarget(visitor, newPath, value);
145
155
  }
@@ -154,15 +164,14 @@ const traverseEntity = async (visitor, options, entity)=>{
154
164
  };
155
165
  const targetSchema = getModel(attribute.component);
156
166
  if (isArray(value)) {
157
- const res = new Array(value.length);
158
- for(let i = 0; i < value.length; i += 1){
167
+ // Process component array items in parallel with ordered error handling
168
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
159
169
  const arrayPath = {
160
170
  ...newPath,
161
171
  rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
162
172
  };
163
- res[i] = await traverseComponent(visitor, arrayPath, targetSchema, value[i]);
164
- }
165
- copy[key] = res;
173
+ return traverseComponent(visitor, arrayPath, targetSchema, item);
174
+ }));
166
175
  } else {
167
176
  copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
168
177
  }
@@ -175,15 +184,14 @@ const traverseEntity = async (visitor, options, entity)=>{
175
184
  attribute,
176
185
  path: newPath
177
186
  };
178
- const res = new Array(value.length);
179
- for(let i = 0; i < value.length; i += 1){
187
+ // Process dynamic zone items in parallel with ordered error handling
188
+ copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
180
189
  const arrayPath = {
181
190
  ...newPath,
182
191
  rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`
183
192
  };
184
- res[i] = await visitDynamicZoneEntry(visitor, arrayPath, value[i]);
185
- }
186
- copy[key] = res;
193
+ return visitDynamicZoneEntry(visitor, arrayPath, item);
194
+ }));
187
195
  continue;
188
196
  }
189
197
  }
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null, rawWithIndices: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await method(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await traverseMediaTarget(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await traverseComponent(visitor, arrayPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices) ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n res[i] = await visitDynamicZoneEntry(visitor, arrayPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
1
+ {"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null, rawWithIndices: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":";;;AAKA;;IAGA,MAAMA,4BAA4B,OAAUC,QAAAA,GAAAA;AAC1C,IAAA,MAAMC,OAAU,GAAA,MAAMC,OAAQC,CAAAA,UAAU,CAACH,QAAAA,CAAAA;;IAGzC,IAAK,IAAII,IAAI,CAAGA,EAAAA,CAAAA,GAAIH,QAAQI,MAAM,EAAED,KAAK,CAAG,CAAA;QAC1C,MAAME,MAAAA,GAASL,OAAO,CAACG,CAAE,CAAA;QACzB,IAAIE,MAAAA,CAAOC,MAAM,KAAK,UAAY,EAAA;AAChC,YAAA,MAAMD,OAAOE,MAAM;AACrB;AACF;AAEA,IAAA,OAAOP,QAAQQ,GAAG,CAAC,CAACC,CAAM,GAACA,EAAgCC,KAAK,CAAA;AAClE,CAAA;AAqCA,MAAMC,cAAAA,GAAiB,OAAOC,OAAAA,EAAkBC,OAA0BC,EAAAA,MAAAA,GAAAA;AACxE,IAAA,MAAM,EAAEC,IAAO,GAAA;QAAEC,GAAK,EAAA,IAAA;QAAMC,SAAW,EAAA,IAAA;QAAMC,cAAgB,EAAA;AAAK,KAAC,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGP,OAAAA;IAE1F,IAAIQ,MAAAA,GAASR,QAAQQ,MAAM;IAE3B,MAAMC,2BAAAA,GAA8B,OAAOV,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;QACvE,MAAMC,YAAAA,GAAeJ,QAASG,CAAAA,KAAAA,CAAME,MAAM,CAAA;AAE1C,QAAA,MAAMC,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;AAEA,IAAA,MAAMI,sBACJ,GAAA,CAACR,MAAkB,GAAA,OAAOP,SAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;AACtD,YAAA,MAAMG,eAAmC,GAAA;AAAEP,gBAAAA,MAAAA;AAAQJ,gBAAAA,IAAAA;AAAMK,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAO,aAAA;YAE1E,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,SAAA;IAEF,MAAMK,mBAAAA,GAAsB,OAAOhB,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;AAC/D,QAAA,MAAMM,eAAkB,GAAA,qBAAA;AACxB,QAAA,MAAML,eAAeJ,QAASS,CAAAA,eAAAA,CAAAA;AAE9B,QAAA,MAAMH,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;AAEA,IAAA,MAAMO,iBAAoB,GAAA,OAAOlB,OAAkBG,EAAAA,IAAAA,EAAYI,MAAeI,EAAAA,KAAAA,GAAAA;AAC5E,QAAA,MAAMG,eAAmC,GAAA;AAAEP,YAAAA,MAAAA;AAAQJ,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAE1E,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;IAEA,MAAMQ,qBAAAA,GAAwB,OAAOnB,OAAAA,EAAkBG,IAAYQ,EAAAA,KAAAA,GAAAA;QACjE,MAAMC,YAAAA,GAAeJ,QAASG,CAAAA,KAAAA,CAAMS,WAAW,CAAA;AAC/C,QAAA,MAAMN,eAAmC,GAAA;YAAEP,MAAQK,EAAAA,YAAAA;AAAcT,YAAAA,IAAAA;AAAMK,YAAAA,QAAAA;AAAUC,YAAAA;AAAO,SAAA;QAExF,OAAOV,cAAAA,CAAeC,SAASc,eAAiBH,EAAAA,KAAAA,CAAAA;AAClD,KAAA;;AAGA,IAAA,IAAI,CAACU,QAAAA,CAASnB,MAAWoB,CAAAA,IAAAA,KAAAA,CAAMf,MAAS,CAAA,EAAA;QACtC,OAAOL,MAAAA;AACT;;;AAIA,IAAA,MAAMqB,OAAOC,KAAMtB,CAAAA,MAAAA,CAAAA;AACnB,IAAA,MAAMuB,eAAeC,kBAAmB,CAAA;QAAEC,IAAMJ,EAAAA;AAAK,KAAA,CAAA;IAErD,MAAMK,IAAAA,GAAOC,MAAOD,CAAAA,IAAI,CAACL,IAAAA,CAAAA;IACzB,IAAK,IAAIhC,IAAI,CAAGA,EAAAA,CAAAA,GAAIqC,KAAKpC,MAAM,EAAED,KAAK,CAAG,CAAA;QACvC,MAAMuC,GAAAA,GAAMF,IAAI,CAACrC,CAAE,CAAA;;AAEnB,QAAA,MAAMc,SAAYE,GAAAA,MAAAA,CAAOwB,UAAU,CAACD,GAAI,CAAA;AAExC,QAAA,MAAME,OAAU,GAAA;AAAE,YAAA,GAAG7B;AAAK,SAAA;AAE1B6B,QAAAA,OAAAA,CAAQ5B,GAAG,GAAGkB,KAAMnB,CAAAA,IAAAA,CAAKC,GAAG,CAAA,GAAI0B,GAAM,GAAA,CAAA,EAAG3B,IAAKC,CAAAA,GAAG,CAAC,CAAC,EAAE0B,GAAK,CAAA,CAAA;AAC1DE,QAAAA,OAAAA,CAAQ1B,cAAc,GAAGgB,KAAMnB,CAAAA,IAAAA,CAAKG,cAAc,CAAA,GAAIwB,GAAM,GAAA,CAAA,EAAG3B,IAAKG,CAAAA,cAAc,CAAC,CAAC,EAAEwB,GAAK,CAAA,CAAA;QAE3F,IAAI,CAACR,MAAMjB,SAAY,CAAA,EAAA;AACrB2B,YAAAA,OAAAA,CAAQ3B,SAAS,GAAGiB,KAAMnB,CAAAA,IAAAA,CAAKE,SAAS,CAAA,GAAIyB,GAAM,GAAA,CAAA,EAAG3B,IAAKE,CAAAA,SAAS,CAAC,CAAC,EAAEyB,GAAK,CAAA,CAAA;AAC9E;;AAGA,QAAA,MAAMG,cAAiC,GAAA;YACrCN,IAAMJ,EAAAA,IAAAA;AACNhB,YAAAA,MAAAA;AACAuB,YAAAA,GAAAA;YACAhC,KAAOyB,EAAAA,IAAI,CAACO,GAAI,CAAA;AAChBzB,YAAAA,SAAAA;YACAF,IAAM6B,EAAAA,OAAAA;AACNxB,YAAAA,QAAAA;AACAC,YAAAA;AACF,SAAA;AAEA,QAAA,MAAMT,QAAQiC,cAAgBR,EAAAA,YAAAA,CAAAA;;QAG9B,MAAM3B,KAAAA,GAAQyB,IAAI,CAACO,GAAI,CAAA;;QAGvB,IAAIR,KAAAA,CAAMxB,KAAUwB,CAAAA,IAAAA,KAAAA,CAAMjB,SAAY,CAAA,EAAA;AACpC,YAAA;AACF;AAEA,QAAA,IAAI6B,sBAAsB7B,SAAY,CAAA,EAAA;YACpCI,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;AACjD,YAAA,MAAMG,kBAAkB9B,SAAU+B,CAAAA,QAAQ,CAACC,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AAEpE,YAAA,MAAMC,SAASJ,eACXzB,GAAAA,2BAAAA,GACAK,sBAAuBP,CAAAA,QAAAA,CAASH,UAAUmC,MAAM,CAAA,CAAA;AAEpD,YAAA,IAAIC,QAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,KAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAOgD,MAAAA,CAAOvC,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACpC,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMS,MAAAA,CAAOvC,SAASgC,OAASlC,EAAAA,KAAAA,CAAAA;AAC7C;AAEA,YAAA;AACF;AAEA,QAAA,IAAI8C,iBAAiBvC,SAAY,CAAA,EAAA;YAC/BI,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;AAEjD,YAAA,IAAIS,QAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,KAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAOyB,mBAAAA,CAAoBhB,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACjD,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMd,mBAAAA,CAAoBhB,SAASgC,OAASlC,EAAAA,KAAAA,CAAAA;AAC1D;AAEA,YAAA;AACF;QAEA,IAAIO,SAAAA,CAAUwC,IAAI,KAAK,WAAa,EAAA;YAClCpC,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;YACjD,MAAMpB,YAAAA,GAAeJ,QAASH,CAAAA,SAAAA,CAAUyC,SAAS,CAAA;AAEjD,YAAA,IAAIL,QAAQ3C,KAAQ,CAAA,EAAA;;gBAElByB,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,oBAAA,MAAMoD,SAAY,GAAA;AAChB,wBAAA,GAAGX,OAAO;AACV1B,wBAAAA,cAAAA,EAAgBgB,KAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,qBAAA;oBACA,OAAO2B,iBAAAA,CAAkBlB,OAAS2C,EAAAA,SAAAA,EAAW/B,YAAc8B,EAAAA,IAAAA,CAAAA;AAC7D,iBAAA,CAAA,CAAA;aAEG,MAAA;AACLnB,gBAAAA,IAAI,CAACO,GAAI,CAAA,GAAG,MAAMZ,iBAAkBlB,CAAAA,OAAAA,EAASgC,SAASpB,YAAcd,EAAAA,KAAAA,CAAAA;AACtE;AAEA,YAAA;AACF;AAEA,QAAA,IAAIO,SAAUwC,CAAAA,IAAI,KAAK,aAAA,IAAiBJ,QAAQ3C,KAAQ,CAAA,EAAA;YACtDW,MAAS,GAAA;AAAEF,gBAAAA,MAAAA;AAAQuB,gBAAAA,GAAAA;AAAKzB,gBAAAA,SAAAA;gBAAWF,IAAM6B,EAAAA;AAAQ,aAAA;;YAGjDT,IAAI,CAACO,IAAI,GAAG,MAAM5C,0BAChBY,KAAMF,CAAAA,GAAG,CAAC,CAAC8C,IAAMnD,EAAAA,CAAAA,GAAAA;AACf,gBAAA,MAAMoD,SAAY,GAAA;AAChB,oBAAA,GAAGX,OAAO;AACV1B,oBAAAA,cAAAA,EAAgBgB,KAAMU,CAAAA,OAAAA,CAAQ1B,cAAc,CAAA,GACxC,CAAGf,EAAAA,CAAAA,CAAAA,CAAG,GACN,CAAA,EAAGyC,OAAQ1B,CAAAA,cAAc,CAAC,CAAC,EAAEf,CAAG,CAAA;AACtC,iBAAA;gBACA,OAAO4B,qBAAAA,CAAsBnB,SAAS2C,SAAWD,EAAAA,IAAAA,CAAAA;AACnD,aAAA,CAAA,CAAA;AAGF,YAAA;AACF;AACF;IAEA,OAAOnB,IAAAA;AACT,CAAA;AAEA,MAAMG,qBAAqB,CAAC,EAAEC,IAAI,EAAkB,IAAM;AACxDoB,QAAAA,MAAAA,CAAAA,CAAOjB,GAAW,EAAA;YAChB,OAAOH,IAAI,CAACG,GAAI,CAAA;AAClB,SAAA;QAEAkB,GAAIlB,CAAAA,CAAAA,GAAW,EAAEhC,KAAW,EAAA;YAC1B6B,IAAI,CAACG,IAAI,GAAGhC,KAAAA;AACd;KACF,CAAA;AAEA,uBAAemD,MAAMlD,cAAgB,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/utils",
3
- "version": "5.33.4",
3
+ "version": "5.34.0",
4
4
  "description": "Shared utilities for the Strapi packages",
5
5
  "keywords": [
6
6
  "strapi",
@@ -61,10 +61,10 @@
61
61
  "@types/http-errors": "2.0.4",
62
62
  "@types/koa": "2.13.4",
63
63
  "@types/node": "24.10.0",
64
- "eslint-config-custom": "5.33.4",
64
+ "eslint-config-custom": "5.34.0",
65
65
  "koa": "2.16.3",
66
66
  "koa-body": "6.0.1",
67
- "tsconfig": "5.33.4"
67
+ "tsconfig": "5.34.0"
68
68
  },
69
69
  "engines": {
70
70
  "node": ">=20.0.0 <=24.x.x",