UNPKG

@aldenquimby/flywaydb-cli

Version:

Install latest flywaydb-cli as a node module

202 lines (164 loc) 6.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cleanupDirs = exports.copyToBin = exports.extractToLib = exports.downloadFlywaySource = exports.getReleaseSource = undefined; var _nodeOs = require("node:os"); var _nodeOs2 = _interopRequireDefault(_nodeOs); var _nodeFs = require("node:fs"); var _nodeFs2 = _interopRequireDefault(_nodeFs); var _nodePath = require("node:path"); var _nodePath2 = _interopRequireDefault(_nodePath); var _nodeChild_process = require("node:child_process"); var _undici = require("undici"); var _extractZip = require("extract-zip"); var _extractZip2 = _interopRequireDefault(_extractZip); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const env = process.env; const repoBaseUrl = "https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline"; const readDotFlywayFile = () => { const dotFlywayPath = _nodePath2.default.resolve(__dirname, "../../../../../", ".flyway"); if (!_nodeFs2.default.existsSync(dotFlywayPath)) { return ''; } const version = _nodeFs2.default.readFileSync(dotFlywayPath, { encoding: 'utf8' }); console.log("Found version in .flyway -> ", version); return version.trim(); }; /** * @returns sources[os.platform()] */ const getReleaseSource = exports.getReleaseSource = () => (0, _undici.fetch)(`${repoBaseUrl}/maven-metadata.xml`).then(resp => resp.text()).then(response => { let releaseRegularExp = new RegExp("<release>(.+)</release>"); let releaseVersion = readDotFlywayFile() || response.match(releaseRegularExp)[1]; let sources = { win32: { url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-windows-x64.zip`, filename: `flyway-commandline-${releaseVersion}-windows-x64.zip`, folder: `flyway-${releaseVersion}` }, linux: { url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-linux-x64.tar.gz`, filename: `flyway-commandline-${releaseVersion}-linux-x64.tar.gz`, folder: `flyway-${releaseVersion}` }, arm64: { url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-macosx-arm64.tar.gz`, filename: `flyway-commandline-${releaseVersion}-macosx-arm64.tar.gz`, folder: `flyway-${releaseVersion}` }, darwin: { url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-macosx-x64.tar.gz`, filename: `flyway-commandline-${releaseVersion}-macosx-x64.tar.gz`, folder: `flyway-${releaseVersion}` } }; // Apple Silicon version was released with 9.6.0 if (_nodeOs2.default.platform() === "darwin" && _nodeOs2.default.arch() === "arm64") { const [majorVersion, minorVersion] = releaseVersion.split("."); if (Number(majorVersion) > 9 || Number(majorVersion) === 9 && Number(minorVersion) >= 6) { return sources.arm64; } } return sources[_nodeOs2.default.platform()]; }); // copied from https://github.com/getsentry/sentry-cli/blob/c65df4fba17101e60e8c31f378f6001b514e5a42/scripts/install.js#L123-L131 const getNpmCache = () => { return env.npm_config_cache || env.npm_config_cache_folder || env.npm_config_yarn_offline_mirror || (env.APPDATA ? _nodePath2.default.join(env.APPDATA, 'npm-cache') : _nodePath2.default.join(_nodeOs2.default.homedir(), '.npm')); }; /** * @param {any} source * @returns source.filename */ const downloadFlywaySource = exports.downloadFlywaySource = source => { let downloadDir = _nodePath2.default.join(getNpmCache(), 'flywaydb-cli'); if (!source) { throw new Error("Your platform is not supported"); } source.filename = _nodePath2.default.join(downloadDir, source.filename); if (_nodeFs2.default.existsSync(source.filename)) { console.log("Cached file exists, skipping download", source.filename); return Promise.resolve(source.filename); } else if (!_nodeFs2.default.existsSync(downloadDir)) { _nodeFs2.default.mkdirSync(downloadDir); } console.log("Downloading", source.url); const proxyUrl = env.npm_config_https_proxy || env.npm_config_http_proxy || env.npm_config_proxy; return (0, _undici.fetch)(source.url, { redirect: 'follow', headers: { 'User-Agent': env.npm_config_user_agent }, dispatcher: proxyUrl ? new _undici.ProxyAgent(proxyUrl) : undefined }).then(resp => { if (!resp.ok) { throw new Error(`Error requesting source: ${source.url}. Status: ${response.statusCode} Proxy URL: ${proxyUrl} Response headers: ${JSON.stringify(response.headers, null, 2)} Make sure your network and proxy settings are correct. If you continue to have issues, please report this full log at https://github.com/sgraham/flywaydb-cli`); } return resp.arrayBuffer(); }).then(body => { _nodeFs2.default.writeFileSync(source.filename, Buffer.from(new Uint8Array(body))); return source.filename; }); }; /** * @param {any} file * @returns extractDir */ const extractToLib = exports.extractToLib = file => { let extractDir = _nodePath2.default.join(__dirname, "../../", "lib"); if (!_nodeFs2.default.existsSync(extractDir)) { _nodeFs2.default.mkdirSync(extractDir); } else { _nodeFs2.default.rmSync(extractDir, { recursive: true, force: true }); _nodeFs2.default.mkdirSync(extractDir); } if (_nodePath2.default.extname(file) === ".zip") { return new Promise((resolve, reject) => { (0, _extractZip2.default)(file, { dir: extractDir }).then(() => resolve(extractDir)).catch(reject); }); } else { return new Promise((resolve, reject) => { (0, _nodeChild_process.spawn)("tar", ["zxf", file], { cwd: extractDir, stdio: "inherit" }).on("close", code => { if (code === 0) { resolve(extractDir); } else { reject(new Error(`Untaring file failed: ${code}`)); } }); }); } }; /** * @param {any} libDir * @returns */ const copyToBin = exports.copyToBin = libDir => { return new Promise((resolve, reject) => { let versionDirs = flywayVersionDir(libDir); let flywayDir = _nodePath2.default.join(libDir, versionDirs[0]); let binDir = _nodePath2.default.join(__dirname, "../../", "bin"); if (_nodeFs2.default.existsSync(flywayDir)) { _nodeFs2.default.rmSync(binDir, { recursive: true, force: true }); _nodeFs2.default.cpSync(flywayDir, binDir, { recursive: true }); resolve(); } else { reject(new Error(`flywayDir was not found at ${flywayDir}`)); } }); }; /** * @param {any} libDir */ const flywayVersionDir = libDir => { return _nodeFs2.default.readdirSync(libDir).filter(file => _nodeFs2.default.statSync(_nodePath2.default.join(libDir, file)).isDirectory()); }; const cleanupDirs = exports.cleanupDirs = () => { const libDir = _nodePath2.default.join(__dirname, "../../", "lib"); _nodeFs2.default.rmSync(libDir, { recursive: true, force: true }); };