@strapi/data-transfer 5.56.0 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/directory/providers/source/index.js +3 -3
- package/dist/directory/providers/source/index.js.map +1 -1
- package/dist/directory/providers/source/index.mjs +2 -2
- package/dist/directory/providers/source/index.mjs.map +1 -1
- package/dist/engine/index.js +13 -8
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/index.mjs +9 -4
- package/dist/engine/index.mjs.map +1 -1
- package/dist/engine/validation/provider.js +2 -2
- package/dist/engine/validation/provider.js.map +1 -1
- package/dist/engine/validation/provider.mjs +1 -1
- package/dist/engine/validation/provider.mjs.map +1 -1
- package/dist/engine/validation/schemas/index.js +4 -4
- package/dist/engine/validation/schemas/index.js.map +1 -1
- package/dist/engine/validation/schemas/index.mjs +3 -3
- package/dist/engine/validation/schemas/index.mjs.map +1 -1
- package/dist/file/providers/source/index.js +3 -3
- package/dist/file/providers/source/index.js.map +1 -1
- package/dist/file/providers/source/index.mjs +2 -2
- package/dist/file/providers/source/index.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/index.js +1 -1
- package/dist/strapi/providers/local-destination/index.mjs +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +4 -4
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +4 -4
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +5 -5
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +5 -3
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
- package/dist/strapi/providers/local-source/configuration.d.ts.map +1 -1
- package/dist/strapi/providers/local-source/configuration.js +4 -2
- package/dist/strapi/providers/local-source/configuration.js.map +1 -1
- package/dist/strapi/providers/local-source/configuration.mjs +4 -2
- package/dist/strapi/providers/local-source/configuration.mjs.map +1 -1
- package/dist/strapi/providers/local-source/entities.js +1 -1
- package/dist/strapi/providers/local-source/entities.mjs +1 -1
- package/dist/strapi/providers/local-source/index.js +1 -1
- package/dist/strapi/providers/local-source/index.mjs +1 -1
- package/dist/strapi/providers/remote-destination/index.js +2 -2
- package/dist/strapi/providers/remote-destination/index.js.map +1 -1
- package/dist/strapi/providers/remote-destination/index.mjs +1 -1
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
- package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
- package/dist/strapi/providers/remote-source/index.js +3 -2
- package/dist/strapi/providers/remote-source/index.js.map +1 -1
- package/dist/strapi/providers/remote-source/index.mjs +3 -2
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
- package/dist/strapi/queries/entity.js +13 -13
- package/dist/strapi/queries/entity.js.map +1 -1
- package/dist/strapi/queries/entity.mjs +13 -13
- package/dist/strapi/queries/entity.mjs.map +1 -1
- package/dist/strapi/queries/link.js +7 -7
- package/dist/strapi/queries/link.js.map +1 -1
- package/dist/strapi/queries/link.mjs +3 -3
- package/dist/strapi/queries/link.mjs.map +1 -1
- package/dist/strapi/remote/handlers/pull.js +2 -3
- package/dist/strapi/remote/handlers/pull.js.map +1 -1
- package/dist/strapi/remote/handlers/pull.mjs +2 -3
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -1
- package/dist/strapi/remote/handlers/push.js +2 -2
- package/dist/strapi/remote/handlers/push.mjs +2 -2
- package/dist/strapi/utils/project-settings-logos.js +2 -2
- package/dist/strapi/utils/project-settings-logos.js.map +1 -1
- package/dist/strapi/utils/project-settings-logos.mjs +2 -2
- package/dist/strapi/utils/project-settings-logos.mjs.map +1 -1
- package/dist/utils/components.d.ts.map +1 -1
- package/dist/utils/components.js +8 -8
- package/dist/utils/components.js.map +1 -1
- package/dist/utils/components.mjs +9 -9
- package/dist/utils/components.mjs.map +1 -1
- package/dist/utils/json.js +8 -6
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/json.mjs +5 -3
- package/dist/utils/json.mjs.map +1 -1
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +2 -2
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/schema.mjs +2 -2
- package/dist/utils/schema.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assign, omit } from 'lodash';
|
|
2
2
|
import { deleteComponents, getComponents, createComponents } from '../../utils/components.mjs';
|
|
3
3
|
|
|
4
4
|
const sanitizeComponentLikeAttributes = (model, data)=>{
|
|
5
5
|
const { attributes } = model;
|
|
6
6
|
const componentLikeAttributesKey = Object.entries(attributes).filter(([, attribute])=>attribute.type === 'component' || attribute.type === 'dynamiczone').map(([key])=>key);
|
|
7
|
-
return omit(
|
|
7
|
+
return omit(data, componentLikeAttributesKey);
|
|
8
8
|
};
|
|
9
|
-
const omitInvalidCreationAttributes = omit([
|
|
10
|
-
|
|
11
|
-
]);
|
|
9
|
+
const omitInvalidCreationAttributes = (data)=>omit(data, [
|
|
10
|
+
'id'
|
|
11
|
+
]);
|
|
12
12
|
const createEntityQuery = (strapi)=>{
|
|
13
13
|
const components = {
|
|
14
14
|
async assignToEntity (uid, data) {
|
|
15
15
|
const model = strapi.getModel(uid);
|
|
16
16
|
const entityComponents = await createComponents(uid, data);
|
|
17
17
|
const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);
|
|
18
|
-
return assign(entityComponents, dataWithoutComponents);
|
|
18
|
+
return assign({}, entityComponents, dataWithoutComponents);
|
|
19
19
|
},
|
|
20
20
|
async get (uid, entity) {
|
|
21
21
|
return getComponents(uid, entity);
|
|
@@ -37,8 +37,8 @@ const createEntityQuery = (strapi)=>{
|
|
|
37
37
|
};
|
|
38
38
|
const createMany = async (params)=>{
|
|
39
39
|
return Promise.resolve(params.data)// Create components for each entity
|
|
40
|
-
.then(map((data)=>components.assignToEntity(uid, data)))// Remove unwanted attributes
|
|
41
|
-
.then(map(omitInvalidCreationAttributes))// Execute a strapi db createMany query with all the entities + their created components
|
|
40
|
+
.then((entities)=>entities.map((data)=>components.assignToEntity(uid, data)))// Remove unwanted attributes
|
|
41
|
+
.then((entities)=>entities.map((data)=>omitInvalidCreationAttributes(data)))// Execute a strapi db createMany query with all the entities + their created components
|
|
42
42
|
.then((data)=>strapi.db.query(uid).createMany({
|
|
43
43
|
...params,
|
|
44
44
|
data
|
|
@@ -64,13 +64,13 @@ const createEntityQuery = (strapi)=>{
|
|
|
64
64
|
if (attribute.type === 'component') {
|
|
65
65
|
const component = strapi.getModel(attribute.component);
|
|
66
66
|
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
67
|
-
if ((
|
|
67
|
+
if (Object.keys(subPopulate).length > 0) {
|
|
68
68
|
populate[key] = {
|
|
69
69
|
...params,
|
|
70
70
|
populate: subPopulate
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
|
-
if (isArray(subPopulate) &&
|
|
73
|
+
if (Array.isArray(subPopulate) && subPopulate.length === 0) {
|
|
74
74
|
populate[key] = {
|
|
75
75
|
...params
|
|
76
76
|
};
|
|
@@ -82,19 +82,19 @@ const createEntityQuery = (strapi)=>{
|
|
|
82
82
|
for (const componentUID of componentsUID){
|
|
83
83
|
const component = strapi.getModel(componentUID);
|
|
84
84
|
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
85
|
-
if ((
|
|
85
|
+
if (Object.keys(subPopulate).length > 0) {
|
|
86
86
|
on[componentUID] = {
|
|
87
87
|
...params,
|
|
88
88
|
populate: subPopulate
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
|
-
if (isArray(subPopulate) &&
|
|
91
|
+
if (Array.isArray(subPopulate) && subPopulate.length === 0) {
|
|
92
92
|
on[componentUID] = {
|
|
93
93
|
...params
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
populate[key] =
|
|
97
|
+
populate[key] = Object.keys(on).length > 0 ? {
|
|
98
98
|
on
|
|
99
99
|
} : true;
|
|
100
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.mjs","sources":["../../../src/strapi/queries/entity.ts"],"sourcesContent":["import { assign, isArray, isEmpty, isObject, map, omit, size } from 'lodash/fp';\n\nimport type { Core, UID, Data, Struct } from '@strapi/types';\nimport * as componentsService from '../../utils/components';\n\nconst sanitizeComponentLikeAttributes = <T extends Struct.Schema>(\n model: T,\n data: Data.Entity<T['uid']>\n) => {\n const { attributes } = model;\n\n const componentLikeAttributesKey = Object.entries(attributes)\n .filter(([, attribute]) => attribute.type === 'component' || attribute.type === 'dynamiczone')\n .map(([key]) => key);\n\n return omit(componentLikeAttributesKey, data);\n};\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst createEntityQuery = (strapi: Core.Strapi): any => {\n const components = {\n async assignToEntity(uid: UID.Schema, data: any) {\n const model = strapi.getModel(uid);\n\n const entityComponents = await componentsService.createComponents(uid, data);\n const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);\n\n return assign(entityComponents, dataWithoutComponents);\n },\n\n async get<T extends object>(uid: string, entity: T) {\n return componentsService.getComponents(uid as UID.Schema, entity as any);\n },\n\n delete<T extends object>(uid: string, componentsToDelete: T) {\n return componentsService.deleteComponents(uid as UID.Schema, componentsToDelete as any, {\n loadComponents: false,\n });\n },\n };\n\n const query = (uid: UID.Schema) => {\n const create = async <T extends { data: U }, U extends object>(params: T) => {\n const dataWithComponents = await components.assignToEntity(uid, params.data);\n const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);\n\n return strapi.db.query(uid).create({ ...params, data: sanitizedData });\n };\n\n const createMany = async <T extends { data: U[] }, U extends object>(params: T) => {\n return (\n Promise.resolve(params.data)\n // Create components for each entity\n .then(map((data) => components.assignToEntity(uid, data)))\n // Remove unwanted attributes\n .then(map(omitInvalidCreationAttributes))\n // Execute a strapi db createMany query with all the entities + their created components\n .then((data) => strapi.db.query(uid).createMany({ ...params, data }))\n );\n };\n\n const deleteMany = async <T extends object>(params?: T) => {\n const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});\n\n if (!entitiesToDelete.length) {\n return null;\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => components.get(uid, entityToDelete))\n );\n\n const deletedEntities = await strapi.db.query(uid).deleteMany(params);\n await Promise.all(componentsToDelete.map((compos) => components.delete(uid, compos)));\n\n return deletedEntities;\n };\n\n const getDeepPopulateComponentLikeQuery = (\n contentType: Struct.Schema,\n params = { select: '*' }\n ) => {\n const { attributes } = contentType;\n\n const populate: any = {};\n\n const entries: [string, any][] = Object.entries(attributes);\n\n for (const [key, attribute] of entries) {\n if (attribute.type === 'component') {\n const component = strapi.getModel(attribute.component);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n populate[key] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n populate[key] = { ...params };\n }\n }\n\n if (attribute.type === 'dynamiczone') {\n const { components: componentsUID } = attribute;\n\n const on: any = {};\n\n for (const componentUID of componentsUID) {\n const component = strapi.getModel(componentUID);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n on[componentUID] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n on[componentUID] = { ...params };\n }\n }\n\n populate[key] = size(on) > 0 ? { on } : true;\n }\n }\n\n const values = Object.values(populate);\n\n if (values.every((value) => value === true)) {\n return Object.keys(populate);\n }\n\n return populate;\n };\n\n return {\n create,\n createMany,\n deleteMany,\n getDeepPopulateComponentLikeQuery,\n\n get deepPopulateComponentLikeQuery() {\n const contentType = strapi.getModel(uid);\n\n return getDeepPopulateComponentLikeQuery(contentType);\n },\n };\n };\n\n return query;\n};\n\nexport { createEntityQuery };\n"],"names":["sanitizeComponentLikeAttributes","model","data","attributes","componentLikeAttributesKey","Object","entries","filter","attribute","type","map","key","omit","omitInvalidCreationAttributes","createEntityQuery","strapi","components","assignToEntity","uid","getModel","entityComponents","componentsService","dataWithoutComponents","assign","get","entity","delete","componentsToDelete","loadComponents","query","create","params","dataWithComponents","sanitizedData","db","createMany","Promise","resolve","then","deleteMany","entitiesToDelete","findMany","length","all","entityToDelete","deletedEntities","compos","getDeepPopulateComponentLikeQuery","contentType","select","populate","component","subPopulate","isArray","isObject","size","isEmpty","componentsUID","on","componentUID","values","every","value","keys","deepPopulateComponentLikeQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entity.mjs","sources":["../../../src/strapi/queries/entity.ts"],"sourcesContent":["import { assign, omit } from 'lodash';\n\nimport type { Core, UID, Data, Struct } from '@strapi/types';\nimport * as componentsService from '../../utils/components';\n\nconst sanitizeComponentLikeAttributes = <T extends Struct.Schema>(\n model: T,\n data: Data.Entity<T['uid']>\n) => {\n const { attributes } = model;\n\n const componentLikeAttributesKey = Object.entries(attributes)\n .filter(([, attribute]) => attribute.type === 'component' || attribute.type === 'dynamiczone')\n .map(([key]) => key);\n\n return omit(data, componentLikeAttributesKey);\n};\n\nconst omitInvalidCreationAttributes = <T extends object>(data: T) => omit(data, ['id']);\n\nconst createEntityQuery = (strapi: Core.Strapi): any => {\n const components = {\n async assignToEntity(uid: UID.Schema, data: any) {\n const model = strapi.getModel(uid);\n\n const entityComponents = await componentsService.createComponents(uid, data);\n const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);\n\n return assign({}, entityComponents, dataWithoutComponents);\n },\n\n async get<T extends object>(uid: string, entity: T) {\n return componentsService.getComponents(uid as UID.Schema, entity as any);\n },\n\n delete<T extends object>(uid: string, componentsToDelete: T) {\n return componentsService.deleteComponents(uid as UID.Schema, componentsToDelete as any, {\n loadComponents: false,\n });\n },\n };\n\n const query = (uid: UID.Schema) => {\n const create = async <T extends { data: U }, U extends object>(params: T) => {\n const dataWithComponents = await components.assignToEntity(uid, params.data);\n const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);\n\n return strapi.db.query(uid).create({ ...params, data: sanitizedData });\n };\n\n const createMany = async <T extends { data: U[] }, U extends object>(params: T) => {\n return (\n Promise.resolve(params.data)\n // Create components for each entity\n .then((entities) => entities.map((data) => components.assignToEntity(uid, data)))\n // Remove unwanted attributes\n .then((entities) => entities.map((data) => omitInvalidCreationAttributes(data)))\n // Execute a strapi db createMany query with all the entities + their created components\n .then((data) => strapi.db.query(uid).createMany({ ...params, data }))\n );\n };\n\n const deleteMany = async <T extends object>(params?: T) => {\n const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});\n\n if (!entitiesToDelete.length) {\n return null;\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => components.get(uid, entityToDelete))\n );\n\n const deletedEntities = await strapi.db.query(uid).deleteMany(params);\n await Promise.all(componentsToDelete.map((compos) => components.delete(uid, compos)));\n\n return deletedEntities;\n };\n\n const getDeepPopulateComponentLikeQuery = (\n contentType: Struct.Schema,\n params = { select: '*' }\n ) => {\n const { attributes } = contentType;\n\n const populate: any = {};\n\n const entries: [string, any][] = Object.entries(attributes);\n\n for (const [key, attribute] of entries) {\n if (attribute.type === 'component') {\n const component = strapi.getModel(attribute.component);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if (Object.keys(subPopulate).length > 0) {\n populate[key] = { ...params, populate: subPopulate };\n }\n\n if (Array.isArray(subPopulate) && subPopulate.length === 0) {\n populate[key] = { ...params };\n }\n }\n\n if (attribute.type === 'dynamiczone') {\n const { components: componentsUID } = attribute;\n\n const on: any = {};\n\n for (const componentUID of componentsUID) {\n const component = strapi.getModel(componentUID);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if (Object.keys(subPopulate).length > 0) {\n on[componentUID] = { ...params, populate: subPopulate };\n }\n\n if (Array.isArray(subPopulate) && subPopulate.length === 0) {\n on[componentUID] = { ...params };\n }\n }\n\n populate[key] = Object.keys(on).length > 0 ? { on } : true;\n }\n }\n\n const values = Object.values(populate);\n\n if (values.every((value) => value === true)) {\n return Object.keys(populate);\n }\n\n return populate;\n };\n\n return {\n create,\n createMany,\n deleteMany,\n getDeepPopulateComponentLikeQuery,\n\n get deepPopulateComponentLikeQuery() {\n const contentType = strapi.getModel(uid);\n\n return getDeepPopulateComponentLikeQuery(contentType);\n },\n };\n };\n\n return query;\n};\n\nexport { createEntityQuery };\n"],"names":["sanitizeComponentLikeAttributes","model","data","attributes","componentLikeAttributesKey","Object","entries","filter","attribute","type","map","key","omit","omitInvalidCreationAttributes","createEntityQuery","strapi","components","assignToEntity","uid","getModel","entityComponents","componentsService","dataWithoutComponents","assign","get","entity","delete","componentsToDelete","loadComponents","query","create","params","dataWithComponents","sanitizedData","db","createMany","Promise","resolve","then","entities","deleteMany","entitiesToDelete","findMany","length","all","entityToDelete","deletedEntities","compos","getDeepPopulateComponentLikeQuery","contentType","select","populate","component","subPopulate","keys","Array","isArray","componentsUID","on","componentUID","values","every","value","deepPopulateComponentLikeQuery"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
|
|
5
5
|
// TODO: Remove any types when we'll have types for DB metadata
|
|
6
6
|
const TARGET_EXISTS_ALIAS = '__target_exists';
|
|
@@ -221,7 +221,7 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
221
221
|
columns.left.order,
|
|
222
222
|
columns.right.ref,
|
|
223
223
|
columns.right.order
|
|
224
|
-
].filter((column)
|
|
224
|
+
].filter((column)=>column != null);
|
|
225
225
|
const buildJoinTableLink = (entry)=>{
|
|
226
226
|
const linkLeft = {
|
|
227
227
|
type: uid,
|
|
@@ -246,8 +246,8 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
246
246
|
return {
|
|
247
247
|
kind,
|
|
248
248
|
relation,
|
|
249
|
-
left:
|
|
250
|
-
right:
|
|
249
|
+
left: _.clone(linkLeft),
|
|
250
|
+
right: _.clone(linkRight)
|
|
251
251
|
};
|
|
252
252
|
};
|
|
253
253
|
const selectColumns = [
|
|
@@ -304,7 +304,7 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
304
304
|
columns.right.type,
|
|
305
305
|
columns.right.field,
|
|
306
306
|
columns.right.order
|
|
307
|
-
].filter((column)
|
|
307
|
+
].filter((column)=>column != null);
|
|
308
308
|
qb.select(validColumns);
|
|
309
309
|
if (trx) {
|
|
310
310
|
qb.transacting(trx);
|
|
@@ -334,8 +334,8 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
334
334
|
morphLinks.push({
|
|
335
335
|
kind,
|
|
336
336
|
relation,
|
|
337
|
-
left:
|
|
338
|
-
right:
|
|
337
|
+
left: _.clone(left),
|
|
338
|
+
right: _.clone(right)
|
|
339
339
|
});
|
|
340
340
|
}
|
|
341
341
|
yield* filterMorphLinksByTargetExistence(strapi, morphLinks, onOrphanedLink);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sources":["../../../src/strapi/queries/link.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport { clone, isNil } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\n\nimport { ILink } from '../../types';\n\n// TODO: Remove any types when we'll have types for DB metadata\n\nconst TARGET_EXISTS_ALIAS = '__target_exists';\nconst LEFT_EXISTS_ALIAS = '__left_exists';\nconst RIGHT_EXISTS_ALIAS = '__right_exists';\nconst EXISTENCE_CHECK_CHUNK_SIZE = 1000;\n\nconst getMetadataTableName = (strapi: Core.Strapi, uid: string) => {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n return metadata.tableName;\n};\n\nconst refKey = (ref: number | string) => `${typeof ref}:${ref}`;\n\n/**\n * Batch-load which refs exist for a content type. Handles numeric `id` refs and\n * string `documentId` refs separately, chunked to keep `IN (...)` lists bounded.\n */\nconst loadExistingRefs = async (\n strapi: Core.Strapi,\n uid: string,\n refs: Array<number | string>\n): Promise<Set<string>> => {\n const existing = new Set<string>();\n\n // Stale morph type UIDs (removed components/CTs) have no metadata — treat as orphaned.\n if (!strapi.db.metadata.has(uid)) {\n return existing;\n }\n\n const uniqueRefs = [...new Set(refs)];\n const numericIds = uniqueRefs.filter((ref): ref is number => typeof ref === 'number');\n const documentIds = uniqueRefs.filter((ref): ref is string => typeof ref === 'string');\n\n for (let i = 0; i < numericIds.length; i += EXISTENCE_CHECK_CHUNK_SIZE) {\n const chunk = numericIds.slice(i, i + EXISTENCE_CHECK_CHUNK_SIZE);\n const rows = await strapi.db.query(uid as UID.Schema).findMany({\n select: ['id'],\n where: { id: { $in: chunk } },\n });\n\n for (const row of rows) {\n existing.add(refKey(row.id as number));\n }\n }\n\n for (let i = 0; i < documentIds.length; i += EXISTENCE_CHECK_CHUNK_SIZE) {\n const chunk = documentIds.slice(i, i + EXISTENCE_CHECK_CHUNK_SIZE);\n const rows = await strapi.db.query(uid as UID.Schema).findMany({\n select: ['id', 'documentId'],\n where: { documentId: { $in: chunk } },\n });\n\n for (const row of rows) {\n if (row.documentId != null) {\n existing.add(refKey(row.documentId as string));\n }\n }\n }\n\n return existing;\n};\n\n/**\n * Filter morph links in batches. The morph owner (`left`) is not checked:\n * morphColumn rows come from the owner table itself, and morph join-table\n * owners are FK-backed. Only dynamic morph targets (`right`) need existence\n * checks, and those have no DB-level FK.\n */\nconst filterMorphLinksByTargetExistence = async function* filterMorphLinksByTargetExistence(\n strapi: Core.Strapi,\n links: ILink[],\n onOrphanedLink?: (link: ILink) => void\n): AsyncGenerator<ILink> {\n const refsByType = new Map<string, Array<number | string>>();\n\n for (const link of links) {\n const { type, ref } = link.right;\n\n if (ref == null || type == null) {\n onOrphanedLink?.(link);\n } else {\n const bucket = refsByType.get(type) ?? [];\n bucket.push(ref);\n refsByType.set(type, bucket);\n }\n }\n\n const existingByType = new Map<string, Set<string>>();\n\n for (const [type, refs] of refsByType) {\n existingByType.set(type, await loadExistingRefs(strapi, type, refs));\n }\n\n for (const link of links) {\n const { type, ref } = link.right;\n\n if (ref == null || type == null) {\n // already reported above\n } else if (existingByType.get(type)?.has(refKey(ref))) {\n yield link;\n } else {\n onOrphanedLink?.(link);\n }\n }\n};\n\nexport interface LinkQueryOptions {\n onOrphanedLink?: (link: ILink) => void;\n}\n\nconst aliasColumn = (tableAlias: string, column: string) => `${tableAlias}.${column}`;\n\nconst selectAliasedColumns = (tableAlias: string, columns: string[]) =>\n columns.map((column) => ({ [column]: aliasColumn(tableAlias, column) }));\n\nexport const createLinkQuery = (\n strapi: Core.Strapi,\n trx?: Knex.Transaction,\n options?: LinkQueryOptions\n) => {\n const { onOrphanedLink } = options ?? {};\n\n const query = () => {\n const { connection } = strapi.db;\n\n // TODO: Export utils from database and use the addSchema that is already written\n const addSchema = (tableName: string) => {\n const schemaName = connection.client.connectionSettings.schema;\n return schemaName ? `${schemaName}.${tableName}` : tableName;\n };\n\n async function* generateAllForAttribute(uid: string, fieldName: string): AsyncGenerator<ILink> {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n if (!(fieldName in attributes)) {\n throw new Error(`${fieldName} is not a valid relational attribute name`);\n }\n\n const attribute = attributes[fieldName];\n\n const kind = getLinkKind(attribute, uid);\n const { relation, target } = attribute;\n\n // The relation is stored in the same table\n // TODO: handle manyToOne joinColumn\n if (attribute.joinColumn) {\n const joinColumnName: string = attribute.joinColumn.name;\n const referencedColumn = attribute.joinColumn.referencedColumn ?? 'id';\n const ownerAlias = 'owner';\n const targetAlias = 'target';\n const ownerTable = addSchema(metadata.tableName);\n const targetTable = addSchema(getMetadataTableName(strapi, target));\n\n // Use EXISTS (not JOIN): joining on non-unique referencedColumn (e.g. i18n\n // document_id) multiplies owner rows by matching target locales.\n const targetExistsSubquery = () =>\n connection\n .queryBuilder()\n .select(connection.raw('1'))\n .from({ [targetAlias]: targetTable })\n .whereRaw('??.?? = ??.??', [targetAlias, referencedColumn, ownerAlias, joinColumnName]);\n\n const qb = connection\n .queryBuilder()\n .select(\n `${ownerAlias}.id`,\n `${ownerAlias}.${joinColumnName} as ${joinColumnName}`,\n ...(onOrphanedLink\n ? // Knex wraps QueryBuilder bindings in parentheses, so `exists (?)`\n // becomes `exists ((select ...))`, which SQLite rejects in a SELECT\n // list. Wrap the EXISTS expression so the compiled SQL is valid.\n [connection.raw('(exists ?) as ??', [targetExistsSubquery(), TARGET_EXISTS_ALIAS])]\n : [])\n )\n .from({ [ownerAlias]: ownerTable })\n .whereNotNull(aliasColumn(ownerAlias, joinColumnName));\n\n if (!onOrphanedLink) {\n qb.whereExists(targetExistsSubquery());\n }\n\n if (trx) {\n qb.transacting(trx);\n }\n\n // TODO: stream the query to improve performances\n const entries = await qb;\n\n for (const entry of entries) {\n const ref = entry[joinColumnName];\n const link: ILink = {\n kind,\n relation,\n left: { type: uid, ref: entry.id, field: fieldName },\n right: { type: target, ref },\n };\n\n // EXISTS yields 0/1 (or boolean); treat falsy as orphaned.\n if (onOrphanedLink && !entry[TARGET_EXISTS_ALIAS]) {\n onOrphanedLink(link);\n } else {\n yield link;\n }\n }\n }\n\n // The relation uses a join table\n if (attribute.joinTable) {\n const {\n name,\n joinColumn,\n inverseJoinColumn,\n orderColumnName,\n morphColumn,\n inverseOrderColumnName,\n } = attribute.joinTable;\n\n type Columns = {\n left: { ref: string | null; order?: string };\n right: { ref: string | null; order?: string; type?: string; field?: string };\n };\n\n const columns: Columns = {\n left: { ref: null },\n right: { ref: null },\n };\n\n const left: Partial<ILink['left']> = { type: uid, field: fieldName };\n const right: Partial<ILink['right']> = {};\n\n if (kind === 'relation.basic' || kind === 'relation.circular') {\n right.type = attribute.target;\n right.field = attribute.inversedBy;\n\n columns.left.ref = joinColumn.name;\n columns.right.ref = inverseJoinColumn.name;\n\n if (orderColumnName) {\n columns.left.order = orderColumnName as string;\n }\n\n if (inverseOrderColumnName) {\n columns.right.order = inverseOrderColumnName as string;\n }\n\n const joinAlias = 'join';\n const leftAlias = 'left';\n const rightAlias = 'right';\n const joinTable = addSchema(name);\n const leftTable = addSchema(metadata.tableName);\n const rightTable = addSchema(getMetadataTableName(strapi, attribute.target));\n const leftReferencedColumn = aliasColumn(leftAlias, joinColumn.referencedColumn ?? 'id');\n const rightReferencedColumn = aliasColumn(\n rightAlias,\n inverseJoinColumn.referencedColumn ?? 'id'\n );\n\n const validColumns = [\n columns.left.ref,\n columns.left.order,\n columns.right.ref,\n columns.right.order,\n ].filter((column: string | null | undefined) => !isNil(column)) as string[];\n\n const buildJoinTableLink = (entry: Record<string, unknown>): ILink => {\n const linkLeft: Partial<ILink['left']> = { type: uid, field: fieldName };\n const linkRight: Partial<ILink['right']> = {\n type: attribute.target,\n field: attribute.inversedBy,\n };\n\n if (columns.left.ref) {\n linkLeft.ref = entry[columns.left.ref] as number;\n }\n\n if (columns.right.ref) {\n linkRight.ref = entry[columns.right.ref] as number;\n }\n\n if (columns.left.order) {\n linkLeft.pos = entry[columns.left.order] as number;\n }\n\n if (columns.right.order) {\n linkRight.pos = entry[columns.right.order] as number;\n }\n\n return {\n kind,\n relation,\n left: clone(linkLeft as ILink['left']),\n right: clone(linkRight as ILink['right']),\n };\n };\n\n const selectColumns = [\n ...selectAliasedColumns(joinAlias, validColumns),\n ...(onOrphanedLink\n ? [\n { [LEFT_EXISTS_ALIAS]: leftReferencedColumn },\n { [RIGHT_EXISTS_ALIAS]: rightReferencedColumn },\n ]\n : []),\n ];\n\n const joinQb = connection\n .queryBuilder()\n .select(selectColumns)\n .from({ [joinAlias]: joinTable });\n\n if (onOrphanedLink) {\n joinQb\n .leftJoin(\n { [leftAlias]: leftTable },\n aliasColumn(joinAlias, joinColumn.name),\n leftReferencedColumn\n )\n .leftJoin(\n { [rightAlias]: rightTable },\n aliasColumn(joinAlias, inverseJoinColumn.name),\n rightReferencedColumn\n );\n } else {\n joinQb\n .innerJoin(\n { [leftAlias]: leftTable },\n aliasColumn(joinAlias, joinColumn.name),\n leftReferencedColumn\n )\n .innerJoin(\n { [rightAlias]: rightTable },\n aliasColumn(joinAlias, inverseJoinColumn.name),\n rightReferencedColumn\n );\n }\n\n if (trx) {\n joinQb.transacting(trx);\n }\n\n const entries = await joinQb;\n\n for (const entry of entries) {\n const link = buildJoinTableLink(entry);\n\n if (\n onOrphanedLink &&\n (entry[LEFT_EXISTS_ALIAS] == null || entry[RIGHT_EXISTS_ALIAS] == null)\n ) {\n onOrphanedLink(link);\n } else {\n yield link;\n }\n }\n }\n\n if (kind === 'relation.morph') {\n const qb = connection.queryBuilder().from(addSchema(name));\n\n columns.left.ref = joinColumn.name;\n\n columns.right.ref = morphColumn.idColumn.name;\n columns.right.type = morphColumn.typeColumn.name;\n columns.right.field = 'field';\n columns.right.order = 'order';\n\n const validColumns = [\n columns.left.ref,\n columns.left.order,\n columns.right.ref,\n columns.right.type,\n columns.right.field,\n columns.right.order,\n ].filter((column: string | null | undefined) => !isNil(column));\n\n qb.select(validColumns);\n\n if (trx) {\n qb.transacting(trx);\n }\n\n // TODO: stream the query to improve performances\n const entries = await qb;\n const morphLinks: ILink[] = [];\n\n for (const entry of entries) {\n if (columns.left.ref) {\n left.ref = entry[columns.left.ref];\n }\n\n if (columns.right.ref) {\n right.ref = entry[columns.right.ref];\n }\n\n if (columns.left.order) {\n left.pos = entry[columns.left.order as string];\n }\n\n if (columns.right.order) {\n right.pos = entry[columns.right.order as string];\n }\n\n if (columns.right.type) {\n right.type = entry[columns.right.type as string];\n }\n\n if (columns.right.field) {\n right.field = entry[columns.right.field as string];\n }\n\n morphLinks.push({\n kind,\n relation,\n left: clone(left as ILink['left']),\n right: clone(right as ILink['right']),\n });\n }\n\n yield* filterMorphLinksByTargetExistence(strapi, morphLinks, onOrphanedLink);\n }\n }\n\n if (attribute.morphColumn) {\n const { typeColumn, idColumn } = attribute.morphColumn;\n\n const qb = connection\n .queryBuilder()\n .select('id', typeColumn.name, idColumn.name)\n .from(addSchema(metadata.tableName))\n .whereNotNull(typeColumn.name)\n .whereNotNull(idColumn.name);\n\n if (trx) {\n qb.transacting(trx);\n }\n\n const entries = await qb;\n const morphLinks: ILink[] = entries.map((entry: Record<string, unknown>) => ({\n kind,\n relation,\n left: { type: uid, ref: entry.id as number, field: fieldName },\n right: { type: entry[typeColumn.name] as string, ref: entry[idColumn.name] as number },\n }));\n\n yield* filterMorphLinksByTargetExistence(strapi, morphLinks, onOrphanedLink);\n }\n }\n\n async function* generateAll(uid: string): AsyncGenerator<ILink> {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n for (const fieldName of Object.keys(attributes)) {\n for await (const link of generateAllForAttribute(uid, fieldName)) {\n yield link;\n }\n }\n }\n\n const insert = async (link: ILink) => {\n const { kind, left, right } = link;\n\n const metadata = strapi.db.metadata.get(left.type);\n const attribute = metadata.attributes[left.field];\n\n const payload = {};\n\n /**\n * This _should_ only happen for attributes that are added dynamically e.g. review-workflow stages\n * and a user is importing EE data into a CE project.\n */\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n throw new Error(`Attribute ${left.field} is not a relation`);\n }\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const joinColumnName = attribute.joinColumn.name;\n\n // Note: this addSchema may not be necessary, but is added for safety\n const qb = connection(addSchema(metadata.tableName))\n .where('id', left.ref)\n .update({ [joinColumnName]: right.ref });\n if (trx) {\n qb.transacting(trx);\n }\n await qb;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n if (joinTable.joinColumn) {\n Object.assign(payload, { [joinTable.joinColumn.name]: left.ref });\n }\n\n const assignInverseColumn = () => {\n if ('inverseJoinColumn' in joinTable && joinTable.inverseJoinColumn) {\n Object.assign(payload, {\n [joinTable.inverseJoinColumn.name]: right.ref,\n });\n }\n };\n\n const assignOrderColumns = () => {\n if ('orderColumnName' in joinTable && joinTable.orderColumnName) {\n Object.assign(payload, { [joinTable.orderColumnName]: left.pos ?? null });\n }\n\n if ('inverseOrderColumnName' in joinTable && joinTable.inverseOrderColumnName) {\n Object.assign(payload, { [joinTable.inverseOrderColumnName]: right.pos ?? null });\n }\n };\n\n const assignMorphColumns = () => {\n if ('morphColumn' in joinTable && joinTable.morphColumn) {\n const { idColumn, typeColumn } = joinTable.morphColumn ?? {};\n\n if (idColumn) {\n Object.assign(payload, { [idColumn.name]: right.ref });\n }\n\n if (typeColumn) {\n Object.assign(payload, { [typeColumn.name]: right.type });\n }\n\n Object.assign(payload, { order: right.pos ?? null, field: right.field ?? null });\n }\n };\n\n if (kind === 'relation.basic' || kind === 'relation.circular') {\n assignInverseColumn();\n }\n\n if (kind === 'relation.morph') {\n assignMorphColumns();\n }\n\n assignOrderColumns();\n const qb = connection.insert(payload).into(addSchema(joinTable.name));\n if (trx) {\n await qb.transacting(trx);\n }\n }\n\n if ('morphColumn' in attribute && attribute.morphColumn) {\n const { morphColumn } = attribute;\n\n const qb = connection(addSchema(metadata.tableName))\n .where('id', left.ref)\n .update({\n [morphColumn.idColumn.name]: right.ref,\n [morphColumn.typeColumn.name]: right.type,\n });\n\n if (trx) {\n qb.transacting(trx);\n }\n\n await qb;\n }\n };\n\n return { generateAll, generateAllForAttribute, insert };\n };\n\n return query;\n};\n\nexport const filterValidRelationalAttributes = (attributes: Record<string, any>) => {\n const isOwner = (attribute: any) => {\n return attribute.owner || (!attribute.mappedBy && !attribute.morphBy);\n };\n\n const isComponentLike = (attribute: any) => attribute.joinTable?.name.endsWith('_cmps');\n\n return Object.entries(attributes)\n .filter(([, attribute]) => {\n return attribute.type === 'relation' && isOwner(attribute) && !isComponentLike(attribute);\n })\n .reduce<Record<string, any>>((acc, [key, attribute]) => ({ ...acc, [key]: attribute }), {});\n};\n\nconst getLinkKind = (attribute: any, uid: string): ILink['kind'] => {\n if (attribute.relation.startsWith('morph')) {\n return 'relation.morph';\n }\n\n if (attribute.target === uid) {\n return 'relation.circular';\n }\n\n return 'relation.basic';\n};\n"],"names":["TARGET_EXISTS_ALIAS","LEFT_EXISTS_ALIAS","RIGHT_EXISTS_ALIAS","EXISTENCE_CHECK_CHUNK_SIZE","getMetadataTableName","strapi","uid","metadata","db","get","Error","tableName","refKey","ref","loadExistingRefs","refs","existing","Set","has","uniqueRefs","numericIds","filter","documentIds","i","length","chunk","slice","rows","query","findMany","select","where","id","$in","row","add","documentId","filterMorphLinksByTargetExistence","links","onOrphanedLink","refsByType","Map","link","type","right","bucket","push","set","existingByType","aliasColumn","tableAlias","column","selectAliasedColumns","columns","map","createLinkQuery","trx","options","connection","addSchema","schemaName","client","connectionSettings","schema","generateAllForAttribute","fieldName","attributes","filterValidRelationalAttributes","attribute","kind","getLinkKind","relation","target","joinColumn","joinColumnName","name","referencedColumn","ownerAlias","targetAlias","ownerTable","targetTable","targetExistsSubquery","queryBuilder","raw","from","whereRaw","qb","whereNotNull","whereExists","transacting","entries","entry","left","field","joinTable","inverseJoinColumn","orderColumnName","morphColumn","inverseOrderColumnName","inversedBy","order","joinAlias","leftAlias","rightAlias","leftTable","rightTable","leftReferencedColumn","rightReferencedColumn","validColumns","isNil","buildJoinTableLink","linkLeft","linkRight","pos","clone","selectColumns","joinQb","leftJoin","innerJoin","idColumn","typeColumn","morphLinks","generateAll","Object","keys","insert","payload","update","assign","assignInverseColumn","assignOrderColumns","assignMorphColumns","into","isOwner","owner","mappedBy","morphBy","isComponentLike","endsWith","reduce","acc","key","startsWith"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.js","sources":["../../../src/strapi/queries/link.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport { clone } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\n\nimport { ILink } from '../../types';\n\n// TODO: Remove any types when we'll have types for DB metadata\n\nconst TARGET_EXISTS_ALIAS = '__target_exists';\nconst LEFT_EXISTS_ALIAS = '__left_exists';\nconst RIGHT_EXISTS_ALIAS = '__right_exists';\nconst EXISTENCE_CHECK_CHUNK_SIZE = 1000;\n\nconst getMetadataTableName = (strapi: Core.Strapi, uid: string) => {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n return metadata.tableName;\n};\n\nconst refKey = (ref: number | string) => `${typeof ref}:${ref}`;\n\n/**\n * Batch-load which refs exist for a content type. Handles numeric `id` refs and\n * string `documentId` refs separately, chunked to keep `IN (...)` lists bounded.\n */\nconst loadExistingRefs = async (\n strapi: Core.Strapi,\n uid: string,\n refs: Array<number | string>\n): Promise<Set<string>> => {\n const existing = new Set<string>();\n\n // Stale morph type UIDs (removed components/CTs) have no metadata — treat as orphaned.\n if (!strapi.db.metadata.has(uid)) {\n return existing;\n }\n\n const uniqueRefs = [...new Set(refs)];\n const numericIds = uniqueRefs.filter((ref): ref is number => typeof ref === 'number');\n const documentIds = uniqueRefs.filter((ref): ref is string => typeof ref === 'string');\n\n for (let i = 0; i < numericIds.length; i += EXISTENCE_CHECK_CHUNK_SIZE) {\n const chunk = numericIds.slice(i, i + EXISTENCE_CHECK_CHUNK_SIZE);\n const rows = await strapi.db.query(uid as UID.Schema).findMany({\n select: ['id'],\n where: { id: { $in: chunk } },\n });\n\n for (const row of rows) {\n existing.add(refKey(row.id as number));\n }\n }\n\n for (let i = 0; i < documentIds.length; i += EXISTENCE_CHECK_CHUNK_SIZE) {\n const chunk = documentIds.slice(i, i + EXISTENCE_CHECK_CHUNK_SIZE);\n const rows = await strapi.db.query(uid as UID.Schema).findMany({\n select: ['id', 'documentId'],\n where: { documentId: { $in: chunk } },\n });\n\n for (const row of rows) {\n if (row.documentId != null) {\n existing.add(refKey(row.documentId as string));\n }\n }\n }\n\n return existing;\n};\n\n/**\n * Filter morph links in batches. The morph owner (`left`) is not checked:\n * morphColumn rows come from the owner table itself, and morph join-table\n * owners are FK-backed. Only dynamic morph targets (`right`) need existence\n * checks, and those have no DB-level FK.\n */\nconst filterMorphLinksByTargetExistence = async function* filterMorphLinksByTargetExistence(\n strapi: Core.Strapi,\n links: ILink[],\n onOrphanedLink?: (link: ILink) => void\n): AsyncGenerator<ILink> {\n const refsByType = new Map<string, Array<number | string>>();\n\n for (const link of links) {\n const { type, ref } = link.right;\n\n if (ref == null || type == null) {\n onOrphanedLink?.(link);\n } else {\n const bucket = refsByType.get(type) ?? [];\n bucket.push(ref);\n refsByType.set(type, bucket);\n }\n }\n\n const existingByType = new Map<string, Set<string>>();\n\n for (const [type, refs] of refsByType) {\n existingByType.set(type, await loadExistingRefs(strapi, type, refs));\n }\n\n for (const link of links) {\n const { type, ref } = link.right;\n\n if (ref == null || type == null) {\n // already reported above\n } else if (existingByType.get(type)?.has(refKey(ref))) {\n yield link;\n } else {\n onOrphanedLink?.(link);\n }\n }\n};\n\nexport interface LinkQueryOptions {\n onOrphanedLink?: (link: ILink) => void;\n}\n\nconst aliasColumn = (tableAlias: string, column: string) => `${tableAlias}.${column}`;\n\nconst selectAliasedColumns = (tableAlias: string, columns: string[]) =>\n columns.map((column) => ({ [column]: aliasColumn(tableAlias, column) }));\n\nexport const createLinkQuery = (\n strapi: Core.Strapi,\n trx?: Knex.Transaction,\n options?: LinkQueryOptions\n) => {\n const { onOrphanedLink } = options ?? {};\n\n const query = () => {\n const { connection } = strapi.db;\n\n // TODO: Export utils from database and use the addSchema that is already written\n const addSchema = (tableName: string) => {\n const schemaName = connection.client.connectionSettings.schema;\n return schemaName ? `${schemaName}.${tableName}` : tableName;\n };\n\n async function* generateAllForAttribute(uid: string, fieldName: string): AsyncGenerator<ILink> {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n if (!(fieldName in attributes)) {\n throw new Error(`${fieldName} is not a valid relational attribute name`);\n }\n\n const attribute = attributes[fieldName];\n\n const kind = getLinkKind(attribute, uid);\n const { relation, target } = attribute;\n\n // The relation is stored in the same table\n // TODO: handle manyToOne joinColumn\n if (attribute.joinColumn) {\n const joinColumnName: string = attribute.joinColumn.name;\n const referencedColumn = attribute.joinColumn.referencedColumn ?? 'id';\n const ownerAlias = 'owner';\n const targetAlias = 'target';\n const ownerTable = addSchema(metadata.tableName);\n const targetTable = addSchema(getMetadataTableName(strapi, target));\n\n // Use EXISTS (not JOIN): joining on non-unique referencedColumn (e.g. i18n\n // document_id) multiplies owner rows by matching target locales.\n const targetExistsSubquery = () =>\n connection\n .queryBuilder()\n .select(connection.raw('1'))\n .from({ [targetAlias]: targetTable })\n .whereRaw('??.?? = ??.??', [targetAlias, referencedColumn, ownerAlias, joinColumnName]);\n\n const qb = connection\n .queryBuilder()\n .select(\n `${ownerAlias}.id`,\n `${ownerAlias}.${joinColumnName} as ${joinColumnName}`,\n ...(onOrphanedLink\n ? // Knex wraps QueryBuilder bindings in parentheses, so `exists (?)`\n // becomes `exists ((select ...))`, which SQLite rejects in a SELECT\n // list. Wrap the EXISTS expression so the compiled SQL is valid.\n [connection.raw('(exists ?) as ??', [targetExistsSubquery(), TARGET_EXISTS_ALIAS])]\n : [])\n )\n .from({ [ownerAlias]: ownerTable })\n .whereNotNull(aliasColumn(ownerAlias, joinColumnName));\n\n if (!onOrphanedLink) {\n qb.whereExists(targetExistsSubquery());\n }\n\n if (trx) {\n qb.transacting(trx);\n }\n\n // TODO: stream the query to improve performances\n const entries = await qb;\n\n for (const entry of entries) {\n const ref = entry[joinColumnName];\n const link: ILink = {\n kind,\n relation,\n left: { type: uid, ref: entry.id, field: fieldName },\n right: { type: target, ref },\n };\n\n // EXISTS yields 0/1 (or boolean); treat falsy as orphaned.\n if (onOrphanedLink && !entry[TARGET_EXISTS_ALIAS]) {\n onOrphanedLink(link);\n } else {\n yield link;\n }\n }\n }\n\n // The relation uses a join table\n if (attribute.joinTable) {\n const {\n name,\n joinColumn,\n inverseJoinColumn,\n orderColumnName,\n morphColumn,\n inverseOrderColumnName,\n } = attribute.joinTable;\n\n type Columns = {\n left: { ref: string | null; order?: string };\n right: { ref: string | null; order?: string; type?: string; field?: string };\n };\n\n const columns: Columns = {\n left: { ref: null },\n right: { ref: null },\n };\n\n const left: Partial<ILink['left']> = { type: uid, field: fieldName };\n const right: Partial<ILink['right']> = {};\n\n if (kind === 'relation.basic' || kind === 'relation.circular') {\n right.type = attribute.target;\n right.field = attribute.inversedBy;\n\n columns.left.ref = joinColumn.name;\n columns.right.ref = inverseJoinColumn.name;\n\n if (orderColumnName) {\n columns.left.order = orderColumnName as string;\n }\n\n if (inverseOrderColumnName) {\n columns.right.order = inverseOrderColumnName as string;\n }\n\n const joinAlias = 'join';\n const leftAlias = 'left';\n const rightAlias = 'right';\n const joinTable = addSchema(name);\n const leftTable = addSchema(metadata.tableName);\n const rightTable = addSchema(getMetadataTableName(strapi, attribute.target));\n const leftReferencedColumn = aliasColumn(leftAlias, joinColumn.referencedColumn ?? 'id');\n const rightReferencedColumn = aliasColumn(\n rightAlias,\n inverseJoinColumn.referencedColumn ?? 'id'\n );\n\n const validColumns = [\n columns.left.ref,\n columns.left.order,\n columns.right.ref,\n columns.right.order,\n ].filter((column: string | null | undefined) => column != null) as string[];\n\n const buildJoinTableLink = (entry: Record<string, unknown>): ILink => {\n const linkLeft: Partial<ILink['left']> = { type: uid, field: fieldName };\n const linkRight: Partial<ILink['right']> = {\n type: attribute.target,\n field: attribute.inversedBy,\n };\n\n if (columns.left.ref) {\n linkLeft.ref = entry[columns.left.ref] as number;\n }\n\n if (columns.right.ref) {\n linkRight.ref = entry[columns.right.ref] as number;\n }\n\n if (columns.left.order) {\n linkLeft.pos = entry[columns.left.order] as number;\n }\n\n if (columns.right.order) {\n linkRight.pos = entry[columns.right.order] as number;\n }\n\n return {\n kind,\n relation,\n left: clone(linkLeft as ILink['left']),\n right: clone(linkRight as ILink['right']),\n };\n };\n\n const selectColumns = [\n ...selectAliasedColumns(joinAlias, validColumns),\n ...(onOrphanedLink\n ? [\n { [LEFT_EXISTS_ALIAS]: leftReferencedColumn },\n { [RIGHT_EXISTS_ALIAS]: rightReferencedColumn },\n ]\n : []),\n ];\n\n const joinQb = connection\n .queryBuilder()\n .select(selectColumns)\n .from({ [joinAlias]: joinTable });\n\n if (onOrphanedLink) {\n joinQb\n .leftJoin(\n { [leftAlias]: leftTable },\n aliasColumn(joinAlias, joinColumn.name),\n leftReferencedColumn\n )\n .leftJoin(\n { [rightAlias]: rightTable },\n aliasColumn(joinAlias, inverseJoinColumn.name),\n rightReferencedColumn\n );\n } else {\n joinQb\n .innerJoin(\n { [leftAlias]: leftTable },\n aliasColumn(joinAlias, joinColumn.name),\n leftReferencedColumn\n )\n .innerJoin(\n { [rightAlias]: rightTable },\n aliasColumn(joinAlias, inverseJoinColumn.name),\n rightReferencedColumn\n );\n }\n\n if (trx) {\n joinQb.transacting(trx);\n }\n\n const entries = await joinQb;\n\n for (const entry of entries) {\n const link = buildJoinTableLink(entry);\n\n if (\n onOrphanedLink &&\n (entry[LEFT_EXISTS_ALIAS] == null || entry[RIGHT_EXISTS_ALIAS] == null)\n ) {\n onOrphanedLink(link);\n } else {\n yield link;\n }\n }\n }\n\n if (kind === 'relation.morph') {\n const qb = connection.queryBuilder().from(addSchema(name));\n\n columns.left.ref = joinColumn.name;\n\n columns.right.ref = morphColumn.idColumn.name;\n columns.right.type = morphColumn.typeColumn.name;\n columns.right.field = 'field';\n columns.right.order = 'order';\n\n const validColumns = [\n columns.left.ref,\n columns.left.order,\n columns.right.ref,\n columns.right.type,\n columns.right.field,\n columns.right.order,\n ].filter((column: string | null | undefined) => column != null);\n\n qb.select(validColumns);\n\n if (trx) {\n qb.transacting(trx);\n }\n\n // TODO: stream the query to improve performances\n const entries = await qb;\n const morphLinks: ILink[] = [];\n\n for (const entry of entries) {\n if (columns.left.ref) {\n left.ref = entry[columns.left.ref];\n }\n\n if (columns.right.ref) {\n right.ref = entry[columns.right.ref];\n }\n\n if (columns.left.order) {\n left.pos = entry[columns.left.order as string];\n }\n\n if (columns.right.order) {\n right.pos = entry[columns.right.order as string];\n }\n\n if (columns.right.type) {\n right.type = entry[columns.right.type as string];\n }\n\n if (columns.right.field) {\n right.field = entry[columns.right.field as string];\n }\n\n morphLinks.push({\n kind,\n relation,\n left: clone(left as ILink['left']),\n right: clone(right as ILink['right']),\n });\n }\n\n yield* filterMorphLinksByTargetExistence(strapi, morphLinks, onOrphanedLink);\n }\n }\n\n if (attribute.morphColumn) {\n const { typeColumn, idColumn } = attribute.morphColumn;\n\n const qb = connection\n .queryBuilder()\n .select('id', typeColumn.name, idColumn.name)\n .from(addSchema(metadata.tableName))\n .whereNotNull(typeColumn.name)\n .whereNotNull(idColumn.name);\n\n if (trx) {\n qb.transacting(trx);\n }\n\n const entries = await qb;\n const morphLinks: ILink[] = entries.map((entry: Record<string, unknown>) => ({\n kind,\n relation,\n left: { type: uid, ref: entry.id as number, field: fieldName },\n right: { type: entry[typeColumn.name] as string, ref: entry[idColumn.name] as number },\n }));\n\n yield* filterMorphLinksByTargetExistence(strapi, morphLinks, onOrphanedLink);\n }\n }\n\n async function* generateAll(uid: string): AsyncGenerator<ILink> {\n const metadata = strapi.db.metadata.get(uid);\n\n if (!metadata) {\n throw new Error(`No metadata found for ${uid}`);\n }\n\n const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n for (const fieldName of Object.keys(attributes)) {\n for await (const link of generateAllForAttribute(uid, fieldName)) {\n yield link;\n }\n }\n }\n\n const insert = async (link: ILink) => {\n const { kind, left, right } = link;\n\n const metadata = strapi.db.metadata.get(left.type);\n const attribute = metadata.attributes[left.field];\n\n const payload = {};\n\n /**\n * This _should_ only happen for attributes that are added dynamically e.g. review-workflow stages\n * and a user is importing EE data into a CE project.\n */\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n throw new Error(`Attribute ${left.field} is not a relation`);\n }\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const joinColumnName = attribute.joinColumn.name;\n\n // Note: this addSchema may not be necessary, but is added for safety\n const qb = connection(addSchema(metadata.tableName))\n .where('id', left.ref)\n .update({ [joinColumnName]: right.ref });\n if (trx) {\n qb.transacting(trx);\n }\n await qb;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n if (joinTable.joinColumn) {\n Object.assign(payload, { [joinTable.joinColumn.name]: left.ref });\n }\n\n const assignInverseColumn = () => {\n if ('inverseJoinColumn' in joinTable && joinTable.inverseJoinColumn) {\n Object.assign(payload, {\n [joinTable.inverseJoinColumn.name]: right.ref,\n });\n }\n };\n\n const assignOrderColumns = () => {\n if ('orderColumnName' in joinTable && joinTable.orderColumnName) {\n Object.assign(payload, { [joinTable.orderColumnName]: left.pos ?? null });\n }\n\n if ('inverseOrderColumnName' in joinTable && joinTable.inverseOrderColumnName) {\n Object.assign(payload, { [joinTable.inverseOrderColumnName]: right.pos ?? null });\n }\n };\n\n const assignMorphColumns = () => {\n if ('morphColumn' in joinTable && joinTable.morphColumn) {\n const { idColumn, typeColumn } = joinTable.morphColumn ?? {};\n\n if (idColumn) {\n Object.assign(payload, { [idColumn.name]: right.ref });\n }\n\n if (typeColumn) {\n Object.assign(payload, { [typeColumn.name]: right.type });\n }\n\n Object.assign(payload, { order: right.pos ?? null, field: right.field ?? null });\n }\n };\n\n if (kind === 'relation.basic' || kind === 'relation.circular') {\n assignInverseColumn();\n }\n\n if (kind === 'relation.morph') {\n assignMorphColumns();\n }\n\n assignOrderColumns();\n const qb = connection.insert(payload).into(addSchema(joinTable.name));\n if (trx) {\n await qb.transacting(trx);\n }\n }\n\n if ('morphColumn' in attribute && attribute.morphColumn) {\n const { morphColumn } = attribute;\n\n const qb = connection(addSchema(metadata.tableName))\n .where('id', left.ref)\n .update({\n [morphColumn.idColumn.name]: right.ref,\n [morphColumn.typeColumn.name]: right.type,\n });\n\n if (trx) {\n qb.transacting(trx);\n }\n\n await qb;\n }\n };\n\n return { generateAll, generateAllForAttribute, insert };\n };\n\n return query;\n};\n\nexport const filterValidRelationalAttributes = (attributes: Record<string, any>) => {\n const isOwner = (attribute: any) => {\n return attribute.owner || (!attribute.mappedBy && !attribute.morphBy);\n };\n\n const isComponentLike = (attribute: any) => attribute.joinTable?.name.endsWith('_cmps');\n\n return Object.entries(attributes)\n .filter(([, attribute]) => {\n return attribute.type === 'relation' && isOwner(attribute) && !isComponentLike(attribute);\n })\n .reduce<Record<string, any>>((acc, [key, attribute]) => ({ ...acc, [key]: attribute }), {});\n};\n\nconst getLinkKind = (attribute: any, uid: string): ILink['kind'] => {\n if (attribute.relation.startsWith('morph')) {\n return 'relation.morph';\n }\n\n if (attribute.target === uid) {\n return 'relation.circular';\n }\n\n return 'relation.basic';\n};\n"],"names":["TARGET_EXISTS_ALIAS","LEFT_EXISTS_ALIAS","RIGHT_EXISTS_ALIAS","EXISTENCE_CHECK_CHUNK_SIZE","getMetadataTableName","strapi","uid","metadata","db","get","Error","tableName","refKey","ref","loadExistingRefs","refs","existing","Set","has","uniqueRefs","numericIds","filter","documentIds","i","length","chunk","slice","rows","query","findMany","select","where","id","$in","row","add","documentId","filterMorphLinksByTargetExistence","links","onOrphanedLink","refsByType","Map","link","type","right","bucket","push","set","existingByType","aliasColumn","tableAlias","column","selectAliasedColumns","columns","map","createLinkQuery","trx","options","connection","addSchema","schemaName","client","connectionSettings","schema","generateAllForAttribute","fieldName","attributes","filterValidRelationalAttributes","attribute","kind","getLinkKind","relation","target","joinColumn","joinColumnName","name","referencedColumn","ownerAlias","targetAlias","ownerTable","targetTable","targetExistsSubquery","queryBuilder","raw","from","whereRaw","qb","whereNotNull","whereExists","transacting","entries","entry","left","field","joinTable","inverseJoinColumn","orderColumnName","morphColumn","inverseOrderColumnName","inversedBy","order","joinAlias","leftAlias","rightAlias","leftTable","rightTable","leftReferencedColumn","rightReferencedColumn","validColumns","buildJoinTableLink","linkLeft","linkRight","pos","clone","selectColumns","joinQb","leftJoin","innerJoin","idColumn","typeColumn","morphLinks","generateAll","Object","keys","insert","payload","update","assign","assignInverseColumn","assignOrderColumns","assignMorphColumns","into","isOwner","owner","mappedBy","morphBy","isComponentLike","endsWith","reduce","acc","key","startsWith"],"mappings":";;;;AAMA;AAEA,MAAMA,mBAAAA,GAAsB,iBAAA;AAC5B,MAAMC,iBAAAA,GAAoB,eAAA;AAC1B,MAAMC,kBAAAA,GAAqB,gBAAA;AAC3B,MAAMC,0BAAAA,GAA6B,IAAA;AAEnC,MAAMC,oBAAAA,GAAuB,CAACC,MAAAA,EAAqBC,GAAAA,GAAAA;AACjD,IAAA,MAAMC,WAAWF,MAAAA,CAAOG,EAAE,CAACD,QAAQ,CAACE,GAAG,CAACH,GAAAA,CAAAA;AAExC,IAAA,IAAI,CAACC,QAAAA,EAAU;AACb,QAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,sBAAsB,EAAEJ,GAAAA,CAAAA,CAAK,CAAA;AAChD,IAAA;AAEA,IAAA,OAAOC,SAASI,SAAS;AAC3B,CAAA;AAEA,MAAMC,MAAAA,GAAS,CAACC,GAAAA,GAAyB,CAAA,EAAG,OAAOA,GAAAA,CAAI,CAAC,EAAEA,GAAAA,CAAAA,CAAK;AAE/D;;;AAGC,IACD,MAAMC,gBAAAA,GAAmB,OACvBT,MAAAA,EACAC,GAAAA,EACAS,IAAAA,GAAAA;AAEA,IAAA,MAAMC,WAAW,IAAIC,GAAAA,EAAAA;;IAGrB,IAAI,CAACZ,OAAOG,EAAE,CAACD,QAAQ,CAACW,GAAG,CAACZ,GAAAA,CAAAA,EAAM;QAChC,OAAOU,QAAAA;AACT,IAAA;AAEA,IAAA,MAAMG,UAAAA,GAAa;AAAI,QAAA,GAAA,IAAIF,GAAAA,CAAIF,IAAAA;AAAM,KAAA;AACrC,IAAA,MAAMK,aAAaD,UAAAA,CAAWE,MAAM,CAAC,CAACR,GAAAA,GAAuB,OAAOA,GAAAA,KAAQ,QAAA,CAAA;AAC5E,IAAA,MAAMS,cAAcH,UAAAA,CAAWE,MAAM,CAAC,CAACR,GAAAA,GAAuB,OAAOA,GAAAA,KAAQ,QAAA,CAAA;IAE7E,IAAK,IAAIU,IAAI,CAAA,EAAGA,CAAAA,GAAIH,WAAWI,MAAM,EAAED,KAAKpB,0BAAAA,CAA4B;AACtE,QAAA,MAAMsB,KAAAA,GAAQL,UAAAA,CAAWM,KAAK,CAACH,GAAGA,CAAAA,GAAIpB,0BAAAA,CAAAA;QACtC,MAAMwB,IAAAA,GAAO,MAAMtB,MAAAA,CAAOG,EAAE,CAACoB,KAAK,CAACtB,GAAAA,CAAAA,CAAmBuB,QAAQ,CAAC;YAC7DC,MAAAA,EAAQ;AAAC,gBAAA;AAAK,aAAA;YACdC,KAAAA,EAAO;gBAAEC,EAAAA,EAAI;oBAAEC,GAAAA,EAAKR;AAAM;AAAE;AAC9B,SAAA,CAAA;QAEA,KAAK,MAAMS,OAAOP,IAAAA,CAAM;AACtBX,YAAAA,QAAAA,CAASmB,GAAG,CAACvB,MAAAA,CAAOsB,GAAAA,CAAIF,EAAE,CAAA,CAAA;AAC5B,QAAA;AACF,IAAA;IAEA,IAAK,IAAIT,IAAI,CAAA,EAAGA,CAAAA,GAAID,YAAYE,MAAM,EAAED,KAAKpB,0BAAAA,CAA4B;AACvE,QAAA,MAAMsB,KAAAA,GAAQH,WAAAA,CAAYI,KAAK,CAACH,GAAGA,CAAAA,GAAIpB,0BAAAA,CAAAA;QACvC,MAAMwB,IAAAA,GAAO,MAAMtB,MAAAA,CAAOG,EAAE,CAACoB,KAAK,CAACtB,GAAAA,CAAAA,CAAmBuB,QAAQ,CAAC;YAC7DC,MAAAA,EAAQ;AAAC,gBAAA,IAAA;AAAM,gBAAA;AAAa,aAAA;YAC5BC,KAAAA,EAAO;gBAAEK,UAAAA,EAAY;oBAAEH,GAAAA,EAAKR;AAAM;AAAE;AACtC,SAAA,CAAA;QAEA,KAAK,MAAMS,OAAOP,IAAAA,CAAM;YACtB,IAAIO,GAAAA,CAAIE,UAAU,IAAI,IAAA,EAAM;AAC1BpB,gBAAAA,QAAAA,CAASmB,GAAG,CAACvB,MAAAA,CAAOsB,GAAAA,CAAIE,UAAU,CAAA,CAAA;AACpC,YAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAOpB,QAAAA;AACT,CAAA;AAEA;;;;;IAMA,MAAMqB,oCAAoC,gBAAgBA,iCAAAA,CACxDhC,MAAmB,EACnBiC,KAAc,EACdC,cAAsC,EAAA;AAEtC,IAAA,MAAMC,aAAa,IAAIC,GAAAA,EAAAA;IAEvB,KAAK,MAAMC,QAAQJ,KAAAA,CAAO;AACxB,QAAA,MAAM,EAAEK,IAAI,EAAE9B,GAAG,EAAE,GAAG6B,KAAKE,KAAK;QAEhC,IAAI/B,GAAAA,IAAO,IAAA,IAAQ8B,IAAAA,IAAQ,IAAA,EAAM;YAC/BJ,cAAAA,GAAiBG,IAAAA,CAAAA;QACnB,CAAA,MAAO;AACL,YAAA,MAAMG,MAAAA,GAASL,UAAAA,CAAW/B,GAAG,CAACkC,SAAS,EAAE;AACzCE,YAAAA,MAAAA,CAAOC,IAAI,CAACjC,GAAAA,CAAAA;YACZ2B,UAAAA,CAAWO,GAAG,CAACJ,IAAAA,EAAME,MAAAA,CAAAA;AACvB,QAAA;AACF,IAAA;AAEA,IAAA,MAAMG,iBAAiB,IAAIP,GAAAA,EAAAA;AAE3B,IAAA,KAAK,MAAM,CAACE,IAAAA,EAAM5B,IAAAA,CAAK,IAAIyB,UAAAA,CAAY;AACrCQ,QAAAA,cAAAA,CAAeD,GAAG,CAACJ,IAAAA,EAAM,MAAM7B,gBAAAA,CAAiBT,QAAQsC,IAAAA,EAAM5B,IAAAA,CAAAA,CAAAA;AAChE,IAAA;IAEA,KAAK,MAAM2B,QAAQJ,KAAAA,CAAO;AACxB,QAAA,MAAM,EAAEK,IAAI,EAAE9B,GAAG,EAAE,GAAG6B,KAAKE,KAAK;QAEhC,IAAI/B,GAAAA,IAAO,IAAA,IAAQ8B,IAAAA,IAAQ,IAAA,EAAM,CAEjC,MAAO,IAAIK,cAAAA,CAAevC,GAAG,CAACkC,IAAAA,CAAAA,EAAOzB,GAAAA,CAAIN,OAAOC,GAAAA,CAAAA,CAAAA,EAAO;YACrD,MAAM6B,IAAAA;QACR,CAAA,MAAO;YACLH,cAAAA,GAAiBG,IAAAA,CAAAA;AACnB,QAAA;AACF,IAAA;AACF,CAAA;AAMA,MAAMO,WAAAA,GAAc,CAACC,UAAAA,EAAoBC,MAAAA,GAAmB,GAAGD,UAAAA,CAAW,CAAC,EAAEC,MAAAA,CAAAA,CAAQ;AAErF,MAAMC,oBAAAA,GAAuB,CAACF,UAAAA,EAAoBG,OAAAA,GAChDA,QAAQC,GAAG,CAAC,CAACH,MAAAA,IAAY;YAAE,CAACA,MAAAA,GAASF,WAAAA,CAAYC,UAAAA,EAAYC,MAAAA;SAAQ,CAAA,CAAA;AAEhE,MAAMI,eAAAA,GAAkB,CAC7BlD,MAAAA,EACAmD,GAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAM,EAAElB,cAAc,EAAE,GAAGkB,WAAW,EAAC;AAEvC,IAAA,MAAM7B,KAAAA,GAAQ,IAAA;AACZ,QAAA,MAAM,EAAE8B,UAAU,EAAE,GAAGrD,OAAOG,EAAE;;AAGhC,QAAA,MAAMmD,YAAY,CAAChD,SAAAA,GAAAA;AACjB,YAAA,MAAMiD,aAAaF,UAAAA,CAAWG,MAAM,CAACC,kBAAkB,CAACC,MAAM;AAC9D,YAAA,OAAOH,aAAa,CAAA,EAAGA,UAAAA,CAAW,CAAC,EAAEjD,WAAW,GAAGA,SAAAA;AACrD,QAAA,CAAA;QAEA,gBAAgBqD,uBAAAA,CAAwB1D,GAAW,EAAE2D,SAAiB,EAAA;AACpE,YAAA,MAAM1D,WAAWF,MAAAA,CAAOG,EAAE,CAACD,QAAQ,CAACE,GAAG,CAACH,GAAAA,CAAAA;AAExC,YAAA,IAAI,CAACC,QAAAA,EAAU;AACb,gBAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,sBAAsB,EAAEJ,GAAAA,CAAAA,CAAK,CAAA;AAChD,YAAA;YAEA,MAAM4D,UAAAA,GAAaC,+BAAAA,CAAgC5D,QAAAA,CAAS2D,UAAU,CAAA;AAEtE,YAAA,IAAI,EAAED,SAAAA,IAAaC,UAAS,CAAA,EAAI;AAC9B,gBAAA,MAAM,IAAIxD,KAAAA,CAAM,CAAA,EAAGuD,SAAAA,CAAU,yCAAyC,CAAC,CAAA;AACzE,YAAA;YAEA,MAAMG,SAAAA,GAAYF,UAAU,CAACD,SAAAA,CAAU;YAEvC,MAAMI,IAAAA,GAAOC,YAAYF,SAAAA,EAAW9D,GAAAA,CAAAA;AACpC,YAAA,MAAM,EAAEiE,QAAQ,EAAEC,MAAM,EAAE,GAAGJ,SAAAA;;;YAI7B,IAAIA,SAAAA,CAAUK,UAAU,EAAE;AACxB,gBAAA,MAAMC,cAAAA,GAAyBN,SAAAA,CAAUK,UAAU,CAACE,IAAI;AACxD,gBAAA,MAAMC,gBAAAA,GAAmBR,SAAAA,CAAUK,UAAU,CAACG,gBAAgB,IAAI,IAAA;AAClE,gBAAA,MAAMC,UAAAA,GAAa,OAAA;AACnB,gBAAA,MAAMC,WAAAA,GAAc,QAAA;gBACpB,MAAMC,UAAAA,GAAapB,SAAAA,CAAUpD,QAAAA,CAASI,SAAS,CAAA;gBAC/C,MAAMqE,WAAAA,GAAcrB,SAAAA,CAAUvD,oBAAAA,CAAqBC,MAAAA,EAAQmE,MAAAA,CAAAA,CAAAA;;;AAI3D,gBAAA,MAAMS,oBAAAA,GAAuB,IAC3BvB,UAAAA,CACGwB,YAAY,EAAA,CACZpD,MAAM,CAAC4B,UAAAA,CAAWyB,GAAG,CAAC,GAAA,CAAA,CAAA,CACtBC,IAAI,CAAC;AAAE,wBAAA,CAACN,cAAcE;qBAAY,CAAA,CAClCK,QAAQ,CAAC,eAAA,EAAiB;AAACP,wBAAAA,WAAAA;AAAaF,wBAAAA,gBAAAA;AAAkBC,wBAAAA,UAAAA;AAAYH,wBAAAA;AAAe,qBAAA,CAAA;gBAE1F,MAAMY,EAAAA,GAAK5B,WACRwB,YAAY,EAAA,CACZpD,MAAM,CACL,CAAA,EAAG+C,WAAW,GAAG,CAAC,EAClB,CAAA,EAAGA,UAAAA,CAAW,CAAC,EAAEH,cAAAA,CAAe,IAAI,EAAEA,cAAAA,CAAAA,CAAgB,EAAA,GAClDnC,cAAAA;;AAIA,gBAAA;oBAACmB,UAAAA,CAAWyB,GAAG,CAAC,kBAAA,EAAoB;AAACF,wBAAAA,oBAAAA,EAAAA;AAAwBjF,wBAAAA;AAAoB,qBAAA;iBAAE,GACnF,EAAE,CAAA,CAEPoF,IAAI,CAAC;AAAE,oBAAA,CAACP,aAAaE;iBAAW,CAAA,CAChCQ,YAAY,CAACtC,WAAAA,CAAY4B,UAAAA,EAAYH,cAAAA,CAAAA,CAAAA;AAExC,gBAAA,IAAI,CAACnC,cAAAA,EAAgB;AACnB+C,oBAAAA,EAAAA,CAAGE,WAAW,CAACP,oBAAAA,EAAAA,CAAAA;AACjB,gBAAA;AAEA,gBAAA,IAAIzB,GAAAA,EAAK;AACP8B,oBAAAA,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACjB,gBAAA;;AAGA,gBAAA,MAAMkC,UAAU,MAAMJ,EAAAA;gBAEtB,KAAK,MAAMK,SAASD,OAAAA,CAAS;oBAC3B,MAAM7E,GAAAA,GAAM8E,KAAK,CAACjB,cAAAA,CAAe;AACjC,oBAAA,MAAMhC,IAAAA,GAAc;AAClB2B,wBAAAA,IAAAA;AACAE,wBAAAA,QAAAA;wBACAqB,IAAAA,EAAM;4BAAEjD,IAAAA,EAAMrC,GAAAA;AAAKO,4BAAAA,GAAAA,EAAK8E,MAAM3D,EAAE;4BAAE6D,KAAAA,EAAO5B;AAAU,yBAAA;wBACnDrB,KAAAA,EAAO;4BAAED,IAAAA,EAAM6B,MAAAA;AAAQ3D,4BAAAA;AAAI;AAC7B,qBAAA;;AAGA,oBAAA,IAAI0B,cAAAA,IAAkB,CAACoD,KAAK,CAAC3F,oBAAoB,EAAE;wBACjDuC,cAAAA,CAAeG,IAAAA,CAAAA;oBACjB,CAAA,MAAO;wBACL,MAAMA,IAAAA;AACR,oBAAA;AACF,gBAAA;AACF,YAAA;;YAGA,IAAI0B,SAAAA,CAAU0B,SAAS,EAAE;AACvB,gBAAA,MAAM,EACJnB,IAAI,EACJF,UAAU,EACVsB,iBAAiB,EACjBC,eAAe,EACfC,WAAW,EACXC,sBAAsB,EACvB,GAAG9B,UAAU0B,SAAS;AAOvB,gBAAA,MAAMzC,OAAAA,GAAmB;oBACvBuC,IAAAA,EAAM;wBAAE/E,GAAAA,EAAK;AAAK,qBAAA;oBAClB+B,KAAAA,EAAO;wBAAE/B,GAAAA,EAAK;AAAK;AACrB,iBAAA;AAEA,gBAAA,MAAM+E,IAAAA,GAA+B;oBAAEjD,IAAAA,EAAMrC,GAAAA;oBAAKuF,KAAAA,EAAO5B;AAAU,iBAAA;AACnE,gBAAA,MAAMrB,QAAiC,EAAC;gBAExC,IAAIyB,IAAAA,KAAS,gBAAA,IAAoBA,IAAAA,KAAS,mBAAA,EAAqB;oBAC7DzB,KAAAA,CAAMD,IAAI,GAAGyB,SAAAA,CAAUI,MAAM;oBAC7B5B,KAAAA,CAAMiD,KAAK,GAAGzB,SAAAA,CAAU+B,UAAU;AAElC9C,oBAAAA,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG,GAAG4D,WAAWE,IAAI;AAClCtB,oBAAAA,OAAAA,CAAQT,KAAK,CAAC/B,GAAG,GAAGkF,kBAAkBpB,IAAI;AAE1C,oBAAA,IAAIqB,eAAAA,EAAiB;wBACnB3C,OAAAA,CAAQuC,IAAI,CAACQ,KAAK,GAAGJ,eAAAA;AACvB,oBAAA;AAEA,oBAAA,IAAIE,sBAAAA,EAAwB;wBAC1B7C,OAAAA,CAAQT,KAAK,CAACwD,KAAK,GAAGF,sBAAAA;AACxB,oBAAA;AAEA,oBAAA,MAAMG,SAAAA,GAAY,MAAA;AAClB,oBAAA,MAAMC,SAAAA,GAAY,MAAA;AAClB,oBAAA,MAAMC,UAAAA,GAAa,OAAA;AACnB,oBAAA,MAAMT,YAAYnC,SAAAA,CAAUgB,IAAAA,CAAAA;oBAC5B,MAAM6B,SAAAA,GAAY7C,SAAAA,CAAUpD,QAAAA,CAASI,SAAS,CAAA;AAC9C,oBAAA,MAAM8F,UAAAA,GAAa9C,SAAAA,CAAUvD,oBAAAA,CAAqBC,MAAAA,EAAQ+D,UAAUI,MAAM,CAAA,CAAA;AAC1E,oBAAA,MAAMkC,oBAAAA,GAAuBzD,WAAAA,CAAYqD,SAAAA,EAAW7B,UAAAA,CAAWG,gBAAgB,IAAI,IAAA,CAAA;AACnF,oBAAA,MAAM+B,qBAAAA,GAAwB1D,WAAAA,CAC5BsD,UAAAA,EACAR,iBAAAA,CAAkBnB,gBAAgB,IAAI,IAAA,CAAA;AAGxC,oBAAA,MAAMgC,YAAAA,GAAe;wBACnBvD,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG;wBAChBwC,OAAAA,CAAQuC,IAAI,CAACQ,KAAK;wBAClB/C,OAAAA,CAAQT,KAAK,CAAC/B,GAAG;wBACjBwC,OAAAA,CAAQT,KAAK,CAACwD;AACf,qBAAA,CAAC/E,MAAM,CAAC,CAAC8B,MAAAA,GAAsCA,MAAAA,IAAU,IAAA,CAAA;AAE1D,oBAAA,MAAM0D,qBAAqB,CAAClB,KAAAA,GAAAA;AAC1B,wBAAA,MAAMmB,QAAAA,GAAmC;4BAAEnE,IAAAA,EAAMrC,GAAAA;4BAAKuF,KAAAA,EAAO5B;AAAU,yBAAA;AACvE,wBAAA,MAAM8C,SAAAA,GAAqC;AACzCpE,4BAAAA,IAAAA,EAAMyB,UAAUI,MAAM;AACtBqB,4BAAAA,KAAAA,EAAOzB,UAAU+B;AACnB,yBAAA;AAEA,wBAAA,IAAI9C,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG,EAAE;4BACpBiG,QAAAA,CAASjG,GAAG,GAAG8E,KAAK,CAACtC,QAAQuC,IAAI,CAAC/E,GAAG,CAAC;AACxC,wBAAA;AAEA,wBAAA,IAAIwC,OAAAA,CAAQT,KAAK,CAAC/B,GAAG,EAAE;4BACrBkG,SAAAA,CAAUlG,GAAG,GAAG8E,KAAK,CAACtC,QAAQT,KAAK,CAAC/B,GAAG,CAAC;AAC1C,wBAAA;AAEA,wBAAA,IAAIwC,OAAAA,CAAQuC,IAAI,CAACQ,KAAK,EAAE;4BACtBU,QAAAA,CAASE,GAAG,GAAGrB,KAAK,CAACtC,QAAQuC,IAAI,CAACQ,KAAK,CAAC;AAC1C,wBAAA;AAEA,wBAAA,IAAI/C,OAAAA,CAAQT,KAAK,CAACwD,KAAK,EAAE;4BACvBW,SAAAA,CAAUC,GAAG,GAAGrB,KAAK,CAACtC,QAAQT,KAAK,CAACwD,KAAK,CAAC;AAC5C,wBAAA;wBAEA,OAAO;AACL/B,4BAAAA,IAAAA;AACAE,4BAAAA,QAAAA;AACAqB,4BAAAA,IAAAA,EAAMqB,OAAAA,CAAMH,QAAAA,CAAAA;AACZlE,4BAAAA,KAAAA,EAAOqE,OAAAA,CAAMF,SAAAA;AACf,yBAAA;AACF,oBAAA,CAAA;AAEA,oBAAA,MAAMG,aAAAA,GAAgB;AACjB9D,wBAAAA,GAAAA,oBAAAA,CAAqBiD,SAAAA,EAAWO,YAAAA,CAAAA;2BAC/BrE,cAAAA,GACA;AACE,4BAAA;AAAE,gCAAA,CAACtC,oBAAoByG;AAAqB,6BAAA;AAC5C,4BAAA;AAAE,gCAAA,CAACxG,qBAAqByG;AAAsB;AAC/C,yBAAA,GACD;AACL,qBAAA;oBAED,MAAMQ,MAAAA,GAASzD,WACZwB,YAAY,EAAA,CACZpD,MAAM,CAACoF,aAAAA,CAAAA,CACP9B,IAAI,CAAC;AAAE,wBAAA,CAACiB,YAAYP;AAAU,qBAAA,CAAA;AAEjC,oBAAA,IAAIvD,cAAAA,EAAgB;AAClB4E,wBAAAA,MAAAA,CACGC,QAAQ,CACP;AAAE,4BAAA,CAACd,YAAYE;AAAU,yBAAA,EACzBvD,YAAYoD,SAAAA,EAAW5B,UAAAA,CAAWE,IAAI,CAAA,EACtC+B,oBAAAA,CAAAA,CAEDU,QAAQ,CACP;AAAE,4BAAA,CAACb,aAAaE;AAAW,yBAAA,EAC3BxD,WAAAA,CAAYoD,SAAAA,EAAWN,iBAAAA,CAAkBpB,IAAI,CAAA,EAC7CgC,qBAAAA,CAAAA;oBAEN,CAAA,MAAO;AACLQ,wBAAAA,MAAAA,CACGE,SAAS,CACR;AAAE,4BAAA,CAACf,YAAYE;AAAU,yBAAA,EACzBvD,YAAYoD,SAAAA,EAAW5B,UAAAA,CAAWE,IAAI,CAAA,EACtC+B,oBAAAA,CAAAA,CAEDW,SAAS,CACR;AAAE,4BAAA,CAACd,aAAaE;AAAW,yBAAA,EAC3BxD,WAAAA,CAAYoD,SAAAA,EAAWN,iBAAAA,CAAkBpB,IAAI,CAAA,EAC7CgC,qBAAAA,CAAAA;AAEN,oBAAA;AAEA,oBAAA,IAAInD,GAAAA,EAAK;AACP2D,wBAAAA,MAAAA,CAAO1B,WAAW,CAACjC,GAAAA,CAAAA;AACrB,oBAAA;AAEA,oBAAA,MAAMkC,UAAU,MAAMyB,MAAAA;oBAEtB,KAAK,MAAMxB,SAASD,OAAAA,CAAS;AAC3B,wBAAA,MAAMhD,OAAOmE,kBAAAA,CAAmBlB,KAAAA,CAAAA;AAEhC,wBAAA,IACEpD,cAAAA,KACCoD,KAAK,CAAC1F,iBAAAA,CAAkB,IAAI,IAAA,IAAQ0F,KAAK,CAACzF,kBAAAA,CAAmB,IAAI,IAAG,CAAA,EACrE;4BACAqC,cAAAA,CAAeG,IAAAA,CAAAA;wBACjB,CAAA,MAAO;4BACL,MAAMA,IAAAA;AACR,wBAAA;AACF,oBAAA;AACF,gBAAA;AAEA,gBAAA,IAAI2B,SAAS,gBAAA,EAAkB;AAC7B,oBAAA,MAAMiB,KAAK5B,UAAAA,CAAWwB,YAAY,EAAA,CAAGE,IAAI,CAACzB,SAAAA,CAAUgB,IAAAA,CAAAA,CAAAA;AAEpDtB,oBAAAA,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG,GAAG4D,WAAWE,IAAI;AAElCtB,oBAAAA,OAAAA,CAAQT,KAAK,CAAC/B,GAAG,GAAGoF,WAAAA,CAAYqB,QAAQ,CAAC3C,IAAI;AAC7CtB,oBAAAA,OAAAA,CAAQT,KAAK,CAACD,IAAI,GAAGsD,WAAAA,CAAYsB,UAAU,CAAC5C,IAAI;oBAChDtB,OAAAA,CAAQT,KAAK,CAACiD,KAAK,GAAG,OAAA;oBACtBxC,OAAAA,CAAQT,KAAK,CAACwD,KAAK,GAAG,OAAA;AAEtB,oBAAA,MAAMQ,YAAAA,GAAe;wBACnBvD,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG;wBAChBwC,OAAAA,CAAQuC,IAAI,CAACQ,KAAK;wBAClB/C,OAAAA,CAAQT,KAAK,CAAC/B,GAAG;wBACjBwC,OAAAA,CAAQT,KAAK,CAACD,IAAI;wBAClBU,OAAAA,CAAQT,KAAK,CAACiD,KAAK;wBACnBxC,OAAAA,CAAQT,KAAK,CAACwD;AACf,qBAAA,CAAC/E,MAAM,CAAC,CAAC8B,MAAAA,GAAsCA,MAAAA,IAAU,IAAA,CAAA;AAE1DmC,oBAAAA,EAAAA,CAAGxD,MAAM,CAAC8E,YAAAA,CAAAA;AAEV,oBAAA,IAAIpD,GAAAA,EAAK;AACP8B,wBAAAA,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACjB,oBAAA;;AAGA,oBAAA,MAAMkC,UAAU,MAAMJ,EAAAA;AACtB,oBAAA,MAAMkC,aAAsB,EAAE;oBAE9B,KAAK,MAAM7B,SAASD,OAAAA,CAAS;AAC3B,wBAAA,IAAIrC,OAAAA,CAAQuC,IAAI,CAAC/E,GAAG,EAAE;4BACpB+E,IAAAA,CAAK/E,GAAG,GAAG8E,KAAK,CAACtC,QAAQuC,IAAI,CAAC/E,GAAG,CAAC;AACpC,wBAAA;AAEA,wBAAA,IAAIwC,OAAAA,CAAQT,KAAK,CAAC/B,GAAG,EAAE;4BACrB+B,KAAAA,CAAM/B,GAAG,GAAG8E,KAAK,CAACtC,QAAQT,KAAK,CAAC/B,GAAG,CAAC;AACtC,wBAAA;AAEA,wBAAA,IAAIwC,OAAAA,CAAQuC,IAAI,CAACQ,KAAK,EAAE;4BACtBR,IAAAA,CAAKoB,GAAG,GAAGrB,KAAK,CAACtC,QAAQuC,IAAI,CAACQ,KAAK,CAAW;AAChD,wBAAA;AAEA,wBAAA,IAAI/C,OAAAA,CAAQT,KAAK,CAACwD,KAAK,EAAE;4BACvBxD,KAAAA,CAAMoE,GAAG,GAAGrB,KAAK,CAACtC,QAAQT,KAAK,CAACwD,KAAK,CAAW;AAClD,wBAAA;AAEA,wBAAA,IAAI/C,OAAAA,CAAQT,KAAK,CAACD,IAAI,EAAE;4BACtBC,KAAAA,CAAMD,IAAI,GAAGgD,KAAK,CAACtC,QAAQT,KAAK,CAACD,IAAI,CAAW;AAClD,wBAAA;AAEA,wBAAA,IAAIU,OAAAA,CAAQT,KAAK,CAACiD,KAAK,EAAE;4BACvBjD,KAAAA,CAAMiD,KAAK,GAAGF,KAAK,CAACtC,QAAQT,KAAK,CAACiD,KAAK,CAAW;AACpD,wBAAA;AAEA2B,wBAAAA,UAAAA,CAAW1E,IAAI,CAAC;AACduB,4BAAAA,IAAAA;AACAE,4BAAAA,QAAAA;AACAqB,4BAAAA,IAAAA,EAAMqB,OAAAA,CAAMrB,IAAAA,CAAAA;AACZhD,4BAAAA,KAAAA,EAAOqE,OAAAA,CAAMrE,KAAAA;AACf,yBAAA,CAAA;AACF,oBAAA;oBAEA,OAAOP,iCAAAA,CAAkChC,QAAQmH,UAAAA,EAAYjF,cAAAA,CAAAA;AAC/D,gBAAA;AACF,YAAA;YAEA,IAAI6B,SAAAA,CAAU6B,WAAW,EAAE;AACzB,gBAAA,MAAM,EAAEsB,UAAU,EAAED,QAAQ,EAAE,GAAGlD,UAAU6B,WAAW;gBAEtD,MAAMX,EAAAA,GAAK5B,UAAAA,CACRwB,YAAY,EAAA,CACZpD,MAAM,CAAC,IAAA,EAAMyF,UAAAA,CAAW5C,IAAI,EAAE2C,QAAAA,CAAS3C,IAAI,CAAA,CAC3CS,IAAI,CAACzB,SAAAA,CAAUpD,QAAAA,CAASI,SAAS,CAAA,CAAA,CACjC4E,YAAY,CAACgC,UAAAA,CAAW5C,IAAI,CAAA,CAC5BY,YAAY,CAAC+B,QAAAA,CAAS3C,IAAI,CAAA;AAE7B,gBAAA,IAAInB,GAAAA,EAAK;AACP8B,oBAAAA,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACjB,gBAAA;AAEA,gBAAA,MAAMkC,UAAU,MAAMJ,EAAAA;AACtB,gBAAA,MAAMkC,aAAsB9B,OAAAA,CAAQpC,GAAG,CAAC,CAACqC,SAAoC;AAC3EtB,wBAAAA,IAAAA;AACAE,wBAAAA,QAAAA;wBACAqB,IAAAA,EAAM;4BAAEjD,IAAAA,EAAMrC,GAAAA;AAAKO,4BAAAA,GAAAA,EAAK8E,MAAM3D,EAAE;4BAAY6D,KAAAA,EAAO5B;AAAU,yBAAA;wBAC7DrB,KAAAA,EAAO;AAAED,4BAAAA,IAAAA,EAAMgD,KAAK,CAAC4B,UAAAA,CAAW5C,IAAI,CAAC;AAAY9D,4BAAAA,GAAAA,EAAK8E,KAAK,CAAC2B,QAAAA,CAAS3C,IAAI;AAAY;qBACvF,CAAA,CAAA;gBAEA,OAAOtC,iCAAAA,CAAkChC,QAAQmH,UAAAA,EAAYjF,cAAAA,CAAAA;AAC/D,YAAA;AACF,QAAA;AAEA,QAAA,gBAAgBkF,YAAYnH,GAAW,EAAA;AACrC,YAAA,MAAMC,WAAWF,MAAAA,CAAOG,EAAE,CAACD,QAAQ,CAACE,GAAG,CAACH,GAAAA,CAAAA;AAExC,YAAA,IAAI,CAACC,QAAAA,EAAU;AACb,gBAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,sBAAsB,EAAEJ,GAAAA,CAAAA,CAAK,CAAA;AAChD,YAAA;YAEA,MAAM4D,UAAAA,GAAaC,+BAAAA,CAAgC5D,QAAAA,CAAS2D,UAAU,CAAA;AAEtE,YAAA,KAAK,MAAMD,SAAAA,IAAayD,MAAAA,CAAOC,IAAI,CAACzD,UAAAA,CAAAA,CAAa;AAC/C,gBAAA,WAAW,MAAMxB,IAAAA,IAAQsB,uBAAAA,CAAwB1D,GAAAA,EAAK2D,SAAAA,CAAAA,CAAY;oBAChE,MAAMvB,IAAAA;AACR,gBAAA;AACF,YAAA;AACF,QAAA;AAEA,QAAA,MAAMkF,SAAS,OAAOlF,IAAAA,GAAAA;AACpB,YAAA,MAAM,EAAE2B,IAAI,EAAEuB,IAAI,EAAEhD,KAAK,EAAE,GAAGF,IAAAA;YAE9B,MAAMnC,QAAAA,GAAWF,OAAOG,EAAE,CAACD,QAAQ,CAACE,GAAG,CAACmF,IAAAA,CAAKjD,IAAI,CAAA;AACjD,YAAA,MAAMyB,YAAY7D,QAAAA,CAAS2D,UAAU,CAAC0B,IAAAA,CAAKC,KAAK,CAAC;AAEjD,YAAA,MAAMgC,UAAU,EAAC;AAEjB;;;UAIA,IAAI,CAACzD,SAAAA,EAAW;AACd,gBAAA;AACF,YAAA;YAEA,IAAIA,SAAAA,CAAUzB,IAAI,KAAK,UAAA,EAAY;gBACjC,MAAM,IAAIjC,MAAM,CAAC,UAAU,EAAEkF,IAAAA,CAAKC,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAC7D,YAAA;AAEA,YAAA,IAAI,YAAA,IAAgBzB,SAAAA,IAAaA,SAAAA,CAAUK,UAAU,EAAE;AACrD,gBAAA,MAAMC,cAAAA,GAAiBN,SAAAA,CAAUK,UAAU,CAACE,IAAI;;AAGhD,gBAAA,MAAMW,EAAAA,GAAK5B,UAAAA,CAAWC,SAAAA,CAAUpD,QAAAA,CAASI,SAAS,CAAA,CAAA,CAC/CoB,KAAK,CAAC,IAAA,EAAM6D,IAAAA,CAAK/E,GAAG,CAAA,CACpBiH,MAAM,CAAC;oBAAE,CAACpD,cAAAA,GAAiB9B,KAAAA,CAAM/B;AAAI,iBAAA,CAAA;AACxC,gBAAA,IAAI2C,GAAAA,EAAK;AACP8B,oBAAAA,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACjB,gBAAA;gBACA,MAAM8B,EAAAA;AACR,YAAA;AAEA,YAAA,IAAI,WAAA,IAAelB,SAAAA,IAAaA,SAAAA,CAAU0B,SAAS,EAAE;gBACnD,MAAM,EAAEA,SAAS,EAAE,GAAG1B,SAAAA;gBAEtB,IAAI0B,SAAAA,CAAUrB,UAAU,EAAE;oBACxBiD,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AAAE,wBAAA,CAAC/B,UAAUrB,UAAU,CAACE,IAAI,GAAGiB,KAAK/E;AAAI,qBAAA,CAAA;AACjE,gBAAA;AAEA,gBAAA,MAAMmH,mBAAAA,GAAsB,IAAA;AAC1B,oBAAA,IAAI,mBAAA,IAAuBlC,SAAAA,IAAaA,SAAAA,CAAUC,iBAAiB,EAAE;wBACnE2B,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AACrB,4BAAA,CAAC/B,UAAUC,iBAAiB,CAACpB,IAAI,GAAG/B,MAAM/B;AAC5C,yBAAA,CAAA;AACF,oBAAA;AACF,gBAAA,CAAA;AAEA,gBAAA,MAAMoH,kBAAAA,GAAqB,IAAA;AACzB,oBAAA,IAAI,iBAAA,IAAqBnC,SAAAA,IAAaA,SAAAA,CAAUE,eAAe,EAAE;wBAC/D0B,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AAAE,4BAAA,CAAC/B,UAAUE,eAAe,GAAGJ,IAAAA,CAAKoB,GAAG,IAAI;AAAK,yBAAA,CAAA;AACzE,oBAAA;AAEA,oBAAA,IAAI,wBAAA,IAA4BlB,SAAAA,IAAaA,SAAAA,CAAUI,sBAAsB,EAAE;wBAC7EwB,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AAAE,4BAAA,CAAC/B,UAAUI,sBAAsB,GAAGtD,KAAAA,CAAMoE,GAAG,IAAI;AAAK,yBAAA,CAAA;AACjF,oBAAA;AACF,gBAAA,CAAA;AAEA,gBAAA,MAAMkB,kBAAAA,GAAqB,IAAA;AACzB,oBAAA,IAAI,aAAA,IAAiBpC,SAAAA,IAAaA,SAAAA,CAAUG,WAAW,EAAE;wBACvD,MAAM,EAAEqB,QAAQ,EAAEC,UAAU,EAAE,GAAGzB,SAAAA,CAAUG,WAAW,IAAI,EAAC;AAE3D,wBAAA,IAAIqB,QAAAA,EAAU;4BACZI,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AAAE,gCAAA,CAACP,QAAAA,CAAS3C,IAAI,GAAG/B,MAAM/B;AAAI,6BAAA,CAAA;AACtD,wBAAA;AAEA,wBAAA,IAAI0G,UAAAA,EAAY;4BACdG,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;AAAE,gCAAA,CAACN,UAAAA,CAAW5C,IAAI,GAAG/B,MAAMD;AAAK,6BAAA,CAAA;AACzD,wBAAA;wBAEA+E,MAAAA,CAAOK,MAAM,CAACF,OAAAA,EAAS;4BAAEzB,KAAAA,EAAOxD,KAAAA,CAAMoE,GAAG,IAAI,IAAA;4BAAMnB,KAAAA,EAAOjD,KAAAA,CAAMiD,KAAK,IAAI;AAAK,yBAAA,CAAA;AAChF,oBAAA;AACF,gBAAA,CAAA;gBAEA,IAAIxB,IAAAA,KAAS,gBAAA,IAAoBA,IAAAA,KAAS,mBAAA,EAAqB;AAC7D2D,oBAAAA,mBAAAA,EAAAA;AACF,gBAAA;AAEA,gBAAA,IAAI3D,SAAS,gBAAA,EAAkB;AAC7B6D,oBAAAA,kBAAAA,EAAAA;AACF,gBAAA;AAEAD,gBAAAA,kBAAAA,EAAAA;gBACA,MAAM3C,EAAAA,GAAK5B,WAAWkE,MAAM,CAACC,SAASM,IAAI,CAACxE,SAAAA,CAAUmC,SAAAA,CAAUnB,IAAI,CAAA,CAAA;AACnE,gBAAA,IAAInB,GAAAA,EAAK;oBACP,MAAM8B,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACvB,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,aAAA,IAAiBY,SAAAA,IAAaA,SAAAA,CAAU6B,WAAW,EAAE;gBACvD,MAAM,EAAEA,WAAW,EAAE,GAAG7B,SAAAA;AAExB,gBAAA,MAAMkB,EAAAA,GAAK5B,UAAAA,CAAWC,SAAAA,CAAUpD,QAAAA,CAASI,SAAS,CAAA,CAAA,CAC/CoB,KAAK,CAAC,IAAA,EAAM6D,IAAAA,CAAK/E,GAAG,CAAA,CACpBiH,MAAM,CAAC;AACN,oBAAA,CAAC7B,YAAYqB,QAAQ,CAAC3C,IAAI,GAAG/B,MAAM/B,GAAG;AACtC,oBAAA,CAACoF,YAAYsB,UAAU,CAAC5C,IAAI,GAAG/B,MAAMD;AACvC,iBAAA,CAAA;AAEF,gBAAA,IAAIa,GAAAA,EAAK;AACP8B,oBAAAA,EAAAA,CAAGG,WAAW,CAACjC,GAAAA,CAAAA;AACjB,gBAAA;gBAEA,MAAM8B,EAAAA;AACR,YAAA;AACF,QAAA,CAAA;QAEA,OAAO;AAAEmC,YAAAA,WAAAA;AAAazD,YAAAA,uBAAAA;AAAyB4D,YAAAA;AAAO,SAAA;AACxD,IAAA,CAAA;IAEA,OAAOhG,KAAAA;AACT;AAEO,MAAMuC,kCAAkC,CAACD,UAAAA,GAAAA;AAC9C,IAAA,MAAMkE,UAAU,CAAChE,SAAAA,GAAAA;QACf,OAAOA,SAAAA,CAAUiE,KAAK,IAAK,CAACjE,UAAUkE,QAAQ,IAAI,CAAClE,SAAAA,CAAUmE,OAAO;AACtE,IAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkB,CAACpE,SAAAA,GAAmBA,UAAU0B,SAAS,EAAEnB,KAAK8D,QAAAA,CAAS,OAAA,CAAA;IAE/E,OAAOf,MAAAA,CAAOhC,OAAO,CAACxB,UAAAA,CAAAA,CACnB7C,MAAM,CAAC,CAAC,GAAG+C,SAAAA,CAAU,GAAA;AACpB,QAAA,OAAOA,UAAUzB,IAAI,KAAK,cAAcyF,OAAAA,CAAQhE,SAAAA,CAAAA,IAAc,CAACoE,eAAAA,CAAgBpE,SAAAA,CAAAA;IACjF,CAAA,CAAA,CACCsE,MAAM,CAAsB,CAACC,GAAAA,EAAK,CAACC,GAAAA,EAAKxE,SAAAA,CAAU,IAAM;AAAE,YAAA,GAAGuE,GAAG;AAAE,YAAA,CAACC,MAAMxE;AAAU,SAAA,GAAI,EAAC,CAAA;AAC7F;AAEA,MAAME,WAAAA,GAAc,CAACF,SAAAA,EAAgB9D,GAAAA,GAAAA;AACnC,IAAA,IAAI8D,SAAAA,CAAUG,QAAQ,CAACsE,UAAU,CAAC,OAAA,CAAA,EAAU;QAC1C,OAAO,gBAAA;AACT,IAAA;IAEA,IAAIzE,SAAAA,CAAUI,MAAM,KAAKlE,GAAAA,EAAK;QAC5B,OAAO,mBAAA;AACT,IAAA;IAEA,OAAO,gBAAA;AACT,CAAA;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { clone } from 'lodash';
|
|
2
2
|
|
|
3
3
|
// TODO: Remove any types when we'll have types for DB metadata
|
|
4
4
|
const TARGET_EXISTS_ALIAS = '__target_exists';
|
|
@@ -219,7 +219,7 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
219
219
|
columns.left.order,
|
|
220
220
|
columns.right.ref,
|
|
221
221
|
columns.right.order
|
|
222
|
-
].filter((column)
|
|
222
|
+
].filter((column)=>column != null);
|
|
223
223
|
const buildJoinTableLink = (entry)=>{
|
|
224
224
|
const linkLeft = {
|
|
225
225
|
type: uid,
|
|
@@ -302,7 +302,7 @@ const createLinkQuery = (strapi, trx, options)=>{
|
|
|
302
302
|
columns.right.type,
|
|
303
303
|
columns.right.field,
|
|
304
304
|
columns.right.order
|
|
305
|
-
].filter((column)
|
|
305
|
+
].filter((column)=>column != null);
|
|
306
306
|
qb.select(validColumns);
|
|
307
307
|
if (trx) {
|
|
308
308
|
qb.transacting(trx);
|