@strapi/data-transfer 5.42.1 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/directory/providers/source/index.d.ts.map +1 -1
- package/dist/directory/providers/source/index.js +3 -2
- package/dist/directory/providers/source/index.js.map +1 -1
- package/dist/directory/providers/source/index.mjs +3 -2
- package/dist/directory/providers/source/index.mjs.map +1 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +130 -5
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/index.mjs +130 -5
- package/dist/engine/index.mjs.map +1 -1
- package/dist/engine/validation/schemas/index.js +2 -0
- package/dist/engine/validation/schemas/index.js.map +1 -1
- package/dist/engine/validation/schemas/index.mjs +2 -0
- package/dist/engine/validation/schemas/index.mjs.map +1 -1
- package/dist/file/providers/source/index.d.ts.map +1 -1
- package/dist/file/providers/source/index.js +84 -45
- package/dist/file/providers/source/index.js.map +1 -1
- package/dist/file/providers/source/index.mjs +85 -46
- package/dist/file/providers/source/index.mjs.map +1 -1
- package/dist/strapi/providers/index.js +2 -0
- package/dist/strapi/providers/index.js.map +1 -1
- package/dist/strapi/providers/index.mjs +1 -0
- package/dist/strapi/providers/index.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts +22 -0
- package/dist/strapi/providers/local-destination/assets-destination-writable.d.ts.map +1 -0
- package/dist/strapi/providers/local-destination/assets-destination-writable.js +107 -0
- package/dist/strapi/providers/local-destination/assets-destination-writable.js.map +1 -0
- package/dist/strapi/providers/local-destination/assets-destination-writable.mjs +105 -0
- package/dist/strapi/providers/local-destination/assets-destination-writable.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/index.d.ts +2 -0
- package/dist/strapi/providers/local-destination/index.d.ts.map +1 -1
- package/dist/strapi/providers/local-destination/index.js +18 -79
- package/dist/strapi/providers/local-destination/index.js.map +1 -1
- package/dist/strapi/providers/local-destination/index.mjs +18 -79
- package/dist/strapi/providers/local-destination/index.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +2 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +2 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +2 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +2 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
- package/dist/strapi/providers/local-source/assets.d.ts +8 -1
- package/dist/strapi/providers/local-source/assets.d.ts.map +1 -1
- package/dist/strapi/providers/local-source/assets.js +47 -19
- package/dist/strapi/providers/local-source/assets.js.map +1 -1
- package/dist/strapi/providers/local-source/assets.mjs +46 -20
- package/dist/strapi/providers/local-source/assets.mjs.map +1 -1
- package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts +11 -0
- package/dist/strapi/providers/local-source/estimate-asset-totals.d.ts.map +1 -0
- package/dist/strapi/providers/local-source/estimate-asset-totals.js +130 -0
- package/dist/strapi/providers/local-source/estimate-asset-totals.js.map +1 -0
- package/dist/strapi/providers/local-source/estimate-asset-totals.mjs +128 -0
- package/dist/strapi/providers/local-source/estimate-asset-totals.mjs.map +1 -0
- package/dist/strapi/providers/local-source/index.d.ts +3 -2
- package/dist/strapi/providers/local-source/index.d.ts.map +1 -1
- package/dist/strapi/providers/local-source/index.js +30 -3
- package/dist/strapi/providers/local-source/index.js.map +1 -1
- package/dist/strapi/providers/local-source/index.mjs +30 -4
- package/dist/strapi/providers/local-source/index.mjs.map +1 -1
- package/dist/strapi/providers/remote-destination/index.d.ts +3 -1
- package/dist/strapi/providers/remote-destination/index.d.ts.map +1 -1
- package/dist/strapi/providers/remote-destination/index.js +88 -19
- package/dist/strapi/providers/remote-destination/index.js.map +1 -1
- package/dist/strapi/providers/remote-destination/index.mjs +89 -20
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
- package/dist/strapi/providers/remote-source/index.d.ts +6 -3
- package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
- package/dist/strapi/providers/remote-source/index.js +180 -47
- package/dist/strapi/providers/remote-source/index.js.map +1 -1
- package/dist/strapi/providers/remote-source/index.mjs +181 -48
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
- package/dist/strapi/providers/utils.d.ts +9 -6
- package/dist/strapi/providers/utils.d.ts.map +1 -1
- package/dist/strapi/providers/utils.js +9 -4
- package/dist/strapi/providers/utils.js.map +1 -1
- package/dist/strapi/providers/utils.mjs +9 -4
- package/dist/strapi/providers/utils.mjs.map +1 -1
- package/dist/strapi/remote/handlers/pull.d.ts +1 -0
- package/dist/strapi/remote/handlers/pull.d.ts.map +1 -1
- package/dist/strapi/remote/handlers/pull.js +36 -15
- package/dist/strapi/remote/handlers/pull.js.map +1 -1
- package/dist/strapi/remote/handlers/pull.mjs +37 -16
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -1
- package/dist/strapi/remote/handlers/push.d.ts +13 -2
- package/dist/strapi/remote/handlers/push.d.ts.map +1 -1
- package/dist/strapi/remote/handlers/push.js +81 -34
- package/dist/strapi/remote/handlers/push.js.map +1 -1
- package/dist/strapi/remote/handlers/push.mjs +82 -35
- package/dist/strapi/remote/handlers/push.mjs.map +1 -1
- package/dist/strapi/remote/handlers/utils.d.ts.map +1 -1
- package/dist/strapi/remote/handlers/utils.js +5 -3
- package/dist/strapi/remote/handlers/utils.js.map +1 -1
- package/dist/strapi/remote/handlers/utils.mjs +5 -3
- package/dist/strapi/remote/handlers/utils.mjs.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/stream.d.ts.map +1 -1
- package/dist/utils/stream.js +40 -3
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/stream.mjs +40 -3
- package/dist/utils/stream.mjs.map +1 -1
- package/dist/utils/transfer-asset-chunk.d.ts +41 -0
- package/dist/utils/transfer-asset-chunk.d.ts.map +1 -0
- package/dist/utils/transfer-asset-chunk.js +93 -0
- package/dist/utils/transfer-asset-chunk.js.map +1 -0
- package/dist/utils/transfer-asset-chunk.mjs +88 -0
- package/dist/utils/transfer-asset-chunk.mjs.map +1 -0
- package/dist/utils/transfer-websocket-json.d.ts +24 -0
- package/dist/utils/transfer-websocket-json.d.ts.map +1 -0
- package/dist/utils/transfer-websocket-json.js +67 -0
- package/dist/utils/transfer-websocket-json.js.map +1 -0
- package/dist/utils/transfer-websocket-json.mjs +63 -0
- package/dist/utils/transfer-websocket-json.mjs.map +1 -0
- package/dist/utils/writable-async-write.d.ts +17 -0
- package/dist/utils/writable-async-write.d.ts.map +1 -0
- package/dist/utils/writable-async-write.js +61 -0
- package/dist/utils/writable-async-write.js.map +1 -0
- package/dist/utils/writable-async-write.mjs +59 -0
- package/dist/utils/writable-async-write.mjs.map +1 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-destination/index.ts"],"sourcesContent":["import { Writable, Readable } from 'stream';\nimport path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Knex } from 'knex';\nimport type { Core, Struct } from '@strapi/types';\nimport type {\n IAsset,\n IDestinationProvider,\n IFile,\n IMetadata,\n ProviderType,\n Transaction,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport { restore } from './strategies';\nimport * as utils from '../../../utils';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport const VALID_CONFLICT_STRATEGIES = ['restore'];\nexport const DEFAULT_CONFLICT_STRATEGY = 'restore';\n\nexport interface ILocalStrapiDestinationProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n restore?: restore.IRestoreOptions; // erase data in strapi database before transfer; required if strategy is 'restore'\n strategy: 'restore'; // conflict management strategy; only the restore strategy is available at this time\n}\n\nclass LocalStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::local-strapi';\n\n type: ProviderType = 'destination';\n\n options: ILocalStrapiDestinationProviderOptions;\n\n strapi?: Core.Strapi;\n\n transaction?: Transaction;\n\n uploadsBackupDirectoryName: string;\n\n onWarning?: ((message: string) => void) | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n /**\n * The entities mapper is used to map old entities to their new IDs\n */\n #entitiesMapper: { [type: string]: { [id: number]: number } };\n\n constructor(options: ILocalStrapiDestinationProviderOptions) {\n this.options = options;\n this.#entitiesMapper = {};\n this.uploadsBackupDirectoryName = `uploads_backup_${Date.now()}`;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#validateOptions();\n this.strapi = await this.options.getStrapi();\n if (!this.strapi) {\n throw new ProviderInitializationError('Could not access local strapi');\n }\n this.strapi.db.lifecycles.disable();\n this.transaction = utils.transaction.createTransaction(this.strapi);\n }\n\n // TODO: either move this to restore strategy, or restore strategy should given access to these instead of repeating the logic possibly in a different way\n #areAssetsIncluded = () => {\n return this.options.restore?.assets;\n };\n\n #isContentTypeIncluded = (type: string) => {\n const notIncluded =\n this.options.restore?.entities?.include &&\n !this.options.restore?.entities?.include?.includes(type);\n const excluded =\n this.options.restore?.entities?.exclude &&\n this.options.restore?.entities.exclude.includes(type);\n\n return !excluded && !notIncluded;\n };\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-destination-provider',\n },\n kind: 'info',\n });\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.transaction?.end();\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n #validateOptions() {\n this.#reportInfo('validating options');\n if (!VALID_CONFLICT_STRATEGIES.includes(this.options.strategy)) {\n throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n check: 'strategy',\n strategy: this.options.strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n // require restore options when using restore\n if (this.options.strategy === 'restore' && !this.options.restore) {\n throw new ProviderValidationError('Missing restore options');\n }\n }\n\n async #deleteFromRestoreOptions() {\n assertValidStrapi(this.strapi);\n if (!this.options.restore) {\n throw new ProviderValidationError('Missing restore options');\n }\n this.#reportInfo('deleting record ');\n return restore.deleteRecords(this.strapi, this.options.restore);\n }\n\n async #deleteAllAssets(trx?: Knex.Transaction) {\n assertValidStrapi(this.strapi);\n this.#reportInfo('deleting all assets');\n // if we're not restoring files, don't touch the files\n if (!this.#areAssetsIncluded()) {\n return;\n }\n\n const stream: Readable = this.strapi.db\n // Create a query builder instance (default type is 'select')\n .queryBuilder('plugin::upload.file')\n // Fetch all columns\n .select('*')\n // Attach the transaction\n .transacting(trx)\n // Get a readable stream\n .stream();\n\n // TODO use bulk delete when exists in providers\n for await (const file of stream) {\n await this.strapi.plugin('upload').provider.delete(file);\n if (file.formats) {\n for (const fileFormat of Object.values(file.formats)) {\n await this.strapi.plugin('upload').provider.delete(fileFormat);\n }\n }\n }\n\n this.#reportInfo('deleted all assets');\n }\n\n async rollback() {\n this.#reportInfo('Rolling back transaction');\n await this.transaction?.rollback();\n this.#reportInfo('Rolled back transaction');\n }\n\n async beforeTransfer() {\n if (!this.strapi) {\n throw new Error('Strapi instance not found');\n }\n\n await this.transaction?.attach(async (trx) => {\n try {\n if (this.options.strategy === 'restore') {\n await this.#handleAssetsBackup();\n await this.#deleteAllAssets(trx);\n await this.#deleteFromRestoreOptions();\n }\n } catch (error) {\n throw new Error(`restore failed ${error}`);\n }\n });\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n this.#reportInfo('getting schema');\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createEntitiesWriteStream(): Writable {\n assertValidStrapi(this.strapi, 'Not able to import entities');\n this.#reportInfo('creating entities stream');\n const { strategy } = this.options;\n\n const updateMappingTable = (type: string, oldID: number, newID: number) => {\n if (!this.#entitiesMapper[type]) {\n this.#entitiesMapper[type] = {};\n }\n\n Object.assign(this.#entitiesMapper[type], { [oldID]: newID });\n };\n\n if (strategy === 'restore') {\n return restore.createEntitiesWriteStream({\n strapi: this.strapi,\n updateMappingTable,\n transaction: this.transaction,\n });\n }\n\n throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n check: 'strategy',\n strategy: this.options.strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n async #handleAssetsBackup() {\n assertValidStrapi(this.strapi, 'Not able to create the assets backup');\n\n // if we're not restoring assets, don't back them up because they won't be touched\n if (!this.#areAssetsIncluded()) {\n return;\n }\n\n if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n this.#reportInfo('creating assets backup directory');\n const assetsDirectory = path.join(this.strapi.dirs.static.public, 'uploads');\n const backupDirectory = path.join(\n this.strapi.dirs.static.public,\n this.uploadsBackupDirectoryName\n );\n\n try {\n // Check access before attempting to do anything\n await fse.access(\n assetsDirectory,\n // eslint-disable-next-line no-bitwise\n fse.constants.W_OK | fse.constants.R_OK | fse.constants.F_OK\n );\n // eslint-disable-next-line no-bitwise\n await fse.access(path.join(assetsDirectory, '..'), fse.constants.W_OK | fse.constants.R_OK);\n\n await fse.move(assetsDirectory, backupDirectory);\n await fse.mkdir(assetsDirectory);\n // Create a .gitkeep file to ensure the directory is not empty\n await fse.outputFile(path.join(assetsDirectory, '.gitkeep'), '');\n this.#reportInfo(`created assets backup directory ${backupDirectory}`);\n } catch (err) {\n throw new ProviderTransferError(\n 'The backup folder for the assets could not be created inside the public folder. Please ensure Strapi has write permissions on the public directory',\n {\n code: 'ASSETS_DIRECTORY_ERR',\n }\n );\n }\n return backupDirectory;\n }\n }\n\n async #removeAssetsBackup() {\n assertValidStrapi(this.strapi, 'Not able to remove Assets');\n // if we're not restoring assets, don't back them up because they won't be touched\n if (!this.#areAssetsIncluded()) {\n return;\n }\n // TODO: this should catch all thrown errors and bubble it up to engine so it can be reported as a non-fatal diagnostic message telling the user they may need to manually delete assets\n if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n this.#reportInfo('removing assets backup');\n assertValidStrapi(this.strapi);\n const backupDirectory = path.join(\n this.strapi.dirs.static.public,\n this.uploadsBackupDirectoryName\n );\n await fse.rm(backupDirectory, { recursive: true, force: true });\n this.#reportInfo('successfully removed assets backup');\n }\n }\n\n // TODO: Move this logic to the restore strategy\n async createAssetsWriteStream(): Promise<Writable> {\n assertValidStrapi(this.strapi, 'Not able to stream Assets');\n this.#reportInfo('creating assets write stream');\n if (!this.#areAssetsIncluded()) {\n throw new ProviderTransferError(\n 'Attempting to transfer assets when `assets` is not set in restore options'\n );\n }\n\n const removeAssetsBackup = this.#removeAssetsBackup.bind(this);\n const strapi = this.strapi;\n const transaction = this.transaction;\n const fileEntitiesMapper = this.#entitiesMapper['plugin::upload.file'];\n\n const restoreMediaEntitiesContent = this.#isContentTypeIncluded('plugin::upload.file');\n\n return new Writable({\n objectMode: true,\n async final(next) {\n // Delete the backup folder\n await removeAssetsBackup();\n next();\n },\n async write(chunk: IAsset, _encoding, callback) {\n await transaction?.attach(async () => {\n const uploadData = {\n ...chunk.metadata,\n stream: Readable.from(chunk.stream),\n buffer: chunk?.buffer,\n };\n\n const provider = strapi.config.get<{ provider: string }>('plugin::upload').provider;\n\n const fileId = fileEntitiesMapper?.[uploadData.id];\n if (!fileId) {\n return callback(new Error(`File ID not found for ID: ${uploadData.id}`));\n }\n\n try {\n await strapi.plugin('upload').provider.uploadStream(uploadData);\n\n // if we're not supposed to transfer the associated entities, stop here\n if (!restoreMediaEntitiesContent) {\n return callback();\n }\n\n // Files formats are stored within the parent file entity\n if (uploadData?.type) {\n const entry: IFile = await strapi.db.query('plugin::upload.file').findOne({\n where: { id: fileId },\n });\n if (!entry) {\n throw new Error('file not found');\n }\n const specificFormat = entry?.formats?.[uploadData.type];\n if (specificFormat) {\n specificFormat.url = uploadData.url;\n }\n await strapi.db.query('plugin::upload.file').update({\n where: { id: entry.id },\n data: {\n formats: entry.formats,\n provider,\n },\n });\n return callback();\n }\n\n const entry: IFile = await strapi.db.query('plugin::upload.file').findOne({\n where: { id: fileId },\n });\n if (!entry) {\n throw new Error('file not found');\n }\n entry.url = uploadData.url;\n await strapi.db.query('plugin::upload.file').update({\n where: { id: entry.id },\n data: {\n url: entry.url,\n provider,\n },\n });\n return callback();\n } catch (error) {\n return callback(new Error(`Error while uploading asset ${chunk.filename} ${error}`));\n }\n });\n },\n });\n }\n\n async createConfigurationWriteStream(): Promise<Writable> {\n assertValidStrapi(this.strapi, 'Not able to stream Configurations');\n this.#reportInfo('creating configuration write stream');\n const { strategy } = this.options;\n\n if (strategy === 'restore') {\n return restore.createConfigurationWriteStream(this.strapi, this.transaction);\n }\n\n throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n check: 'strategy',\n strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n async createLinksWriteStream(): Promise<Writable> {\n this.#reportInfo('creating links write stream');\n if (!this.strapi) {\n throw new Error('Not able to stream links. Strapi instance not found');\n }\n\n const { strategy } = this.options;\n const mapID = (uid: string, id: number): number | undefined => this.#entitiesMapper[uid]?.[id];\n\n if (strategy === 'restore') {\n return restore.createLinksWriteStream(mapID, this.strapi, this.transaction, this.onWarning);\n }\n\n throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n check: 'strategy',\n strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n}\n\nexport const createLocalStrapiDestinationProvider = (\n options: ILocalStrapiDestinationProviderOptions\n) => {\n return new LocalStrapiDestinationProvider(options);\n};\n"],"names":["VALID_CONFLICT_STRATEGIES","DEFAULT_CONFLICT_STRATEGY","LocalStrapiDestinationProvider","bootstrap","diagnostics","strapi","options","getStrapi","ProviderInitializationError","db","lifecycles","disable","transaction","utils","close","autoDestroy","assertValidStrapi","end","enable","undefined","destroy","rollback","beforeTransfer","Error","attach","trx","strategy","error","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","getSchemas","schemas","contentTypes","components","createEntitiesWriteStream","updateMappingTable","type","oldID","newID","Object","assign","restore","ProviderValidationError","check","validStrategies","createAssetsWriteStream","ProviderTransferError","removeAssetsBackup","bind","fileEntitiesMapper","restoreMediaEntitiesContent","Writable","objectMode","final","next","write","chunk","_encoding","callback","uploadData","metadata","stream","Readable","from","buffer","provider","fileId","id","plugin","uploadStream","entry","query","findOne","where","specificFormat","formats","url","update","data","filename","createConfigurationWriteStream","createLinksWriteStream","mapID","uid","onWarning","name","assets","notIncluded","entities","include","includes","excluded","exclude","uploadsBackupDirectoryName","now","message","report","details","origin","kind","queryBuilder","select","transacting","file","delete","fileFormat","values","assetsDirectory","path","join","dirs","static","public","backupDirectory","fse","access","constants","W_OK","R_OK","F_OK","move","mkdir","outputFile","err","code","rm","recursive","force","createLocalStrapiDestinationProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-destination/index.ts"],"sourcesContent":["import { Writable, Readable } from 'stream';\nimport path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Knex } from 'knex';\nimport type { Core, Struct } from '@strapi/types';\nimport type { IDestinationProvider, IMetadata, ProviderType, Transaction } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport { createAssetsDestinationWritable } from './assets-destination-writable';\nimport { restore } from './strategies';\nimport * as utils from '../../../utils';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport const VALID_CONFLICT_STRATEGIES = ['restore'];\nexport const DEFAULT_CONFLICT_STRATEGY = 'restore';\n\nexport interface ILocalStrapiDestinationProviderOptions {\n getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n restore?: restore.IRestoreOptions; // erase data in strapi database before transfer; required if strategy is 'restore'\n strategy: 'restore'; // conflict management strategy; only the restore strategy is available at this time\n /** CLI / UI: human-readable progress during {@link beforeTransfer} (restore prep). */\n onTransferPhase?: (message: string) => void;\n}\n\nclass LocalStrapiDestinationProvider implements IDestinationProvider {\n name = 'destination::local-strapi';\n\n type: ProviderType = 'destination';\n\n options: ILocalStrapiDestinationProviderOptions;\n\n strapi?: Core.Strapi;\n\n transaction?: Transaction;\n\n uploadsBackupDirectoryName: string;\n\n onWarning?: ((message: string) => void) | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n /**\n * The entities mapper is used to map old entities to their new IDs\n */\n #entitiesMapper: { [type: string]: { [id: number]: number } };\n\n constructor(options: ILocalStrapiDestinationProviderOptions) {\n this.options = options;\n this.#entitiesMapper = {};\n this.uploadsBackupDirectoryName = `uploads_backup_${Date.now()}`;\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#validateOptions();\n this.strapi = await this.options.getStrapi();\n if (!this.strapi) {\n throw new ProviderInitializationError('Could not access local strapi');\n }\n this.strapi.db.lifecycles.disable();\n this.transaction = utils.transaction.createTransaction(this.strapi);\n }\n\n // TODO: either move this to restore strategy, or restore strategy should given access to these instead of repeating the logic possibly in a different way\n #areAssetsIncluded = () => {\n return this.options.restore?.assets;\n };\n\n #isContentTypeIncluded = (type: string) => {\n const notIncluded =\n this.options.restore?.entities?.include &&\n !this.options.restore?.entities?.include?.includes(type);\n const excluded =\n this.options.restore?.entities?.exclude &&\n this.options.restore?.entities.exclude.includes(type);\n\n return !excluded && !notIncluded;\n };\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'local-destination-provider',\n },\n kind: 'info',\n });\n }\n\n async close(): Promise<void> {\n const { autoDestroy } = this.options;\n assertValidStrapi(this.strapi);\n this.transaction?.end();\n this.strapi.db.lifecycles.enable();\n // Basically `!== false` but more deterministic\n if (autoDestroy === undefined || autoDestroy === true) {\n await this.strapi?.destroy();\n }\n }\n\n #validateOptions() {\n this.#reportInfo('validating options');\n if (!VALID_CONFLICT_STRATEGIES.includes(this.options.strategy)) {\n throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n check: 'strategy',\n strategy: this.options.strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n // require restore options when using restore\n if (this.options.strategy === 'restore' && !this.options.restore) {\n throw new ProviderValidationError('Missing restore options');\n }\n }\n\n async #deleteFromRestoreOptions() {\n assertValidStrapi(this.strapi);\n if (!this.options.restore) {\n throw new ProviderValidationError('Missing restore options');\n }\n this.#reportInfo('deleting record ');\n return restore.deleteRecords(this.strapi, this.options.restore);\n }\n\n async #deleteAllAssets(trx?: Knex.Transaction) {\n assertValidStrapi(this.strapi);\n this.#reportInfo('deleting all assets');\n // if we're not restoring files, don't touch the files\n if (!this.#areAssetsIncluded()) {\n return;\n }\n\n const stream: Readable = this.strapi.db\n // Create a query builder instance (default type is 'select')\n .queryBuilder('plugin::upload.file')\n // Fetch all columns\n .select('*')\n // Attach the transaction\n .transacting(trx)\n // Get a readable stream\n .stream();\n\n // TODO use bulk delete when exists in providers\n for await (const file of stream) {\n await this.strapi.plugin('upload').provider.delete(file);\n if (file.formats) {\n for (const fileFormat of Object.values(file.formats)) {\n await this.strapi.plugin('upload').provider.delete(fileFormat);\n }\n }\n }\n\n this.#reportInfo('deleted all assets');\n }\n\n async rollback() {\n this.#reportInfo('Rolling back transaction');\n await this.transaction?.rollback();\n this.#reportInfo('Rolled back transaction');\n }\n\n async beforeTransfer() {\n if (!this.strapi) {\n throw new Error('Strapi instance not found');\n }\n\n this.options.onTransferPhase?.('Local: preparing destination for restore…');\n\n await this.transaction?.attach(async (trx) => {\n try {\n if (this.options.strategy === 'restore') {\n if (this.#areAssetsIncluded()) {\n this.options.onTransferPhase?.('Local: backing up existing upload folder…');\n }\n await this.#handleAssetsBackup();\n if (this.#areAssetsIncluded()) {\n this.options.onTransferPhase?.('Local: deleting existing media files from disk…');\n }\n await this.#deleteAllAssets(trx);\n this.options.onTransferPhase?.('Local: clearing database content for restore…');\n await this.#deleteFromRestoreOptions();\n }\n } catch (error) {\n throw new Error(`restore failed ${error}`);\n }\n });\n }\n\n getMetadata(): IMetadata {\n this.#reportInfo('getting metadata');\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n const strapiVersion = this.strapi.config.get<string>('info.strapi');\n const createdAt = new Date().toISOString();\n\n return {\n createdAt,\n strapi: {\n version: strapiVersion,\n },\n };\n }\n\n getSchemas(): Record<string, Struct.Schema> {\n this.#reportInfo('getting schema');\n assertValidStrapi(this.strapi, 'Not able to get Schemas');\n\n const schemas = utils.schema.schemasToValidJSON({\n ...this.strapi.contentTypes,\n ...this.strapi.components,\n });\n\n return utils.schema.mapSchemasValues(schemas);\n }\n\n createEntitiesWriteStream(): Writable {\n assertValidStrapi(this.strapi, 'Not able to import entities');\n this.#reportInfo('creating entities stream');\n const { strategy } = this.options;\n\n const updateMappingTable = (type: string, oldID: number, newID: number) => {\n if (!this.#entitiesMapper[type]) {\n this.#entitiesMapper[type] = {};\n }\n\n Object.assign(this.#entitiesMapper[type], { [oldID]: newID });\n };\n\n if (strategy === 'restore') {\n return restore.createEntitiesWriteStream({\n strapi: this.strapi,\n updateMappingTable,\n transaction: this.transaction,\n });\n }\n\n throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n check: 'strategy',\n strategy: this.options.strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n async #handleAssetsBackup() {\n assertValidStrapi(this.strapi, 'Not able to create the assets backup');\n\n // if we're not restoring assets, don't back them up because they won't be touched\n if (!this.#areAssetsIncluded()) {\n return;\n }\n\n if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n this.#reportInfo('creating assets backup directory');\n const assetsDirectory = path.join(this.strapi.dirs.static.public, 'uploads');\n const backupDirectory = path.join(\n this.strapi.dirs.static.public,\n this.uploadsBackupDirectoryName\n );\n\n try {\n // Check access before attempting to do anything\n await fse.access(\n assetsDirectory,\n // eslint-disable-next-line no-bitwise\n fse.constants.W_OK | fse.constants.R_OK | fse.constants.F_OK\n );\n // eslint-disable-next-line no-bitwise\n await fse.access(path.join(assetsDirectory, '..'), fse.constants.W_OK | fse.constants.R_OK);\n\n await fse.move(assetsDirectory, backupDirectory);\n await fse.mkdir(assetsDirectory);\n // Create a .gitkeep file to ensure the directory is not empty\n await fse.outputFile(path.join(assetsDirectory, '.gitkeep'), '');\n this.#reportInfo(`created assets backup directory ${backupDirectory}`);\n } catch (err) {\n throw new ProviderTransferError(\n 'The backup folder for the assets could not be created inside the public folder. Please ensure Strapi has write permissions on the public directory',\n {\n code: 'ASSETS_DIRECTORY_ERR',\n }\n );\n }\n return backupDirectory;\n }\n }\n\n async #removeAssetsBackup() {\n assertValidStrapi(this.strapi, 'Not able to remove Assets');\n // if we're not restoring assets, don't back them up because they won't be touched\n if (!this.#areAssetsIncluded()) {\n return;\n }\n // TODO: this should catch all thrown errors and bubble it up to engine so it can be reported as a non-fatal diagnostic message telling the user they may need to manually delete assets\n if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n this.#reportInfo('removing assets backup');\n assertValidStrapi(this.strapi);\n const backupDirectory = path.join(\n this.strapi.dirs.static.public,\n this.uploadsBackupDirectoryName\n );\n await fse.rm(backupDirectory, { recursive: true, force: true });\n this.#reportInfo('successfully removed assets backup');\n }\n }\n\n // TODO: Move this logic to the restore strategy\n async createAssetsWriteStream(): Promise<Writable> {\n assertValidStrapi(this.strapi, 'Not able to stream Assets');\n this.#reportInfo('creating assets write stream');\n if (!this.#areAssetsIncluded()) {\n throw new ProviderTransferError(\n 'Attempting to transfer assets when `assets` is not set in restore options'\n );\n }\n\n const fileEntitiesMapper = this.#entitiesMapper['plugin::upload.file'];\n\n return createAssetsDestinationWritable({\n strapi: this.strapi,\n transaction: this.transaction!,\n resolveUploadFileId: (metadata) => fileEntitiesMapper?.[metadata.id],\n restoreMediaEntitiesContent: this.#isContentTypeIncluded('plugin::upload.file'),\n removeAssetsBackup: this.#removeAssetsBackup.bind(this),\n });\n }\n\n async createConfigurationWriteStream(): Promise<Writable> {\n assertValidStrapi(this.strapi, 'Not able to stream Configurations');\n this.#reportInfo('creating configuration write stream');\n const { strategy } = this.options;\n\n if (strategy === 'restore') {\n return restore.createConfigurationWriteStream(this.strapi, this.transaction);\n }\n\n throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n check: 'strategy',\n strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n\n async createLinksWriteStream(): Promise<Writable> {\n this.#reportInfo('creating links write stream');\n if (!this.strapi) {\n throw new Error('Not able to stream links. Strapi instance not found');\n }\n\n const { strategy } = this.options;\n const mapID = (uid: string, id: number): number | undefined => this.#entitiesMapper[uid]?.[id];\n\n if (strategy === 'restore') {\n return restore.createLinksWriteStream(mapID, this.strapi, this.transaction, this.onWarning);\n }\n\n throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n check: 'strategy',\n strategy,\n validStrategies: VALID_CONFLICT_STRATEGIES,\n });\n }\n}\n\nexport const createLocalStrapiDestinationProvider = (\n options: ILocalStrapiDestinationProviderOptions\n) => {\n return new LocalStrapiDestinationProvider(options);\n};\n"],"names":["VALID_CONFLICT_STRATEGIES","DEFAULT_CONFLICT_STRATEGY","LocalStrapiDestinationProvider","bootstrap","diagnostics","strapi","options","getStrapi","ProviderInitializationError","db","lifecycles","disable","transaction","utils","close","autoDestroy","assertValidStrapi","end","enable","undefined","destroy","rollback","beforeTransfer","Error","onTransferPhase","attach","trx","strategy","error","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","getSchemas","schemas","contentTypes","components","createEntitiesWriteStream","updateMappingTable","type","oldID","newID","Object","assign","restore","ProviderValidationError","check","validStrategies","createAssetsWriteStream","ProviderTransferError","fileEntitiesMapper","createAssetsDestinationWritable","resolveUploadFileId","metadata","id","restoreMediaEntitiesContent","removeAssetsBackup","bind","createConfigurationWriteStream","createLinksWriteStream","mapID","uid","onWarning","name","assets","notIncluded","entities","include","includes","excluded","exclude","uploadsBackupDirectoryName","now","message","report","details","origin","kind","stream","queryBuilder","select","transacting","file","plugin","provider","delete","formats","fileFormat","values","assetsDirectory","path","join","dirs","static","public","backupDirectory","fse","access","constants","W_OK","R_OK","F_OK","move","mkdir","outputFile","err","code","rm","recursive","force","createLocalStrapiDestinationProvider"],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ var stream = require('stream');
|
|
|
4
4
|
var fp = require('lodash/fp');
|
|
5
5
|
var providers = require('../../../../../errors/providers.js');
|
|
6
6
|
require('crypto');
|
|
7
|
+
require('node:events');
|
|
8
|
+
require('node:stream/promises');
|
|
7
9
|
var json = require('../../../../../utils/json.js');
|
|
8
10
|
require('events');
|
|
9
11
|
var entity = require('../../../../queries/entity.js');
|
|
@@ -1 +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":"
|
|
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,KAAAA,GAAQC,wBAAgC,CAACJ,MAAAA,CAAAA;AAE/C,IAAA,OAAO,IAAIK,eAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AAEZ,QAAA,MAAMC,KAAAA,CAAAA,CAAMC,MAAe,EAAEC,SAAS,EAAEC,QAAQ,EAAA;AAC9C,YAAA,MAAMR,aAAaS,MAAAA,CAAO,UAAA;AACxB,gBAAA,MAAM,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGN,MAAAA;AAC3B,gBAAA,MAAM,EAAEO,MAAM,EAAEC,iCAAiC,EAAE,GAAGb,KAAAA,CAAMS,IAAAA,CAAAA;gBAC5D,MAAMK,WAAAA,GAAcjB,MAAAA,CAAOkB,QAAQ,CAACN,IAAAA,CAAAA;gBAEpC,IAAI;oBACF,MAAMO,OAAAA,GAAU,MAAMJ,MAAAA,CAAO;AAC3BD,wBAAAA,IAAAA;AACAM,wBAAAA,QAAAA,EAAUJ,kCAAkCC,WAAAA,EAAa;4BAAEI,MAAAA,EAAQ;AAAK,yBAAA,CAAA;wBACxEA,MAAAA,EAAQ;AACV,qBAAA,CAAA;;AAGA,oBAAA,MAAMC,KAAAA,GAAQC,SAAS,CAACT,IAAAA,EAAMK,OAAAA,CAAAA;oBAE9BlB,kBAAAA,CAAmBW,IAAAA,EAAMC,EAAAA,EAAIM,OAAAA,CAAQN,EAAE,CAAA;;;oBAIvCS,KAAAA,CAAME,OAAO,CAAC,CAACC,IAAAA,GAAAA;wBACb,IAAIA,IAAAA,CAAKC,IAAI,KAAK,UAAA,IAAcC,OAAAA,CAAKF,KAAKG,IAAI,CAAA,KAAM,IAAA,IAAQ,MAAA,IAAUX,WAAAA,EAAa;AACjF,4BAAA,MAAMY,SAASC,8BAAAA,CAAoB;AAAEC,gCAAAA,KAAAA,EAAON,KAAKG,IAAI;AAAEd,gCAAAA,IAAAA;AAAMG,gCAAAA,WAAAA;AAAajB,gCAAAA;AAAO,6BAAA,CAAA;;AAGjF,4BAAA,IAAI,CAAC6B,MAAAA,EAAQ;AACX,gCAAA;AACF,4BAAA;AAEA,4BAAA,MAAM,CAACG,KAAAA,EAAOC,KAAAA,CAAM,GAAGR,KAAKS,MAAM;AAElCjC,4BAAAA,kBAAAA,CAAmB4B,QAAQG,KAAAA,EAAOC,KAAAA,CAAAA;AACpC,wBAAA;AACF,oBAAA,CAAA,CAAA;AACF,gBAAA,CAAA,CAAE,OAAOE,CAAAA,EAAG;AACV,oBAAA,IAAIA,aAAaC,KAAAA,EAAO;AACtB,wBAAA,OAAO1B,QAAAA,CAASyB,CAAAA,CAAAA;AAClB,oBAAA;oBAEA,OAAOzB,QAAAA,CAAS,IAAI2B,+BAAAA,CAAsB,CAAC,kBAAkB,EAAEzB,IAAAA,CAAK,GAAG,EAAEC,EAAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAChF,gBAAA;AAEA,gBAAA,OAAOH,QAAAA,CAAS,IAAA,CAAA;AAClB,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -2,6 +2,8 @@ import { Writable } from 'stream';
|
|
|
2
2
|
import { last } from 'lodash/fp';
|
|
3
3
|
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
4
4
|
import 'crypto';
|
|
5
|
+
import 'node:events';
|
|
6
|
+
import 'node:stream/promises';
|
|
5
7
|
import { diff } from '../../../../../utils/json.mjs';
|
|
6
8
|
import 'events';
|
|
7
9
|
import { createEntityQuery } from '../../../../queries/entity.mjs';
|
|
@@ -1 +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":"
|
|
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,KAAAA,GAAQC,iBAAgC,CAACJ,MAAAA,CAAAA;AAE/C,IAAA,OAAO,IAAIK,QAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AAEZ,QAAA,MAAMC,KAAAA,CAAAA,CAAMC,MAAe,EAAEC,SAAS,EAAEC,QAAQ,EAAA;AAC9C,YAAA,MAAMR,aAAaS,MAAAA,CAAO,UAAA;AACxB,gBAAA,MAAM,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGN,MAAAA;AAC3B,gBAAA,MAAM,EAAEO,MAAM,EAAEC,iCAAiC,EAAE,GAAGb,KAAAA,CAAMS,IAAAA,CAAAA;gBAC5D,MAAMK,WAAAA,GAAcjB,MAAAA,CAAOkB,QAAQ,CAACN,IAAAA,CAAAA;gBAEpC,IAAI;oBACF,MAAMO,OAAAA,GAAU,MAAMJ,MAAAA,CAAO;AAC3BD,wBAAAA,IAAAA;AACAM,wBAAAA,QAAAA,EAAUJ,kCAAkCC,WAAAA,EAAa;4BAAEI,MAAAA,EAAQ;AAAK,yBAAA,CAAA;wBACxEA,MAAAA,EAAQ;AACV,qBAAA,CAAA;;AAGA,oBAAA,MAAMC,KAAAA,GAAQC,IAAS,CAACT,IAAAA,EAAMK,OAAAA,CAAAA;oBAE9BlB,kBAAAA,CAAmBW,IAAAA,EAAMC,EAAAA,EAAIM,OAAAA,CAAQN,EAAE,CAAA;;;oBAIvCS,KAAAA,CAAME,OAAO,CAAC,CAACC,IAAAA,GAAAA;wBACb,IAAIA,IAAAA,CAAKC,IAAI,KAAK,UAAA,IAAcC,IAAAA,CAAKF,KAAKG,IAAI,CAAA,KAAM,IAAA,IAAQ,MAAA,IAAUX,WAAAA,EAAa;AACjF,4BAAA,MAAMY,SAASC,mBAAAA,CAAoB;AAAEC,gCAAAA,KAAAA,EAAON,KAAKG,IAAI;AAAEd,gCAAAA,IAAAA;AAAMG,gCAAAA,WAAAA;AAAajB,gCAAAA;AAAO,6BAAA,CAAA;;AAGjF,4BAAA,IAAI,CAAC6B,MAAAA,EAAQ;AACX,gCAAA;AACF,4BAAA;AAEA,4BAAA,MAAM,CAACG,KAAAA,EAAOC,KAAAA,CAAM,GAAGR,KAAKS,MAAM;AAElCjC,4BAAAA,kBAAAA,CAAmB4B,QAAQG,KAAAA,EAAOC,KAAAA,CAAAA;AACpC,wBAAA;AACF,oBAAA,CAAA,CAAA;AACF,gBAAA,CAAA,CAAE,OAAOE,CAAAA,EAAG;AACV,oBAAA,IAAIA,aAAaC,KAAAA,EAAO;AACtB,wBAAA,OAAO1B,QAAAA,CAASyB,CAAAA,CAAAA;AAClB,oBAAA;oBAEA,OAAOzB,QAAAA,CAAS,IAAI2B,qBAAAA,CAAsB,CAAC,kBAAkB,EAAEzB,IAAAA,CAAK,GAAG,EAAEC,EAAAA,CAAG,CAAC,CAAC,CAAA,CAAA;AAChF,gBAAA;AAEA,gBAAA,OAAOH,QAAAA,CAAS,IAAA,CAAA;AAClB,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -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":"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"}
|
|
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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"}
|
|
@@ -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 = 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,8 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Duplex } from 'stream';
|
|
3
3
|
import type { Core } from '@strapi/types';
|
|
4
|
+
import type { IFile } from '../../../../types';
|
|
5
|
+
export declare function getFileStatsForTransfer(filepath: string, strapi: Core.Strapi, isLocal?: boolean): Promise<{
|
|
6
|
+
size: number;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function signUploadFileForTransfer(strapi: Core.Strapi, file: IFile): Promise<void>;
|
|
4
9
|
/**
|
|
5
10
|
* Generate and consume assets streams in order to stream each file individually
|
|
6
11
|
*/
|
|
7
|
-
export declare const createAssetsStream: (strapi: Core.Strapi
|
|
12
|
+
export declare const createAssetsStream: (strapi: Core.Strapi, options?: {
|
|
13
|
+
onWarning?: (message: string) => void;
|
|
14
|
+
}) => Duplex;
|
|
8
15
|
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/local-source/assets.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAyB,MAAM,QAAQ,CAAC;AAGvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../src/strapi/providers/local-source/assets.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAyB,MAAM,QAAQ,CAAC;AAGvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAU,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAqCvD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,UAAQ,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB3B;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,iBAiB/E;AAOD;;GAEG;AACH,eAAO,MAAM,kBAAkB,WACrB,KAAK,MAAM,YACV;IAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,KACjD,MAoFF,CAAC"}
|
|
@@ -4,14 +4,14 @@ var path = require('path');
|
|
|
4
4
|
var stream = require('stream');
|
|
5
5
|
var fs = require('fs-extra');
|
|
6
6
|
|
|
7
|
-
function getFileStream(filepath,
|
|
7
|
+
function getFileStream(filepath, strapi, isLocal = false) {
|
|
8
8
|
if (isLocal) {
|
|
9
9
|
// Todo: handle errors
|
|
10
10
|
return fs.createReadStream(filepath);
|
|
11
11
|
}
|
|
12
12
|
const readableStream = new stream.PassThrough();
|
|
13
13
|
// fetch the image from remote url and stream it
|
|
14
|
-
|
|
14
|
+
strapi.fetch(filepath).then((res)=>{
|
|
15
15
|
if (res.status !== 200) {
|
|
16
16
|
readableStream.emit('error', new Error(`Request failed with status code ${res.status}`));
|
|
17
17
|
return;
|
|
@@ -27,12 +27,12 @@ function getFileStream(filepath, strapi1, isLocal = false) {
|
|
|
27
27
|
});
|
|
28
28
|
return readableStream;
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function getFileStatsForTransfer(filepath, strapi, isLocal = false) {
|
|
31
31
|
if (isLocal) {
|
|
32
32
|
return fs.stat(filepath);
|
|
33
33
|
}
|
|
34
34
|
return new Promise((resolve, reject)=>{
|
|
35
|
-
|
|
35
|
+
strapi.fetch(filepath).then((res)=>{
|
|
36
36
|
if (res.status !== 200) {
|
|
37
37
|
reject(new Error(`Request failed with status code ${res.status}`));
|
|
38
38
|
return;
|
|
@@ -47,18 +47,16 @@ function getFileStats(filepath, strapi1, isLocal = false) {
|
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
async function
|
|
50
|
+
async function signUploadFileForTransfer(strapi, file) {
|
|
51
51
|
const { provider } = strapi.plugins.upload;
|
|
52
52
|
const { provider: providerName } = strapi.config.get('plugin.upload');
|
|
53
53
|
const isPrivate = await provider.isPrivate();
|
|
54
54
|
if (file?.provider === providerName && isPrivate) {
|
|
55
|
-
const signUrl = async (
|
|
56
|
-
const signedUrl = await provider.getSignedUrl(
|
|
57
|
-
|
|
55
|
+
const signUrl = async (f)=>{
|
|
56
|
+
const signedUrl = await provider.getSignedUrl(f);
|
|
57
|
+
f.url = signedUrl.url;
|
|
58
58
|
};
|
|
59
|
-
// Sign the original file
|
|
60
59
|
await signUrl(file);
|
|
61
|
-
// Sign each file format
|
|
62
60
|
if (file.formats) {
|
|
63
61
|
for (const format of Object.keys(file.formats)){
|
|
64
62
|
await signUrl(file.formats[format]);
|
|
@@ -66,22 +64,40 @@ async function signFile(file) {
|
|
|
66
64
|
}
|
|
67
65
|
}
|
|
68
66
|
}
|
|
67
|
+
const missingAssetWarningMessage = (file, filepath, format)=>{
|
|
68
|
+
const formatPart = format ? ` (format: ${format})` : '';
|
|
69
|
+
return `[Data transfer] Media item ${file.id} (hash: ${file.hash}) exists in database but no corresponding file was found to transfer${formatPart}. Path: ${filepath}`;
|
|
70
|
+
};
|
|
69
71
|
/**
|
|
70
72
|
* Generate and consume assets streams in order to stream each file individually
|
|
71
|
-
*/ const createAssetsStream = (
|
|
73
|
+
*/ const createAssetsStream = (strapi, options = {})=>{
|
|
74
|
+
const warnMissingAsset = (message)=>{
|
|
75
|
+
strapi.log.warn(message);
|
|
76
|
+
options.onWarning?.(message);
|
|
77
|
+
};
|
|
72
78
|
const generator = async function*() {
|
|
73
|
-
const stream =
|
|
79
|
+
const stream = strapi.db.queryBuilder('plugin::upload.file')// Create a query builder instance (default type is 'select')
|
|
74
80
|
// Fetch all columns
|
|
75
81
|
.select('*')// Get a readable stream
|
|
76
82
|
.stream();
|
|
77
83
|
for await (const file of stream){
|
|
78
84
|
const isLocalProvider = file.provider === 'local';
|
|
79
85
|
if (!isLocalProvider) {
|
|
80
|
-
await
|
|
86
|
+
await signUploadFileForTransfer(strapi, file);
|
|
81
87
|
}
|
|
82
|
-
const filepath = isLocalProvider ? path.join(
|
|
83
|
-
|
|
84
|
-
|
|
88
|
+
const filepath = isLocalProvider ? path.join(strapi.dirs.static.public, file.url) : file.url;
|
|
89
|
+
let stats;
|
|
90
|
+
try {
|
|
91
|
+
stats = await getFileStatsForTransfer(filepath, strapi, isLocalProvider);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
const code = err && typeof err === 'object' && 'code' in err ? err.code : undefined;
|
|
94
|
+
if (code === 'ENOENT') {
|
|
95
|
+
warnMissingAsset(missingAssetWarningMessage(file, filepath));
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
const stream = getFileStream(filepath, strapi, isLocalProvider);
|
|
85
101
|
yield {
|
|
86
102
|
metadata: file,
|
|
87
103
|
filepath,
|
|
@@ -94,9 +110,19 @@ async function signFile(file) {
|
|
|
94
110
|
if (file.formats) {
|
|
95
111
|
for (const format of Object.keys(file.formats)){
|
|
96
112
|
const fileFormat = file.formats[format];
|
|
97
|
-
const fileFormatFilepath = isLocalProvider ? path.join(
|
|
98
|
-
|
|
99
|
-
|
|
113
|
+
const fileFormatFilepath = isLocalProvider ? path.join(strapi.dirs.static.public, fileFormat.url) : fileFormat.url;
|
|
114
|
+
let fileFormatStats;
|
|
115
|
+
try {
|
|
116
|
+
fileFormatStats = await getFileStatsForTransfer(fileFormatFilepath, strapi, isLocalProvider);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
const code = err && typeof err === 'object' && 'code' in err ? err.code : undefined;
|
|
119
|
+
if (code === 'ENOENT') {
|
|
120
|
+
warnMissingAsset(missingAssetWarningMessage(file, fileFormatFilepath, format));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
const fileFormatStream = getFileStream(fileFormatFilepath, strapi, isLocalProvider);
|
|
100
126
|
const metadata = {
|
|
101
127
|
...fileFormat,
|
|
102
128
|
type: format,
|
|
@@ -120,4 +146,6 @@ async function signFile(file) {
|
|
|
120
146
|
};
|
|
121
147
|
|
|
122
148
|
exports.createAssetsStream = createAssetsStream;
|
|
149
|
+
exports.getFileStatsForTransfer = getFileStatsForTransfer;
|
|
150
|
+
exports.signUploadFileForTransfer = signUploadFileForTransfer;
|
|
123
151
|
//# sourceMappingURL=assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sources":["../../../../src/strapi/providers/local-source/assets.ts"],"sourcesContent":["import { join } from 'path';\nimport { Duplex, PassThrough, Readable } from 'stream';\nimport { stat, createReadStream, ReadStream } from 'fs-extra';\nimport * as webStream from 'stream/web';\nimport type { Core } from '@strapi/types';\n\nimport type { IAsset, IFile } from '../../../../types';\n\nfunction getFileStream(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): PassThrough | ReadStream {\n if (isLocal) {\n // Todo: handle errors\n return createReadStream(filepath);\n }\n\n const readableStream = new PassThrough();\n\n // fetch the image from remote url and stream it\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n readableStream.emit('error', new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n if (res.body) {\n // pipe the image data\n Readable.fromWeb(res.body as webStream.ReadableStream<Uint8Array>).pipe(readableStream);\n } else {\n readableStream.emit('error', new Error('Empty data found for file'));\n }\n })\n .catch((error: unknown) => {\n readableStream.emit('error', error);\n });\n\n return readableStream;\n}\n\nfunction getFileStats(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): Promise<{ size: number }> {\n if (isLocal) {\n return stat(filepath);\n }\n return new Promise((resolve, reject) => {\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n reject(new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n const contentLength = res.headers.get('content-length');\n const stats = {\n size: contentLength ? parseInt(contentLength, 10) : 0,\n };\n\n resolve(stats);\n })\n .catch((error: unknown) => {\n reject(error);\n });\n });\n}\n\nasync function signFile(file: IFile) {\n const { provider } = strapi.plugins.upload;\n const { provider: providerName } = strapi.config.get('plugin.upload') as { provider: string };\n const isPrivate = await provider.isPrivate();\n if (file?.provider === providerName && isPrivate) {\n const signUrl = async (file: IFile) => {\n const signedUrl = await provider.getSignedUrl(file);\n file.url = signedUrl.url;\n };\n\n // Sign the original file\n await signUrl(file);\n // Sign each file format\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n await signUrl(file.formats[format]);\n }\n }\n }\n}\n\n/**\n * Generate and consume assets streams in order to stream each file individually\n */\nexport const createAssetsStream = (strapi: Core.Strapi): Duplex => {\n const generator: () => AsyncGenerator<IAsset, void> = async function* () {\n const stream: Readable = strapi.db\n .queryBuilder('plugin::upload.file')\n // Create a query builder instance (default type is 'select')\n // Fetch all columns\n .select('*')\n // Get a readable stream\n .stream();\n\n for await (const file of stream) {\n const isLocalProvider = file.provider === 'local';\n if (!isLocalProvider) {\n await signFile(file);\n }\n const filepath = isLocalProvider ? join(strapi.dirs.static.public, file.url) : file.url;\n const stats = await getFileStats(filepath, strapi, isLocalProvider);\n const stream = getFileStream(filepath, strapi, isLocalProvider);\n\n yield {\n metadata: file,\n filepath,\n filename: file.hash + file.ext,\n stream,\n stats: { size: stats.size },\n };\n\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n const fileFormat = file.formats[format];\n const fileFormatFilepath = isLocalProvider\n ? join(strapi.dirs.static.public, fileFormat.url)\n : fileFormat.url;\n const fileFormatStats = await getFileStats(fileFormatFilepath, strapi, isLocalProvider);\n const fileFormatStream = getFileStream(fileFormatFilepath, strapi, isLocalProvider);\n const metadata = { ...fileFormat, type: format, id: file.id, mainHash: file.hash };\n yield {\n metadata,\n filepath: fileFormatFilepath,\n filename: fileFormat.hash + fileFormat.ext,\n stream: fileFormatStream,\n stats: { size: fileFormatStats.size },\n };\n }\n }\n }\n };\n\n return Duplex.from(generator());\n};\n"],"names":["getFileStream","filepath","strapi","isLocal","createReadStream","readableStream","PassThrough","fetch","then","res","status","emit","Error","body","Readable","fromWeb","pipe","catch","error","getFileStats","stat","Promise","resolve","reject","contentLength","headers","get","stats","size","parseInt","signFile","file","provider","plugins","upload","providerName","config","isPrivate","signUrl","signedUrl","getSignedUrl","url","formats","format","Object","keys","createAssetsStream","generator","stream","db","queryBuilder","select","isLocalProvider","join","dirs","static","public","metadata","filename","hash","ext","fileFormat","fileFormatFilepath","fileFormatStats","fileFormatStream","type","id","mainHash","Duplex","from"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assets.js","sources":["../../../../src/strapi/providers/local-source/assets.ts"],"sourcesContent":["import { join } from 'path';\nimport { Duplex, PassThrough, Readable } from 'stream';\nimport { stat, createReadStream, ReadStream } from 'fs-extra';\nimport * as webStream from 'stream/web';\nimport type { Core } from '@strapi/types';\n\nimport type { IAsset, IFile } from '../../../../types';\n\nfunction getFileStream(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): PassThrough | ReadStream {\n if (isLocal) {\n // Todo: handle errors\n return createReadStream(filepath);\n }\n\n const readableStream = new PassThrough();\n\n // fetch the image from remote url and stream it\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n readableStream.emit('error', new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n if (res.body) {\n // pipe the image data\n Readable.fromWeb(res.body as webStream.ReadableStream<Uint8Array>).pipe(readableStream);\n } else {\n readableStream.emit('error', new Error('Empty data found for file'));\n }\n })\n .catch((error: unknown) => {\n readableStream.emit('error', error);\n });\n\n return readableStream;\n}\n\nexport function getFileStatsForTransfer(\n filepath: string,\n strapi: Core.Strapi,\n isLocal = false\n): Promise<{ size: number }> {\n if (isLocal) {\n return stat(filepath);\n }\n return new Promise((resolve, reject) => {\n strapi\n .fetch(filepath)\n .then((res: Response) => {\n if (res.status !== 200) {\n reject(new Error(`Request failed with status code ${res.status}`));\n return;\n }\n\n const contentLength = res.headers.get('content-length');\n const stats = {\n size: contentLength ? parseInt(contentLength, 10) : 0,\n };\n\n resolve(stats);\n })\n .catch((error: unknown) => {\n reject(error);\n });\n });\n}\n\nexport async function signUploadFileForTransfer(strapi: Core.Strapi, file: IFile) {\n const { provider } = strapi.plugins.upload;\n const { provider: providerName } = strapi.config.get('plugin.upload') as { provider: string };\n const isPrivate = await provider.isPrivate();\n if (file?.provider === providerName && isPrivate) {\n const signUrl = async (f: IFile) => {\n const signedUrl = await provider.getSignedUrl(f);\n f.url = signedUrl.url;\n };\n\n await signUrl(file);\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n await signUrl(file.formats[format]);\n }\n }\n }\n}\n\nconst missingAssetWarningMessage = (file: IFile, filepath: string, format?: string): string => {\n const formatPart = format ? ` (format: ${format})` : '';\n return `[Data transfer] Media item ${file.id} (hash: ${file.hash}) exists in database but no corresponding file was found to transfer${formatPart}. Path: ${filepath}`;\n};\n\n/**\n * Generate and consume assets streams in order to stream each file individually\n */\nexport const createAssetsStream = (\n strapi: Core.Strapi,\n options: { onWarning?: (message: string) => void } = {}\n): Duplex => {\n const warnMissingAsset = (message: string) => {\n strapi.log.warn(message);\n options.onWarning?.(message);\n };\n\n const generator: () => AsyncGenerator<IAsset, void> = async function* () {\n const stream: Readable = strapi.db\n .queryBuilder('plugin::upload.file')\n // Create a query builder instance (default type is 'select')\n // Fetch all columns\n .select('*')\n // Get a readable stream\n .stream();\n\n for await (const file of stream) {\n const isLocalProvider = file.provider === 'local';\n if (!isLocalProvider) {\n await signUploadFileForTransfer(strapi, file);\n }\n const filepath = isLocalProvider ? join(strapi.dirs.static.public, file.url) : file.url;\n let stats: { size: number };\n try {\n stats = await getFileStatsForTransfer(filepath, strapi, isLocalProvider);\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err\n ? (err as NodeJS.ErrnoException).code\n : undefined;\n if (code === 'ENOENT') {\n warnMissingAsset(missingAssetWarningMessage(file, filepath));\n continue;\n }\n throw err;\n }\n const stream = getFileStream(filepath, strapi, isLocalProvider);\n\n yield {\n metadata: file,\n filepath,\n filename: file.hash + file.ext,\n stream,\n stats: { size: stats.size },\n };\n\n if (file.formats) {\n for (const format of Object.keys(file.formats)) {\n const fileFormat = file.formats[format];\n const fileFormatFilepath = isLocalProvider\n ? join(strapi.dirs.static.public, fileFormat.url)\n : fileFormat.url;\n let fileFormatStats: { size: number };\n try {\n fileFormatStats = await getFileStatsForTransfer(\n fileFormatFilepath,\n strapi,\n isLocalProvider\n );\n } catch (err: unknown) {\n const code =\n err && typeof err === 'object' && 'code' in err\n ? (err as NodeJS.ErrnoException).code\n : undefined;\n if (code === 'ENOENT') {\n warnMissingAsset(missingAssetWarningMessage(file, fileFormatFilepath, format));\n continue;\n }\n throw err;\n }\n const fileFormatStream = getFileStream(fileFormatFilepath, strapi, isLocalProvider);\n const metadata = { ...fileFormat, type: format, id: file.id, mainHash: file.hash };\n yield {\n metadata,\n filepath: fileFormatFilepath,\n filename: fileFormat.hash + fileFormat.ext,\n stream: fileFormatStream,\n stats: { size: fileFormatStats.size },\n };\n }\n }\n }\n };\n\n return Duplex.from(generator());\n};\n"],"names":["getFileStream","filepath","strapi","isLocal","createReadStream","readableStream","PassThrough","fetch","then","res","status","emit","Error","body","Readable","fromWeb","pipe","catch","error","getFileStatsForTransfer","stat","Promise","resolve","reject","contentLength","headers","get","stats","size","parseInt","signUploadFileForTransfer","file","provider","plugins","upload","providerName","config","isPrivate","signUrl","f","signedUrl","getSignedUrl","url","formats","format","Object","keys","missingAssetWarningMessage","formatPart","id","hash","createAssetsStream","options","warnMissingAsset","message","log","warn","onWarning","generator","stream","db","queryBuilder","select","isLocalProvider","join","dirs","static","public","err","code","undefined","metadata","filename","ext","fileFormat","fileFormatFilepath","fileFormatStats","fileFormatStream","type","mainHash","Duplex","from"],"mappings":"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"}
|