UNPKG

@jameslnewell/buildkite-pipelines

Version:
174 lines 6.21 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const yargs_1 = __importDefault(require("yargs")); const resolve_1 = __importDefault(require("resolve")); const debug_1 = __importDefault(require("debug")); const lib_1 = require("../lib"); const isPipelineBuilder_1 = require("../lib/builders/isPipelineBuilder"); const log = (0, debug_1.default)('buildkite-pipelines'); const resolve = (id, basedir) => new Promise((resolve, reject) => (0, resolve_1.default)(id, { basedir }, (error, path) => { if (error || !path) { reject(error); } else { resolve(path); } })); (async () => { await yargs_1.default.scriptName('buildkite-pipelines').command('$0 <file>', 'Generate a Buildkite pipeline', (yargs) => yargs .option('require', { type: 'string', alias: 'r', description: `Require a module on startup`, }) .option('cwd', { type: 'string', description: `Change the working directory`, }) .option('ignore-validation-errors', { boolean: true, description: 'Output the pipeline and exit cleanly when the pipeline is not valid', }) .positional('file', { type: 'string', demandOption: true, description: 'A file exporting a pipeline object', }), async (argv) => { const { file, require, cwd } = argv; // redirect any stdout writes from the imported pipeline (and any // functions it executes) to stderr so they don't get interleaved // with the generated YAML on stdout const originalStdoutWrite = process.stdout.write.bind(process.stdout); process.stdout.write = process.stderr.write.bind(process.stderr); // change the current working directory const basedir = process.cwd(); if (cwd) process.chdir(cwd); // coerce the requires into an array const requires = Array.isArray(require) ? require : require ? [require] : []; // import scripts in order to setup transpilers and stuff for (const r of requires) { log('requiring: %s', r); let m; try { m = await resolve(r, basedir); await import(m); } catch (error) { console.error(); console.error(`💥 ERROR`); console.error(); console.error(`An error occurred whilst requiring "${r}"`); console.error(); console.error(error); process.exitCode = 1; return; } } // check the pipeline file is specified if (!file) { console.error(`No pipeline file specified`); process.exitCode = 1; return; } // import the pipeline log('importing pipeline: %s', file); let m; let pipeline; try { m = await resolve(file, basedir); pipeline = await import(m); } catch (error) { console.error(); console.error(`💥 ERROR`); console.error(); console.error(`An error occurred whilst executing "${file}"`); console.error(); console.error(error); process.exitCode = 1; return; } // check for a named property let property; if (pipeline.pipeline) { log('using .pipeline property'); property = '.pipeline'; pipeline = pipeline.pipeline; // check for a default property } else if (pipeline.default) { property = '.default'; log('using .default property'); pipeline = pipeline.default; } else { log('using module'); property = '.default'; } // execute the factory function if pipeline is a factory if (typeof pipeline === 'function') { log('executing pipeline factory'); try { pipeline = await pipeline(); } catch (error) { console.error(); console.error(`💥 ERROR`); console.error(); console.error(`An error occurred whilst executing "${file}#${property}()"`); console.error(); console.error(error); process.exitCode = 1; return; } } // build the pipeline if its a builder if ((0, isPipelineBuilder_1.isPipelineBuilder)(pipeline)) { log('building pipeline'); try { pipeline = await pipeline.build(); } catch (error) { console.error(); console.error(`💥 ERROR`); console.error(); console.error(`An error occurred whilst executing "${file}#${property}()"`); console.error(); console.error(error); process.exitCode = 1; return; } } // validate log('validating pipeline'); const errors = await (0, lib_1.validate)(pipeline); if (errors.length) { console.error(); console.error(`👮‍♀️ The pipeline is not valid:`); console.error(); for (const error of errors) { console.error(error); } if (!argv.ignoreValidationErrors) { process.exitCode = 1; return; } } log('stringifying pipeline'); const yaml = await (0, lib_1.stringify)(pipeline); // write the generated YAML to the original stdout originalStdoutWrite(`${yaml}\n`); // restore stdout process.stdout.write = originalStdoutWrite; }).argv; })(); //# sourceMappingURL=index.js.map