UNPKG

cloudscript-server

Version:

A local environment for cloudscript development

163 lines (140 loc) โ€ข 4.91 kB
const argv = require('minimist')(process.argv.slice(2)); const compiler = require('./src/compilers/devCompiler.js'); const remoteCompiler = require('./compiler.js'); const minifiedCompiler = require('./src/compilers/localReleaseCompiler.js'); const fs = require('fs'); const { spawn } = require('child_process'); const path = require('path'); const chokidar = require('chokidar'); const typesGenerator = require('./typesGenerator.js'); const compilerUtils = require('./src/compilers/compilerUtils.js'); require('colors'); let timeout = null; let child = null; let directory = null; function stopServer() { if (child == null) return; console.log("๐Ÿ›‘ Stopping server\n".red); child.kill('SIGINT'); child = null; } function startServer() { timeout = null; stopServer(); if (argv["clear-cache"] || argv.clearCache) { try { typesGenerator.clearCache(); compilerUtils.clearCache(); console.log("๐Ÿงน Cache cleared\n".yellow); } catch (error) { console.error("โŒ Failed to clear cache:\n".red, error); } } try { console.log("โš™๏ธ Compiling...".blue); const startTime = Date.now(); if (argv._.includes('remote')){ remoteCompiler.compile(directory); }else{ if (argv.minify) minifiedCompiler.compile(directory); else compiler.compile(directory); } console.log(`โœ”๏ธ Compiled in ${Date.now() - startTime}ms`.blue); } catch (err) { console.error("โŒ Failed to compile:\n".red, err); return; // do not restart server if compilation failed } try { if (argv['auto-generate-typings'] || argv['autogenerate-typings']) { console.log(); typesGenerator.generateTypings(directory); } } catch (err) { console.error("โŒ Failed to generate typings:\n".red, err); return; } let port = argv.p ?? argv.port ?? 8080; let serverType = argv._.includes('remote') ? 'server-remote.js' : 'server.js'; let args = [path.join(__dirname, serverType), port, directory, '--color']; for (let key of Object.keys(argv)) { if (key == '_') continue; args.push(`--${key}`, argv[key]); } if (argv.verbose) { try { let verboseIgnore = path.join(directory, '.verboseignore'); let verboseIgnoreContent = fs.readFileSync(verboseIgnore, 'utf8'); verboseIgnore = verboseIgnoreContent.split('\n').map(line => line.trim()).filter(line => line.length > 0); args.push(`--verboseignore`, verboseIgnore.join(',')) } catch (e) { } } child = spawn(process.execPath, args, { detached: true, stdio: 'pipe' }); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); } function keepAliveChild() { if (child == null) return; child.stdin.write('1', (err) => { }); } async function main() { directory = argv.dir ?? argv.d; if (directory != null && !path.isAbsolute(directory)) { directory = path.join(process.cwd(), directory); } else if (directory == null) { directory = process.cwd(); } if (argv._.includes("clear-cache")) { typesGenerator.clearCache(); compilerUtils.clearCache(); console.log("๐Ÿงน Cache cleared".green); return; } if (argv._.includes("init")) { require('./src/projectInitializer/initializeProject.js')(directory); return; } if (argv._.includes(`generate-typings`)) { require('./typesGenerator.js').generateTypings(directory); return; } if (argv._.includes('typings')) { require('./types-generator.js')(directory); return; } if (argv._.includes('publish')) { await require('./publisher.js')(directory); return; } console.log(("๐Ÿ“‚ Monitoring folder: " + directory.bold.underline + "\n").yellow); chokidar.watch(directory, { ignored: [ /node_modules/, /typings[\/\\]autogenerated[\/\\]/ ], ignoreInitial: true }) .on('all', (event, filePath) => { let extension = path.extname(filePath); if (extension != '.js' && extension != '.ts' && !filePath.includes('.env')) return; if (timeout != null) { clearTimeout(timeout); } timeout = setTimeout(startServer, 500); }); process.on('SIGINT', () => { stopServer(); process.exit(); }); process.on('exit', stopServer); startServer(); setInterval(keepAliveChild, 5000); } main();