@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
60 lines (57 loc) • 2.06 kB
JavaScript
import { Readable, Transform } from 'stream';
import { createEntityQuery } from '../../queries/entity.mjs';
import 'lodash/fp';
/**
* Generate and consume content-types streams in order to stream each entity individually
*/ const createEntitiesStream = (strapi)=>{
const contentTypes = Object.values(strapi.contentTypes);
async function* contentTypeStreamGenerator() {
for (const contentType of contentTypes){
const query = createEntityQuery(strapi).call(null, contentType.uid);
const stream = strapi.db// Create a query builder instance (default type is 'select')
.queryBuilder(contentType.uid)// Fetch all columns
.select('*')// Apply the populate
.populate(query.deepPopulateComponentLikeQuery)// Get a readable stream
.stream();
yield {
contentType,
stream
};
}
}
return Readable.from(async function* entitiesGenerator() {
for await (const { stream, contentType } of contentTypeStreamGenerator()){
try {
for await (const entity of stream){
yield {
entity,
contentType
};
}
} catch {
// ignore
} finally{
stream.destroy();
}
}
}());
};
/**
* Create an entity transform stream which convert the output of
* the multi-content-types stream to the transfer entity format
*/ const createEntitiesTransformStream = ()=>{
return new Transform({
objectMode: true,
transform (data, _encoding, callback) {
const { entity, contentType } = data;
const { id, ...attributes } = entity;
callback(null, {
type: contentType.uid,
id,
data: attributes
});
}
});
};
export { createEntitiesStream, createEntitiesTransformStream };
//# sourceMappingURL=entities.mjs.map