@strapi/utils 5.33.3 → 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/model-cache.d.ts +19 -0
- package/dist/model-cache.d.ts.map +1 -0
- package/dist/model-cache.js +33 -0
- package/dist/model-cache.js.map +1 -0
- package/dist/model-cache.mjs +31 -0
- package/dist/model-cache.mjs.map +1 -0
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +29 -21
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +29 -21
- package/dist/traverse-entity.mjs.map +1 -1
- package/package.json +3 -3
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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';
|
package/dist/index.mjs.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/traverse-entity.js
CHANGED
|
@@ -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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
160
|
-
|
|
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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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":"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"}
|
package/dist/traverse-entity.mjs
CHANGED
|
@@ -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
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/utils",
|
|
3
|
-
"version": "5.
|
|
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.
|
|
64
|
+
"eslint-config-custom": "5.34.0",
|
|
65
65
|
"koa": "2.16.3",
|
|
66
66
|
"koa-body": "6.0.1",
|
|
67
|
-
"tsconfig": "5.
|
|
67
|
+
"tsconfig": "5.34.0"
|
|
68
68
|
},
|
|
69
69
|
"engines": {
|
|
70
70
|
"node": ">=20.0.0 <=24.x.x",
|