UNPKG

limgen

Version:

Infrastructure as Code generator

106 lines (105 loc) 4.71 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.envPull = void 0; const project_1 = require("../project"); const commander_1 = require("commander"); const zod_1 = require("zod"); const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const prompts_1 = __importDefault(require("prompts")); const cli_helpers_1 = require("../cli-helpers"); const exec_1 = require("../exec"); const envPullOptionsSchema = zod_1.z.object({ project: zod_1.z.string().optional(), stack: zod_1.z.string().optional(), directory: zod_1.z.string().optional(), }); exports.envPull = new commander_1.Command() .name('env-pull') .description('Pull project environment variables into a local .env file') .option('-p, --projectName <project>', 'Name of the project to pull environment variables from') .option('-s, --stack <stack>', 'Name of the stack to pull environment variables from') .option('-d, --directory <directory>', 'Directory for the base infrastructure folder') .action((options) => __awaiter(void 0, void 0, void 0, function* () { const cmdArgs = envPullOptionsSchema.parse({ options }); if (options.directory) { process.chdir(options.directory); } const projectName = yield getProjectName(cmdArgs); const projectType = yield getProjectType({ projectName }); const project = yield (0, project_1.importProjectType)(projectType); if (!project.envPull) { throw new Error(`Project type ${projectType} does not support env-pull`); } const stack = yield getStackName({ projectName, stack: cmdArgs.stack, }); const msg = (0, cli_helpers_1.spinner)(`Pulling environment variables for ${projectName} stack ${stack}`).start(); yield project.envPull({ projectName, stack, }); msg.succeed(`Environment variables pulled for ${projectName} stack ${stack}`); })); function getProjectName(cmdArgs) { return __awaiter(this, void 0, void 0, function* () { if (cmdArgs.project) { return cmdArgs.project; } // get the project name from a prompt by reading what's in the infrastructure folder relative to ${directory} const projects = yield promises_1.default.readdir('infrastructure/projects'); // use a prompt from prompts() furnction const { projectName } = yield (0, prompts_1.default)({ type: 'select', name: 'projectName', message: 'Select a project', choices: projects.map((project) => ({ title: project, value: project })), }); return projectName; }); } function getProjectType({ projectName }) { return __awaiter(this, void 0, void 0, function* () { const metadata = yield (0, project_1.readProjectMetadata)({ projectName: projectName, }); if (!project_1.AllProjectTypes.includes(metadata.projectType)) { throw new Error(`Unsupported project type: ${metadata.projectType}`); } return metadata.projectType; }); } function getStackName(opts) { return __awaiter(this, void 0, void 0, function* () { if (opts.stack) { return opts.stack; } const { stdout } = yield (0, exec_1.execPromise)('pulumi stack ls --json', { cwd: path_1.default.join('infrastructure', 'projects', opts.projectName) }); const stacks = JSON.parse(stdout); if (stacks.length === 0) { throw new Error('No stacks found'); } const { stackName } = yield (0, prompts_1.default)({ type: 'select', name: 'stackName', message: 'Select a stack', choices: stacks.map((stack) => ({ title: stack.name, value: stack.name })), }); return stackName; }); }