hyperchat/scripts/task.mts

266 lines
6.5 KiB
TypeScript

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) {
}