UNPKG

@coko/server

Version:

Reusable server for use by Coko's projects

270 lines 9.99 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); const commander_1 = require("commander"); const madge_1 = __importDefault(require("madge")); const output_1 = __importDefault(require("madge/lib/output")); const ora_1 = __importDefault(require("ora")); const nodemon_1 = __importDefault(require("nodemon")); const copyfiles_1 = __importDefault(require("copyfiles")); const internals_1 = __importDefault(require("../logger/internals")); const loadBuilderConfig_1 = __importDefault(require("./loadBuilderConfig")); const generateTsConfig_1 = __importDefault(require("./generateTsConfig")); const db_1 = require("../db"); const config_1 = __importDefault(require("../configManager/config")); const filesystem_1 = require("../utils/filesystem"); const pkg = require('../../package.json'); const outDir = path_1.default.join(process.cwd(), 'dist'); const tscPath = path_1.default.dirname(require.resolve('typescript')); const tsc = path_1.default.join(tscPath, '..', 'bin', 'tsc'); const tsxPath = path_1.default.dirname(require.resolve('tsx')); const tsx = path_1.default.join(tsxPath, 'cli.mjs'); const cokoServerPath = path_1.default.dirname(require.resolve('@coko/server')); const tempTsConfigFile = 'tsconfig.json'; commander_1.program .command('build') .description('Build production server') .showHelpAfterError() .action(async () => { internals_1.default.work('Building project...'); try { const { assetExtensions } = (0, loadBuilderConfig_1.default)(); const tsConfig = (0, generateTsConfig_1.default)(); const configPath = path_1.default.join(filesystem_1.tempFolderPath, tempTsConfigFile); await (0, filesystem_1.writeFileToTemp)(JSON.stringify(tsConfig), tempTsConfigFile); const command = `${tsc} --project ${configPath} --outDir ${outDir}`; (0, child_process_1.execSync)(command, { stdio: 'inherit' }); const pattern = `**/*.{${assetExtensions.join(',')}}`; await new Promise((resolve, reject) => { (0, copyfiles_1.default)([pattern, outDir], { exclude: ['node_modules/**', 'dist/**', 'tmp/**'] }, err => { if (err) reject(err); else resolve(); }); }); internals_1.default.success('Build completed successfully.'); } finally { await (0, filesystem_1.deleteFileFromTemp)(tempTsConfigFile); } }); commander_1.program .command('start') .description('Start server') .showHelpAfterError() .action(async () => { const serverPath = path_1.default.join(cokoServerPath, 'startServer.js'); const { startServer } = await Promise.resolve(`${serverPath}`).then(s => __importStar(require(s))); startServer(); }); commander_1.program .command('start-dev') .description('Start development server') .showHelpAfterError() .action(async () => { const { devServer: { inspectorPort, ignore }, } = (0, loadBuilderConfig_1.default)(); const tsConfig = (0, generateTsConfig_1.default)(); const scriptPath = path_1.default.join(__dirname, '..', 'init.js'); const exec = ` echo '${JSON.stringify(tsConfig)}' | ${tsx} --inspect=0.0.0.0:${inspectorPort} --tsconfig /dev/stdin `.trim(); (0, nodemon_1.default)({ script: scriptPath, exec, ignore, ext: '*', }); nodemon_1.default .on('start', () => { internals_1.default.nodemon('Starting dev server...'); }) .on('quit', () => { internals_1.default.nodemon('Stopping dev server...'); process.exit(); }) .on('restart', files => { internals_1.default.nodemon(`Retarting dev server due to files ${files}...`); }); }); commander_1.program .command('typecheck') .description('Typecheck your code') .showHelpAfterError() .action(async () => { internals_1.default.work('Typechecking your code...'); try { const tsConfig = (0, generateTsConfig_1.default)(); const configPath = path_1.default.join(filesystem_1.tempFolderPath, tempTsConfigFile); await (0, filesystem_1.writeFileToTemp)(JSON.stringify(tsConfig), tempTsConfigFile); const command = `${tsc} --noEmit --project ${configPath}`; (0, child_process_1.execSync)(command, { stdio: 'inherit' }); internals_1.default.success('Typecheck completed successfully.'); } finally { await (0, filesystem_1.deleteFileFromTemp)(tempTsConfigFile); } }); const migrateCommand = commander_1.program .command('migrate') .description('Run or roll back migrations') .hook('preAction', async () => { const tsConfig = (0, generateTsConfig_1.default)(); const { register } = await Promise.resolve().then(() => __importStar(require('ts-node'))); register({ transpileOnly: true, compilerOptions: tsConfig.compilerOptions, }); await config_1.default.init(); db_1.db.init(); }) .showHelpAfterError(); migrateCommand .command('up') .option('-s, --step <number>', 'How many migrations to run') .option('-l, --skip-last <number>', 'Run all except for the last <number> migrations. If used, the --step option is discarded.') .description('Run migrations') .alias('run') .action(async (options) => { try { const optionsToPass = {}; if (options.skipLast) { optionsToPass.skipLast = parseInt(options.skipLast, 10); } if (options.step) { optionsToPass.step = parseInt(options.step, 10); } await db_1.migrationManager.migrate(optionsToPass); process.exit(0); } catch (e) { internals_1.default.error(e); process.exit(1); } }); migrateCommand .command('down') .option('-s, --step <number>', 'How many migrations to roll back', '1') .option('-l, --last-successful-run', 'Roll back to the last time migrate completed successfully. If used, the --step option is discarded.') .description('Roll back migrations') .alias('rollback') .action(async (options) => { const optionsToPass = {}; const lastSuccessfulRun = options.lastSuccessfulRun === true; const step = parseInt(options.step, 10); if (!lastSuccessfulRun) { if (step > 1) optionsToPass.step = step; } else { optionsToPass.lastSuccessfulRun = true; } try { await db_1.migrationManager.rollback(optionsToPass); process.exit(0); } catch (e) { internals_1.default.error(e); process.exit(1); } }); migrateCommand .command('pending') .description('Display pending migrations') .action(async () => { try { await db_1.migrationManager.pending(); process.exit(0); } catch (e) { internals_1.default.error(e); process.exit(1); } }); migrateCommand .command('executed') .description('Display executed migrations') .action(async () => { try { await db_1.migrationManager.executed(); process.exit(0); } catch (e) { internals_1.default.error(e); process.exit(1); } }); commander_1.program .command('circular') .description('Display circular dependencies') .showHelpAfterError() .action(async () => { try { const res = await (0, madge_1.default)(process.cwd()); const circular = res.circular(); // borrowed from the madge cli tool: https://github.com/pahen/madge/blob/master/bin/cli.js#L9 const spinner = (0, ora_1.default)({ text: 'Finding files', color: 'white', interval: 100000, // @ts-ignore isEnabled: commander_1.program.spinner === 'false' ? false : null, }); output_1.default.circular(spinner, res, circular, { // @ts-ignore json: commander_1.program.json, // @ts-ignore printCount: commander_1.program.count, }); process.exit(0); } catch (e) { internals_1.default.error(e); process.exit(1); } }); commander_1.program .name('coko-server') .version(pkg.version, '-v, --version') .description("Coko server's cli tool") .showHelpAfterError() .parse(process.argv); //# sourceMappingURL=coko-server.js.map