import { $, argv, fs, os, path, usePowerShell, within } from "zx"; import { fileURLToPath } from "url"; import spawn from "cross-spawn"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const rootDir = path.resolve(__dirname, "../"); if (argv.updateVersion) { let pack = await fs.readJSON(path.resolve(rootDir, "./package.json")); let webpackage = await fs.readJSON( path.resolve(rootDir, "./web/package.json") ); if (webpackage.version != pack.version) { webpackage.version = pack.version; await fs.writeFile( path.resolve(rootDir, "./web/package.json"), JSON.stringify(webpackage, null, 2) ); } let electronpackage = await fs.readJSON( path.resolve(rootDir, "./electron/package.json") ); if (electronpackage.version != pack.version) { electronpackage.version = pack.version; await fs.writeFile( path.resolve(rootDir, "./electron/package.json"), JSON.stringify(electronpackage, null, 2) ); } } $.verbose = true; if (os.platform() === "win32") { usePowerShell(); } fs.writeFileSync( "./electron/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js", fs .readFileSync( "./electron/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js" ) .toString() .replace( `import { spawn } from "node:child_process";`, `import spawn from "cross-spawn";` ) ); fs.writeFileSync( "./electron/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js", fs .readFileSync( "./electron/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js" ) .toString() .replace( `const node_child_process_1 = require("node:child_process");`, `const spawn = require("cross-spawn");` ) .replace( `node_child_process_1.spawn`, `spawn` ) ); // if ( // !fs // .readFileSync( // "./electron/node_modules/@modelcontextprotocol/sdk/dist/client/sse.js" // ) // .toString() // .includes(`'eventsource'`) // ) { // fs.writeFileSync( // "./electron/node_modules/@modelcontextprotocol/sdk/dist/client/sse.js", // fs // .readFileSync( // "./electron/node_modules/@modelcontextprotocol/sdk/dist/client/sse.js" // ) // .toString() // .replace( // `import { JSONRPCMessageSchema } from "../types.js";`, // `import { JSONRPCMessageSchema } from "../types.js"; // import {EventSource} from 'eventsource'` // ) // ); // } const spawnWithOutput = (command: string, args: string[], options) => { return new Promise((resolve, reject) => { const proc = spawn(command, args, options); let stdout = ""; let stderr = ""; proc.stdout.pipe(process.stdout); proc.stderr.pipe(process.stderr); proc.stdout.on("data", (data) => { stdout += data.toString(); // console.log(data.toString()); // 实时输出 }); proc.stderr.on("data", (data) => { stderr += data.toString(); // console.error(data.toString()); // 实时输出错误 }); proc.on("close", (code) => { if (code !== 0) { reject(new Error(`Command failed with code ${code}\n${stderr}`)); } else { resolve({ stdout, stderr, code, }); } }); proc.on("error", (err) => { reject(err); }); }); }; if (argv.dev) { spawnWithOutput( "npx", ["cross-env", "NODE_ENV=development", "myEnv=dev", "webpack", "serve"], { cwd: path.resolve(rootDir, "./web/"), } ); spawnWithOutput( "npx", [ "cross-env", "NODE_ENV=development", "myEnv=dev", "webpack", "-w", "-c", "webpack.eval.js", ], { cwd: path.resolve(rootDir, "./web/"), } ); spawnWithOutput("npm", ["run", "dev"], { cwd: path.resolve(rootDir, "./electron/"), }); // $({ // cwd: path.resolve(__dirname, "./web/"), // spawn: spawn as any, // })`npx cross-env NODE_ENV=development webpack serve -c webpack.config.js`; // $({ // cwd: path.resolve(__dirname, "./electron/"), // spawn: spawn as any, // })`npm run dev`; } if (argv.prod) { await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=production myEnv=prod webpack -c webpack.config.js`; await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=development myEnv=dev webpack -c webpack.eval.js`; await fs.copy( `./web/public/logo.png`, `./electron/web-build/assets/favicon.png`, { overwrite: true, } ); await $({ cwd: path.resolve(rootDir, "./electron/"), })`npm run prod`; // let p = path.resolve(__dirname, `./dist`); // fs.ensureDirSync(p); // let pack = await fs.readJSON( // path.resolve(__dirname, "./electron/package.json") // ); // let arr = [ // `HyperChat-${pack.version}-win-x64.exe`, // `HyperChat-${pack.version}-mac-x64.exe`, // `HyperChat-${pack.version}-mac-arm64.exe`, // ]; // for (let name of arr) { // if (fs.existsSync(`./electron/dist/HyperChat-${pack.version}-x64.exe`)) { // await fs.copy(`./electron/dist/` + name, p + `/` + name, { // overwrite: true, // }); // } // } } if (argv.prod_node) { await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=production myEnv=prod webpack -c webpack.config.js`; await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=development myEnv=dev webpack -c webpack.eval.js`; await fs.copy( `./web/public/logo.png`, `./electron/web-build/assets/favicon.png`, { overwrite: true, } ); await $({ cwd: path.resolve(rootDir, "./electron/"), })`npm run build:node`; } if (argv.build) { await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=production myEnv=prod webpack -c webpack.config.js`; await $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=development myEnv=dev webpack -c webpack.eval.js`; await fs.copy( `./web/public/logo.png`, `./electron/web-build/assets/favicon.png`, { overwrite: true, } ); await $({ cwd: path.resolve(rootDir, "./electron/"), })`npm run build`; } if (argv.test) { await within(() => { return Promise.all([ $({ cwd: path.resolve(rootDir, "./web/"), })`npx cross-env NODE_ENV=development myEnv=test webpack -c webpack.config.js`, $({ cwd: path.resolve(rootDir, "./electron/"), })`npm run testprod`, ]); }); } if (argv.pre_commit) { }