UNPKG

@launchql/migrate

Version:
100 lines (99 loc) 3.92 kB
"use strict"; 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;