build.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { parseArgs } from "util";
  2. import { readFile } from "fs/promises";
  3. import { InlineConfig, build, createServer } from "vite";
  4. import { UserScriptPlugin } from "./utils/userscript.js";
  5. import { walk } from "./utils/path.js";
  6. const pkg = JSON.parse(await readFile("package.json", "utf8"));
  7. const args = parseArgs({
  8. options: {
  9. production: {
  10. type: "boolean",
  11. default: false
  12. }
  13. }
  14. });
  15. const server = await createServer();
  16. if (!args.values.production) {
  17. await server.listen();
  18. server.printUrls();
  19. }
  20. const entries: string[] = [];
  21. for await (const path of walk("src/")) {
  22. if (!path.endsWith("main.ts")) continue;
  23. const code = await readFile(path, { encoding: "utf8" });
  24. if (!code.startsWith("// ==UserScript==")) continue;
  25. entries.push(path.toString());
  26. }
  27. const configs = entries.map<InlineConfig>(entry => ({
  28. mode: args.values.production ? "production" : "development",
  29. plugins: [
  30. UserScriptPlugin({
  31. entry: entry,
  32. format: "umd",
  33. port: server.config.server.port,
  34. cdn: args.values.production ? pkg["config"]["cdn"] : ""
  35. })
  36. ],
  37. build: {
  38. emptyOutDir: false,
  39. watch: args.values.production ? null : {},
  40. outDir: args.values.production ? "dist/" : "out/"
  41. }
  42. }));
  43. await Promise.all(configs.map(build));
  44. if (args.values.production) await server.close();