11// @ts -check
22
3- import { appendFile } from 'node:fs/promises' ;
3+ import { readFile , writeFile } from 'node:fs/promises' ;
44import { join } from 'node:path' ;
55import { build } from 'tsup' ;
66import { Colors , erase , findCommandKitConfig , panic , write } from './common.mjs' ;
@@ -14,6 +14,7 @@ export async function bootstrapProductionBuild(config) {
1414 antiCrash = true ,
1515 src,
1616 main,
17+ requirePolyfill : polyfillRequire ,
1718 } = await findCommandKitConfig ( config ) ;
1819
1920 const status = ora ( 'Creating optimized production build...\n' ) . start ( ) ;
@@ -39,7 +40,7 @@ export async function bootstrapProductionBuild(config) {
3940 entry : [ src , '!dist' , '!.commandkit' , `!${ outDir } ` ] ,
4041 } ) ;
4142
42- await injectShims ( outDir , main , antiCrash ) ;
43+ await injectShims ( outDir , main , antiCrash , polyfillRequire ) ;
4344
4445 status . succeed (
4546 Colors . green ( `Build completed in ${ ( performance . now ( ) - start ) . toFixed ( 2 ) } ms!` ) ,
@@ -55,14 +56,33 @@ export async function bootstrapProductionBuild(config) {
5556 }
5657}
5758
58- async function injectShims ( outDir , main , antiCrash ) {
59+ export async function injectShims ( outDir , main , antiCrash , polyfillRequire ) {
5960 const path = join ( process . cwd ( ) , outDir , main ) ;
6061
62+ const head = [ '\n\n;await (async()=>{' , " 'use strict';" ] . join ( '\n' ) ;
63+ const tail = '\n})();' ;
64+ const requireScript = polyfillRequire
65+ ? [
66+ '// --- CommandKit require() polyfill ---' ,
67+ ' if (typeof require === "undefined") {' ,
68+ ' const { createRequire } = await import("node:module");' ,
69+ ' const __require = createRequire(import.meta.url);' ,
70+ ' Object.defineProperty(globalThis, "require", {' ,
71+ ' value: (id) => {' ,
72+ ' return __require(id);' ,
73+ ' },' ,
74+ ' configurable: true,' ,
75+ ' enumerable: false,' ,
76+ ' writable: true,' ,
77+ ' });' ,
78+ ' }' ,
79+ '// --- CommandKit require() polyfill ---' ,
80+ ] . join ( '\n' )
81+ : '' ;
82+
6183 const antiCrashScript = antiCrash
6284 ? [
63- '\n\n// --- CommandKit Anti-Crash Monitor ---' ,
64- ';(()=>{' ,
65- " 'use strict';" ,
85+ '// --- CommandKit Anti-Crash Monitor ---' ,
6686 " // 'uncaughtException' event is supposed to be used to perform synchronous cleanup before shutting down the process" ,
6787 ' // instead of using it as a means to resume operation.' ,
6888 ' // But it exists here due to compatibility reasons with discord bot ecosystem.' ,
@@ -75,12 +95,12 @@ async function injectShims(outDir, main, antiCrash) {
7595 ' process.on(e2, (r) => {' ,
7696 ' l(p(`${b} Unhandled promise rejection`)); l(p(`${b} ${r.stack || r}`));' ,
7797 ' });' ,
78- '})();' ,
79- '// --- CommandKit Anti-Crash Monitor ---\n' ,
98+ '// --- CommandKit Anti-Crash Monitor ---' ,
8099 ] . join ( '\n' )
81100 : '' ;
82101
83- const finalScript = [ antiCrashScript ] . join ( '\n' ) ;
102+ const contents = await readFile ( path , 'utf-8' ) ;
103+ const finalScript = [ head , requireScript , antiCrashScript , tail , '\n\n' , contents ] . join ( '\n' ) ;
84104
85- return appendFile ( path , finalScript ) ;
105+ return writeFile ( path , finalScript ) ;
86106}
0 commit comments