diff --git a/packages/hydrooj/bin/hydrooj.js b/packages/hydrooj/bin/hydrooj.js index 349a1c32a..a5d49fad2 100755 --- a/packages/hydrooj/bin/hydrooj.js +++ b/packages/hydrooj/bin/hydrooj.js @@ -2,17 +2,64 @@ /* eslint-disable consistent-return */ -require('esbuild-register/dist/node').register({ - target: `node${process.version.slice(1)}`, - jsx: 'transform', +const map = {}; +require('source-map-support').install({ + handleUncaughtExceptions: false, + environment: 'node', + retrieveSourceMap(file) { + if (map[file]) { + return { + url: file, + map: map[file], + }; + } + return null; + }, }); const os = require('os'); const path = require('path'); const fs = require('fs-extra'); const argv = require('cac')().parse(); const child = require('child_process'); +const esbuild = require('esbuild'); if (!process.env.NODE_APP_INSTANCE) process.env.NODE_APP_INSTANCE = '0'; +const major = +process.version.split('.')[0].split('v')[1]; +const minor = +process.version.split('.')[1]; + +let transformTimeUsage = 0; +let transformCount = 0; +let displayTimeout; +function transform(filename) { + const start = Date.now(); + const code = fs.readFileSync(filename, 'utf-8'); + const result = esbuild.transformSync(code, { + sourcefile: filename, + sourcemap: 'both', + format: 'cjs', + loader: 'tsx', + target: `node${major}.${minor}`, + jsx: 'transform', + }); + if (result.warnings.length) console.warn(result.warnings); + transformTimeUsage += Date.now() - start; + transformCount++; + if (displayTimeout) clearTimeout(displayTimeout); + displayTimeout = setTimeout(() => console.log(`Transformed ${transformCount} files. (${transformTimeUsage}ms)`), 1000); + map[filename] = result.map; + return result.code; +} +const ESM = ['p-queue', 'p-timeout']; +require.extensions['.js'] = function loader(module, filename) { + if (ESM.filter((i) => filename.includes(i)).length || major < 14) { + return module._compile(transform(filename), filename); + } + const content = fs.readFileSync(filename, 'utf-8'); + return module._compile(content, filename); +}; +require.extensions['.ts'] = require.extensions['.tsx'] = function loader(module, filename) { + return module._compile(transform(filename), filename); +}; function buildUrl(opts) { let mongourl = `${opts.protocol || 'mongodb'}://`; diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f9c438167..7dfe793cd 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -18,7 +18,7 @@ "cac": "^6.7.3", "cookies": "^0.8.0", "detect-browser": "^5.2.0", - "esbuild-register": "^3.0.0", + "esbuild": "^0.12.28", "fs-extra": "^10.0.0", "graphql": "^15.5.3", "graphql-scalars": "^1.10.1", @@ -41,6 +41,7 @@ "reflect-metadata": "^0.1.13", "serialize-javascript": "^6.0.0", "sockjs": "^0.3.21", + "source-map-support": "^0.5.20", "superagent": "^6.1.0", "tx2": "^1.0.4" }, @@ -60,6 +61,7 @@ "@types/nodemailer": "^6.4.4", "@types/serialize-javascript": "^5.0.1", "@types/sockjs": "^0.3.33", + "@types/source-map-support": "^0", "@types/superagent": "^4.1.12", "formidable": "^1.2.2", "moment": "^2.29.1"