@strapi/data-transfer 5.52.3 → 5.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/strapi/index.d.ts +1 -0
  2. package/dist/strapi/index.d.ts.map +1 -1
  3. package/dist/strapi/index.js +9 -0
  4. package/dist/strapi/index.js.map +1 -1
  5. package/dist/strapi/index.mjs +1 -0
  6. package/dist/strapi/index.mjs.map +1 -1
  7. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +2 -2
  8. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -1
  9. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +2 -2
  10. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -1
  11. package/dist/strapi/providers/local-destination/strategies/restore/index.d.ts.map +1 -1
  12. package/dist/strapi/providers/local-destination/strategies/restore/index.js +1 -1
  13. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
  14. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +1 -1
  15. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
  16. package/dist/strapi/remote/handlers/push.d.ts +14 -0
  17. package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
  18. package/dist/strapi/remote/handlers/push.js +104 -9
  19. package/dist/strapi/remote/handlers/push.js.map +1 -1
  20. package/dist/strapi/remote/handlers/push.mjs +103 -10
  21. package/dist/strapi/remote/handlers/push.mjs.map +1 -1
  22. package/dist/strapi/transfer-policy.d.ts +12 -0
  23. package/dist/strapi/transfer-policy.d.ts.map +1 -0
  24. package/dist/strapi/transfer-policy.js +163 -0
  25. package/dist/strapi/transfer-policy.js.map +1 -0
  26. package/dist/strapi/transfer-policy.mjs +154 -0
  27. package/dist/strapi/transfer-policy.mjs.map +1 -0
  28. package/package.json +6 -6
@@ -1,4 +1,5 @@
1
1
  export * as providers from './providers';
2
2
  export * as queries from './queries';
3
3
  export * as remote from './remote';
4
+ export * from './transfer-policy';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strapi/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strapi/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
@@ -3,10 +3,19 @@
3
3
  var index = require('./providers/index.js');
4
4
  var index$1 = require('./queries/index.js');
5
5
  var index$2 = require('./remote/index.js');
6
+ var transferPolicy = require('./transfer-policy.js');
6
7
 
7
8
 
8
9
 
9
10
  exports.providers = index;
10
11
  exports.queries = index$1;
11
12
  exports.remote = index$2;
13
+ exports.OFFICIAL_TRANSFER_IGNORED_TYPES = transferPolicy.OFFICIAL_TRANSFER_IGNORED_TYPES;
14
+ exports.assertRemoteEntityAllowed = transferPolicy.assertRemoteEntityAllowed;
15
+ exports.assertRemoteLinkAllowed = transferPolicy.assertRemoteLinkAllowed;
16
+ exports.getIgnoredOfficialTransferTypes = transferPolicy.getIgnoredOfficialTransferTypes;
17
+ exports.getProtectedTransferUIDs = transferPolicy.getProtectedTransferUIDs;
18
+ exports.isIgnoredOfficialTransferType = transferPolicy.isIgnoredOfficialTransferType;
19
+ exports.isProtectedRemotePushType = transferPolicy.isProtectedRemotePushType;
20
+ exports.normalizeRemoteRestoreOptions = transferPolicy.normalizeRemoteRestoreOptions;
12
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -4,4 +4,5 @@ import * as index$1 from './queries/index.mjs';
4
4
  export { index$1 as queries };
5
5
  import * as index$2 from './remote/index.mjs';
6
6
  export { index$2 as remote };
