limgen
Version:
Infrastructure as Code generator
106 lines (105 loc) • 4.71 kB
JavaScript
;
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;
});
}