Browse Source

Boilerplating Init-Script

Christian Kahlau 3 years ago
parent
commit
f8c6b4c1ab
4 changed files with 149 additions and 0 deletions
  1. 1 0
      package.json
  2. 68 0
      scripts/init.js
  3. 63 0
      scripts/init.ts
  4. 17 0
      scripts/tsconfig.json

+ 1 - 0
package.json

@@ -22,6 +22,7 @@
   },
   "devDependencies": {
     "@types/express": "^4.17.13",
+    "node-utils": "git+https://bitbucket.siriusonline.de/scm/npm/node-utils.git#1.0.5",
     "typescript": "^4.6.4"
   }
 }

+ 68 - 0
scripts/init.js

@@ -0,0 +1,68 @@
+"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 });
+const fs_1 = __importDefault(require("fs"));
+const shell_1 = require("node-utils/shell");
+const file_1 = require("node-utils/file");
+const path_1 = __importDefault(require("path"));
+const util_1 = __importDefault(require("util"));
+const cli = {
+    blue: v => `\x1b[34m${v}\x1b[0m`,
+    green: v => `\x1b[32m${v}\x1b[0m`,
+    yellow: v => `\x1b[33m${v}\x1b[0m`,
+    red: v => `\x1b[31m${v}\x1b[0m`
+};
+(() => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        const projectRootDir = path_1.default.resolve(process.cwd());
+        if (!fs_1.default.existsSync(path_1.default.resolve(projectRootDir, 'package.json'))) {
+            yield shell_1.exec('npm init -y', process.stdout, process.stderr);
+        }
+        const cloneDir = path_1.default.resolve(projectRootDir, '.clone');
+        if (fs_1.default.existsSync(cloneDir)) {
+            yield util_1.default.promisify(fs_1.default.rm)(cloneDir, { force: true, recursive: true });
+        }
+        yield shell_1.exec(`git clone ssh://git@bitbucket.siriusonline.de:7999/tsc/express-starter.git "${cloneDir}"`, process.stdout, process.stderr);
+        const pkgJson = yield file_1.readJsonFile(path_1.default.resolve(cloneDir, 'package.json'));
+        let dependencies = Object.keys(pkgJson.dependencies).join('" "');
+        yield shell_1.exec(`npm install "${dependencies}"`, process.stdout, process.stderr);
+        dependencies = Object.keys(pkgJson.devDependencies)
+            .filter(d => d !== 'node-utils')
+            .join('" "');
+        yield shell_1.exec(`npm install --save-dev "${dependencies}"`, process.stdout, process.stderr);
+        const copyFiles = ['.env', '.gitignore', '.prettierrc.js', 'tsconfig.json', '.vscode/settings.json', 'src'];
+        for (const cpFile of copyFiles) {
+            const sourceFile = path_1.default.resolve(cloneDir, cpFile);
+            const targetFile = path_1.default.resolve(projectRootDir, cpFile);
+            const targetDir = path_1.default.dirname(targetFile);
+            if (!fs_1.default.existsSync(targetDir)) {
+                console.log(cli.blue('[INFO]'), 'Creating directory recursively:', targetDir);
+                yield util_1.default.promisify(fs_1.default.mkdir)(targetDir, { recursive: true, mode: 0o777 });
+            }
+            const stat = yield util_1.default.promisify(fs_1.default.stat)(sourceFile);
+            if (stat.isFile()) {
+                yield util_1.default.promisify(fs_1.default.copyFile)(sourceFile, targetFile);
+            }
+            else {
+                yield shell_1.exec(`cp -r "${sourceFile}" "${targetFile}"`);
+            }
+        }
+        yield util_1.default.promisify(fs_1.default.rm)(cloneDir, { force: true, recursive: true });
+        process.exit(0);
+    }
+    catch (e) {
+        console.error(e);
+        process.exit(1);
+    }
+}))();

+ 63 - 0
scripts/init.ts

@@ -0,0 +1,63 @@
+import fs from 'fs';
+import { exec } from 'node-utils/shell';
+import { readJsonFile } from 'node-utils/file';
+import path from 'path';
+import util from 'util';
+
+const cli = {
+  blue: v => `\x1b[34m${v}\x1b[0m`,
+  green: v => `\x1b[32m${v}\x1b[0m`,
+  yellow: v => `\x1b[33m${v}\x1b[0m`,
+  red: v => `\x1b[31m${v}\x1b[0m`
+};
+
+(async () => {
+  try {
+    const projectRootDir = path.resolve(process.cwd());
+    if (!fs.existsSync(path.resolve(projectRootDir, 'package.json'))) {
+      await exec('npm init -y', process.stdout, process.stderr);
+    }
+
+    const cloneDir = path.resolve(projectRootDir, '.clone');
+
+    if (fs.existsSync(cloneDir)) {
+      await util.promisify(fs.rm)(cloneDir, { force: true, recursive: true });
+    }
+
+    await exec(`git clone ssh://git@bitbucket.siriusonline.de:7999/tsc/express-starter.git "${cloneDir}"`, process.stdout, process.stderr);
+
+    const pkgJson = await readJsonFile<any>(path.resolve(cloneDir, 'package.json'));
+
+    let dependencies = Object.keys(pkgJson.dependencies).join('" "');
+    await exec(`npm install "${dependencies}"`, process.stdout, process.stderr);
+    dependencies = Object.keys(pkgJson.devDependencies)
+      .filter(d => d !== 'node-utils')
+      .join('" "');
+    await exec(`npm install --save-dev "${dependencies}"`, process.stdout, process.stderr);
+
+    const copyFiles = ['.env', '.gitignore', '.prettierrc.js', 'tsconfig.json', '.vscode/settings.json', 'src'];
+
+    for (const cpFile of copyFiles) {
+      const sourceFile = path.resolve(cloneDir, cpFile);
+      const targetFile = path.resolve(projectRootDir, cpFile);
+      const targetDir = path.dirname(targetFile);
+      if (!fs.existsSync(targetDir)) {
+        console.log(cli.blue('[INFO]'), 'Creating directory recursively:', targetDir);
+        await util.promisify(fs.mkdir)(targetDir, { recursive: true, mode: 0o777 });
+      }
+      const stat = await util.promisify(fs.stat)(sourceFile);
+      if (stat.isFile()) {
+        await util.promisify(fs.copyFile)(sourceFile, targetFile);
+      } else {
+        await exec(`cp -r "${sourceFile}" "${targetFile}"`);
+      }
+    }
+
+    await util.promisify(fs.rm)(cloneDir, { force: true, recursive: true });
+
+    process.exit(0);
+  } catch (e) {
+    console.error(e);
+    process.exit(1);
+  }
+})();

+ 17 - 0
scripts/tsconfig.json

@@ -0,0 +1,17 @@
+{
+  "compilerOptions": {
+    "outDir": "./",
+    "esModuleInterop": true,
+    "moduleResolution": "node",
+    "module": "commonjs",
+    "target": "ES2016",
+    "baseUrl": "./",
+    "rootDirs": ["./"],
+    "resolveJsonModule": true,
+    "paths": {
+      "*": ["../node_modules/*", "./*"]
+    }
+  },
+  "include": ["./*", "./**/*"],
+  "exclude": []
+}