@strapi/data-transfer 5.56.0 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/directory/providers/source/index.js +3 -3
- package/dist/directory/providers/source/index.js.map +1 -1
- package/dist/directory/providers/source/index.mjs +2 -2
- package/dist/directory/providers/source/index.mjs.map +1 -1
- package/dist/engine/index.js +13 -8
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/index.mjs +9 -4
- package/dist/engine/index.mjs.map +1 -1
- package/dist/engine/validation/provider.js +2 -2
- package/dist/engine/validation/provider.js.map +1 -1
- package/dist/engine/validation/provider.mjs +1 -1
- package/dist/engine/validation/provider.mjs.map +1 -1
- package/dist/engine/validation/schemas/index.js +4 -4
- package/dist/engine/validation/schemas/index.js.map +1 -1
- package/dist/engine/validation/schemas/index.mjs +3 -3
- package/dist/engine/validation/schemas/index.mjs.map +1 -1
- package/dist/file/providers/source/index.js +3 -3
- package/dist/file/providers/source/index.js.map +1 -1
- package/dist/file/providers/source/index.mjs +2 -2
- package/dist/file/providers/source/index.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/index.js +1 -1
- package/dist/strapi/providers/local-destination/index.mjs +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +4 -4
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +4 -4
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +5 -5
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -1
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +5 -3
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -1
- package/dist/strapi/providers/local-source/configuration.d.ts.map +1 -1
- package/dist/strapi/providers/local-source/configuration.js +4 -2
- package/dist/strapi/providers/local-source/configuration.js.map +1 -1
- package/dist/strapi/providers/local-source/configuration.mjs +4 -2
- package/dist/strapi/providers/local-source/configuration.mjs.map +1 -1
- package/dist/strapi/providers/local-source/entities.js +1 -1
- package/dist/strapi/providers/local-source/entities.mjs +1 -1
- package/dist/strapi/providers/local-source/index.js +1 -1
- package/dist/strapi/providers/local-source/index.mjs +1 -1
- package/dist/strapi/providers/remote-destination/index.js +2 -2
- package/dist/strapi/providers/remote-destination/index.js.map +1 -1
- package/dist/strapi/providers/remote-destination/index.mjs +1 -1
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -1
- package/dist/strapi/providers/remote-source/index.d.ts.map +1 -1
- package/dist/strapi/providers/remote-source/index.js +3 -2
- package/dist/strapi/providers/remote-source/index.js.map +1 -1
- package/dist/strapi/providers/remote-source/index.mjs +3 -2
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -1
- package/dist/strapi/queries/entity.js +13 -13
- package/dist/strapi/queries/entity.js.map +1 -1
- package/dist/strapi/queries/entity.mjs +13 -13
- package/dist/strapi/queries/entity.mjs.map +1 -1
- package/dist/strapi/queries/link.js +7 -7
- package/dist/strapi/queries/link.js.map +1 -1
- package/dist/strapi/queries/link.mjs +3 -3
- package/dist/strapi/queries/link.mjs.map +1 -1
- package/dist/strapi/remote/handlers/pull.js +2 -3
- package/dist/strapi/remote/handlers/pull.js.map +1 -1
- package/dist/strapi/remote/handlers/pull.mjs +2 -3
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -1
- package/dist/strapi/remote/handlers/push.js +2 -2
- package/dist/strapi/remote/handlers/push.mjs +2 -2
- package/dist/strapi/utils/project-settings-logos.js +2 -2
- package/dist/strapi/utils/project-settings-logos.js.map +1 -1
- package/dist/strapi/utils/project-settings-logos.mjs +2 -2
- package/dist/strapi/utils/project-settings-logos.mjs.map +1 -1
- package/dist/utils/components.d.ts.map +1 -1
- package/dist/utils/components.js +8 -8
- package/dist/utils/components.js.map +1 -1
- package/dist/utils/components.mjs +9 -9
- package/dist/utils/components.mjs.map +1 -1
- package/dist/utils/json.js +8 -6
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/json.mjs +5 -3
- package/dist/utils/json.mjs.map +1 -1
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +2 -2
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/schema.mjs +2 -2
- package/dist/utils/schema.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/file/providers/source/index.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport type { Readable } from 'stream';\n\nimport zip from 'zlib';\nimport path from 'path';\nimport { pipeline, PassThrough } from 'stream';\nimport { finished } from 'stream/promises';\nimport fs from 'fs-extra';\nimport { Parser, type ReadEntry } from 'tar';\nimport { isEmpty, keyBy } from 'lodash/fp';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ProviderType,\n IFile,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport {\n isFilePathInDirname,\n isPathEquivalent,\n unknownPathToPosix,\n validateAssetMetadata,\n} from './utils';\n\ntype StreamItemArray = Parameters<typeof chain>[0];\n\n/**\n * Constant for the metadata file path\n */\nconst METADATA_FILE_PATH = 'metadata.json';\n\n/**\n * Provider options\n */\nexport interface ILocalFileSourceProviderOptions {\n file: {\n path: string; // the file to load\n };\n\n encryption: {\n enabled: boolean; // if the file is encrypted (and should be decrypted)\n key?: string; // the key to decrypt the file\n };\n\n compression: {\n enabled: boolean; // if the file is compressed (and should be decompressed)\n };\n}\n\nexport const createLocalFileSourceProvider = (options: ILocalFileSourceProviderOptions) => {\n return new LocalFileSourceProvider(options);\n};\n\nclass LocalFileSourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-file';\n\n options: ILocalFileSourceProviderOptions;\n\n #metadata?: IMetadata;\n\n #assetMetadata?: Map<string, IFile>;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileSourceProviderOptions) {\n this.options = options;\n\n const { encryption } = this.options;\n\n if (encryption.enabled && encryption.key === undefined) {\n throw new Error('Missing encryption key');\n }\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * tar `Parser` invokes the pipeline completion callback when the archive ends, but it does not\n * reliably await async `onReadEntry` — defer `end` until outstanding async entry work is done.\n */\n #endPassThroughWhenTarIdle(\n outStream: PassThrough,\n activeAsyncEntries: () => number,\n err?: Error | null\n ) {\n if (err) {\n outStream.destroy(err);\n return;\n }\n const tick = () => {\n if (activeAsyncEntries() === 0) {\n outStream.end();\n } else {\n setImmediate(tick);\n }\n };\n tick();\n }\n\n /**\n * Pre flight checks regarding the provided options, making sure that the file can be opened (decrypted, decompressed), etc.\n */\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const { path: filePath } = this.options.file;\n\n try {\n // Read the metadata to ensure the file can be parsed\n await this.#loadMetadata();\n // TODO: we might also need to read the schema.jsonl files & implements a custom stream-check\n } catch {\n if (this.options?.encryption?.enabled) {\n throw new ProviderInitializationError(\n `Key is incorrect or the file '${filePath}' is not a valid Strapi data file.`\n );\n }\n throw new ProviderInitializationError(`File '${filePath}' is not a valid Strapi data file.`);\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data file.');\n }\n }\n\n async #loadMetadata() {\n const backupStream = this.#getBackupStream();\n this.#metadata = await this.#parseJSONFile<IMetadata>(backupStream, METADATA_FILE_PATH);\n }\n\n async #loadAssetMetadata(sidecarPath: string) {\n const backupStream = this.#getBackupStream();\n const filename = path.posix.basename(sidecarPath).replace(/\\.json$/, '');\n return validateAssetMetadata(\n await this.#parseJSONFile<IFile>(backupStream, sidecarPath),\n filename\n );\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data file.');\n }\n\n // Group schema by UID\n const schemas = keyBy('uid', schemaCollection);\n\n // Transform to valid JSON\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n async validateStage(stage: TransferStage) {\n if (stage !== 'assets') {\n return;\n }\n\n const uploads = new Set<string>();\n const sidecars = new Map<string, Buffer>();\n const inStream = this.#getBackupStream();\n\n await new Promise<void>((resolve, reject) => {\n let activeEntries = 0;\n let archiveFinished = false;\n let validationError: Error | undefined;\n\n const finishWhenIdle = () => {\n if (!archiveFinished || activeEntries > 0) {\n return;\n }\n if (validationError) {\n reject(validationError);\n return;\n }\n resolve();\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return (\n isFilePathInDirname('assets/uploads', filePath) ||\n isFilePathInDirname('assets/metadata', filePath)\n );\n },\n async onReadEntry(entry: ReadEntry) {\n activeEntries += 1;\n const normalizedPath = unknownPathToPosix(entry.path);\n const filename = path.basename(normalizedPath);\n\n try {\n if (isFilePathInDirname('assets/uploads', normalizedPath)) {\n uploads.add(filename);\n entry.resume();\n await finished(entry as unknown as Readable);\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (filename.endsWith('.json')) {\n const assetFilename = filename.slice(0, -'.json'.length);\n sidecars.set(assetFilename, Buffer.concat(chunks));\n }\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n validationError = new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}\": ${reason}`,\n { error }\n );\n } finally {\n activeEntries -= 1;\n finishWhenIdle();\n }\n },\n }),\n ],\n (error) => {\n archiveFinished = true;\n validationError ||= error ?? undefined;\n finishWhenIdle();\n }\n );\n });\n\n const missingSidecars = [...uploads].filter((filename) => !sidecars.has(filename)).sort();\n if (missingSidecars.length > 0) {\n throw new ProviderValidationError(\n `Asset metadata preflight failed: missing sidecar metadata for ${missingSidecars\n .map((filename) => `\"${filename}\"`)\n .join(', ')}. The destination was not modified; re-export and try again.`\n );\n }\n\n const metadata = new Map<string, IFile>();\n for (const filename of uploads) {\n try {\n metadata.set(\n filename,\n validateAssetMetadata(JSON.parse(sidecars.get(filename)!.toString()), filename)\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}.json\": ${reason}. The destination was not modified; re-export and try again.`,\n { error }\n );\n }\n }\n\n this.#assetMetadata = metadata;\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n // NOTE: TBD\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable | Promise<Readable> {\n const inStream = this.#getBackupStream();\n const outStream = new PassThrough({ objectMode: true });\n const loadAssetMetadata = this.#loadAssetMetadata.bind(this);\n const assetMetadata = this.#assetMetadata;\n this.#reportInfo('creating assets read stream');\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n // find only files in the assets/uploads folder\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return isFilePathInDirname('assets/uploads', filePath);\n },\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const { path: filePath, size = 0 } = entry;\n const normalizedPath = unknownPathToPosix(filePath);\n const file = path.basename(normalizedPath);\n const metadata =\n assetMetadata?.get(file) ??\n (await loadAssetMetadata(`assets/metadata/${file}.json`).catch(() => {\n throw new Error(`Failed to read metadata for ${file}`);\n }));\n const asset: IAsset = {\n metadata,\n filename: file,\n filepath: normalizedPath,\n stats: { size },\n stream: entry as unknown as Readable,\n };\n await write(outStream, asset);\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n #getBackupStream() {\n const { file, encryption, compression } = this.options;\n\n const streams: StreamItemArray = [];\n\n try {\n streams.push(fs.createReadStream(file.path));\n } catch {\n throw new Error(`Could not read backup file path provided at \"${this.options.file.path}\"`);\n }\n\n if (encryption.enabled && encryption.key) {\n streams.push(utils.encryption.createDecryptionCipher(encryption.key));\n }\n\n if (compression.enabled) {\n streams.push(zip.createGunzip());\n }\n\n return chain(streams);\n }\n\n // `directory` must be posix formatted path\n #streamJsonlDirectory(directory: string) {\n const inStream = this.#getBackupStream();\n\n const outStream = new PassThrough({ objectMode: true });\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isFilePathInDirname(directory, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const transforms = [\n // JSONL parser to read the data chunks one by one (line by line)\n parser({\n checkErrors: true,\n }),\n // The JSONL parser returns each line as key/value\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = entry.pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(\n `Error parsing backup files from backup file ${entry.path}: ${\n (e as Error).message\n }`,\n {\n details: {\n error: e,\n },\n }\n )\n );\n }\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n // For collecting an entire JSON file then parsing it, not for streaming JSONL\n async #parseJSONFile<T extends object>(fileStream: Readable, filePath: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n pipeline(\n [\n fileStream,\n // Custom backup archive parsing\n new Parser({\n /**\n * Filter the parsed entries to only keep the one that matches the given filepath\n */\n filter(entryPath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isPathEquivalent(entryPath, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n // Collect all the content of the entry stream (ReadEntry has no .collect() in tar v7)\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n try {\n // Parse from buffer array to string to JSON\n const parsedContent = JSON.parse(Buffer.concat(chunks).toString());\n\n // Resolve the Promise with the parsed content\n resolve(parsedContent);\n } catch (e) {\n reject(e);\n } finally {\n // Cleanup (close the stream associated to the entry)\n entry.destroy();\n }\n },\n }),\n ],\n () => {\n // If the promise hasn't been resolved and we've parsed all\n // the archive entries, then the file doesn't exist\n reject(new Error(`File \"${filePath}\" not found`));\n }\n );\n });\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalFileSourceProvider","options","LocalFileSourceProvider","bootstrap","diagnostics","path","filePath","file","encryption","enabled","ProviderInitializationError","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","validateStage","stage","uploads","Set","sidecars","Map","inStream","Promise","resolve","reject","activeEntries","archiveFinished","validationError","finishWhenIdle","pipeline","Parser","filter","entry","type","isFilePathInDirname","onReadEntry","normalizedPath","unknownPathToPosix","filename","basename","add","resume","finished","chunks","chunk","push","Buffer","isBuffer","from","endsWith","assetFilename","slice","length","set","concat","error","reason","Error","message","String","ProviderValidationError","undefined","missingSidecars","has","sort","map","join","metadata","validateAssetMetadata","JSON","parse","get","toString","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","loadAssetMetadata","bind","assetMetadata","activeAsyncEntries","runReadEntry","fn","size","catch","asset","filepath","stats","stream","write","err","name","key","report","details","createdAt","Date","origin","kind","destroy","tick","end","setImmediate","backupStream","sidecarPath","posix","replace","compression","streams","fs","createReadStream","zip","createGunzip","chain","directory","transforms","parser","checkErrors","line","value","pipe","e","ProviderTransferError","fileStream","entryPath","isPathEquivalent","parsedContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/file/providers/source/index.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport type { Readable } from 'stream';\n\nimport zip from 'zlib';\nimport path from 'path';\nimport { pipeline, PassThrough } from 'stream';\nimport { finished } from 'stream/promises';\nimport fs from 'fs-extra';\nimport { Parser, type ReadEntry } from 'tar';\nimport { isEmpty, keyBy } from 'lodash';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ProviderType,\n IFile,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport {\n isFilePathInDirname,\n isPathEquivalent,\n unknownPathToPosix,\n validateAssetMetadata,\n} from './utils';\n\ntype StreamItemArray = Parameters<typeof chain>[0];\n\n/**\n * Constant for the metadata file path\n */\nconst METADATA_FILE_PATH = 'metadata.json';\n\n/**\n * Provider options\n */\nexport interface ILocalFileSourceProviderOptions {\n file: {\n path: string; // the file to load\n };\n\n encryption: {\n enabled: boolean; // if the file is encrypted (and should be decrypted)\n key?: string; // the key to decrypt the file\n };\n\n compression: {\n enabled: boolean; // if the file is compressed (and should be decompressed)\n };\n}\n\nexport const createLocalFileSourceProvider = (options: ILocalFileSourceProviderOptions) => {\n return new LocalFileSourceProvider(options);\n};\n\nclass LocalFileSourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-file';\n\n options: ILocalFileSourceProviderOptions;\n\n #metadata?: IMetadata;\n\n #assetMetadata?: Map<string, IFile>;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileSourceProviderOptions) {\n this.options = options;\n\n const { encryption } = this.options;\n\n if (encryption.enabled && encryption.key === undefined) {\n throw new Error('Missing encryption key');\n }\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * tar `Parser` invokes the pipeline completion callback when the archive ends, but it does not\n * reliably await async `onReadEntry` — defer `end` until outstanding async entry work is done.\n */\n #endPassThroughWhenTarIdle(\n outStream: PassThrough,\n activeAsyncEntries: () => number,\n err?: Error | null\n ) {\n if (err) {\n outStream.destroy(err);\n return;\n }\n const tick = () => {\n if (activeAsyncEntries() === 0) {\n outStream.end();\n } else {\n setImmediate(tick);\n }\n };\n tick();\n }\n\n /**\n * Pre flight checks regarding the provided options, making sure that the file can be opened (decrypted, decompressed), etc.\n */\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const { path: filePath } = this.options.file;\n\n try {\n // Read the metadata to ensure the file can be parsed\n await this.#loadMetadata();\n // TODO: we might also need to read the schema.jsonl files & implements a custom stream-check\n } catch {\n if (this.options?.encryption?.enabled) {\n throw new ProviderInitializationError(\n `Key is incorrect or the file '${filePath}' is not a valid Strapi data file.`\n );\n }\n throw new ProviderInitializationError(`File '${filePath}' is not a valid Strapi data file.`);\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data file.');\n }\n }\n\n async #loadMetadata() {\n const backupStream = this.#getBackupStream();\n this.#metadata = await this.#parseJSONFile<IMetadata>(backupStream, METADATA_FILE_PATH);\n }\n\n async #loadAssetMetadata(sidecarPath: string) {\n const backupStream = this.#getBackupStream();\n const filename = path.posix.basename(sidecarPath).replace(/\\.json$/, '');\n return validateAssetMetadata(\n await this.#parseJSONFile<IFile>(backupStream, sidecarPath),\n filename\n );\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data file.');\n }\n\n // Group schema by UID\n const schemas = keyBy(schemaCollection, 'uid');\n\n // Transform to valid JSON\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n async validateStage(stage: TransferStage) {\n if (stage !== 'assets') {\n return;\n }\n\n const uploads = new Set<string>();\n const sidecars = new Map<string, Buffer>();\n const inStream = this.#getBackupStream();\n\n await new Promise<void>((resolve, reject) => {\n let activeEntries = 0;\n let archiveFinished = false;\n let validationError: Error | undefined;\n\n const finishWhenIdle = () => {\n if (!archiveFinished || activeEntries > 0) {\n return;\n }\n if (validationError) {\n reject(validationError);\n return;\n }\n resolve();\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return (\n isFilePathInDirname('assets/uploads', filePath) ||\n isFilePathInDirname('assets/metadata', filePath)\n );\n },\n async onReadEntry(entry: ReadEntry) {\n activeEntries += 1;\n const normalizedPath = unknownPathToPosix(entry.path);\n const filename = path.basename(normalizedPath);\n\n try {\n if (isFilePathInDirname('assets/uploads', normalizedPath)) {\n uploads.add(filename);\n entry.resume();\n await finished(entry as unknown as Readable);\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (filename.endsWith('.json')) {\n const assetFilename = filename.slice(0, -'.json'.length);\n sidecars.set(assetFilename, Buffer.concat(chunks));\n }\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n validationError = new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}\": ${reason}`,\n { error }\n );\n } finally {\n activeEntries -= 1;\n finishWhenIdle();\n }\n },\n }),\n ],\n (error) => {\n archiveFinished = true;\n validationError ||= error ?? undefined;\n finishWhenIdle();\n }\n );\n });\n\n const missingSidecars = [...uploads].filter((filename) => !sidecars.has(filename)).sort();\n if (missingSidecars.length > 0) {\n throw new ProviderValidationError(\n `Asset metadata preflight failed: missing sidecar metadata for ${missingSidecars\n .map((filename) => `\"${filename}\"`)\n .join(', ')}. The destination was not modified; re-export and try again.`\n );\n }\n\n const metadata = new Map<string, IFile>();\n for (const filename of uploads) {\n try {\n metadata.set(\n filename,\n validateAssetMetadata(JSON.parse(sidecars.get(filename)!.toString()), filename)\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}.json\": ${reason}. The destination was not modified; re-export and try again.`,\n { error }\n );\n }\n }\n\n this.#assetMetadata = metadata;\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n // NOTE: TBD\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable | Promise<Readable> {\n const inStream = this.#getBackupStream();\n const outStream = new PassThrough({ objectMode: true });\n const loadAssetMetadata = this.#loadAssetMetadata.bind(this);\n const assetMetadata = this.#assetMetadata;\n this.#reportInfo('creating assets read stream');\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n // find only files in the assets/uploads folder\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return isFilePathInDirname('assets/uploads', filePath);\n },\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const { path: filePath, size = 0 } = entry;\n const normalizedPath = unknownPathToPosix(filePath);\n const file = path.basename(normalizedPath);\n const metadata =\n assetMetadata?.get(file) ??\n (await loadAssetMetadata(`assets/metadata/${file}.json`).catch(() => {\n throw new Error(`Failed to read metadata for ${file}`);\n }));\n const asset: IAsset = {\n metadata,\n filename: file,\n filepath: normalizedPath,\n stats: { size },\n stream: entry as unknown as Readable,\n };\n await write(outStream, asset);\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n #getBackupStream() {\n const { file, encryption, compression } = this.options;\n\n const streams: StreamItemArray = [];\n\n try {\n streams.push(fs.createReadStream(file.path));\n } catch {\n throw new Error(`Could not read backup file path provided at \"${this.options.file.path}\"`);\n }\n\n if (encryption.enabled && encryption.key) {\n streams.push(utils.encryption.createDecryptionCipher(encryption.key));\n }\n\n if (compression.enabled) {\n streams.push(zip.createGunzip());\n }\n\n return chain(streams);\n }\n\n // `directory` must be posix formatted path\n #streamJsonlDirectory(directory: string) {\n const inStream = this.#getBackupStream();\n\n const outStream = new PassThrough({ objectMode: true });\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isFilePathInDirname(directory, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const transforms = [\n // JSONL parser to read the data chunks one by one (line by line)\n parser({\n checkErrors: true,\n }),\n // The JSONL parser returns each line as key/value\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = entry.pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(\n `Error parsing backup files from backup file ${entry.path}: ${\n (e as Error).message\n }`,\n {\n details: {\n error: e,\n },\n }\n )\n );\n }\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n // For collecting an entire JSON file then parsing it, not for streaming JSONL\n async #parseJSONFile<T extends object>(fileStream: Readable, filePath: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n pipeline(\n [\n fileStream,\n // Custom backup archive parsing\n new Parser({\n /**\n * Filter the parsed entries to only keep the one that matches the given filepath\n */\n filter(entryPath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isPathEquivalent(entryPath, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n // Collect all the content of the entry stream (ReadEntry has no .collect() in tar v7)\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n try {\n // Parse from buffer array to string to JSON\n const parsedContent = JSON.parse(Buffer.concat(chunks).toString());\n\n // Resolve the Promise with the parsed content\n resolve(parsedContent);\n } catch (e) {\n reject(e);\n } finally {\n // Cleanup (close the stream associated to the entry)\n entry.destroy();\n }\n },\n }),\n ],\n () => {\n // If the promise hasn't been resolved and we've parsed all\n // the archive entries, then the file doesn't exist\n reject(new Error(`File \"${filePath}\" not found`));\n }\n );\n });\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalFileSourceProvider","options","LocalFileSourceProvider","bootstrap","diagnostics","path","filePath","file","encryption","enabled","ProviderInitializationError","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","validateStage","stage","uploads","Set","sidecars","Map","inStream","Promise","resolve","reject","activeEntries","archiveFinished","validationError","finishWhenIdle","pipeline","Parser","filter","entry","type","isFilePathInDirname","onReadEntry","normalizedPath","unknownPathToPosix","filename","basename","add","resume","finished","chunks","chunk","push","Buffer","isBuffer","from","endsWith","assetFilename","slice","length","set","concat","error","reason","Error","message","String","ProviderValidationError","undefined","missingSidecars","has","sort","map","join","metadata","validateAssetMetadata","JSON","parse","get","toString","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","loadAssetMetadata","bind","assetMetadata","activeAsyncEntries","runReadEntry","fn","size","catch","asset","filepath","stats","stream","write","err","name","key","report","details","createdAt","Date","origin","kind","destroy","tick","end","setImmediate","backupStream","sidecarPath","posix","replace","compression","streams","fs","createReadStream","zip","createGunzip","chain","directory","transforms","parser","checkErrors","line","value","pipe","e","ProviderTransferError","fileStream","entryPath","isPathEquivalent","parsedContent"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { pipeline, PassThrough } from 'stream';
|
|
|
4
4
|
import { finished } from 'stream/promises';
|
|
5
5
|
import fs__default from 'fs-extra';
|
|
6
6
|
import { Parser } from 'tar';
|
|
7
|
-
import { isEmpty, keyBy } from 'lodash
|
|
7
|
+
import { isEmpty, keyBy } from 'lodash';
|
|
8
8
|
import { chain } from 'stream-chain';
|
|
9
9
|
import { parser } from 'stream-json/jsonl/Parser';
|
|
10
10
|
import 'crypto';
|
|
@@ -71,7 +71,7 @@ class LocalFileSourceProvider {
|
|
|
71
71
|
throw new ProviderInitializationError('Could not load schemas from Strapi data file.');
|
|
72
72
|
}
|
|
73
73
|
// Group schema by UID
|
|
74
|
-
const schemas = keyBy('uid'
|
|
74
|
+
const schemas = keyBy(schemaCollection, 'uid');
|
|
75
75
|
// Transform to valid JSON
|
|
76
76
|
return schemasToValidJSON(schemas);
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/file/providers/source/index.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport type { Readable } from 'stream';\n\nimport zip from 'zlib';\nimport path from 'path';\nimport { pipeline, PassThrough } from 'stream';\nimport { finished } from 'stream/promises';\nimport fs from 'fs-extra';\nimport { Parser, type ReadEntry } from 'tar';\nimport { isEmpty, keyBy } from 'lodash/fp';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ProviderType,\n IFile,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport {\n isFilePathInDirname,\n isPathEquivalent,\n unknownPathToPosix,\n validateAssetMetadata,\n} from './utils';\n\ntype StreamItemArray = Parameters<typeof chain>[0];\n\n/**\n * Constant for the metadata file path\n */\nconst METADATA_FILE_PATH = 'metadata.json';\n\n/**\n * Provider options\n */\nexport interface ILocalFileSourceProviderOptions {\n file: {\n path: string; // the file to load\n };\n\n encryption: {\n enabled: boolean; // if the file is encrypted (and should be decrypted)\n key?: string; // the key to decrypt the file\n };\n\n compression: {\n enabled: boolean; // if the file is compressed (and should be decompressed)\n };\n}\n\nexport const createLocalFileSourceProvider = (options: ILocalFileSourceProviderOptions) => {\n return new LocalFileSourceProvider(options);\n};\n\nclass LocalFileSourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-file';\n\n options: ILocalFileSourceProviderOptions;\n\n #metadata?: IMetadata;\n\n #assetMetadata?: Map<string, IFile>;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileSourceProviderOptions) {\n this.options = options;\n\n const { encryption } = this.options;\n\n if (encryption.enabled && encryption.key === undefined) {\n throw new Error('Missing encryption key');\n }\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * tar `Parser` invokes the pipeline completion callback when the archive ends, but it does not\n * reliably await async `onReadEntry` — defer `end` until outstanding async entry work is done.\n */\n #endPassThroughWhenTarIdle(\n outStream: PassThrough,\n activeAsyncEntries: () => number,\n err?: Error | null\n ) {\n if (err) {\n outStream.destroy(err);\n return;\n }\n const tick = () => {\n if (activeAsyncEntries() === 0) {\n outStream.end();\n } else {\n setImmediate(tick);\n }\n };\n tick();\n }\n\n /**\n * Pre flight checks regarding the provided options, making sure that the file can be opened (decrypted, decompressed), etc.\n */\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const { path: filePath } = this.options.file;\n\n try {\n // Read the metadata to ensure the file can be parsed\n await this.#loadMetadata();\n // TODO: we might also need to read the schema.jsonl files & implements a custom stream-check\n } catch {\n if (this.options?.encryption?.enabled) {\n throw new ProviderInitializationError(\n `Key is incorrect or the file '${filePath}' is not a valid Strapi data file.`\n );\n }\n throw new ProviderInitializationError(`File '${filePath}' is not a valid Strapi data file.`);\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data file.');\n }\n }\n\n async #loadMetadata() {\n const backupStream = this.#getBackupStream();\n this.#metadata = await this.#parseJSONFile<IMetadata>(backupStream, METADATA_FILE_PATH);\n }\n\n async #loadAssetMetadata(sidecarPath: string) {\n const backupStream = this.#getBackupStream();\n const filename = path.posix.basename(sidecarPath).replace(/\\.json$/, '');\n return validateAssetMetadata(\n await this.#parseJSONFile<IFile>(backupStream, sidecarPath),\n filename\n );\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data file.');\n }\n\n // Group schema by UID\n const schemas = keyBy('uid', schemaCollection);\n\n // Transform to valid JSON\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n async validateStage(stage: TransferStage) {\n if (stage !== 'assets') {\n return;\n }\n\n const uploads = new Set<string>();\n const sidecars = new Map<string, Buffer>();\n const inStream = this.#getBackupStream();\n\n await new Promise<void>((resolve, reject) => {\n let activeEntries = 0;\n let archiveFinished = false;\n let validationError: Error | undefined;\n\n const finishWhenIdle = () => {\n if (!archiveFinished || activeEntries > 0) {\n return;\n }\n if (validationError) {\n reject(validationError);\n return;\n }\n resolve();\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return (\n isFilePathInDirname('assets/uploads', filePath) ||\n isFilePathInDirname('assets/metadata', filePath)\n );\n },\n async onReadEntry(entry: ReadEntry) {\n activeEntries += 1;\n const normalizedPath = unknownPathToPosix(entry.path);\n const filename = path.basename(normalizedPath);\n\n try {\n if (isFilePathInDirname('assets/uploads', normalizedPath)) {\n uploads.add(filename);\n entry.resume();\n await finished(entry as unknown as Readable);\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (filename.endsWith('.json')) {\n const assetFilename = filename.slice(0, -'.json'.length);\n sidecars.set(assetFilename, Buffer.concat(chunks));\n }\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n validationError = new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}\": ${reason}`,\n { error }\n );\n } finally {\n activeEntries -= 1;\n finishWhenIdle();\n }\n },\n }),\n ],\n (error) => {\n archiveFinished = true;\n validationError ||= error ?? undefined;\n finishWhenIdle();\n }\n );\n });\n\n const missingSidecars = [...uploads].filter((filename) => !sidecars.has(filename)).sort();\n if (missingSidecars.length > 0) {\n throw new ProviderValidationError(\n `Asset metadata preflight failed: missing sidecar metadata for ${missingSidecars\n .map((filename) => `\"${filename}\"`)\n .join(', ')}. The destination was not modified; re-export and try again.`\n );\n }\n\n const metadata = new Map<string, IFile>();\n for (const filename of uploads) {\n try {\n metadata.set(\n filename,\n validateAssetMetadata(JSON.parse(sidecars.get(filename)!.toString()), filename)\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}.json\": ${reason}. The destination was not modified; re-export and try again.`,\n { error }\n );\n }\n }\n\n this.#assetMetadata = metadata;\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n // NOTE: TBD\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable | Promise<Readable> {\n const inStream = this.#getBackupStream();\n const outStream = new PassThrough({ objectMode: true });\n const loadAssetMetadata = this.#loadAssetMetadata.bind(this);\n const assetMetadata = this.#assetMetadata;\n this.#reportInfo('creating assets read stream');\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n // find only files in the assets/uploads folder\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return isFilePathInDirname('assets/uploads', filePath);\n },\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const { path: filePath, size = 0 } = entry;\n const normalizedPath = unknownPathToPosix(filePath);\n const file = path.basename(normalizedPath);\n const metadata =\n assetMetadata?.get(file) ??\n (await loadAssetMetadata(`assets/metadata/${file}.json`).catch(() => {\n throw new Error(`Failed to read metadata for ${file}`);\n }));\n const asset: IAsset = {\n metadata,\n filename: file,\n filepath: normalizedPath,\n stats: { size },\n stream: entry as unknown as Readable,\n };\n await write(outStream, asset);\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n #getBackupStream() {\n const { file, encryption, compression } = this.options;\n\n const streams: StreamItemArray = [];\n\n try {\n streams.push(fs.createReadStream(file.path));\n } catch {\n throw new Error(`Could not read backup file path provided at \"${this.options.file.path}\"`);\n }\n\n if (encryption.enabled && encryption.key) {\n streams.push(utils.encryption.createDecryptionCipher(encryption.key));\n }\n\n if (compression.enabled) {\n streams.push(zip.createGunzip());\n }\n\n return chain(streams);\n }\n\n // `directory` must be posix formatted path\n #streamJsonlDirectory(directory: string) {\n const inStream = this.#getBackupStream();\n\n const outStream = new PassThrough({ objectMode: true });\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isFilePathInDirname(directory, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const transforms = [\n // JSONL parser to read the data chunks one by one (line by line)\n parser({\n checkErrors: true,\n }),\n // The JSONL parser returns each line as key/value\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = entry.pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(\n `Error parsing backup files from backup file ${entry.path}: ${\n (e as Error).message\n }`,\n {\n details: {\n error: e,\n },\n }\n )\n );\n }\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n // For collecting an entire JSON file then parsing it, not for streaming JSONL\n async #parseJSONFile<T extends object>(fileStream: Readable, filePath: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n pipeline(\n [\n fileStream,\n // Custom backup archive parsing\n new Parser({\n /**\n * Filter the parsed entries to only keep the one that matches the given filepath\n */\n filter(entryPath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isPathEquivalent(entryPath, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n // Collect all the content of the entry stream (ReadEntry has no .collect() in tar v7)\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n try {\n // Parse from buffer array to string to JSON\n const parsedContent = JSON.parse(Buffer.concat(chunks).toString());\n\n // Resolve the Promise with the parsed content\n resolve(parsedContent);\n } catch (e) {\n reject(e);\n } finally {\n // Cleanup (close the stream associated to the entry)\n entry.destroy();\n }\n },\n }),\n ],\n () => {\n // If the promise hasn't been resolved and we've parsed all\n // the archive entries, then the file doesn't exist\n reject(new Error(`File \"${filePath}\" not found`));\n }\n );\n });\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalFileSourceProvider","options","LocalFileSourceProvider","bootstrap","diagnostics","path","filePath","file","encryption","enabled","ProviderInitializationError","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","validateStage","stage","uploads","Set","sidecars","Map","inStream","Promise","resolve","reject","activeEntries","archiveFinished","validationError","finishWhenIdle","pipeline","Parser","filter","entry","type","isFilePathInDirname","onReadEntry","normalizedPath","unknownPathToPosix","filename","basename","add","resume","finished","chunks","chunk","push","Buffer","isBuffer","from","endsWith","assetFilename","slice","length","set","concat","error","reason","Error","message","String","ProviderValidationError","undefined","missingSidecars","has","sort","map","join","metadata","validateAssetMetadata","JSON","parse","get","toString","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","loadAssetMetadata","bind","assetMetadata","activeAsyncEntries","runReadEntry","fn","size","catch","asset","filepath","stats","stream","write","err","name","key","report","details","createdAt","Date","origin","kind","destroy","tick","end","setImmediate","backupStream","sidecarPath","posix","replace","compression","streams","fs","createReadStream","zip","createGunzip","chain","directory","transforms","parser","checkErrors","line","value","pipe","e","ProviderTransferError","fileStream","entryPath","isPathEquivalent","parsedContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/file/providers/source/index.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport type { Readable } from 'stream';\n\nimport zip from 'zlib';\nimport path from 'path';\nimport { pipeline, PassThrough } from 'stream';\nimport { finished } from 'stream/promises';\nimport fs from 'fs-extra';\nimport { Parser, type ReadEntry } from 'tar';\nimport { isEmpty, keyBy } from 'lodash';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ProviderType,\n IFile,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport {\n isFilePathInDirname,\n isPathEquivalent,\n unknownPathToPosix,\n validateAssetMetadata,\n} from './utils';\n\ntype StreamItemArray = Parameters<typeof chain>[0];\n\n/**\n * Constant for the metadata file path\n */\nconst METADATA_FILE_PATH = 'metadata.json';\n\n/**\n * Provider options\n */\nexport interface ILocalFileSourceProviderOptions {\n file: {\n path: string; // the file to load\n };\n\n encryption: {\n enabled: boolean; // if the file is encrypted (and should be decrypted)\n key?: string; // the key to decrypt the file\n };\n\n compression: {\n enabled: boolean; // if the file is compressed (and should be decompressed)\n };\n}\n\nexport const createLocalFileSourceProvider = (options: ILocalFileSourceProviderOptions) => {\n return new LocalFileSourceProvider(options);\n};\n\nclass LocalFileSourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-file';\n\n options: ILocalFileSourceProviderOptions;\n\n #metadata?: IMetadata;\n\n #assetMetadata?: Map<string, IFile>;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileSourceProviderOptions) {\n this.options = options;\n\n const { encryption } = this.options;\n\n if (encryption.enabled && encryption.key === undefined) {\n throw new Error('Missing encryption key');\n }\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-source-provider',\n },\n kind: 'info',\n });\n }\n\n /**\n * tar `Parser` invokes the pipeline completion callback when the archive ends, but it does not\n * reliably await async `onReadEntry` — defer `end` until outstanding async entry work is done.\n */\n #endPassThroughWhenTarIdle(\n outStream: PassThrough,\n activeAsyncEntries: () => number,\n err?: Error | null\n ) {\n if (err) {\n outStream.destroy(err);\n return;\n }\n const tick = () => {\n if (activeAsyncEntries() === 0) {\n outStream.end();\n } else {\n setImmediate(tick);\n }\n };\n tick();\n }\n\n /**\n * Pre flight checks regarding the provided options, making sure that the file can be opened (decrypted, decompressed), etc.\n */\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const { path: filePath } = this.options.file;\n\n try {\n // Read the metadata to ensure the file can be parsed\n await this.#loadMetadata();\n // TODO: we might also need to read the schema.jsonl files & implements a custom stream-check\n } catch {\n if (this.options?.encryption?.enabled) {\n throw new ProviderInitializationError(\n `Key is incorrect or the file '${filePath}' is not a valid Strapi data file.`\n );\n }\n throw new ProviderInitializationError(`File '${filePath}' is not a valid Strapi data file.`);\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data file.');\n }\n }\n\n async #loadMetadata() {\n const backupStream = this.#getBackupStream();\n this.#metadata = await this.#parseJSONFile<IMetadata>(backupStream, METADATA_FILE_PATH);\n }\n\n async #loadAssetMetadata(sidecarPath: string) {\n const backupStream = this.#getBackupStream();\n const filename = path.posix.basename(sidecarPath).replace(/\\.json$/, '');\n return validateAssetMetadata(\n await this.#parseJSONFile<IFile>(backupStream, sidecarPath),\n filename\n );\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data file.');\n }\n\n // Group schema by UID\n const schemas = keyBy(schemaCollection, 'uid');\n\n // Transform to valid JSON\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n async validateStage(stage: TransferStage) {\n if (stage !== 'assets') {\n return;\n }\n\n const uploads = new Set<string>();\n const sidecars = new Map<string, Buffer>();\n const inStream = this.#getBackupStream();\n\n await new Promise<void>((resolve, reject) => {\n let activeEntries = 0;\n let archiveFinished = false;\n let validationError: Error | undefined;\n\n const finishWhenIdle = () => {\n if (!archiveFinished || activeEntries > 0) {\n return;\n }\n if (validationError) {\n reject(validationError);\n return;\n }\n resolve();\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return (\n isFilePathInDirname('assets/uploads', filePath) ||\n isFilePathInDirname('assets/metadata', filePath)\n );\n },\n async onReadEntry(entry: ReadEntry) {\n activeEntries += 1;\n const normalizedPath = unknownPathToPosix(entry.path);\n const filename = path.basename(normalizedPath);\n\n try {\n if (isFilePathInDirname('assets/uploads', normalizedPath)) {\n uploads.add(filename);\n entry.resume();\n await finished(entry as unknown as Readable);\n } else {\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (filename.endsWith('.json')) {\n const assetFilename = filename.slice(0, -'.json'.length);\n sidecars.set(assetFilename, Buffer.concat(chunks));\n }\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n validationError = new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}\": ${reason}`,\n { error }\n );\n } finally {\n activeEntries -= 1;\n finishWhenIdle();\n }\n },\n }),\n ],\n (error) => {\n archiveFinished = true;\n validationError ||= error ?? undefined;\n finishWhenIdle();\n }\n );\n });\n\n const missingSidecars = [...uploads].filter((filename) => !sidecars.has(filename)).sort();\n if (missingSidecars.length > 0) {\n throw new ProviderValidationError(\n `Asset metadata preflight failed: missing sidecar metadata for ${missingSidecars\n .map((filename) => `\"${filename}\"`)\n .join(', ')}. The destination was not modified; re-export and try again.`\n );\n }\n\n const metadata = new Map<string, IFile>();\n for (const filename of uploads) {\n try {\n metadata.set(\n filename,\n validateAssetMetadata(JSON.parse(sidecars.get(filename)!.toString()), filename)\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ProviderValidationError(\n `Asset metadata preflight failed for \"${filename}.json\": ${reason}. The destination was not modified; re-export and try again.`,\n { error }\n );\n }\n }\n\n this.#assetMetadata = metadata;\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n // NOTE: TBD\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable | Promise<Readable> {\n const inStream = this.#getBackupStream();\n const outStream = new PassThrough({ objectMode: true });\n const loadAssetMetadata = this.#loadAssetMetadata.bind(this);\n const assetMetadata = this.#assetMetadata;\n this.#reportInfo('creating assets read stream');\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n // find only files in the assets/uploads folder\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n return isFilePathInDirname('assets/uploads', filePath);\n },\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const { path: filePath, size = 0 } = entry;\n const normalizedPath = unknownPathToPosix(filePath);\n const file = path.basename(normalizedPath);\n const metadata =\n assetMetadata?.get(file) ??\n (await loadAssetMetadata(`assets/metadata/${file}.json`).catch(() => {\n throw new Error(`Failed to read metadata for ${file}`);\n }));\n const asset: IAsset = {\n metadata,\n filename: file,\n filepath: normalizedPath,\n stats: { size },\n stream: entry as unknown as Readable,\n };\n await write(outStream, asset);\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n #getBackupStream() {\n const { file, encryption, compression } = this.options;\n\n const streams: StreamItemArray = [];\n\n try {\n streams.push(fs.createReadStream(file.path));\n } catch {\n throw new Error(`Could not read backup file path provided at \"${this.options.file.path}\"`);\n }\n\n if (encryption.enabled && encryption.key) {\n streams.push(utils.encryption.createDecryptionCipher(encryption.key));\n }\n\n if (compression.enabled) {\n streams.push(zip.createGunzip());\n }\n\n return chain(streams);\n }\n\n // `directory` must be posix formatted path\n #streamJsonlDirectory(directory: string) {\n const inStream = this.#getBackupStream();\n\n const outStream = new PassThrough({ objectMode: true });\n\n let activeAsyncEntries = 0;\n const runReadEntry = async (fn: () => Promise<void>) => {\n activeAsyncEntries += 1;\n try {\n await fn();\n } finally {\n activeAsyncEntries -= 1;\n }\n };\n\n pipeline(\n [\n inStream,\n new Parser({\n filter(filePath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isFilePathInDirname(directory, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n await runReadEntry(async () => {\n const transforms = [\n // JSONL parser to read the data chunks one by one (line by line)\n parser({\n checkErrors: true,\n }),\n // The JSONL parser returns each line as key/value\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = entry.pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(\n `Error parsing backup files from backup file ${entry.path}: ${\n (e as Error).message\n }`,\n {\n details: {\n error: e,\n },\n }\n )\n );\n }\n });\n },\n }),\n ],\n (err) => this.#endPassThroughWhenTarIdle(outStream, () => activeAsyncEntries, err)\n );\n\n return outStream;\n }\n\n // For collecting an entire JSON file then parsing it, not for streaming JSONL\n async #parseJSONFile<T extends object>(fileStream: Readable, filePath: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n pipeline(\n [\n fileStream,\n // Custom backup archive parsing\n new Parser({\n /**\n * Filter the parsed entries to only keep the one that matches the given filepath\n */\n filter(entryPath: string, entry: Stats | ReadEntry) {\n if (!('type' in entry) || entry.type !== 'File') {\n return false;\n }\n\n return isPathEquivalent(entryPath, filePath);\n },\n\n async onReadEntry(entry: ReadEntry) {\n // Collect all the content of the entry stream (ReadEntry has no .collect() in tar v7)\n const chunks: Buffer[] = [];\n for await (const chunk of entry) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n try {\n // Parse from buffer array to string to JSON\n const parsedContent = JSON.parse(Buffer.concat(chunks).toString());\n\n // Resolve the Promise with the parsed content\n resolve(parsedContent);\n } catch (e) {\n reject(e);\n } finally {\n // Cleanup (close the stream associated to the entry)\n entry.destroy();\n }\n },\n }),\n ],\n () => {\n // If the promise hasn't been resolved and we've parsed all\n // the archive entries, then the file doesn't exist\n reject(new Error(`File \"${filePath}\" not found`));\n }\n );\n });\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalFileSourceProvider","options","LocalFileSourceProvider","bootstrap","diagnostics","path","filePath","file","encryption","enabled","ProviderInitializationError","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","validateStage","stage","uploads","Set","sidecars","Map","inStream","Promise","resolve","reject","activeEntries","archiveFinished","validationError","finishWhenIdle","pipeline","Parser","filter","entry","type","isFilePathInDirname","onReadEntry","normalizedPath","unknownPathToPosix","filename","basename","add","resume","finished","chunks","chunk","push","Buffer","isBuffer","from","endsWith","assetFilename","slice","length","set","concat","error","reason","Error","message","String","ProviderValidationError","undefined","missingSidecars","has","sort","map","join","metadata","validateAssetMetadata","JSON","parse","get","toString","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","loadAssetMetadata","bind","assetMetadata","activeAsyncEntries","runReadEntry","fn","size","catch","asset","filepath","stats","stream","write","err","name","key","report","details","createdAt","Date","origin","kind","destroy","tick","end","setImmediate","backupStream","sidecarPath","posix","replace","compression","streams","fs","createReadStream","zip","createGunzip","chain","directory","transforms","parser","checkErrors","line","value","pipe","e","ProviderTransferError","fileStream","entryPath","isPathEquivalent","parsedContent"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ require('crypto');
|
|
|
8
8
|
require('node:events');
|
|
9
9
|
require('node:stream/promises');
|
|
10
10
|
require('stream');
|
|
11
|
-
require('lodash
|
|
11
|
+
require('lodash');
|
|
12
12
|
var schema = require('../../../utils/schema.js');
|
|
13
13
|
var transaction = require('../../../utils/transaction.js');
|
|
14
14
|
require('events');
|
|
@@ -6,7 +6,7 @@ import 'crypto';
|
|
|
6
6
|
import 'node:events';
|
|
7
7
|
import 'node:stream/promises';
|
|
8
8
|
import 'stream';
|
|
9
|
-
import 'lodash
|
|
9
|
+
import 'lodash';
|
|
10
10
|
import { schemasToValidJSON, mapSchemasValues } from '../../../utils/schema.mjs';
|
|
11
11
|
import { createTransaction } from '../../../utils/transaction.mjs';
|
|
12
12
|
import 'events';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var stream = require('stream');
|
|
4
|
-
var
|
|
4
|
+
var _ = require('lodash');
|
|
5
5
|
var chalk = require('chalk');
|
|
6
6
|
var providers = require('../../../../../errors/providers.js');
|
|
7
7
|
var projectSettingsLogos = require('../../../../utils/project-settings-logos.js');
|
|
@@ -10,9 +10,9 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
10
10
|
|
|
11
11
|
var chalk__default = /*#__PURE__*/_interopDefault(chalk);
|
|
12
12
|
|
|
13
|
-
const omitInvalidCreationAttributes =
|
|
14
|
-
|
|
15
|
-
]);
|
|
13
|
+
const omitInvalidCreationAttributes = (data)=>_.omit(data, [
|
|
14
|
+
'id'
|
|
15
|
+
]);
|
|
16
16
|
const restoreCoreStore = async (strapi, values)=>{
|
|
17
17
|
const data = omitInvalidCreationAttributes(values);
|
|
18
18
|
const row = await projectSettingsLogos.restoreProjectSettingsRow(strapi, data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash
|
|
1
|
+
{"version":3,"file":"configuration.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = <T extends object>(data: T) => omit(data, ['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch (error) {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}): ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","data","omit","restoreCoreStore","strapi","values","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","error","ProviderTransferError","chalk","yellowBright","greenBright","id","Error","message","String"],"mappings":";;;;;;;;;;;;AAQA,MAAMA,6BAAAA,GAAgC,CAAmBC,IAAAA,GAAYC,MAAAA,CAAKD,IAAAA,EAAM;AAAC,QAAA;AAAK,KAAA,CAAA;AAEtF,MAAME,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMJ,OAAOD,6BAAAA,CAA8BK,MAAAA,CAAAA;IAC3C,MAAMC,GAAAA,GAAM,MAAMC,8CAAAA,CAChBH,MAAAA,EACAH,IAAAA,CAAAA;AAGF,IAAA,OAAOG,OAAOI,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDT,IAAAA,EAAM;AACJ,YAAA,GAAGK,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCV,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMJ,OAAOD,6BAAAA,CAA8BK,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOI,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAET,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMc,cAAAA,GAAiB,OAAOX,MAAAA,EAAqBY,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOd,gBAAAA,CAAiBC,MAAAA,EAAQY,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBV,MAAAA,EAAQY,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cd,MAAAA,EACAe,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,eAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeX,MAAAA,EAAQY,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOU,KAAAA,EAAO;AACd,oBAAA,OAAOF,QAAAA,CACL,IAAIG,+BAAAA,CACF,CAAC,iBAAiB,EAAEC,sBAAAA,CAAMC,YAAY,CAACb,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEW,sBAAAA,CAAME,WAAW,CACvEd,MAAAA,CAAOL,KAAK,CAACoB,EAAE,CAAA,CACf,GAAG,EAAEL,KAAAA,YAAiBM,KAAAA,GAAQN,KAAAA,CAAMO,OAAO,GAAGC,OAAOR,KAAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA;AAGrE,gBAAA;AACAF,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Writable } from 'stream';
|
|
2
|
-
import { omit } from 'lodash
|
|
2
|
+
import { omit } from 'lodash';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
5
5
|
import { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos.mjs';
|
|
6
6
|
|
|
7
|
-
const omitInvalidCreationAttributes = omit([
|
|
8
|
-
|
|
9
|
-
]);
|
|
7
|
+
const omitInvalidCreationAttributes = (data)=>omit(data, [
|
|
8
|
+
'id'
|
|
9
|
+
]);
|
|
10
10
|
const restoreCoreStore = async (strapi, values)=>{
|
|
11
11
|
const data = omitInvalidCreationAttributes(values);
|
|
12
12
|
const row = await restoreProjectSettingsRow(strapi, data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash
|
|
1
|
+
{"version":3,"file":"configuration.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/configuration.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { omit } from 'lodash';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { IConfiguration, Transaction } from '../../../../../types';\nimport { restoreProjectSettingsRow } from '../../../../utils/project-settings-logos';\n\nconst omitInvalidCreationAttributes = <T extends object>(data: T) => omit(data, ['id']);\n\nconst restoreCoreStore = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n const row = await restoreProjectSettingsRow(\n strapi,\n data as unknown as { key: string; value: unknown }\n );\n\n return strapi.db.query('strapi::core-store').create({\n data: {\n ...row,\n value: JSON.stringify(row.value),\n },\n });\n};\n\nconst restoreWebhooks = async <T extends { value: unknown }>(strapi: Core.Strapi, values: T) => {\n const data = omitInvalidCreationAttributes(values);\n return strapi.db.query('strapi::webhook').create({ data });\n};\n\nexport const restoreConfigs = async (strapi: Core.Strapi, config: IConfiguration) => {\n if (config.type === 'core-store') {\n return restoreCoreStore(strapi, config.value as { value: unknown });\n }\n\n if (config.type === 'webhook') {\n return restoreWebhooks(strapi, config.value as { value: unknown });\n }\n};\n\nexport const createConfigurationWriteStream = async (\n strapi: Core.Strapi,\n transaction?: Transaction\n) => {\n return new Writable({\n objectMode: true,\n async write<T extends { id: number }>(\n config: IConfiguration<T>,\n _encoding: BufferEncoding,\n callback: (error?: Error | null) => void\n ) {\n await transaction?.attach(async () => {\n try {\n await restoreConfigs(strapi, config);\n } catch (error) {\n return callback(\n new ProviderTransferError(\n `Failed to import ${chalk.yellowBright(config.type)} (${chalk.greenBright(\n config.value.id\n )}): ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n callback();\n });\n },\n });\n};\n"],"names":["omitInvalidCreationAttributes","data","omit","restoreCoreStore","strapi","values","row","restoreProjectSettingsRow","db","query","create","value","JSON","stringify","restoreWebhooks","restoreConfigs","config","type","createConfigurationWriteStream","transaction","Writable","objectMode","write","_encoding","callback","attach","error","ProviderTransferError","chalk","yellowBright","greenBright","id","Error","message","String"],"mappings":";;;;;;AAQA,MAAMA,6BAAAA,GAAgC,CAAmBC,IAAAA,GAAYC,IAAAA,CAAKD,IAAAA,EAAM;AAAC,QAAA;AAAK,KAAA,CAAA;AAEtF,MAAME,gBAAAA,GAAmB,OAAqCC,MAAAA,EAAqBC,MAAAA,GAAAA;AACjF,IAAA,MAAMJ,OAAOD,6BAAAA,CAA8BK,MAAAA,CAAAA;IAC3C,MAAMC,GAAAA,GAAM,MAAMC,yBAAAA,CAChBH,MAAAA,EACAH,IAAAA,CAAAA;AAGF,IAAA,OAAOG,OAAOI,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,MAAM,CAAC;QAClDT,IAAAA,EAAM;AACJ,YAAA,GAAGK,GAAG;AACNK,YAAAA,KAAAA,EAAOC,IAAAA,CAAKC,SAAS,CAACP,GAAAA,CAAIK,KAAK;AACjC;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMG,eAAAA,GAAkB,OAAqCV,MAAAA,EAAqBC,MAAAA,GAAAA;AAChF,IAAA,MAAMJ,OAAOD,6BAAAA,CAA8BK,MAAAA,CAAAA;AAC3C,IAAA,OAAOD,OAAOI,EAAE,CAACC,KAAK,CAAC,iBAAA,CAAA,CAAmBC,MAAM,CAAC;AAAET,QAAAA;AAAK,KAAA,CAAA;AAC1D,CAAA;AAEO,MAAMc,cAAAA,GAAiB,OAAOX,MAAAA,EAAqBY,MAAAA,GAAAA;IACxD,IAAIA,MAAAA,CAAOC,IAAI,KAAK,YAAA,EAAc;QAChC,OAAOd,gBAAAA,CAAiBC,MAAAA,EAAQY,MAAAA,CAAOL,KAAK,CAAA;AAC9C,IAAA;IAEA,IAAIK,MAAAA,CAAOC,IAAI,KAAK,SAAA,EAAW;QAC7B,OAAOH,eAAAA,CAAgBV,MAAAA,EAAQY,MAAAA,CAAOL,KAAK,CAAA;AAC7C,IAAA;AACF;AAEO,MAAMO,8BAAAA,GAAiC,OAC5Cd,MAAAA,EACAe,WAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,QAAAA,CAAS;QAClBC,UAAAA,EAAY,IAAA;AACZ,QAAA,MAAMC,KAAAA,CAAAA,CACJN,MAAyB,EACzBO,SAAyB,EACzBC,QAAwC,EAAA;AAExC,YAAA,MAAML,aAAaM,MAAAA,CAAO,UAAA;gBACxB,IAAI;AACF,oBAAA,MAAMV,eAAeX,MAAAA,EAAQY,MAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOU,KAAAA,EAAO;AACd,oBAAA,OAAOF,QAAAA,CACL,IAAIG,qBAAAA,CACF,CAAC,iBAAiB,EAAEC,KAAAA,CAAMC,YAAY,CAACb,MAAAA,CAAOC,IAAI,CAAA,CAAE,EAAE,EAAEW,KAAAA,CAAME,WAAW,CACvEd,MAAAA,CAAOL,KAAK,CAACoB,EAAE,CAAA,CACf,GAAG,EAAEL,KAAAA,YAAiBM,KAAAA,GAAQN,KAAAA,CAAMO,OAAO,GAAGC,OAAOR,KAAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA;AAGrE,gBAAA;AACAF,gBAAAA,QAAAA,EAAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AACF;;;;"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var stream = require('stream');
|
|
4
4
|
var providers = require('../../../../../errors/providers.js');
|
|
5
5
|
var entity = require('../../../../queries/entity.js');
|
|
6
|
-
require('lodash
|
|
6
|
+
require('lodash');
|
|
7
7
|
var components = require('../../../../../utils/components.js');
|
|
8
8
|
|
|
9
9
|
const createEntitiesWriteStream = (options)=>{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Writable } from 'stream';
|
|
2
2
|
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
3
3
|
import { createEntityQuery } from '../../../../queries/entity.mjs';
|
|
4
|
-
import 'lodash
|
|
4
|
+
import 'lodash';
|
|
5
5
|
import { collectComponentIdMappings } from '../../../../../utils/components.mjs';
|
|
6
6
|
|
|
7
7
|
const createEntitiesWriteStream = (options)=>{
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var providers = require('../../../../../errors/providers.js');
|
|
4
4
|
var entity = require('../../../../queries/entity.js');
|
|
5
|
-
require('lodash/fp');
|
|
6
|
-
require('stream');
|
|
7
5
|
require('lodash');
|
|
6
|
+
require('stream');
|
|
8
7
|
require('@strapi/utils');
|
|
9
|
-
|
|
8
|
+
require('chalk');
|
|
9
|
+
require('path');
|
|
10
|
+
require('fs-extra');
|
|
11
|
+
require('mime-types');
|
|
10
12
|
require('crypto');
|
|
11
13
|
|
|
12
14
|
const deleteRecords = async (strapi, options)=>{
|
|
@@ -119,7 +121,5 @@ const useResults = (keys)=>{
|
|
|
119
121
|
];
|
|
120
122
|
};
|
|
121
123
|
|
|
122
|
-
exports.createConfigurationWriteStream = configuration.createConfigurationWriteStream;
|
|
123
|
-
exports.restoreConfigs = configuration.restoreConfigs;
|
|
124
124
|
exports.deleteRecords = deleteRecords;
|
|
125
125
|
//# sourceMappingURL=index.js.map
|
|
@@ -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 =\n removeThisContentType && entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":";;;;;;;;;;;AAwBO,MAAMA,aAAAA,GAAgB,OAAOC,MAAAA,EAAqBC,OAAAA,GAAAA;IACvD,MAAMC,QAAAA,GAAW,MAAMC,qBAAAA,CAAsBH,MAAAA,EAAQC,OAAAA,CAAAA;IACrD,MAAMG,aAAAA,GAAgB,MAAMC,0BAAAA,CAA2BL,MAAAA,EAAQC,OAAAA,CAAAA;IAE/D,OAAO;AACLK,QAAAA,KAAAA,EAAOJ,QAAAA,CAASI,KAAK,GAAGF,aAAAA,CAAcE,KAAK;AAC3CJ,QAAAA,QAAAA;AACAE,QAAAA;AACF,KAAA;AACF;AAEA,MAAMD,qBAAAA,GAAwB,OAC5BH,MAAAA,EACAC,OAAAA,GAA2B,EAAE,GAAA;IAE7B,MAAM,EAAEC,QAAQ,EAAE,GAAGD,OAAAA;AAErB,IAAA,MAAMM,MAAAA,GAASP,MAAAA,CAAOQ,GAAG,CAAC,UAAUA,GAAG,EAAA;AACvC,IAAA,MAAMC,YAAAA,GAAeC,MAAAA,CAAOC,MAAM,CAACX,OAAOS,YAAY,CAAA;AAEtD,IAAA,MAAMG,mBAAAA,GAAsBH,YAAAA,CACzBI,MAAM,CAAC,CAACC,WAAAA,GAAAA;AACP,QAAA,IAAIC,qBAAAA,GAAwB,IAAA;;AAG5B,QAAA,IAAIb,UAAUc,OAAAA,EAAS;AACrBD,YAAAA,qBAAAA,GAAwBb,SAASc,OAAO,CAACC,QAAQ,CAACH,YAAYI,GAAG,CAAA;AACnE,QAAA;;QAGA,IAAIhB,QAAAA,EAAUiB,WAAWjB,QAAAA,CAASiB,OAAO,CAACF,QAAQ,CAACH,WAAAA,CAAYI,GAAG,CAAA,EAAG;YACnEH,qBAAAA,GAAwB,KAAA;AAC1B,QAAA;AAEA,QAAA,IAAIb,UAAUkB,OAAAA,EAAS;YACrBL,qBAAAA,GACEA,qBAAAA,IAAyBb,SAASkB,OAAO,CAACC,KAAK,CAAC,CAACR,SAAWA,MAAAA,CAAOC,WAAAA,CAAAA,CAAAA;AACvE,QAAA;QAEA,OAAOC,qBAAAA;AACT,IAAA,CAAA,CAAA,CACCO,GAAG,CAAC,CAACR,WAAAA,GAAgBA,YAAYI,GAAG,CAAA;AAEvC,IAAA,MAAMK,aAAAA,GAAgBhB,MAAAA,CACnBM,MAAM,CAAC,CAACW,KAAAA,GAAAA;AACP,QAAA,IAAIZ,mBAAAA,CAAoBK,QAAQ,CAACO,KAAAA,CAAMN,GAAG,CAAA,EAAsB;YAC9D,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,IAAIO,eAAAA,GAAkB,IAAA;;AAGtB,QAAA,IAAIvB,UAAUc,OAAAA,EAAS;AACrBS,YAAAA,eAAAA,GAAkBvB,SAASc,OAAO,CAACC,QAAQ,CAACO,MAAMN,GAAG,CAAA;AACvD,QAAA;;QAGA,IAAIhB,QAAAA,EAAUiB,WAAWjB,QAAAA,CAASiB,OAAO,CAACF,QAAQ,CAACO,KAAAA,CAAMN,GAAG,CAAA,EAAG;YAC7DO,eAAAA,GAAkB,KAAA;AACpB,QAAA;QAEA,OAAOA,eAAAA;AACT,IAAA,CAAA,CAAA,CACCH,GAAG,CAAC,CAACE,KAAAA,GAAUA,MAAMN,GAAG,CAAA;AAE3B,IAAA,MAAM,CAACQ,OAAAA,EAASC,aAAAA,CAAc,GAAGC,UAAAA,CAAW;AAAIhB,QAAAA,GAAAA,mBAAAA;AAAwBW,QAAAA,GAAAA;AAAc,KAAA,CAAA;AAEtF,IAAA,MAAMM,gBAAAA,GAAmBC,wBAAgC,CAAC9B,MAAAA,CAAAA;AAE1D,IAAA,MAAM+B,mBAAAA,GAAsBnB,mBAAAA,CAAoBU,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;AACzD,QAAA,MAAMc,SAAS,MAAMH,gBAAAA,CAAiBX,GAAAA,CAAAA,CAAKe,UAAU,CAAC/B,QAAAA,EAAUgC,MAAAA,CAAAA;AAEhE,QAAA,IAAIF,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,IAAI,CAAA,EAAGY,GAAAA,CAAAA;AACnC,QAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMiB,cAAAA,GAAiBZ,aAAAA,CAAcD,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;QAC9C,MAAMc,MAAAA,GAAS,MAAMhC,MAAAA,CAAOoC,EAAE,CAACC,KAAK,CAACnB,GAAAA,CAAAA,CAAKe,UAAU,CAAC,EAAC,CAAA;AAEtD,QAAA,IAAID,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,IAAI,CAAA,EAAGY,GAAAA,CAAAA;AACnC,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,MAAMoB,OAAAA,CAAQC,GAAG,CAAC;AAAIR,QAAAA,GAAAA,mBAAAA;AAAwBI,QAAAA,GAAAA;AAAe,KAAA,CAAA;IAE7D,OAAOT,OAAAA;AACT,CAAA;AAEA,MAAMrB,0BAAAA,GAA6B,OACjCL,MAAAA,EACAC,OAAAA,GAA2B,EAAE,GAAA;IAE7B,MAAM,EAAEuC,SAAAA,GAAY,IAAI,EAAEC,OAAAA,GAAU,IAAI,EAAE,GAAGxC,OAAAA,EAASG,aAAAA,IAAiB,EAAC;AAExE,IAAA,MAAMG,SAAmB,EAAE;AAE3B,IAAA,IAAIiC,SAAAA,EAAW;AACbjC,QAAAA,MAAAA,CAAOmC,IAAI,CAAC,oBAAA,CAAA;AACd,IAAA;AAEA,IAAA,IAAID,OAAAA,EAAS;AACXlC,QAAAA,MAAAA,CAAOmC,IAAI,CAAC,iBAAA,CAAA;AACd,IAAA;AAEA,IAAA,MAAM,CAAChB,OAAAA,EAASC,aAAAA,CAAc,GAAGC,UAAAA,CAAWrB,MAAAA,CAAAA;AAE5C,IAAA,MAAMoC,cAAAA,GAAiBpC,MAAAA,CAAOe,GAAG,CAAC,OAAOJ,GAAAA,GAAAA;QACvC,MAAMc,MAAAA,GAAS,MAAMhC,MAAAA,CAAOoC,EAAE,CAACC,KAAK,CAACnB,GAAAA,CAAAA,CAAKe,UAAU,CAAC,EAAC,CAAA;AAEtD,QAAA,IAAID,MAAAA,EAAQ;YACVL,aAAAA,CAAcK,MAAAA,CAAO1B,KAAK,EAAEY,GAAAA,CAAAA;AAC9B,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,MAAMoB,OAAAA,CAAQC,GAAG,CAACI,cAAAA,CAAAA;IAElB,OAAOjB,OAAAA;AACT,CAAA;AAEA,MAAME,aAAa,CACjBgB,IAAAA,GAAAA;AAEA,IAAA,MAAMlB,OAAAA,GAA0B;QAC9BpB,KAAAA,EAAO,CAAA;AACPuC,QAAAA,SAAAA,EAAWD,KAAKE,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAS;AAAE,gBAAA,GAAGD,GAAG;AAAE,gBAAA,CAACC,MAAM;oBAAE1C,KAAAA,EAAO;AAAE;AAAE,aAAA,GAAI,EAAC;AAC3E,KAAA;IAEA,MAAM2C,MAAAA,GAAS,CAAC3C,KAAAA,EAAe0C,GAAAA,GAAAA;AAC7B,QAAA,IAAIA,GAAAA,EAAK;AACP,YAAA,IAAI,EAAEA,GAAAA,IAAOtB,OAAAA,CAAQmB,SAAS,CAAD,EAAI;AAC/B,gBAAA,MAAM,IAAIK,+BAAAA,CAAsB,CAAC,aAAa,EAAEF,GAAAA,CAAI,4BAA4B,CAAC,CAAA;AACnF,YAAA;AAEAtB,YAAAA,OAAAA,CAAQmB,SAAS,CAACG,GAAAA,CAAI,CAAC1C,KAAK,IAAIA,KAAAA;AAClC,QAAA;AAEAoB,QAAAA,OAAAA,CAAQpB,KAAK,IAAIA,KAAAA;AACnB,IAAA,CAAA;IAEA,OAAO;AAACoB,QAAAA,OAAAA;AAASuB,QAAAA;AAAO,KAAA;AAC1B,CAAA;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n assets?: boolean; // delete media library files before transfer\n configuration?: {\n webhook?: boolean; // delete webhooks before transfer\n coreStore?: boolean; // delete core store before transfer\n };\n entities?: {\n include?: string[]; // only delete these stage entities before transfer\n exclude?: string[]; // exclude these stage entities from deletion\n filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n };\n}\n\ninterface IDeleteResults {\n count: number;\n aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n const entities = await deleteEntitiesRecords(strapi, options);\n const configuration = await deleteConfigurationRecords(strapi, options);\n\n return {\n count: entities.count + configuration.count,\n entities,\n configuration,\n };\n};\n\nconst deleteEntitiesRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { entities } = options;\n\n const models = strapi.get('models').get() as Model[];\n const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n const contentTypesToClear = contentTypes\n .filter((contentType) => {\n let removeThisContentType = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisContentType = entities.include.includes(contentType.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n removeThisContentType = false;\n }\n\n if (entities?.filters) {\n removeThisContentType =\n removeThisContentType && entities.filters.every((filter) => filter(contentType));\n }\n\n return removeThisContentType;\n })\n .map((contentType) => contentType.uid);\n\n const modelsToClear = models\n .filter((model) => {\n if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n return false;\n }\n\n let removeThisModel = true;\n\n // include means \"only include these types\" so if it's not in here, it's not being included\n if (entities?.include) {\n removeThisModel = entities.include.includes(model.uid);\n }\n\n // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n if (entities?.exclude && entities.exclude.includes(model.uid)) {\n removeThisModel = false;\n }\n\n return removeThisModel;\n })\n .map((model) => model.uid);\n\n const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n const contentTypePromises = contentTypesToClear.map(async (uid) => {\n const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n const modelsPromises = modelsToClear.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count || 0, uid);\n }\n });\n\n await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n return results;\n};\n\nconst deleteConfigurationRecords = async (\n strapi: Core.Strapi,\n options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n const models: string[] = [];\n\n if (coreStore) {\n models.push('strapi::core-store');\n }\n\n if (webhook) {\n models.push('strapi::webhook');\n }\n\n const [results, updateResults] = useResults(models);\n\n const deletePromises = models.map(async (uid) => {\n const result = await strapi.db.query(uid).deleteMany({});\n\n if (result) {\n updateResults(result.count, uid);\n }\n });\n\n await Promise.all(deletePromises);\n\n return results;\n};\n\nconst useResults = (\n keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n const results: IDeleteResults = {\n count: 0,\n aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n };\n\n const update = (count: number, key?: string) => {\n if (key) {\n if (!(key in results.aggregate)) {\n throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n }\n\n results.aggregate[key].count += count;\n }\n\n results.count += count;\n };\n\n return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { ProviderTransferError } from '../../../../../errors/providers.mjs';
|
|
2
2
|
import { createEntityQuery } from '../../../../queries/entity.mjs';
|
|
3
|
-
import 'lodash/fp';
|
|
4
|
-
import 'stream';
|
|
5
3
|
import 'lodash';
|
|
4
|
+
import 'stream';
|
|
6
5
|
import '@strapi/utils';
|
|
7
|
-
|
|
6
|
+
import 'chalk';
|
|
7
|
+
import 'path';
|
|
8
|
+
import 'fs-extra';
|
|
9
|
+
import 'mime-types';
|
|
8
10
|
import 'crypto';
|
|
9
11
|
|
|
10
12
|
const deleteRecords = async (strapi, options)=>{
|