@strapi/data-transfer 5.12.1 → 5.12.3
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/engine/errors.js +39 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/errors.mjs +34 -0
- package/dist/engine/errors.mjs.map +1 -0
- package/dist/engine/index.js +797 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/index.mjs +792 -0
- package/dist/engine/index.mjs.map +1 -0
- package/dist/engine/validation/provider.js +19 -0
- package/dist/engine/validation/provider.js.map +1 -0
- package/dist/engine/validation/provider.mjs +17 -0
- package/dist/engine/validation/provider.mjs.map +1 -0
- package/dist/engine/validation/schemas/index.js +57 -0
- package/dist/engine/validation/schemas/index.js.map +1 -0
- package/dist/engine/validation/schemas/index.mjs +55 -0
- package/dist/engine/validation/schemas/index.mjs.map +1 -0
- package/dist/errors/base.js +13 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/base.mjs +11 -0
- package/dist/errors/base.mjs.map +1 -0
- package/dist/errors/constants.js +10 -0
- package/dist/errors/constants.js.map +1 -0
- package/dist/errors/constants.mjs +8 -0
- package/dist/errors/constants.mjs.map +1 -0
- package/dist/errors/providers.js +41 -0
- package/dist/errors/providers.js.map +1 -0
- package/dist/errors/providers.mjs +36 -0
- package/dist/errors/providers.mjs.map +1 -0
- package/dist/file/index.js +8 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/index.mjs +3 -0
- package/dist/file/index.mjs.map +1 -0
- package/dist/file/providers/destination/index.js +248 -0
- package/dist/file/providers/destination/index.js.map +1 -0
- package/dist/file/providers/destination/index.mjs +246 -0
- package/dist/file/providers/destination/index.mjs.map +1 -0
- package/dist/file/providers/destination/utils.js +63 -0
- package/dist/file/providers/destination/utils.js.map +1 -0
- package/dist/file/providers/destination/utils.mjs +60 -0
- package/dist/file/providers/destination/utils.mjs.map +1 -0
- package/dist/file/providers/index.js +10 -0
- package/dist/file/providers/index.js.map +1 -0
- package/dist/file/providers/index.mjs +3 -0
- package/dist/file/providers/index.mjs.map +1 -0
- package/dist/file/providers/source/index.js +288 -0
- package/dist/file/providers/source/index.js.map +1 -0
- package/dist/file/providers/source/index.mjs +286 -0
- package/dist/file/providers/source/index.mjs.map +1 -0
- package/dist/file/providers/source/utils.js +56 -0
- package/dist/file/providers/source/utils.js.map +1 -0
- package/dist/file/providers/source/utils.mjs +52 -0
- package/dist/file/providers/source/utils.mjs.map +1 -0
- package/dist/index.js +8 -5692
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -5674
- package/dist/index.mjs.map +1 -1
- package/dist/strapi/index.js +12 -0
- package/dist/strapi/index.js.map +1 -0
- package/dist/strapi/index.mjs +7 -0
- package/dist/strapi/index.mjs.map +1 -0
- package/dist/strapi/providers/index.js +16 -0
- package/dist/strapi/providers/index.js.map +1 -0
- package/dist/strapi/providers/index.mjs +7 -0
- package/dist/strapi/providers/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/index.js +419 -0
- package/dist/strapi/providers/local-destination/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/index.mjs +396 -0
- package/dist/strapi/providers/local-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +52 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +49 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +64 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +62 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +126 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +122 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js +60 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +58 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -0
- package/dist/strapi/providers/local-source/assets.js +123 -0
- package/dist/strapi/providers/local-source/assets.js.map +1 -0
- package/dist/strapi/providers/local-source/assets.mjs +121 -0
- package/dist/strapi/providers/local-source/assets.mjs.map +1 -0
- package/dist/strapi/providers/local-source/configuration.js +39 -0
- package/dist/strapi/providers/local-source/configuration.js.map +1 -0
- package/dist/strapi/providers/local-source/configuration.mjs +37 -0
- package/dist/strapi/providers/local-source/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-source/entities.js +62 -0
- package/dist/strapi/providers/local-source/entities.js.map +1 -0
- package/dist/strapi/providers/local-source/entities.mjs +59 -0
- package/dist/strapi/providers/local-source/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-source/index.js +154 -0
- package/dist/strapi/providers/local-source/index.js.map +1 -0
- package/dist/strapi/providers/local-source/index.mjs +152 -0
- package/dist/strapi/providers/local-source/index.mjs.map +1 -0
- package/dist/strapi/providers/local-source/links.js +26 -0
- package/dist/strapi/providers/local-source/links.js.map +1 -0
- package/dist/strapi/providers/local-source/links.mjs +24 -0
- package/dist/strapi/providers/local-source/links.mjs.map +1 -0
- package/dist/strapi/providers/remote-destination/index.js +392 -0
- package/dist/strapi/providers/remote-destination/index.js.map +1 -0
- package/dist/strapi/providers/remote-destination/index.mjs +390 -0
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/remote-source/index.js +405 -0
- package/dist/strapi/providers/remote-source/index.js.map +1 -0
- package/dist/strapi/providers/remote-source/index.mjs +403 -0
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -0
- package/dist/strapi/providers/utils.js +173 -0
- package/dist/strapi/providers/utils.js.map +1 -0
- package/dist/strapi/providers/utils.mjs +169 -0
- package/dist/strapi/providers/utils.mjs.map +1 -0
- package/dist/strapi/queries/entity.js +125 -0
- package/dist/strapi/queries/entity.js.map +1 -0
- package/dist/strapi/queries/entity.mjs +123 -0
- package/dist/strapi/queries/entity.mjs.map +1 -0
- package/dist/strapi/queries/index.js +10 -0
- package/dist/strapi/queries/index.js.map +1 -0
- package/dist/strapi/queries/index.mjs +5 -0
- package/dist/strapi/queries/index.mjs.map +1 -0
- package/dist/strapi/queries/link.js +298 -0
- package/dist/strapi/queries/link.js.map +1 -0
- package/dist/strapi/queries/link.mjs +295 -0
- package/dist/strapi/queries/link.mjs.map +1 -0
- package/dist/strapi/remote/constants.js +11 -0
- package/dist/strapi/remote/constants.js.map +1 -0
- package/dist/strapi/remote/constants.mjs +8 -0
- package/dist/strapi/remote/constants.mjs.map +1 -0
- package/dist/strapi/remote/flows/default.js +43 -0
- package/dist/strapi/remote/flows/default.js.map +1 -0
- package/dist/strapi/remote/flows/default.mjs +41 -0
- package/dist/strapi/remote/flows/default.mjs.map +1 -0
- package/dist/strapi/remote/flows/index.js +54 -0
- package/dist/strapi/remote/flows/index.js.map +1 -0
- package/dist/strapi/remote/flows/index.mjs +52 -0
- package/dist/strapi/remote/flows/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/constants.js +10 -0
- package/dist/strapi/remote/handlers/constants.js.map +1 -0
- package/dist/strapi/remote/handlers/constants.mjs +8 -0
- package/dist/strapi/remote/handlers/constants.mjs.map +1 -0
- package/dist/strapi/remote/handlers/index.js +12 -0
- package/dist/strapi/remote/handlers/index.js.map +1 -0
- package/dist/strapi/remote/handlers/index.mjs +4 -0
- package/dist/strapi/remote/handlers/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/pull.js +348 -0
- package/dist/strapi/remote/handlers/pull.js.map +1 -0
- package/dist/strapi/remote/handlers/pull.mjs +346 -0
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -0
- package/dist/strapi/remote/handlers/push.js +400 -0
- package/dist/strapi/remote/handlers/push.js.map +1 -0
- package/dist/strapi/remote/handlers/push.mjs +398 -0
- package/dist/strapi/remote/handlers/push.mjs.map +1 -0
- package/dist/strapi/remote/handlers/utils.js +316 -0
- package/dist/strapi/remote/handlers/utils.js.map +1 -0
- package/dist/strapi/remote/handlers/utils.mjs +310 -0
- package/dist/strapi/remote/handlers/utils.mjs.map +1 -0
- package/dist/strapi/remote/index.js +10 -0
- package/dist/strapi/remote/index.js.map +1 -0
- package/dist/strapi/remote/index.mjs +5 -0
- package/dist/strapi/remote/index.mjs.map +1 -0
- package/dist/utils/components.js +178 -0
- package/dist/utils/components.js.map +1 -0
- package/dist/utils/components.mjs +171 -0
- package/dist/utils/components.mjs.map +1 -0
- package/dist/utils/diagnostic.js +51 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/diagnostic.mjs +49 -0
- package/dist/utils/diagnostic.mjs.map +1 -0
- package/dist/utils/encryption/decrypt.js +47 -0
- package/dist/utils/encryption/decrypt.js.map +1 -0
- package/dist/utils/encryption/decrypt.mjs +45 -0
- package/dist/utils/encryption/decrypt.mjs.map +1 -0
- package/dist/utils/encryption/encrypt.js +47 -0
- package/dist/utils/encryption/encrypt.js.map +1 -0
- package/dist/utils/encryption/encrypt.mjs +45 -0
- package/dist/utils/encryption/encrypt.mjs.map +1 -0
- package/dist/utils/encryption/index.js +10 -0
- package/dist/utils/encryption/index.js.map +1 -0
- package/dist/utils/encryption/index.mjs +3 -0
- package/dist/utils/encryption/index.mjs.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +15 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/json.js +96 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/json.mjs +94 -0
- package/dist/utils/json.mjs.map +1 -0
- package/dist/utils/middleware.js +14 -0
- package/dist/utils/middleware.js.map +1 -0
- package/dist/utils/middleware.mjs +12 -0
- package/dist/utils/middleware.mjs.map +1 -0
- package/dist/utils/providers.js +12 -0
- package/dist/utils/providers.js.map +1 -0
- package/dist/utils/providers.mjs +10 -0
- package/dist/utils/providers.mjs.map +1 -0
- package/dist/utils/schema.js +32 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/schema.mjs +29 -0
- package/dist/utils/schema.mjs.map +1 -0
- package/dist/utils/stream.js +59 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/stream.mjs +55 -0
- package/dist/utils/stream.mjs.map +1 -0
- package/dist/utils/transaction.js +93 -0
- package/dist/utils/transaction.js.map +1 -0
- package/dist/utils/transaction.mjs +91 -0
- package/dist/utils/transaction.mjs.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stream = require('stream');
|
|
4
|
+
var fp = require('lodash/fp');
|
|
5
|
+
var providers = require('../../../../../errors/providers.js');
|
|
6
|
+
require('crypto');
|
|
7
|
+
var json = require('../../../../../utils/json.js');
|
|
8
|
+
require('events');
|
|
9
|
+
var entity = require('../../../../queries/entity.js');
|
|
10
|
+
var components = require('../../../../../utils/components.js');
|
|
11
|
+
|
|
12
|
+
const createEntitiesWriteStream = (options)=>{
|
|
13
|
+
const { strapi, updateMappingTable, transaction } = options;
|
|
14
|
+
const query = entity.createEntityQuery(strapi);
|
|
15
|
+
return new stream.Writable({
|
|
16
|
+
objectMode: true,
|
|
17
|
+
async write (entity, _encoding, callback) {
|
|
18
|
+
await transaction?.attach(async ()=>{
|
|
19
|
+
const { type, id, data } = entity;
|
|
20
|
+
const { create, getDeepPopulateComponentLikeQuery } = query(type);
|
|
21
|
+
const contentType = strapi.getModel(type);
|
|
22
|
+
try {
|
|
23
|
+
const created = await create({
|
|
24
|
+
data,
|
|
25
|
+
populate: getDeepPopulateComponentLikeQuery(contentType, {
|
|
26
|
+
select: 'id'
|
|
27
|
+
}),
|
|
28
|
+
select: 'id'
|
|
29
|
+
});
|
|
30
|
+
// Compute differences between original & new entities
|
|
31
|
+
const diffs = json.diff(data, created);
|
|
32
|
+
updateMappingTable(type, id, created.id);
|
|
33
|
+
// For each difference found on an ID attribute,
|
|
34
|
+
// update the mapping the table accordingly
|
|
35
|
+
diffs.forEach((diff)=>{
|
|
36
|
+
if (diff.kind === 'modified' && fp.last(diff.path) === 'id' && 'kind' in contentType) {
|
|
37
|
+
const target = components.resolveComponentUID({
|
|
38
|
+
paths: diff.path,
|
|
39
|
+
data,
|
|
40
|
+
contentType,
|
|
41
|
+
strapi
|
|
42
|
+
});
|
|
43
|
+
// If no type is found for the given path, then ignore the diff
|
|
44
|
+
if (!target) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const [oldID, newID] = diff.values;
|
|
48
|
+
updateMappingTable(target, oldID, newID);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
} catch (e) {
|
|
52
|
+
if (e instanceof Error) {
|
|
53
|
+
return callback(e);
|
|
54
|
+
}
|
|
55
|
+
return callback(new providers.ProviderTransferError(`Failed to create "${type}" (${id})`));
|
|
56
|
+
}
|
|
57
|
+
return callback(null);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
exports.createEntitiesWriteStream = createEntitiesWriteStream;
|
|
64
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/entities.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core, UID } from '@strapi/types';\n\nimport { last } from 'lodash/fp';\n\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport type { IEntity, Transaction } from '../../../../../../types';\nimport { json } from '../../../../../utils';\nimport * as queries from '../../../../queries';\nimport { resolveComponentUID } from '../../../../../utils/components';\n\ninterface IEntitiesRestoreStreamOptions {\n strapi: Core.Strapi;\n updateMappingTable<TSchemaUID extends UID.Schema>(\n type: TSchemaUID,\n oldID: number,\n newID: number\n ): void;\n transaction?: Transaction;\n}\n\nexport const createEntitiesWriteStream = (options: IEntitiesRestoreStreamOptions) => {\n const { strapi, updateMappingTable, transaction } = options;\n const query = queries.entity.createEntityQuery(strapi);\n\n return new Writable({\n objectMode: true,\n\n async write(entity: IEntity, _encoding, callback) {\n await transaction?.attach(async () => {\n const { type, id, data } = entity;\n const { create, getDeepPopulateComponentLikeQuery } = query(type);\n const contentType = strapi.getModel(type);\n\n try {\n const created = await create({\n data,\n populate: getDeepPopulateComponentLikeQuery(contentType, { select: 'id' }),\n select: 'id',\n });\n\n // Compute differences between original & new entities\n const diffs = json.diff(data, created);\n\n updateMappingTable(type, id, created.id);\n\n // For each difference found on an ID attribute,\n // update the mapping the table accordingly\n diffs.forEach((diff) => {\n if (diff.kind === 'modified' && last(diff.path) === 'id' && 'kind' in contentType) {\n const target = resolveComponentUID({ paths: diff.path, data, contentType, strapi });\n\n // If no type is found for the given path, then ignore the diff\n if (!target) {\n return;\n }\n\n const [oldID, newID] = diff.values as [number, number];\n\n updateMappingTable(target, oldID, newID);\n }\n });\n } catch (e) {\n if (e instanceof Error) {\n return callback(e);\n }\n\n return callback(new ProviderTransferError(`Failed to create \"${type}\" (${id})`));\n }\n\n return callback(null);\n });\n },\n });\n};\n"],"names":["createEntitiesWriteStream","options","strapi","updateMappingTable","transaction","query","queries","Writable","objectMode","write","entity","_encoding","callback","attach","type","id","data","create","getDeepPopulateComponentLikeQuery","contentType","getModel","created","populate","select","diffs","json","forEach","diff","kind","last","path","target","resolveComponentUID","paths","oldID","newID","values","e","Error","ProviderTransferError"],"mappings":";;;;;;;;;;;AAqBO,MAAMA,4BAA4B,CAACC,OAAAA,GAAAA;AACxC,IAAA,MAAM,EAAEC,MAAM,EAAEC,kBAAkB,EAAEC,WAAW,EAAE,GAAGH,OAAAA;AACpD,IAAA,MAAMI,KAAQC,GAAAA,wBAAgC,CAACJ,MAAAA,CAAAA;AAE/C,IAAA,OAAO,IAAIK,eAAS,CAAA;QAClBC,UAAY,EAAA,IAAA;AAEZ,QAAA,MAAMC,KAAMC,CAAAA,CAAAA,MAAe,EAAEC,SAAS,EAAEC,QAAQ,EAAA;AAC9C,YAAA,MAAMR,aAAaS,MAAO,CAAA,UAAA;AACxB,gBAAA,MAAM,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGN,MAAAA;AAC3B,gBAAA,MAAM,EAAEO,MAAM,EAAEC,iCAAiC,EAAE,GAAGb,KAAMS,CAAAA,IAAAA,CAAAA;gBAC5D,MAAMK,WAAAA,GAAcjB,MAAOkB,CAAAA,QAAQ,CAACN,IAAAA,CAAAA;gBAEpC,IAAI;oBACF,MAAMO,OAAAA,GAAU,MAAMJ,MAAO,CAAA;AAC3BD,wBAAAA,IAAAA;AACAM,wBAAAA,QAAAA,EAAUJ,kCAAkCC,WAAa,EAAA;4BAAEI,MAAQ,EAAA;AAAK,yBAAA,CAAA;wBACxEA,MAAQ,EAAA;AACV,qBAAA,CAAA;;AAGA,oBAAA,MAAMC,KAAQC,GAAAA,SAAS,CAACT,IAAMK,EAAAA,OAAAA,CAAAA;oBAE9BlB,kBAAmBW,CAAAA,IAAAA,EAAMC,EAAIM,EAAAA,OAAAA,CAAQN,EAAE,CAAA;;;oBAIvCS,KAAME,CAAAA,OAAO,CAAC,CAACC,IAAAA,GAAAA;wBACb,IAAIA,IAAAA,CAAKC,IAAI,KAAK,UAAcC,IAAAA,OAAAA,CAAKF,KAAKG,IAAI,CAAA,KAAM,IAAQ,IAAA,MAAA,IAAUX,WAAa,EAAA;AACjF,4BAAA,MAAMY,SAASC,8BAAoB,CAAA;AAAEC,gCAAAA,KAAAA,EAAON,KAAKG,IAAI;AAAEd,gCAAAA,IAAAA;AAAMG,gCAAAA,WAAAA;AAAajB,gCAAAA;AAAO,6BAAA,CAAA;;AAGjF,4BAAA,IAAI,CAAC6B,MAAQ,EAAA;AACX,gCAAA;AACF;AAEA,4BAAA,MAAM,CAACG,KAAAA,EAAOC,KAAM,CAAA,GAAGR,KAAKS,MAAM;AAElCjC,4BAAAA,kBAAAA,CAAmB4B,QAAQG,KAAOC,EAAAA,KAAAA,CAAAA;AACpC;AACF,qBAAA,CAAA;AACF,iBAAA,CAAE,OAAOE,CAAG,EAAA;AACV,oBAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,wBAAA,OAAO1B,QAASyB,CAAAA,CAAAA,CAAAA;AAClB;oBAEA,OAAOzB,QAAAA,CAAS,IAAI2B,+BAAAA,CAAsB,CAAC,kBAAkB,EAAEzB,IAAAA,CAAK,GAAG,EAAEC,EAAG,CAAA,CAAC,CAAC,CAAA,CAAA;AAChF;AAEA,gBAAA,OAAOH,QAAS,CAAA,IAAA,CAAA;AAClB,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Writable } from 'stream';
|
|
2
|
+
import { last } from 'lodash/fp';
|
|
3
|
+
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
4
|
+
import 'crypto';
|
|
5
|
+
import { diff } from '../../../../../utils/json.mjs';
|
|
6
|
+
import 'events';
|
|
7
|
+
import { createEntityQuery } from '../../../../queries/entity.mjs';
|
|
8
|
+
import { resolveComponentUID } from '../../../../../utils/components.mjs';
|
|
9
|
+
|
|
10
|
+
const createEntitiesWriteStream = (options)=>{
|
|
11
|
+
const { strapi, updateMappingTable, transaction } = options;
|
|
12
|
+
const query = createEntityQuery(strapi);
|
|
13
|
+
return new Writable({
|
|
14
|
+
objectMode: true,
|
|
15
|
+
async write (entity, _encoding, callback) {
|
|
16
|
+
await transaction?.attach(async ()=>{
|
|
17
|
+
const { type, id, data } = entity;
|
|
18
|
+
const { create, getDeepPopulateComponentLikeQuery } = query(type);
|
|
19
|
+
const contentType = strapi.getModel(type);
|
|
20
|
+
try {
|
|
21
|
+
const created = await create({
|
|
22
|
+
data,
|
|
23
|
+
populate: getDeepPopulateComponentLikeQuery(contentType, {
|
|
24
|
+
select: 'id'
|
|
25
|
+
}),
|
|
26
|
+
select: 'id'
|
|
27
|
+
});
|
|
28
|
+
// Compute differences between original & new entities
|
|
29
|
+
const diffs = diff(data, created);
|
|
30
|
+
updateMappingTable(type, id, created.id);
|
|
31
|
+
// For each difference found on an ID attribute,
|
|
32
|
+
// update the mapping the table accordingly
|
|
33
|
+
diffs.forEach((diff)=>{
|
|
34
|
+
if (diff.kind === 'modified' && last(diff.path) === 'id' && 'kind' in contentType) {
|
|
35
|
+
const target = resolveComponentUID({
|
|
36
|
+
paths: diff.path,
|
|
37
|
+
data,
|
|
38
|
+
contentType,
|
|
39
|
+
strapi
|
|
40
|
+
});
|
|
41
|
+
// If no type is found for the given path, then ignore the diff
|
|
42
|
+
if (!target) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const [oldID, newID] = diff.values;
|
|
46
|
+
updateMappingTable(target, oldID, newID);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
} catch (e) {
|
|
50
|
+
if (e instanceof Error) {
|
|
51
|
+
return callback(e);
|
|
52
|
+
}
|
|
53
|
+
return callback(new ProviderTransferError(`Failed to create "${type}" (${id})`));
|
|
54
|
+
}
|
|
55
|
+
return callback(null);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { createEntitiesWriteStream };
|
|
62
|
+
//# sourceMappingURL=entities.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/entities.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core, UID } from '@strapi/types';\n\nimport { last } from 'lodash/fp';\n\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport type { IEntity, Transaction } from '../../../../../../types';\nimport { json } from '../../../../../utils';\nimport * as queries from '../../../../queries';\nimport { resolveComponentUID } from '../../../../../utils/components';\n\ninterface IEntitiesRestoreStreamOptions {\n strapi: Core.Strapi;\n updateMappingTable<TSchemaUID extends UID.Schema>(\n type: TSchemaUID,\n oldID: number,\n newID: number\n ): void;\n transaction?: Transaction;\n}\n\nexport const createEntitiesWriteStream = (options: IEntitiesRestoreStreamOptions) => {\n const { strapi, updateMappingTable, transaction } = options;\n const query = queries.entity.createEntityQuery(strapi);\n\n return new Writable({\n objectMode: true,\n\n async write(entity: IEntity, _encoding, callback) {\n await transaction?.attach(async () => {\n const { type, id, data } = entity;\n const { create, getDeepPopulateComponentLikeQuery } = query(type);\n const contentType = strapi.getModel(type);\n\n try {\n const created = await create({\n data,\n populate: getDeepPopulateComponentLikeQuery(contentType, { select: 'id' }),\n select: 'id',\n });\n\n // Compute differences between original & new entities\n const diffs = json.diff(data, created);\n\n updateMappingTable(type, id, created.id);\n\n // For each difference found on an ID attribute,\n // update the mapping the table accordingly\n diffs.forEach((diff) => {\n if (diff.kind === 'modified' && last(diff.path) === 'id' && 'kind' in contentType) {\n const target = resolveComponentUID({ paths: diff.path, data, contentType, strapi });\n\n // If no type is found for the given path, then ignore the diff\n if (!target) {\n return;\n }\n\n const [oldID, newID] = diff.values as [number, number];\n\n updateMappingTable(target, oldID, newID);\n }\n });\n } catch (e) {\n if (e instanceof Error) {\n return callback(e);\n }\n\n return callback(new ProviderTransferError(`Failed to create \"${type}\" (${id})`));\n }\n\n return callback(null);\n });\n },\n });\n};\n"],"names":["createEntitiesWriteStream","options","strapi","updateMappingTable","transaction","query","queries","Writable","objectMode","write","entity","_encoding","callback","attach","type","id","data","create","getDeepPopulateComponentLikeQuery","contentType","getModel","created","populate","select","diffs","json","forEach","diff","kind","last","path","target","resolveComponentUID","paths","oldID","newID","values","e","Error","ProviderTransferError"],"mappings":";;;;;;;;;AAqBO,MAAMA,4BAA4B,CAACC,OAAAA,GAAAA;AACxC,IAAA,MAAM,EAAEC,MAAM,EAAEC,kBAAkB,EAAEC,WAAW,EAAE,GAAGH,OAAAA;AACpD,IAAA,MAAMI,KAAQC,GAAAA,iBAAgC,CAACJ,MAAAA,CAAAA;AAE/C,IAAA,OAAO,IAAIK,QAAS,CAAA;QAClBC,UAAY,EAAA,IAAA;AAEZ,QAAA,MAAMC,KAAMC,CAAAA,CAAAA,MAAe,EAAEC,SAAS,EAAEC,QAAQ,EAAA;AAC9C,YAAA,MAAMR,aAAaS,MAAO,CAAA,UAAA;AACxB,gBAAA,MAAM,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGN,MAAAA;AAC3B,gBAAA,MAAM,EAAEO,MAAM,EAAEC,iCAAiC,EAAE,GAAGb,KAAMS,CAAAA,IAAAA,CAAAA;gBAC5D,MAAMK,WAAAA,GAAcjB,MAAOkB,CAAAA,QAAQ,CAACN,IAAAA,CAAAA;gBAEpC,IAAI;oBACF,MAAMO,OAAAA,GAAU,MAAMJ,MAAO,CAAA;AAC3BD,wBAAAA,IAAAA;AACAM,wBAAAA,QAAAA,EAAUJ,kCAAkCC,WAAa,EAAA;4BAAEI,MAAQ,EAAA;AAAK,yBAAA,CAAA;wBACxEA,MAAQ,EAAA;AACV,qBAAA,CAAA;;AAGA,oBAAA,MAAMC,KAAQC,GAAAA,IAAS,CAACT,IAAMK,EAAAA,OAAAA,CAAAA;oBAE9BlB,kBAAmBW,CAAAA,IAAAA,EAAMC,EAAIM,EAAAA,OAAAA,CAAQN,EAAE,CAAA;;;oBAIvCS,KAAME,CAAAA,OAAO,CAAC,CAACC,IAAAA,GAAAA;wBACb,IAAIA,IAAAA,CAAKC,IAAI,KAAK,UAAcC,IAAAA,IAAAA,CAAKF,KAAKG,IAAI,CAAA,KAAM,IAAQ,IAAA,MAAA,IAAUX,WAAa,EAAA;AACjF,4BAAA,MAAMY,SAASC,mBAAoB,CAAA;AAAEC,gCAAAA,KAAAA,EAAON,KAAKG,IAAI;AAAEd,gCAAAA,IAAAA;AAAMG,gCAAAA,WAAAA;AAAajB,gCAAAA;AAAO,6BAAA,CAAA;;AAGjF,4BAAA,IAAI,CAAC6B,MAAQ,EAAA;AACX,gCAAA;AACF;AAEA,4BAAA,MAAM,CAACG,KAAAA,EAAOC,KAAM,CAAA,GAAGR,KAAKS,MAAM;AAElCjC,4BAAAA,kBAAAA,CAAmB4B,QAAQG,KAAOC,EAAAA,KAAAA,CAAAA;AACpC;AACF,qBAAA,CAAA;AACF,iBAAA,CAAE,OAAOE,CAAG,EAAA;AACV,oBAAA,IAAIA,aAAaC,KAAO,EAAA;AACtB,wBAAA,OAAO1B,QAASyB,CAAAA,CAAAA,CAAAA;AAClB;oBAEA,OAAOzB,QAAAA,CAAS,IAAI2B,qBAAAA,CAAsB,CAAC,kBAAkB,EAAEzB,IAAAA,CAAK,GAAG,EAAEC,EAAG,CAAA,CAAC,CAAC,CAAA,CAAA;AAChF;AAEA,gBAAA,OAAOH,QAAS,CAAA,IAAA,CAAA;AAClB,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var providers = require('../../../../../errors/providers.js');
|
|
4
|
+
var entity = require('../../../../queries/entity.js');
|
|
5
|
+
require('lodash/fp');
|
|
6
|
+
require('stream');
|
|
7
|
+
require('crypto');
|
|
8
|
+
require('events');
|
|
9
|
+
require('lodash');
|
|
10
|
+
require('@strapi/utils');
|
|
11
|
+
var configuration = require('./configuration.js');
|
|
12
|
+
|
|
13
|
+
const deleteRecords = async (strapi, options)=>{
|
|
14
|
+
const entities = await deleteEntitiesRecords(strapi, options);
|
|
15
|
+
const configuration = await deleteConfigurationRecords(strapi, options);
|
|
16
|
+
return {
|
|
17
|
+
count: entities.count + configuration.count,
|
|
18
|
+
entities,
|
|
19
|
+
configuration
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const deleteEntitiesRecords = async (strapi, options = {})=>{
|
|
23
|
+
const { entities } = options;
|
|
24
|
+
const models = strapi.get('models').get();
|
|
25
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
26
|
+
const contentTypesToClear = contentTypes.filter((contentType)=>{
|
|
27
|
+
let removeThisContentType = true;
|
|
28
|
+
// include means "only include these types" so if it's not in here, it's not being included
|
|
29
|
+
if (entities?.include) {
|
|
30
|
+
removeThisContentType = entities.include.includes(contentType.uid);
|
|
31
|
+
}
|
|
32
|
+
// if something is excluded, remove it. But lack of being excluded doesn't mean it's kept
|
|
33
|
+
if (entities?.exclude && entities.exclude.includes(contentType.uid)) {
|
|
34
|
+
removeThisContentType = false;
|
|
35
|
+
}
|
|
36
|
+
if (entities?.filters) {
|
|
37
|
+
removeThisContentType = entities.filters.every((filter)=>filter(contentType));
|
|
38
|
+
}
|
|
39
|
+
return removeThisContentType;
|
|
40
|
+
}).map((contentType)=>contentType.uid);
|
|
41
|
+
const modelsToClear = models.filter((model)=>{
|
|
42
|
+
if (contentTypesToClear.includes(model.uid)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
let removeThisModel = true;
|
|
46
|
+
// include means "only include these types" so if it's not in here, it's not being included
|
|
47
|
+
if (entities?.include) {
|
|
48
|
+
removeThisModel = entities.include.includes(model.uid);
|
|
49
|
+
}
|
|
50
|
+
// if something is excluded, remove it. But lack of being excluded doesn't mean it's kept
|
|
51
|
+
if (entities?.exclude && entities.exclude.includes(model.uid)) {
|
|
52
|
+
removeThisModel = false;
|
|
53
|
+
}
|
|
54
|
+
return removeThisModel;
|
|
55
|
+
}).map((model)=>model.uid);
|
|
56
|
+
const [results, updateResults] = useResults([
|
|
57
|
+
...contentTypesToClear,
|
|
58
|
+
...modelsToClear
|
|
59
|
+
]);
|
|
60
|
+
const contentTypeQuery = entity.createEntityQuery(strapi);
|
|
61
|
+
const contentTypePromises = contentTypesToClear.map(async (uid)=>{
|
|
62
|
+
const result = await contentTypeQuery(uid).deleteMany(entities?.params);
|
|
63
|
+
if (result) {
|
|
64
|
+
updateResults(result.count || 0, uid);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const modelsPromises = modelsToClear.map(async (uid)=>{
|
|
68
|
+
const result = await strapi.db.query(uid).deleteMany({});
|
|
69
|
+
if (result) {
|
|
70
|
+
updateResults(result.count || 0, uid);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
await Promise.all([
|
|
74
|
+
...contentTypePromises,
|
|
75
|
+
...modelsPromises
|
|
76
|
+
]);
|
|
77
|
+
return results;
|
|
78
|
+
};
|
|
79
|
+
const deleteConfigurationRecords = async (strapi, options = {})=>{
|
|
80
|
+
const { coreStore = true, webhook = true } = options?.configuration ?? {};
|
|
81
|
+
const models = [];
|
|
82
|
+
if (coreStore) {
|
|
83
|
+
models.push('strapi::core-store');
|
|
84
|
+
}
|
|
85
|
+
if (webhook) {
|
|
86
|
+
models.push('strapi::webhook');
|
|
87
|
+
}
|
|
88
|
+
const [results, updateResults] = useResults(models);
|
|
89
|
+
const deletePromises = models.map(async (uid)=>{
|
|
90
|
+
const result = await strapi.db.query(uid).deleteMany({});
|
|
91
|
+
if (result) {
|
|
92
|
+
updateResults(result.count, uid);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
await Promise.all(deletePromises);
|
|
96
|
+
return results;
|
|
97
|
+
};
|
|
98
|
+
const useResults = (keys)=>{
|
|
99
|
+
const results = {
|
|
100
|
+
count: 0,
|
|
101
|
+
aggregate: keys.reduce((acc, key)=>({
|
|
102
|
+
...acc,
|
|
103
|
+
[key]: {
|
|
104
|
+
count: 0
|
|
105
|
+
}
|
|
106
|
+
}), {})
|
|
107
|
+
};
|
|
108
|
+
const update = (count, key)=>{
|
|
109
|
+
if (key) {
|
|
110
|
+
if (!(key in results.aggregate)) {
|
|
111
|
+
throw new providers.ProviderTransferError(`Unknown key "${key}" provided in results update`);
|
|
112
|
+
}
|
|
113
|
+
results.aggregate[key].count += count;
|
|
114
|
+
}
|
|
115
|
+
results.count += count;
|
|
116
|
+
};
|
|
117
|
+
return [
|
|
118
|
+
results,
|
|
119
|
+
update
|
|
120
|
+
];
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
exports.createConfigurationWriteStream = configuration.createConfigurationWriteStream;
|
|
124
|
+
exports.restoreConfigs = configuration.restoreConfigs;
|
|
125
|
+
exports.deleteRecords = deleteRecords;
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
2
|
+
import { createEntityQuery } from '../../../../queries/entity.mjs';
|
|
3
|
+
import 'lodash/fp';
|
|
4
|
+
import 'stream';
|
|
5
|
+
import 'crypto';
|
|
6
|
+
import 'events';
|
|
7
|
+
import 'lodash';
|
|
8
|
+
import '@strapi/utils';
|
|
9
|
+
export { createConfigurationWriteStream, restoreConfigs } from './configuration.mjs';
|
|
10
|
+
|
|
11
|
+
const deleteRecords = async (strapi, options)=>{
|
|
12
|
+
const entities = await deleteEntitiesRecords(strapi, options);
|
|
13
|
+
const configuration = await deleteConfigurationRecords(strapi, options);
|
|
14
|
+
return {
|
|
15
|
+
count: entities.count + configuration.count,
|
|
16
|
+
entities,
|
|
17
|
+
configuration
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const deleteEntitiesRecords = async (strapi, options = {})=>{
|
|
21
|
+
const { entities } = options;
|
|
22
|
+
const models = strapi.get('models').get();
|
|
23
|
+
const contentTypes = Object.values(strapi.contentTypes);
|
|
24
|
+
const contentTypesToClear = contentTypes.filter((contentType)=>{
|
|
25
|
+
let removeThisContentType = true;
|
|
26
|
+
// include means "only include these types" so if it's not in here, it's not being included
|
|
27
|
+
if (entities?.include) {
|
|
28
|
+
removeThisContentType = entities.include.includes(contentType.uid);
|
|
29
|
+
}
|
|
30
|
+
// if something is excluded, remove it. But lack of being excluded doesn't mean it's kept
|
|
31
|
+
if (entities?.exclude && entities.exclude.includes(contentType.uid)) {
|
|
32
|
+
removeThisContentType = false;
|
|
33
|
+
}
|
|
34
|
+
if (entities?.filters) {
|
|
35
|
+
removeThisContentType = entities.filters.every((filter)=>filter(contentType));
|
|
36
|
+
}
|
|
37
|
+
return removeThisContentType;
|
|
38
|
+
}).map((contentType)=>contentType.uid);
|
|
39
|
+
const modelsToClear = models.filter((model)=>{
|
|
40
|
+
if (contentTypesToClear.includes(model.uid)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
let removeThisModel = true;
|
|
44
|
+
// include means "only include these types" so if it's not in here, it's not being included
|
|
45
|
+
if (entities?.include) {
|
|
46
|
+
removeThisModel = entities.include.includes(model.uid);
|
|
47
|
+
}
|
|
48
|
+
// if something is excluded, remove it. But lack of being excluded doesn't mean it's kept
|
|
49
|
+
if (entities?.exclude && entities.exclude.includes(model.uid)) {
|
|
50
|
+
removeThisModel = false;
|
|
51
|
+
}
|
|
52
|
+
return removeThisModel;
|
|
53
|
+
}).map((model)=>model.uid);
|
|
54
|
+
const [results, updateResults] = useResults([
|
|
55
|
+
...contentTypesToClear,
|
|
56
|
+
...modelsToClear
|
|
57
|
+
]);
|
|
58
|
+
const contentTypeQuery = createEntityQuery(strapi);
|
|
59
|
+
const contentTypePromises = contentTypesToClear.map(async (uid)=>{
|
|
60
|
+
const result = await contentTypeQuery(uid).deleteMany(entities?.params);
|
|
61
|
+
if (result) {
|
|
62
|
+
updateResults(result.count || 0, uid);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
const modelsPromises = modelsToClear.map(async (uid)=>{
|
|
66
|
+
const result = await strapi.db.query(uid).deleteMany({});
|
|
67
|
+
if (result) {
|
|
68
|
+
updateResults(result.count || 0, uid);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
await Promise.all([
|
|
72
|
+
...contentTypePromises,
|
|
73
|
+
...modelsPromises
|
|
74
|
+
]);
|
|
75
|
+
return results;
|
|
76
|
+
};
|
|
77
|
+
const deleteConfigurationRecords = async (strapi, options = {})=>{
|
|
78
|
+
const { coreStore = true, webhook = true } = options?.configuration ?? {};
|
|
79
|
+
const models = [];
|
|
80
|
+
if (coreStore) {
|
|
81
|
+
models.push('strapi::core-store');
|
|
82
|
+
}
|
|
83
|
+
if (webhook) {
|
|
84
|
+
models.push('strapi::webhook');
|
|
85
|
+
}
|
|
86
|
+
const [results, updateResults] = useResults(models);
|
|
87
|
+
const deletePromises = models.map(async (uid)=>{
|
|
88
|
+
const result = await strapi.db.query(uid).deleteMany({});
|
|
89
|
+
if (result) {
|
|
90
|
+
updateResults(result.count, uid);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
await Promise.all(deletePromises);
|
|
94
|
+
return results;
|
|
95
|
+
};
|
|
96
|
+
const useResults = (keys)=>{
|
|
97
|
+
const results = {
|
|
98
|
+
count: 0,
|
|
99
|
+
aggregate: keys.reduce((acc, key)=>({
|
|
100
|
+
...acc,
|
|
101
|
+
[key]: {
|
|
102
|
+
count: 0
|
|
103
|
+
}
|
|
104
|
+
}), {})
|
|
105
|
+
};
|
|
106
|
+
const update = (count, key)=>{
|
|
107
|
+
if (key) {
|
|
108
|
+
if (!(key in results.aggregate)) {
|
|
109
|
+
throw new ProviderTransferError(`Unknown key "${key}" provided in results update`);
|
|
110
|
+
}
|
|
111
|
+
results.aggregate[key].count += count;
|
|
112
|
+
}
|
|
113
|
+
results.count += count;
|
|
114
|
+
};
|
|
115
|
+
return [
|
|
116
|
+
results,
|
|
117
|
+
update
|
|
118
|
+
];
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export { deleteRecords };
|
|
122
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType = entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stream = require('stream');
|
|
4
|
+
var providers = require('../../../../../errors/providers.js');
|
|
5
|
+
var link = require('../../../../queries/link.js');
|
|
6
|
+
|
|
7
|
+
const isErrorWithCode = (error)=>{
|
|
8
|
+
return error && typeof error.code === 'string';
|
|
9
|
+
};
|
|
10
|
+
const isForeignKeyConstraintError = (e)=>{
|
|
11
|
+
const MYSQL_FK_ERROR_CODES = [
|
|
12
|
+
'1452',
|
|
13
|
+
'1557',
|
|
14
|
+
'1216',
|
|
15
|
+
'1217',
|
|
16
|
+
'1451'
|
|
17
|
+
];
|
|
18
|
+
const POSTGRES_FK_ERROR_CODE = '23503';
|
|
19
|
+
const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';
|
|
20
|
+
if (isErrorWithCode(e) && e.code) {
|
|
21
|
+
return [
|
|
22
|
+
SQLITE_FK_ERROR_CODE,
|
|
23
|
+
POSTGRES_FK_ERROR_CODE,
|
|
24
|
+
...MYSQL_FK_ERROR_CODES
|
|
25
|
+
].includes(e.code);
|
|
26
|
+
}
|
|
27
|
+
return e.message.toLowerCase().includes('foreign key constraint');
|
|
28
|
+
};
|
|
29
|
+
const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
|
|
30
|
+
return new stream.Writable({
|
|
31
|
+
objectMode: true,
|
|
32
|
+
async write (link$1, _encoding, callback) {
|
|
33
|
+
await transaction?.attach(async (trx)=>{
|
|
34
|
+
const { left, right } = link$1;
|
|
35
|
+
const query = link.createLinkQuery(strapi, trx);
|
|
36
|
+
const originalLeftRef = left.ref;
|
|
37
|
+
const originalRightRef = right.ref;
|
|
38
|
+
// Map IDs if needed
|
|
39
|
+
left.ref = mapID(left.type, originalLeftRef) ?? originalLeftRef;
|
|
40
|
+
right.ref = mapID(right.type, originalRightRef) ?? originalRightRef;
|
|
41
|
+
try {
|
|
42
|
+
await query().insert(link$1);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
if (e instanceof Error) {
|
|
45
|
+
if (isForeignKeyConstraintError(e)) {
|
|
46
|
+
onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
|
|
47
|
+
return callback(null);
|
|
48
|
+
}
|
|
49
|
+
return callback(e);
|
|
50
|
+
}
|
|
51
|
+
return callback(new providers.ProviderTransferError(`An error happened while trying to import a ${left.type} link.`));
|
|
52
|
+
}
|
|
53
|
+
callback(null);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
exports.createLinksWriteStream = createLinksWriteStream;
|
|
60
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../../types';\nimport { createLinkQuery } from '../../../../queries/link';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n // Map IDs if needed\n left.ref = mapID(left.type, originalLeftRef) ?? originalLeftRef;\n right.ref = mapID(right.type, originalRightRef) ?? originalRightRef;\n\n try {\n await query().insert(link);\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e)) {\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","createLinksWriteStream","mapID","strapi","transaction","onWarning","Writable","objectMode","write","link","_encoding","callback","attach","trx","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","type","insert","Error","ProviderTransferError"],"mappings":";;;;;;AAUA,MAAMA,kBAAkB,CAACC,KAAAA,GAAAA;AACvB,IAAA,OAAOA,KAAS,IAAA,OAAOA,KAAMC,CAAAA,IAAI,KAAK,QAAA;AACxC,CAAA;AAEA,MAAMC,8BAA8B,CAACC,CAAAA,GAAAA;AACnC,IAAA,MAAMC,oBAAuB,GAAA;AAAC,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA;AAAO,KAAA;AACrE,IAAA,MAAMC,sBAAyB,GAAA,OAAA;AAC/B,IAAA,MAAMC,oBAAuB,GAAA,8BAAA;AAE7B,IAAA,IAAIP,eAAgBI,CAAAA,CAAAA,CAAAA,IAAMA,CAAEF,CAAAA,IAAI,EAAE;QAChC,OAAO;AAACK,YAAAA,oBAAAA;AAAsBD,YAAAA,sBAAAA;AAA2BD,YAAAA,GAAAA;SAAqB,CAACG,QAAQ,CAACJ,CAAAA,CAAEF,IAAI,CAAA;AAChG;AAEA,IAAA,OAAOE,EAAEK,OAAO,CAACC,WAAW,EAAA,CAAGF,QAAQ,CAAC,wBAAA,CAAA;AAC1C,CAAA;AAEaG,MAAAA,sBAAAA,GAAyB,CACpCC,KAAAA,EACAC,QACAC,WACAC,EAAAA,SAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,eAAS,CAAA;QAClBC,UAAY,EAAA,IAAA;AACZ,QAAA,MAAMC,KAAMC,CAAAA,CAAAA,MAAW,EAAEC,SAAS,EAAEC,QAAQ,EAAA;YAC1C,MAAMP,WAAAA,EAAaQ,OAAO,OAAOC,GAAAA,GAAAA;AAC/B,gBAAA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGN,MAAAA;gBACxB,MAAMO,KAAAA,GAAQC,qBAAgBd,MAAQU,EAAAA,GAAAA,CAAAA;gBAEtC,MAAMK,eAAAA,GAAkBJ,KAAKK,GAAG;gBAChC,MAAMC,gBAAAA,GAAmBL,MAAMI,GAAG;;AAGlCL,gBAAAA,IAAAA,CAAKK,GAAG,GAAGjB,KAAAA,CAAMY,IAAKO,CAAAA,IAAI,EAAEH,eAAoBA,CAAAA,IAAAA,eAAAA;AAChDH,gBAAAA,KAAAA,CAAMI,GAAG,GAAGjB,KAAAA,CAAMa,KAAMM,CAAAA,IAAI,EAAED,gBAAqBA,CAAAA,IAAAA,gBAAAA;gBAEnD,IAAI;oBACF,MAAMJ,KAAAA,EAAAA,CAAQM,MAAM,CAACb,MAAAA,CAAAA;AACvB,iBAAA,CAAE,OAAOf,CAAG,EAAA;AACV,oBAAA,IAAIA,aAAa6B,KAAO,EAAA;AACtB,wBAAA,IAAI9B,4BAA4BC,CAAI,CAAA,EAAA;AAClCW,4BAAAA,SAAAA,GACE,CAAC,cAAc,EAAES,KAAKO,IAAI,CAAC,CAAC,EAAEH,eAAAA,CAAgB,IAAI,EAAEH,MAAMM,IAAI,CAAC,CAAC,EAAED,gBAAAA,CAAiB,iCAAiC,CAAC,CAAA;AAEvH,4BAAA,OAAOT,QAAS,CAAA,IAAA,CAAA;AAClB;AACA,wBAAA,OAAOA,QAASjB,CAAAA,CAAAA,CAAAA;AAClB;oBAEA,OAAOiB,QAAAA,CACL,IAAIa,+BAAAA,CACF,CAAC,2CAA2C,EAAEV,IAAKO,CAAAA,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA;AAGrE;gBAEAV,QAAS,CAAA,IAAA,CAAA;AACX,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Writable } from 'stream';
|
|
2
|
+
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
3
|
+
import { createLinkQuery } from '../../../../queries/link.mjs';
|
|
4
|
+
|
|
5
|
+
const isErrorWithCode = (error)=>{
|
|
6
|
+
return error && typeof error.code === 'string';
|
|
7
|
+
};
|
|
8
|
+
const isForeignKeyConstraintError = (e)=>{
|
|
9
|
+
const MYSQL_FK_ERROR_CODES = [
|
|
10
|
+
'1452',
|
|
11
|
+
'1557',
|
|
12
|
+
'1216',
|
|
13
|
+
'1217',
|
|
14
|
+
'1451'
|
|
15
|
+
];
|
|
16
|
+
const POSTGRES_FK_ERROR_CODE = '23503';
|
|
17
|
+
const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';
|
|
18
|
+
if (isErrorWithCode(e) && e.code) {
|
|
19
|
+
return [
|
|
20
|
+
SQLITE_FK_ERROR_CODE,
|
|
21
|
+
POSTGRES_FK_ERROR_CODE,
|
|
22
|
+
...MYSQL_FK_ERROR_CODES
|
|
23
|
+
].includes(e.code);
|
|
24
|
+
}
|
|
25
|
+
return e.message.toLowerCase().includes('foreign key constraint');
|
|
26
|
+
};
|
|
27
|
+
const createLinksWriteStream = (mapID, strapi, transaction, onWarning)=>{
|
|
28
|
+
return new Writable({
|
|
29
|
+
objectMode: true,
|
|
30
|
+
async write (link, _encoding, callback) {
|
|
31
|
+
await transaction?.attach(async (trx)=>{
|
|
32
|
+
const { left, right } = link;
|
|
33
|
+
const query = createLinkQuery(strapi, trx);
|
|
34
|
+
const originalLeftRef = left.ref;
|
|
35
|
+
const originalRightRef = right.ref;
|
|
36
|
+
// Map IDs if needed
|
|
37
|
+
left.ref = mapID(left.type, originalLeftRef) ?? originalLeftRef;
|
|
38
|
+
right.ref = mapID(right.type, originalRightRef) ?? originalRightRef;
|
|
39
|
+
try {
|
|
40
|
+
await query().insert(link);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
if (e instanceof Error) {
|
|
43
|
+
if (isForeignKeyConstraintError(e)) {
|
|
44
|
+
onWarning?.(`Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`);
|
|
45
|
+
return callback(null);
|
|
46
|
+
}
|
|
47
|
+
return callback(e);
|
|
48
|
+
}
|
|
49
|
+
return callback(new ProviderTransferError(`An error happened while trying to import a ${left.type} link.`));
|
|
50
|
+
}
|
|
51
|
+
callback(null);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export { createLinksWriteStream };
|
|
58
|
+
//# sourceMappingURL=links.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../../types';\nimport { createLinkQuery } from '../../../../queries/link';\n\ninterface ErrorWithCode extends Error {\n code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n const POSTGRES_FK_ERROR_CODE = '23503';\n const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n if (isErrorWithCode(e) && e.code) {\n return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n }\n\n return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nexport const createLinksWriteStream = (\n mapID: (uid: string, id: number) => number | undefined,\n strapi: Core.Strapi,\n transaction?: Transaction,\n onWarning?: (message: string) => void\n) => {\n return new Writable({\n objectMode: true,\n async write(link: ILink, _encoding, callback) {\n await transaction?.attach(async (trx) => {\n const { left, right } = link;\n const query = createLinkQuery(strapi, trx);\n\n const originalLeftRef = left.ref;\n const originalRightRef = right.ref;\n\n // Map IDs if needed\n left.ref = mapID(left.type, originalLeftRef) ?? originalLeftRef;\n right.ref = mapID(right.type, originalRightRef) ?? originalRightRef;\n\n try {\n await query().insert(link);\n } catch (e) {\n if (e instanceof Error) {\n if (isForeignKeyConstraintError(e)) {\n onWarning?.(\n `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n );\n return callback(null);\n }\n return callback(e);\n }\n\n return callback(\n new ProviderTransferError(\n `An error happened while trying to import a ${left.type} link.`\n )\n );\n }\n\n callback(null);\n });\n },\n });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","createLinksWriteStream","mapID","strapi","transaction","onWarning","Writable","objectMode","write","link","_encoding","callback","attach","trx","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","type","insert","Error","ProviderTransferError"],"mappings":";;;;AAUA,MAAMA,kBAAkB,CAACC,KAAAA,GAAAA;AACvB,IAAA,OAAOA,KAAS,IAAA,OAAOA,KAAMC,CAAAA,IAAI,KAAK,QAAA;AACxC,CAAA;AAEA,MAAMC,8BAA8B,CAACC,CAAAA,GAAAA;AACnC,IAAA,MAAMC,oBAAuB,GAAA;AAAC,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA,MAAA;AAAQ,QAAA;AAAO,KAAA;AACrE,IAAA,MAAMC,sBAAyB,GAAA,OAAA;AAC/B,IAAA,MAAMC,oBAAuB,GAAA,8BAAA;AAE7B,IAAA,IAAIP,eAAgBI,CAAAA,CAAAA,CAAAA,IAAMA,CAAEF,CAAAA,IAAI,EAAE;QAChC,OAAO;AAACK,YAAAA,oBAAAA;AAAsBD,YAAAA,sBAAAA;AAA2BD,YAAAA,GAAAA;SAAqB,CAACG,QAAQ,CAACJ,CAAAA,CAAEF,IAAI,CAAA;AAChG;AAEA,IAAA,OAAOE,EAAEK,OAAO,CAACC,WAAW,EAAA,CAAGF,QAAQ,CAAC,wBAAA,CAAA;AAC1C,CAAA;AAEaG,MAAAA,sBAAAA,GAAyB,CACpCC,KAAAA,EACAC,QACAC,WACAC,EAAAA,SAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,QAAS,CAAA;QAClBC,UAAY,EAAA,IAAA;AACZ,QAAA,MAAMC,KAAMC,CAAAA,CAAAA,IAAW,EAAEC,SAAS,EAAEC,QAAQ,EAAA;YAC1C,MAAMP,WAAAA,EAAaQ,OAAO,OAAOC,GAAAA,GAAAA;AAC/B,gBAAA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGN,IAAAA;gBACxB,MAAMO,KAAAA,GAAQC,gBAAgBd,MAAQU,EAAAA,GAAAA,CAAAA;gBAEtC,MAAMK,eAAAA,GAAkBJ,KAAKK,GAAG;gBAChC,MAAMC,gBAAAA,GAAmBL,MAAMI,GAAG;;AAGlCL,gBAAAA,IAAAA,CAAKK,GAAG,GAAGjB,KAAAA,CAAMY,IAAKO,CAAAA,IAAI,EAAEH,eAAoBA,CAAAA,IAAAA,eAAAA;AAChDH,gBAAAA,KAAAA,CAAMI,GAAG,GAAGjB,KAAAA,CAAMa,KAAMM,CAAAA,IAAI,EAAED,gBAAqBA,CAAAA,IAAAA,gBAAAA;gBAEnD,IAAI;oBACF,MAAMJ,KAAAA,EAAAA,CAAQM,MAAM,CAACb,IAAAA,CAAAA;AACvB,iBAAA,CAAE,OAAOf,CAAG,EAAA;AACV,oBAAA,IAAIA,aAAa6B,KAAO,EAAA;AACtB,wBAAA,IAAI9B,4BAA4BC,CAAI,CAAA,EAAA;AAClCW,4BAAAA,SAAAA,GACE,CAAC,cAAc,EAAES,KAAKO,IAAI,CAAC,CAAC,EAAEH,eAAAA,CAAgB,IAAI,EAAEH,MAAMM,IAAI,CAAC,CAAC,EAAED,gBAAAA,CAAiB,iCAAiC,CAAC,CAAA;AAEvH,4BAAA,OAAOT,QAAS,CAAA,IAAA,CAAA;AAClB;AACA,wBAAA,OAAOA,QAASjB,CAAAA,CAAAA,CAAAA;AAClB;oBAEA,OAAOiB,QAAAA,CACL,IAAIa,qBAAAA,CACF,CAAC,2CAA2C,EAAEV,IAAKO,CAAAA,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA;AAGrE;gBAEAV,QAAS,CAAA,IAAA,CAAA;AACX,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;;;;"}
|