UNPKG

@launchql/migrate

Version:
125 lines (123 loc) 4.25 kB
"use strict"; 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;