limgen
Version:
Infrastructure as Code generator
106 lines (105 loc) • 4.61 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.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;