sb-mig
Version:
CLI to rule the world. (and handle stuff related to Storyblok CMS)
78 lines (77 loc) • 2.51 kB
JavaScript
import semver from "semver";
import { createJsonFile, readFile } from "./files.js";
export const preselectMigrations = (currentVersion, installedVersion, versionMapping, alreadyApplied = {
story: [],
preset: [],
}) => {
const final = {
story: [],
preset: [],
};
const versionThatApplies = Object.keys(versionMapping).filter((version) => {
if (semver.lte(version, installedVersion) &&
semver.gt(version, currentVersion)) {
return version;
}
else {
return false;
}
});
versionThatApplies.map((version) => {
// @ts-ignore
final.story.push(versionMapping[version]);
// @ts-ignore
final.preset.push(versionMapping[version]);
});
if (Array.isArray(alreadyApplied)) {
alreadyApplied = {
story: alreadyApplied,
preset: [],
};
}
const storyFlatted = final.story
.flatMap((item) => item)
.filter((migration) => !alreadyApplied.story.includes(migration));
const presetFlatted = final.preset
.flatMap((item) => item)
.filter((migration) => !alreadyApplied.preset.includes(migration));
return {
story: storyFlatted,
preset: presetFlatted,
};
};
export const modifyOrCreateAppliedMigrationsFile = async (migrationApplied, itemType) => {
const fileName = "applied-backpack-migrations.json";
let alreadyAppliedFileContent;
let alreadyApplied;
try {
alreadyAppliedFileContent = (await readFile(fileName));
alreadyApplied = JSON.parse(alreadyAppliedFileContent).migrations;
}
catch (e) {
console.log(`No file named: ${fileName}`);
console.log("Will create one now.");
alreadyApplied = {
story: [],
preset: [],
};
}
if (Array.isArray(alreadyApplied)) {
alreadyApplied = {
story: alreadyApplied,
preset: [],
};
}
const migrations = {
story: itemType === "story"
? [...new Set([...alreadyApplied.story, migrationApplied])]
: alreadyApplied.story,
preset: itemType === "preset"
? [...new Set([...alreadyApplied.preset, migrationApplied])]
: alreadyApplied.preset,
};
const appliedMigrationsFileContent = JSON.stringify({
migrations,
});
await createJsonFile(appliedMigrationsFileContent, "applied-backpack-migrations.json");
};