lina-infratech-cli
Version:
A CLI tool for Lina Infratech Developers
183 lines (162 loc) • 4.87 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateConfigFiles = void 0;
const tslib_1 = require("tslib");
const axios_1 = tslib_1.__importDefault(require("axios"));
const child_process_1 = require("child_process");
const colors_1 = require("../utils/chalk/colors");
const messages_1 = require("../ui/messages");
const writer_1 = require("../utils/writer");
function generatePrettierConfig() {
const fileName = '.prettierrc';
const content = `{
'trailingComma': 'es5',
'semi': false,
'singleQuote': true,
'bracketSpacing': true,
'tabWidth': 2,
'useTabs': true,
'printWidth': 80,
'endOfLine': 'lf',
}`;
(0, writer_1.writeFile)(fileName, content);
}
function generateTsConfig() {
const fileName = 'tsconfig.json';
const content = `{
"compilerOptions": {
"incremental": true,
"target": "es2016",
"experimentalDecorators": true,
"module": "commonjs",
"allowJs": true,
"checkJs": true,
"declaration": true,
"outDir": "./dist",
"removeComments": true,
"importHelpers": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"skipLibCheck": true
}
}`;
(0, writer_1.writeFile)(fileName, content);
}
function generateNodemonJson() {
const fileName = 'nodemon.json';
const content = {
'ignore': ['node_modules/**', 'dist/**'],
};
(0, writer_1.writeFile)(fileName, JSON.stringify(content));
}
function generateLinterFile() {
const fileName = '.eslintrc.js';
const content = `module.exports = {
env: {
es6: true,
node: true,
},
extends: ['airbnb-base', 'prettier'],
plugins: ['prettier'],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly',
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
},
rules: {
'no-new': 0,
'no-template-curly-in-string': 0,
'import/no-named-as-default': 0,
'prettier/prettier': 'error',
'class-methods-use-this': 'off',
'no-param-reassign': 'off',
camelcase: 'off',
'no-unused-vars': ['error', { argsIgnorePattern: 'next' }],
ident: ['error', 'tab'],
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
rules: {
'prettier/prettier': 0,
},
root: true,
env: {
node: true,
jest: true,
},
}`;
(0, writer_1.writeFile)(fileName, content);
}
function generateGitFiles() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
(0, child_process_1.execSync)('git init');
const fileName = '.gitignore';
let { data } = yield (0, axios_1.default)('https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore');
data += `*.swp\n.vscode\n.DS_Store`;
(0, writer_1.writeFile)(fileName, data);
});
}
function generateDockerIgnore() {
const fileName = '.dockerignore';
const content = '.git\nnode_modules\ndist\n.env*\ndevops';
(0, writer_1.writeFile)(fileName, content);
}
function generateDockerFiles() {
generateDockerIgnore();
const fileName = 'Dockerfile';
const content = `###################
# BUILD FOR LOCAL DEVELOPMENT
###################
FROM node:18-alpine As development
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
RUN npm ci
COPY --chown=node:node . .
USER node
###################
# BUILD FOR PRODUCTION
###################
FROM node:18-alpine As build
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules
COPY --chown=node:node . .
RUN npm run build
ENV NODE_ENV prod
RUN npm ci --only=production && npm cache clean --force
USER node
###################
# PRODUCTION
###################
FROM node:18-alpine As production
COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
COPY --chown=node:node --from=build /usr/src/app/dist ./dist
CMD [ "node", "dist/src/server.js" ]`;
(0, writer_1.writeFile)(fileName, content);
(0, colors_1.logWarning)('You should change node:lts-alpine image to fixed NodeJS version.');
}
function generateConfigFiles() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
console.log(messages_1.MESSAGES.GENERATE_CONFIG_FILES('prettier', 'typescript', 'docker', 'eslint', 'nodemon'));
generatePrettierConfig();
generateTsConfig();
generateLinterFile();
generateNodemonJson();
generateDockerFiles();
yield generateGitFiles();
(0, colors_1.logSuccess)(messages_1.MESSAGES.CONFIG_FILES_OK);
});
}
exports.generateConfigFiles = generateConfigFiles;