7
+ export { OFFICIAL_TRANSFER_IGNORED_TYPES, assertRemoteEntityAllowed, assertRemoteLinkAllowed, getIgnoredOfficialTransferTypes, getProtectedTransferUIDs, isIgnoredOfficialTransferType, isProtectedRemotePushType, normalizeRemoteRestoreOptions } from './transfer-policy.mjs';
7
8
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -44,8 +44,8 @@ const createConfigurationWriteStream = async (strapi, transaction)=>{
44
44
  await transaction?.attach(async ()=>{
45
45
  try {
46
46
  await restoreConfigs(strapi, config);
47
- } catch {
48
- return callback(new providers.ProviderTransferError(`Failed to import ${chalk__default.default.yellowBright(config.type)} (${chalk__default.default.greenBright(config.value.id)}`));
47
+ } catch (error) {
48
+ return callback(new providers.ProviderTransferError(`Failed to import ${chalk__default.default.yellowBright(config.type)} (${chalk__default.default.greenBright(config.value.id)}): ${error instanceof Error ? error.message : String(error)}`));
49
49
  }
50
50
  callback();
51
51
  });
@@ -1 +1 @@
1
- {"version":3,"file":"configuration.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash/fp';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","omit","restoreCoreStore","strapi","values","data","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","ProviderTransferError","chalk","yellowBright","greenBright","id"],"mappings":";;;;;;;;;;;;AAQA,MAAMA,gCAAgCC,OAAAA,CAAK;AAAC,IAAA;AAAK,CAAA,CAAA;AAEjD,MAAMC,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;IAC3C,MAAME,GAAAA,GAAM,MAAMC,8CAAAA,CAChBJ,MAAAA,EACAE,IAAAA,CAAAA;AAGF,IAAA,OAAOF,OAAOK,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDL,IAAAA,EAAM;AACJ,YAAA,GAAGC,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCX,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOK,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAEL,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMU,cAAAA,GAAiB,OAAOZ,MAAAA,EAAqBa,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOf,gBAAAA,CAAiBC,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBX,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cf,MAAAA,EACAgB,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,eAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeZ,MAAAA,EAAQa,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAM;oBACN,OAAOQ,QAAAA,CACL,IAAIE,+BAAAA,CACF,CAAC,iBAAiB,EAAEC,sBAAAA,CAAMC,YAAY,CAACZ,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEU,sBAAAA,CAAME,WAAW,CACvEb,MAAAA,CAAOL,KAAK,CAACmB,EAAE,CAAA,CAAA,CACd,CAAA,CAAA;AAGT,gBAAA;AACAN,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;;"}
1
+ {"version":3,"file":"configuration.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash/fp';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch (error) {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}): ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","omit","restoreCoreStore","strapi","values","data","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","error","ProviderTransferError","chalk","yellowBright","greenBright","id","Error","message","String"],"mappings":";;;;;;;;;;;;AAQA,MAAMA,gCAAgCC,OAAAA,CAAK;AAAC,IAAA;AAAK,CAAA,CAAA;AAEjD,MAAMC,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;IAC3C,MAAME,GAAAA,GAAM,MAAMC,8CAAAA,CAChBJ,MAAAA,EACAE,IAAAA,CAAAA;AAGF,IAAA,OAAOF,OAAOK,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDL,IAAAA,EAAM;AACJ,YAAA,GAAGC,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCX,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOK,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAEL,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMU,cAAAA,GAAiB,OAAOZ,MAAAA,EAAqBa,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOf,gBAAAA,CAAiBC,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBX,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cf,MAAAA,EACAgB,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,eAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeZ,MAAAA,EAAQa,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOU,KAAAA,EAAO;AACd,oBAAA,OAAOF,QAAAA,CACL,IAAIG,+BAAAA,CACF,CAAC,iBAAiB,EAAEC,sBAAAA,CAAMC,YAAY,CAACb,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEW,sBAAAA,CAAME,WAAW,CACvEd,MAAAA,CAAOL,KAAK,CAACoB,EAAE,CAAA,CACf,GAAG,EAAEL,KAAAA,YAAiBM,KAAAA,GAAQN,KAAAA,CAAMO,OAAO,GAAGC,OAAOR,KAAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA;AAGrE,gBAAA;AACAF,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;;"}
@@ -38,8 +38,8 @@ const createConfigurationWriteStream = async (strapi, transaction)=>{
38
38
  await transaction?.attach(async ()=>{
39
39
  try {
40
40
  await restoreConfigs(strapi, config);
41
- } catch {
42
- return callback(new ProviderTransferError(`Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(config.value.id)}`));
41
+ } catch (error) {
42
+ return callback(new ProviderTransferError(`Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(config.value.id)}): ${error instanceof Error ? error.message : String(error)}`));
43
43
  }
44
44
  callback();
45
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"configuration.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash/fp';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","omit","restoreCoreStore","strapi","values","data","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","ProviderTransferError","chalk","yellowBright","greenBright","id"],"mappings":";;;;;;AAQA,MAAMA,gCAAgCC,IAAAA,CAAK;AAAC,IAAA;AAAK,CAAA,CAAA;AAEjD,MAAMC,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;IAC3C,MAAME,GAAAA,GAAM,MAAMC,yBAAAA,CAChBJ,MAAAA,EACAE,IAAAA,CAAAA;AAGF,IAAA,OAAOF,OAAOK,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDL,IAAAA,EAAM;AACJ,YAAA,GAAGC,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCX,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOK,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAEL,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMU,cAAAA,GAAiB,OAAOZ,MAAAA,EAAqBa,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOf,gBAAAA,CAAiBC,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBX,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cf,MAAAA,EACAgB,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,QAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeZ,MAAAA,EAAQa,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAM;oBACN,OAAOQ,QAAAA,CACL,IAAIE,qBAAAA,CACF,CAAC,iBAAiB,EAAEC,KAAAA,CAAMC,YAAY,CAACZ,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEU,KAAAA,CAAME,WAAW,CACvEb,MAAAA,CAAOL,KAAK,CAACmB,EAAE,CAAA,CAAA,CACd,CAAA,CAAA;AAGT,gBAAA;AACAN,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"configuration.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash/fp';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch (error) {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}): ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","omit","restoreCoreStore","strapi","values","data","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","error","ProviderTransferError","chalk","yellowBright","greenBright","id","Error","message","String"],"mappings":";;;;;;AAQA,MAAMA,gCAAgCC,IAAAA,CAAK;AAAC,IAAA;AAAK,CAAA,CAAA;AAEjD,MAAMC,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;IAC3C,MAAME,GAAAA,GAAM,MAAMC,yBAAAA,CAChBJ,MAAAA,EACAE,IAAAA,CAAAA;AAGF,IAAA,OAAOF,OAAOK,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDL,IAAAA,EAAM;AACJ,YAAA,GAAGC,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCX,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMC,OAAOL,6BAAAA,CAA8BI,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOK,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAEL,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMU,cAAAA,GAAiB,OAAOZ,MAAAA,EAAqBa,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOf,gBAAAA,CAAiBC,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBX,MAAAA,EAAQa,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cf,MAAAA,EACAgB,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,QAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeZ,MAAAA,EAAQa,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOU,KAAAA,EAAO;AACd,oBAAA,OAAOF,QAAAA,CACL,IAAIG,qBAAAA,CACF,CAAC,iBAAiB,EAAEC,KAAAA,CAAMC,YAAY,CAACb,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEW,KAAAA,CAAME,WAAW,CACvEd,MAAAA,CAAOL,KAAK,CAACoB,EAAE,CAAA,CACf,GAAG,EAAEL,KAAAA,YAAiBM,KAAAA,GAAQN,KAAAA,CAAMO,OAAO,GAAGC,OAAOR,KAAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA;AAGrE,gBAAA;AACAF,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,iBAAiB,KAAK,OAAO,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;KACrC,CAAC;CACH;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACjD;AAED,eAAO,MAAM,aAAa,GAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,eAAe;;;;EAShF,CAAC;AAsIF,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,iBAAiB,KAAK,OAAO,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;KACrC,CAAC;CACH;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACjD;AAED,eAAO,MAAM,aAAa,GAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,eAAe;;;;EAShF,CAAC;AAuIF,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
@@ -33,7 +33,7 @@ const deleteEntitiesRecords = async (strapi, options = {})=>{
33
33
  removeThisContentType = false;
34
34
  }
35
35
  if (entities?.filters) {
36
- removeThisContentType = entities.filters.every((filter)=>filter(contentType));
36
+ removeThisContentType = removeThisContentType && entities.filters.every((filter)=>filter(contentType));
37
37
  }
38
38
  return removeThisContentType;
39
39
  }).map((contentType)=>contentType.uid);
