@launchql/migrate
Version:
PostgreSQL Migration Tools
125 lines (123 loc) • 4.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.writeExtensions = exports.writeExtensionControlFile = exports.writeExtensionMakefile = exports.getInstalledExtensions = exports.getExtensionInfo = exports.getExtensionName = exports.getAvailableExtensions = void 0;
const fs_1 = require("fs");
/**
* Get the list of available extensions, including predefined core extensions.
*/
const getAvailableExtensions = (modules) => {
const coreExtensions = [
'address_standardizer',
'address_standardizer_data_us',
'bloom',
'btree_gin',
'btree_gist',
'citext',
'hstore',
'intarray',
'pg_trgm',
'pgcrypto',
'plpgsql',
'plperl',
'plv8',
'postgis_tiger_geocoder',
'postgis_topology',
'postgis',
'postgres_fdw',
'unaccent',
'uuid-ossp',
];
return Object.keys(modules).reduce((acc, module) => {
if (!acc.includes(module))
acc.push(module);
return acc;
}, [...coreExtensions]);
};
exports.getAvailableExtensions = getAvailableExtensions;
/**
* Parse the sqitch.plan file to get the extension name.
*/
const getExtensionName = (packageDir) => {
const plan = (0, fs_1.readFileSync)(`${packageDir}/sqitch.plan`, 'utf-8')
.split('\n')
.map((line) => line.trim())
.filter((line) => /^%project=/.test(line));
if (!plan.length) {
throw new Error('No project name found in sqitch.plan!');
}
return plan[0].split('=')[1].trim();
};
exports.getExtensionName = getExtensionName;
/**
* Get detailed information about an extension in the specified directory.
*/
const getExtensionInfo = (packageDir) => {
const pkgPath = `${packageDir}/package.json`;
const pkg = require(pkgPath);
const extname = (0, exports.getExtensionName)(packageDir);
const version = pkg.version;
const Makefile = `${packageDir}/Makefile`;
const controlFile = `${packageDir}/${extname}.control`;
const sqlFile = `sql/${extname}--${version}.sql`;
return { extname, packageDir, version, Makefile, controlFile, sqlFile };
};
exports.getExtensionInfo = getExtensionInfo;
/**
* Get a list of extensions required by an extension from its control file.
*/
const getInstalledExtensions = (controlFilePath) => {
try {
const requiresLine = (0, fs_1.readFileSync)(controlFilePath, 'utf-8')
.split('\n')
.find((line) => /^requires/.test(line));
if (!requiresLine) {
throw new Error('No "requires" line found in the control file.');
}
return requiresLine
.split('=')[1]
.split("'")[1]
.split(',')
.map((ext) => ext.trim());
}
catch (e) {
throw new Error('Error parsing "requires" from control file.');
}
};
exports.getInstalledExtensions = getInstalledExtensions;
/**
* Write the Makefile for the extension.
*/
const writeExtensionMakefile = (outputPath, extname, version) => {
const content = `EXTENSION = ${extname}
DATA = sql/${extname}--${version}.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
`;
(0, fs_1.writeFileSync)(outputPath, content);
};
exports.writeExtensionMakefile = writeExtensionMakefile;
/**
* Write the control file for the extension.
*/
const writeExtensionControlFile = (outputPath, extname, extensions, version) => {
const content = `# ${extname} extension
comment = '${extname} extension'
default_version = '${version}'
module_pathname = '$libdir/${extname}'
requires = '${extensions.join(',')}'
relocatable = false
superuser = false
`;
(0, fs_1.writeFileSync)(outputPath, content);
};
exports.writeExtensionControlFile = writeExtensionControlFile;
/**
* Write control and Makefile for the extension with given data.
*/
const writeExtensions = async (packageDir, extensions) => {
const { controlFile, Makefile, extname, version } = (0, exports.getExtensionInfo)(packageDir);
(0, exports.writeExtensionControlFile)(controlFile, extname, extensions, version);
(0, exports.writeExtensionMakefile)(Makefile, extname, version);
};
exports.writeExtensions = writeExtensions;