@launchql/core
Version:
LaunchQL Package and Migration Tools
63 lines (62 loc) • 2.44 kB
JavaScript
import { sync as glob } from 'glob';
import { basename } from 'path';
import { getLatestChange, parseControlFile } from '../files';
import { errors } from '@launchql/types';
/**
* List all modules by parsing .control files in the provided directory.
*/
export const listModules = (workspaceDir) => {
const moduleFiles = glob(`${workspaceDir}/**/*.control`).filter((file) => !/node_modules/.test(file));
return moduleFiles.reduce((acc, file) => {
const module = parseControlFile(file, workspaceDir);
acc[basename(file).split('.control')[0]] = module;
return acc;
}, {});
};
/**
* Get the latest change from the launchql.plan file for a specific module.
*/
export const latestChange = (sqlmodule, modules, basePath) => {
const module = modules[sqlmodule];
if (!module) {
throw errors.MODULE_NOT_FOUND({ name: sqlmodule });
}
const planPath = `${basePath}/${module.path}/launchql.plan`;
return getLatestChange(planPath);
};
/**
* Get the latest change and version for a specific module.
*/
export const latestChangeAndVersion = (sqlmodule, modules, basePath) => {
const module = modules[sqlmodule];
if (!module) {
throw errors.MODULE_NOT_FOUND({ name: sqlmodule });
}
const planPath = `${basePath}/${module.path}/launchql.plan`;
const change = getLatestChange(planPath);
const pkg = require(`${basePath}/${module.path}/package.json`);
return { change, version: pkg.version };
};
/**
* Get extensions and modules required by a specific module.
*/
export const getExtensionsAndModules = (sqlmodule, modules) => {
const module = modules[sqlmodule];
if (!module) {
throw errors.MODULE_NOT_FOUND({ name: sqlmodule });
}
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 };
};
/**
* Get extensions and modules with their latest changes and versions.
*/
export const getExtensionsAndModulesChanges = (sqlmodule, modules, basePath) => {
const { native, sqitch } = getExtensionsAndModules(sqlmodule, modules);
const sqitchWithDetails = sqitch.map((mod) => {
const { change, version } = latestChangeAndVersion(mod, modules, basePath);
return { name: mod, latest: change, version };
});
return { native, sqitch: sqitchWithDetails };
};