@@ -1 +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":";;;;;;;;;;;AAwBO,MAAMA,aAAAA,GAAgB,OAAOC,MAAAA,EAAqBC,OAAAA,GAAAA;IACvD,MAAMC,QAAAA,GAAW,MAAMC,qBAAAA,CAAsBH,MAAAA,EAAQC,OAAAA,CAAAA;IACrD,MAAMG,aAAAA,GAAgB,MAAMC,0BAAAA,CAA2BL,MAAAA,EAAQC,OAAAA,CAAAA;IAE/D,OAAO;AACLK,QAAAA,KAAAA,EAAOJ,QAAAA,CAASI,KAAK,GAAGF,aAAAA,CAAcE,KAAK;AAC3CJ,QAAAA,QAAAA;AACAE,QAAAA;AACF,KAAA;AACF;AAEA,MAAMD,qBAAAA,GAAwB,OAC5BH,MAAAA,EACAC,OAAAA,GAA2B,EAAE,GAAA;IAE7B,MAAM,EAAEC,QAAQ,EAAE,GAAGD,OAAAA;AAErB,IAAA,MAAMM,MAAAA,GAASP,MAAAA,CAAOQ,GAAG,CAAC,UAAUA,GAAG,EAAA;AACvC,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,MAAM,CAACX,OAAOS,YAAY,CAAA;AAEtD,IAAA,MAAMG,mBAAAA,GAAsBH,YAAAA,CACzBI,MAAM,CAAC,CAACC,WAAAA,GAAAA;AACP,QAAA,IAAIC,qBAAAA,GAAwB,IAAA;;AAG5B,QAAA,IAAIb,UAAUc,OAAAA,EAAS;AACrBD,YAAAA,qBAAAA,GAAwBb,SAASc,OAAO,CAACC,QAAQ,CAACH,YAAYI,GAAG,CAAA;AACnE,QAAA;;QAGA,IAAIhB,QAAAA,EAAUiB,WAAWjB,QAAAA,CAASiB,OAAO,CAACF,QAAQ,CAACH,WAAAA,CAAYI,GAAG,CAAA,EAAG;YACnEH,qBAAAA,GAAwB,KAAA;AAC1B,QAAA;AAEA,QAAA,IAAIb,UAAUkB,OAAAA,EAAS;AACrBL,YAAAA,qBAAAA,GAAwBb,SAASkB,OAAO,CAACC,KAAK,CAAC,CAACR,SAAWA,MAAAA,CAAOC,WAAAA,CAAAA,CAAAA;AACpE,QAAA;QAEA,OAAOC,qBAAAA;AACT,IAAA,CAAA,CAAA,CACCO,GAAG,CAAC,CAACR,WAAAA,GAAgBA,YAAYI,GAAG,CAAA;AAEvC,IAAA,MAAMK,aAAAA,GAAgBhB,MAAAA,CACnBM,MAAM,CAAC,CAACW,KAAAA,GAAAA;AACP,QAAA,IAAIZ,mBAAAA,CAAoBK,QAAQ,CAACO,KAAAA,CAAMN,GAAG,CAAA,EAAsB;YAC9D,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,IAAIO,eAAAA,GAAkB,IAAA;;AAGtB,QAAA,IAAIvB,UAAUc,OAAAA,EAAS;AACrBS,YAAAA,eAAAA,GAAkBvB,SAASc,OAAO,CAACC,QAAQ,CAACO,MAAMN,GAAG,CAAA;AACvD,QAAA;;QAGA,IAAIhB,QAAAA,EAAUiB,WAAWjB,QAAAA,CAASiB,OAAO,CAACF,QAAQ,CAACO,KAAAA,CAAMN,GAAG,CAAA,EAAG;YAC7DO,eAAAA,GAAkB,KAAA;AACpB,QAAA;QAEA,OAAOA,eAAAA;AACT,IAAA,CAAA,CAAA,CACCH,GAAG,CAAC,CAACE,KAAAA,GAAUA,MAAMN,GAAG,CAAA;AAE3B,IAAA,MAAM,CAACQ,OAAAA,EAASC,aAAAA,CAAc,GAAGC,UAAAA,CAAW;AAAIhB,QAAAA,GAAAA,mBAAAA;AAAwBW,QAAAA,GAAAA;AAAc,KAAA,CAAA;AAEtF,IAAA,MAAMM,gBAAAA,GAAmBC,wBAAgC,CAAC9B,MAAAA,CAAAA;AAE1D,IAAA,MAAM+B,mBAAAA,GAAsBnB,mBAAAA,CAAoBU,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;AACzD,QAAA,MAAMc,SAAS,MAAMH,gBAAAA,CAAiBX,GAAAA,CAAAA,CAAKe,UAAU,CAAC/B,QAAAA,EAAUgC,MAAAA,CAAAA;AAEhE,QAAA,IAAIF,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,IAAI,CAAA,EAAGY,GAAAA,CAAAA;AACnC,QAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMiB,cAAAA,GAAiBZ,aAAAA,CAAcD,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;QAC9C,MAAMc,MAAAA,GAAS,MAAMhC,MAAAA,CAAOoC,EAAE,CAACC,KAAK,CAACnB,GAAAA,CAAAA,CAAKe,UAAU,CAAC,EAAC,CAAA;AAEtD,QAAA,IAAID,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,IAAI,CAAA,EAAGY,GAAAA,CAAAA;AACnC,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,MAAMoB,OAAAA,CAAQC,GAAG,CAAC;AAAIR,QAAAA,GAAAA,mBAAAA;AAAwBI,QAAAA,GAAAA;AAAe,KAAA,CAAA;IAE7D,OAAOT,OAAAA;AACT,CAAA;AAEA,MAAMrB,0BAAAA,GAA6B,OACjCL,MAAAA,EACAC,OAAAA,GAA2B,EAAE,GAAA;IAE7B,MAAM,EAAEuC,SAAAA,GAAY,IAAI,EAAEC,OAAAA,GAAU,IAAI,EAAE,GAAGxC,OAAAA,EAASG,aAAAA,IAAiB,EAAC;AAExE,IAAA,MAAMG,SAAmB,EAAE;AAE3B,IAAA,IAAIiC,SAAAA,EAAW;AACbjC,QAAAA,MAAAA,CAAOmC,IAAI,CAAC,oBAAA,CAAA;AACd,IAAA;AAEA,IAAA,IAAID,OAAAA,EAAS;AACXlC,QAAAA,MAAAA,CAAOmC,IAAI,CAAC,iBAAA,CAAA;AACd,IAAA;AAEA,IAAA,MAAM,CAAChB,OAAAA,EAASC,aAAAA,CAAc,GAAGC,UAAAA,CAAWrB,MAAAA,CAAAA;AAE5C,IAAA,MAAMoC,cAAAA,GAAiBpC,MAAAA,CAAOe,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;QACvC,MAAMc,MAAAA,GAAS,MAAMhC,MAAAA,CAAOoC,EAAE,CAACC,KAAK,CAACnB,GAAAA,CAAAA,CAAKe,UAAU,CAAC,EAAC,CAAA;AAEtD,QAAA,IAAID,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,EAAEY,GAAAA,CAAAA;AAC9B,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,MAAMoB,OAAAA,CAAQC,GAAG,CAACI,cAAAA,CAAAA;IAElB,OAAOjB,OAAAA;AACT,CAAA;AAEA,MAAME,aAAa,CACjBgB,IAAAA,GAAAA;AAEA,IAAA,MAAMlB,OAAAA,GAA0B;QAC9BpB,KAAAA,EAAO,CAAA;AACPuC,QAAAA,SAAAA,EAAWD,KAAKE,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAS;AAAE,gBAAA,GAAGD,GAAG;AAAE,gBAAA,CAACC,MAAM;oBAAE1C,KAAAA,EAAO;AAAE;AAAE,aAAA,GAAI,EAAC;AAC3E,KAAA;IAEA,MAAM2C,MAAAA,GAAS,CAAC3C,KAAAA,EAAe0C,GAAAA,GAAAA;AAC7B,QAAA,IAAIA,GAAAA,EAAK;AACP,YAAA,IAAI,EAAEA,GAAAA,IAAOtB,OAAAA,CAAQmB,SAAS,CAAD,EAAI;AAC/B,gBAAA,MAAM,IAAIK,+BAAAA,CAAsB,CAAC,aAAa,EAAEF,GAAAA,CAAI,4BAA4B,CAAC,CAAA;AACnF,YAAA;AAEAtB,YAAAA,OAAAA,CAAQmB,SAAS,CAACG,GAAAA,CAAI,CAAC1C,KAAK,IAAIA,KAAAA;AAClC,QAAA;AAEAoB,QAAAA,OAAAA,CAAQpB,KAAK,IAAIA,KAAAA;AACnB,IAAA,CAAA;IAEA,OAAO;AAACoB,QAAAA,OAAAA;AAASuB,QAAAA;AAAO,KAAA;AAC1B,CAAA;;;;;;"}
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 =\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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"}
@@ -31,7 +31,7 @@ const deleteEntitiesRecords = async (strapi, options = {})=>{
31
31
  removeThisContentType = false;
32
32
  }
