@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
178 lines (175 loc) • 8.02 kB
JavaScript
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