UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

178 lines (175 loc) 8.02 kB
import path from 'path'; import { createWriteStream } from 'fs'; import { Writable, pipeline } from 'stream'; import fs__default from 'fs-extra'; import { stringer } from 'stream-json/jsonl/Stringer'; import { chain } from 'stream-chain'; import { createDirectoryJsonlWriter } from './utils.mjs'; import { ProviderTransferError } from '../../../errors/providers.mjs'; import { createFilePathFactory } from '../../../file/providers/destination/utils.mjs'; function _class_private_field_loose_base(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } var id = 0; function _class_private_field_loose_key(name) { return "__private_" + id++ + "_" + name; } const createLocalDirectoryDestinationProvider = (options)=>{ return new LocalDirectoryDestinationProvider(options); }; var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata"); class LocalDirectoryDestinationProvider { setMetadata(target, metadata) { _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata; return this; } async bootstrap(diagnostics) { _class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics; _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('preparing directory export'); await fs__default.mkdir(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], { recursive: true }); this.results.file = { path: _class_private_field_loose_base(this, _rootResolved)[_rootResolved] }; } async close() { await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata](); } async rollback() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back'); await fs__default.rm(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], { recursive: true, force: true }); } getMetadata() { return null; } createSchemasWriteStream() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating schemas write stream'); const filePathFactory = createFilePathFactory('schemas'); const entryStream = createDirectoryJsonlWriter(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], filePathFactory, this.options.file.maxSizeJsonl); return chain([ stringer(), entryStream ]); } createEntitiesWriteStream() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities write stream'); const filePathFactory = createFilePathFactory('entities'); const entryStream = createDirectoryJsonlWriter(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], filePathFactory, this.options.file.maxSizeJsonl); return chain([ stringer(), entryStream ]); } createLinksWriteStream() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links write stream'); const filePathFactory = createFilePathFactory('links'); const entryStream = createDirectoryJsonlWriter(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], filePathFactory, this.options.file.maxSizeJsonl); return chain([ stringer(), entryStream ]); } createConfigurationWriteStream() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating configuration write stream'); const filePathFactory = createFilePathFactory('configuration'); const entryStream = createDirectoryJsonlWriter(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], filePathFactory, this.options.file.maxSizeJsonl); return chain([ stringer(), entryStream ]); } createAssetsWriteStream() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets write stream'); const root = _class_private_field_loose_base(this, _rootResolved)[_rootResolved]; return new Writable({ objectMode: true, write (data, _encoding, callback) { const { filename } = data; const entryPath = path.join(root, 'assets', 'uploads', filename); const entryMetadataPath = path.join(root, 'assets', 'metadata', `${filename}.json`); const assetWriteError = (cause)=>new ProviderTransferError(`Failed to write asset ${filename}`, { details: { error: cause instanceof Error ? cause : new Error(String(cause)) } }); let fileStream; try { fs__default.mkdirSync(path.dirname(entryPath), { recursive: true }); fs__default.mkdirSync(path.dirname(entryMetadataPath), { recursive: true }); fs__default.writeFileSync(entryMetadataPath, JSON.stringify(data.metadata), 'utf8'); fileStream = createWriteStream(entryPath); } catch (error) { callback(assetWriteError(error)); return; } pipeline(data.stream, fileStream, (err)=>{ if (err) { callback(assetWriteError(err)); return; } callback(null); }); } }); } constructor(options){ Object.defineProperty(this, _reportInfo, { value: reportInfo }); Object.defineProperty(this, _writeMetadata, { value: writeMetadata }); Object.defineProperty(this, _providersMetadata, { writable: true, value: void 0 }); Object.defineProperty(this, _rootResolved, { writable: true, value: void 0 }); Object.defineProperty(this, _diagnostics, { writable: true, value: void 0 }); this.name = 'destination::local-directory'; this.type = 'destination'; this.results = {}; _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {}; this.options = options; _class_private_field_loose_base(this, _rootResolved)[_rootResolved] = path.resolve(options.directory.path); } } function reportInfo(message) { _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({ details: { createdAt: new Date(), message, origin: 'directory-destination-provider' }, kind: 'info' }); } async function writeMetadata() { _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('writing metadata'); const metadata = _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata].source; if (metadata) { const target = path.join(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], 'metadata.json'); await fs__default.mkdir(path.dirname(target), { recursive: true }); await fs__default.writeFile(target, JSON.stringify(metadata, null, 2), 'utf8'); } } export { createLocalDirectoryDestinationProvider }; //# sourceMappingURL=index.mjs.map