@launchql/migrate
Version:
PostgreSQL Migration Tools
100 lines (99 loc) • 3.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getExtensionsAndModulesChanges = exports.getExtensionsAndModules = exports.latestChangeAndVersion = exports.latestChange = exports.listModules = void 0;
const fs_1 = require("fs");
const glob_1 = require("glob");
const path_1 = require("path");
/**
* Parse a .control file and extract its metadata.
*/
const parseControlFile = (filePath, basePath) => {
const contents = (0, fs_1.readFileSync)(filePath, 'utf-8');
const key = (0, path_1.basename)(filePath).split('.control')[0];
const requires = contents
.split('\n')
.find((line) => /^requires/.test(line))
?.split('=')[1]
.split(',')
.map((req) => req.replace(/[\'\s]*/g, '').trim()) || [];
const version = contents
.split('\n')
.find((line) => /^default_version/.test(line))
?.split('=')[1]
.replace(/[\']*/g, '')
.trim() || '';
return {
path: (0, path_1.dirname)((0, path_1.relative)(basePath, filePath)),
requires,
version,
};
};
/**
* List all modules by parsing .control files in the provided directory.
*/
const listModules = (workspaceDir) => {
const moduleFiles = (0, glob_1.sync)(`${workspaceDir}/**/*.control`).filter((file) => !/node_modules/.test(file));
return moduleFiles.reduce((acc, file) => {
const module = parseControlFile(file, workspaceDir);
acc[(0, path_1.basename)(file).split('.control')[0]] = module;
return acc;
}, {});
};
exports.listModules = listModules;
/**
* Get the latest change from the sqitch.plan file for a specific module.
*/
const latestChange = (sqlmodule, modules, basePath) => {
const module = modules[sqlmodule];
if (!module) {
throw new Error(`latestChange() ${sqlmodule} NOT FOUND!`);
}
const plan = (0, fs_1.readFileSync)(`${basePath}/${module.path}/sqitch.plan`, 'utf-8')
.split('\n')
.map((line) => line.trim())
.filter(Boolean);
return plan[plan.length - 1].split(' ')[0];
};
exports.latestChange = latestChange;
/**
* Get the latest change and version for a specific module.
*/
const latestChangeAndVersion = (sqlmodule, modules, basePath) => {
const module = modules[sqlmodule];
if (!module) {
throw new Error(`latestChangeAndVersion() ${sqlmodule} NOT FOUND!`);
}
const plan = (0, fs_1.readFileSync)(`${basePath}/${module.path}/sqitch.plan`, 'utf-8')
.split('\n')
.map((line) => line.trim())
.filter(Boolean);
const change = plan[plan.length - 1].split(' ')[0];
const pkg = require(`${basePath}/${module.path}/package.json`);
return { change, version: pkg.version };
};
exports.latestChangeAndVersion = latestChangeAndVersion;
/**
* Get extensions and modules required by a specific module.
*/
const getExtensionsAndModules = (sqlmodule, modules) => {
const module = modules[sqlmodule];
if (!module) {
throw new Error(`getExtensionsAndModules() ${sqlmodule} NOT FOUND!`);
}
const native = module.requires.filter((req) => !Object.keys(modules).includes(req));
const sqitch = module.requires.filter((req) => Object.keys(modules).includes(req));
return { native, sqitch };
};
exports.getExtensionsAndModules = getExtensionsAndModules;
/**
* Get extensions and modules with their latest changes and versions.
*/
const getExtensionsAndModulesChanges = (sqlmodule, modules, basePath) => {
const { native, sqitch } = (0, exports.getExtensionsAndModules)(sqlmodule, modules);
const sqitchWithDetails = sqitch.map((mod) => {
const { change, version } = (0, exports.latestChangeAndVersion)(mod, modules, basePath);
return { name: mod, latest: change, version };
});
return { native, sqitch: sqitchWithDetails };
};
exports.getExtensionsAndModulesChanges = getExtensionsAndModulesChanges;