UNPKG

limgen

Version:

Infrastructure as Code generator

106 lines (105 loc) 4.61 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.isFullstack = exports.collectInput = exports.inputs = void 0; const docker_1 = require("../../docker"); const schema_1 = require("../../schema"); const ejs_1 = __importDefault(require("ejs")); const promises_1 = __importDefault(require("fs/promises")); const inputs = (cmdArgs, projectInput) => __awaiter(void 0, void 0, void 0, function* () { return [ { name: 'port', message: 'Port to expose', schema: (0, schema_1.cliInteger)().optional(), } ]; }); exports.inputs = inputs; const collectInput = (cmdArgs, projectInput, frameworkArgs) => __awaiter(void 0, void 0, void 0, function* () { let port = frameworkArgs.port; if (!port || port === 'unknown') { const dockerfilePort = yield (0, docker_1.getDockerfilePort)(); if (dockerfilePort === null) { port = 3000; } } return { projectType: projectInput.projectType, port, }; }); exports.collectInput = collectInput; function nextJsFramework(opts) { return __awaiter(this, void 0, void 0, function* () { yield Promise.all([ ensureDockerfile(opts), updateNextConfig(opts.projectType), updateDockerignore(opts) ]); }); } exports.default = nextJsFramework; const updateDockerignore = (opts) => __awaiter(void 0, void 0, void 0, function* () { if (!(0, exports.isFullstack)(opts.projectType)) { return; } const contents = yield promises_1.default.readFile('.dockerignore', 'utf-8'); if (!contents.includes('node_modules')) { yield promises_1.default.appendFile('.dockerignore', 'node_modules\n'); } }); const ensureDockerfile = (opts) => __awaiter(void 0, void 0, void 0, function* () { if (!(0, exports.isFullstack)(opts.projectType)) { return; } if (yield (0, docker_1.dockerfileExists)()) { return; } try { const result = yield ejs_1.default.renderFile(`${__dirname}/Dockerfile.ejs.t`, opts); yield promises_1.default.writeFile('Dockerfile', result); } catch (error) { console.error('Unable to render Dockerfile', error); throw error; } }); const updateNextConfig = (projectType) => __awaiter(void 0, void 0, void 0, function* () { // get next.config.js or next.config.ts let nextConfigFile = 'next.config.js'; try { yield promises_1.default.access('next.config.ts'); nextConfigFile = 'next.config.ts'; } catch (error) { } const nextConfig = yield promises_1.default.readFile(nextConfigFile, 'utf-8'); // update next.config.ts, detect const nextConfig: NextConfig = { const nextConfigMatch = nextConfig.match(/const nextConfig: NextConfig = {/); if (nextConfigMatch) { // find a section matching output: 'standalone' const outputMatch = nextConfig.match(/output: *('|")(.+)('|")/); const desiredOutputType = (0, exports.isFullstack)(projectType) ? 'standalone' : 'export'; if (!outputMatch) { const updatedNextConfig = nextConfig.replace(/const nextConfig: NextConfig = {/, `const nextConfig: NextConfig = {\n output: '${desiredOutputType}',\n`); yield promises_1.default.writeFile(nextConfigFile, updatedNextConfig); } else if (outputMatch[2] !== desiredOutputType) { throw new Error(`Your NextJS config 'output' property is not set to '${desiredOutputType}'.\n\n` + `Limgen currently requires '${desiredOutputType}' to be set for ${projectType} compatibility.`); } } }); const isFullstack = (projectType) => projectType.startsWith('fullstack'); exports.isFullstack = isFullstack;