33
33
  if (entities?.filters) {
34
- removeThisContentType = entities.filters.every((filter)=>filter(contentType));
34
+ removeThisContentType = removeThisContentType && entities.filters.every((filter)=>filter(contentType));
35
35
  }
36
36
  return removeThisContentType;
37
37
  }).map((contentType)=>contentType.uid);
@@ -1 +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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"}
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 =\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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"}
@@ -1,5 +1,6 @@
1
1
  import { type Hash } from 'crypto';
2
2
  import { Writable, PassThrough } from 'stream';
3
+ import type { Core } from '@strapi/types';
3
4
  import type { TransferFlow } from '../flows';
4
5
  import type { TransferStage, IAsset, Protocol } from '../../../types';
5
6
  import { createLocalStrapiDestinationProvider } from '../../providers';
@@ -41,6 +42,12 @@ export interface PushHandler extends Handler {
41
42
  * Interval for periodic destination memory logging during assets stage
42
43
  */
43
44
  memoryLogInterval?: ReturnType<typeof setInterval>;
45
+ /** A rejected remote policy violation permanently invalidates this connection's transfer. */
46
+ terminal?: boolean;
47
+ /** Serialize WebSocket frames so a later close cannot race a policy rollback. */
48
+ messageQueue?: Promise<void>;
49
+ /** Shared teardown promise for policy rejection, errors, and socket close. */
50
+ abortPromise?: Promise<void>;
44
51
  /**
45
52
  * Checks that the given action is a valid push transfer action
46
53
  */
@@ -53,6 +60,8 @@ export interface PushHandler extends Handler {
53
60
  * Simple override of the auth verification
54
61
  */
55
62
  verifyAuth(): Promise<void>;
63
+ /** Process one already-serialized WebSocket frame. */
64
+ processMessage(raw: Parameters<Handler['onMessage']>[0]): Promise<void>;
56
65
  /**
57
66
  * Callback when receiving a regular transfer message
58
67
  */
@@ -81,7 +90,12 @@ export interface PushHandler extends Handler {
81
90
  * Checks whether it's possible to stream a chunk for the given stage
82
91
  */
83
92
  assertValidStreamTransferStep(stage: TransferStage): void;
93
+ abort(this: PushHandler, terminal?: boolean): Promise<void>;
84
94
  }
95
+ type PushTransferTeardown = Pick<PushHandler, 'provider' | 'streams' | 'assets' | 'cleanup'>;
96
+ type ProtectedPushStreamStage = 'entities' | 'links';
97
+ export declare const abortPushTransfer: ({ provider, streams, assets, cleanup, }: PushTransferTeardown) => Promise<void>;
98
+ export declare const writeValidatedPushStreamBatch: (strapi: Core.Strapi, stage: ProtectedPushStreamStage, data: Protocol.Client.GetTransferPushStreamData<ProtectedPushStreamStage>, stream: Writable, stats: Protocol.Client.Stats) => Promise<void>;
85
99
  export declare const createPushController: (options: import("./utils").HandlerOptions) => (ctx: import("koa").Context) => Promise<void>;
86
100
  export {};
87
101
  //# sourceMappingURL=push.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAQ,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAKtE,OAAO,EAAE,oCAAoC,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,QAAA,MAAM,sBAAsB,4FAOlB,CAAC;AAEX,KAAK,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIlE,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C;;OAEG;IACH,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,oCAAoC,CAAC,CAAC;IAEnE;;OAEG;IACH,OAAO,CAAC,EAAE;SAAG,KAAK,IAAI,aAAa,CAAC,CAAC,EAAE,QAAQ;KAAE,CAAC;IAElD,KAAK,EAAE;SACJ,KAAK,IAAI,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK;KACpE,CAAC;IAEF;;OAEG;IACH,MAAM,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG;YAAE,MAAM,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,CAAC;IAChE,yGAAyG;IACzG,cAAc,CAAC,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAEnD;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC;IAEhF;;OAEG;IACH,2BAA2B,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAEpF;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAE1E;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAErF;;OAEG;IACH,WAAW,CACT,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,CAAC;IAIjB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAE7C;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAE/C;;OAEG;IACH,6BAA6B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,oBAAoB,kDAqDb,0BACnB,kBAmbE,CAAC"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/strapi/remote/handlers/push.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ require('fs-extra');
14
14
  require('mime-types');
15
15
  require('events');
16
16
  require('ws');
17
+ var transferPolicy = require('../../transfer-policy.js');
17
18
  var index = require('../flows/index.js');
18
19
  var utils = require('./utils.js');
19
20
  var _default = require('../flows/default.js');
@@ -27,6 +28,66 @@ const VALID_TRANSFER_ACTIONS = [
27
28
  'getSchemas'
28
29
  ];
29
30
  const TRANSFER_KIND = 'push';
31
+ const reportTeardownError = (error)=>{
32
+ strapi?.log?.error('[Data transfer] Failed to clean up push transfer');
33
+ strapi?.log?.error(error);
34
+ };
35
+ const abortPushTransfer = async ({ provider, streams, assets, cleanup })=>{
36
+ try {
37
+ for (const stream of Object.values(streams ?? {})){
38
+ try {
39
+ stream?.destroy();
40
+ } catch (error) {
41
+ reportTeardownError(error);
42
+ }
43
+ }
44
+ for (const asset of Object.values(assets ?? {})){
45
+ try {
46
+ asset.stream.destroy();
47
+ } catch (error) {
48
+ reportTeardownError(error);
49
+ }
50
+ }
51
+ if (provider) {
52
+ try {
53
+ await provider.rollback();
54
+ } catch (error) {
55
+ reportTeardownError(error);
56
+ } finally{
57
+ // A local provider only owns Strapi lifecycle restoration after bootstrap.
58
+ if (provider.strapi) {
59
+ try {
60
+ await provider.close();
61
+ } catch (error) {
62
+ reportTeardownError(error);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ } finally{
68
+ try {
69
+ cleanup();
70
+ } catch (error) {
71
+ reportTeardownError(error);
72
+ }
73
+ }
74
+ };
75
+ const writeValidatedPushStreamBatch = async (strapi1, stage, data, stream, stats)=>{
76
+ if (stage === 'entities') {
77
+ for (const entity of data){
78
+ transferPolicy.assertRemoteEntityAllowed(strapi1, entity);
79
+ }
80
+ } else {
81
+ for (const link of data){
82
+ transferPolicy.assertRemoteLinkAllowed(link);
83
+ }
84
+ }
85
+ for (const item of data){
86
+ stats.started += 1;
87
+ await writableAsyncWrite.write(stream, item);
88
+ stats.finished += 1;
89
+ }
90
+ };
30
91
  const createPushController = utils.handlerControllerFactory((proto)=>({
31
92
  isTransferStarted () {
32
93
  return proto.isTransferStarted.call(this) && this.provider !== undefined;
@@ -67,14 +128,25 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
67
128
  delete this.flow;
68
129
  delete this.provider;
69
130
  },
70
- teardown () {
131
+ async abort (terminal = false) {
132
+ if (terminal) {
133
+ this.terminal = true;
134
+ }
135
+ if (this.abortPromise) {
136
+ return this.abortPromise;
137
+ }
138
+ this.abortPromise = abortPushTransfer({
139
+ ...this,
140
+ cleanup: ()=>this.cleanup()
141
+ });
142
+ return this.abortPromise;
143
+ },
144
+ async teardown () {
71
145
  if (this.memoryLogInterval) {
72
146
  clearInterval(this.memoryLogInterval);
73
147
  delete this.memoryLogInterval;
74
148
  }
75
- if (this.provider) {
76
- this.provider.rollback();
77
- }
149
+ await this.abort();
78
150
  proto.teardown.call(this);
79
151
  },
80
152
  assertValidTransfer () {
@@ -123,12 +195,23 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
123
195
  this.streams[step] = await mapper[step]();
124
196
  },
125
197
  async onMessage (raw) {
198
+ const previousMessage = this.messageQueue ?? Promise.resolve();
199
+ const nextMessage = previousMessage.then(()=>this.processMessage(raw));
200
+ this.messageQueue = nextMessage.catch(()=>undefined);
201
+ return nextMessage;
202
+ },
203
+ async processMessage (raw) {
126
204
  const msg = JSON.parse(raw.toString());
127
205
  if (!utils.isDataTransferMessage(msg)) {
128
206
  return;
129
207
  }
130
208
  if (!msg.uuid) {
131
209
  await this.respond(undefined, new Error('Missing uuid in message'));
210
+ return;
211
+ }
212
+ if (this.terminal) {
213
+ await this.respond(msg.uuid, new providers.ProviderTransferError('Transfer has been terminated'));
214
+ return;
132
215
  }
133
216
  if (proto.hasUUID(msg.uuid)) {
134
217
  const previousResponse = proto.response;
@@ -248,6 +331,16 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
248
331
  if (stage === 'assets') {
249
332
  return this.streamAsset(msg.data);
250
333
  }
334
+ try {
335
+ if (stage === 'entities' || stage === 'links') {
336
+ await writeValidatedPushStreamBatch(strapi, stage, msg.data, stream, this.stats[stage]);
337
+ return;
338
+ }
339
+ } catch (error) {
340
+ // Mark terminal before awaiting rollback so no queued WebSocket frame can commit.
341
+ await this.abort(true);
342
+ throw error;
343
+ }
251
344
  // One objectMode Writable: do not overlap writes.
252
345
  for (const item of msg.data){
253
346
  this.stats[stage].started += 1;
@@ -361,11 +454,11 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
361
454
  }
362
455
  }
363
456
  },
364
- onClose () {
365
- this.teardown();
457
+ async onClose () {
458
+ await this.teardown();
366
459
  },
367
- onError (err) {
368
- this.teardown();
460
+ async onError (err) {
461
+ await this.teardown();
369
462
  strapi.log.error(err);
370
463
  },
371
464
  // Commands
@@ -401,7 +494,7 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
401
494
  this.flow = index.createFlow(_default);
402
495
  this.provider = index$1.createLocalStrapiDestinationProvider({
403
496
  strategy: params?.options?.strategy ?? 'restore',
404
- restore: params?.options?.restore ?? {},
497
+ restore: transferPolicy.normalizeRemoteRestoreOptions(strapi, params?.options?.restore ?? {}),
405
498
  autoDestroy: false,
406
499
  getStrapi: ()=>strapi
407
500
  });
@@ -450,5 +543,7 @@ const createPushController = utils.handlerControllerFactory((proto)=>({
450
543
  }
451
544
  }));
452
545
 
546
+ exports.abortPushTransfer = abortPushTransfer;
453
547
  exports.createPushController = createPushController;
548
+ exports.writeValidatedPushStreamBatch = writeValidatedPushStreamBatch;
454
549
  //# sourceMappingURL=push.js.map