storyblok-migrate
Version:
Component and content migrations for the headless CMS Storyblok
65 lines (53 loc) • 2.08 kB
JavaScript
const commander = require(`commander`);
const fs = require(`fs`);
const path = require(`path`);
const { backupDirectory } = require(`./config`);
const { version } = require(`./package`);
const componentService = require(`./services/component`);
const storyService = require(`./services/story`);
const unpaginate = require(`./utils/unpaginate`);
async function start() {
try {
commander
.version(version)
.option(
`-c, --components`,
`create a backup of all components`,
)
.option(
`-s, --stories`,
`create a backup of all stories`,
)
.parse(process.argv);
const date = new Date().toISOString().split(`.`)[0].replace(/:/g, ``);
const directory = path.resolve(process.cwd(), backupDirectory);
if (commander.components) {
const { data } = await componentService.list();
const fileName = `components_${date}.json`;
const fullPath = path.join(directory, fileName);
const fileContent = JSON.stringify(data, null, 2);
await fs.promises.mkdir(directory, { recursive: true });
await fs.promises.writeFile(fullPath, fileContent, { flag: `w` });
// eslint-disable-next-line no-console
console.log(`Successfully created a backup of all of your components.`);
}
if (commander.stories) {
const storyPages = await unpaginate({ cb: storyService.list });
await fs.promises.mkdir(directory, { recursive: true });
storyPages.forEach(async (data, page) => {
const fileName = `stories_${date}_${page + 1}.json`;
const fullPath = path.join(directory, fileName);
const fileContent = JSON.stringify(data, null, 2);
await fs.promises.writeFile(fullPath, fileContent, { flag: `w` });
// eslint-disable-next-line no-console
console.log(`Successfully created a backup of all stories of page ${page + 1} of ${storyPages.length}.`);
});
}
} catch (error) {
// eslint-disable-next-line no-console
console.error(error);
process.exit(1);
}
}
start();