esbuild.mjs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import * as esbuild from "esbuild"
  2. import * as fs from "fs"
  3. import * as path from "path"
  4. import { fileURLToPath } from "url"
  5. import { getGitSha, copyPaths, copyLocales, copyWasms, generatePackageJson } from "@roo-code/build"
  6. const __filename = fileURLToPath(import.meta.url)
  7. const __dirname = path.dirname(__filename)
  8. async function main() {
  9. const production = process.argv.includes("--production")
  10. const minify = production
  11. const sourcemap = !production
  12. const overrideJson = JSON.parse(fs.readFileSync(path.join(__dirname, "package.nightly.json"), "utf8"))
  13. console.log(`[main] name: ${overrideJson.name}`)
  14. console.log(`[main] version: ${overrideJson.version}`)
  15. const gitSha = getGitSha()
  16. console.log(`[main] gitSha: ${gitSha}`)
  17. /**
  18. * @type {import('esbuild').BuildOptions}
  19. */
  20. const buildOptions = {
  21. bundle: true,
  22. minify,
  23. sourcemap,
  24. logLevel: "silent",
  25. format: "cjs",
  26. sourcesContent: false,
  27. platform: "node",
  28. define: {
  29. "process.env.PKG_NAME": '"roo-code-nightly"',
  30. "process.env.PKG_VERSION": `"${overrideJson.version}"`,
  31. "process.env.PKG_OUTPUT_CHANNEL": '"Roo-Code-Nightly"',
  32. ...(gitSha ? { "process.env.PKG_SHA": `"${gitSha}"` } : {}),
  33. },
  34. }
  35. const srcDir = path.join(__dirname, "..", "..", "src")
  36. const buildDir = path.join(__dirname, "build")
  37. const distDir = path.join(buildDir, "dist")
  38. /**
  39. * @type {import('esbuild').Plugin[]}
  40. */
  41. const plugins = [
  42. {
  43. name: "copy-files",
  44. setup(build) {
  45. build.onEnd(() => {
  46. copyPaths(
  47. [
  48. ["../README.md", "README.md"],
  49. ["../CHANGELOG.md", "CHANGELOG.md"],
  50. ["../LICENSE", "LICENSE"],
  51. [".vscodeignore", ".vscodeignore"],
  52. ["assets", "assets"],
  53. ["integrations", "integrations"],
  54. ["node_modules/vscode-material-icons/generated", "assets/vscode-material-icons"],
  55. ["../webview-ui/audio", "webview-ui/audio"],
  56. ],
  57. srcDir,
  58. buildDir,
  59. )
  60. })
  61. },
  62. },
  63. {
  64. name: "generate-package-json",
  65. setup(build) {
  66. build.onEnd(() => {
  67. const packageJson = JSON.parse(fs.readFileSync(path.join(srcDir, "package.json"), "utf8"))
  68. const generatedPackageJson = generatePackageJson({
  69. packageJson,
  70. overrideJson,
  71. substitution: ["roo-cline", "roo-code-nightly"],
  72. })
  73. fs.writeFileSync(path.join(buildDir, "package.json"), JSON.stringify(generatedPackageJson, null, 2))
  74. console.log(`[generate-package-json] Generated package.json`)
  75. let count = 0
  76. fs.readdirSync(path.join(srcDir)).forEach((file) => {
  77. if (file.startsWith("package.nls")) {
  78. fs.copyFileSync(path.join(srcDir, file), path.join(buildDir, file))
  79. count++
  80. }
  81. })
  82. console.log(`[copy-src] Copied ${count} package.nls*.json files to ${buildDir}`)
  83. const nlsPkg = JSON.parse(fs.readFileSync(path.join(srcDir, "package.nls.json"), "utf8"))
  84. const nlsNightlyPkg = JSON.parse(
  85. fs.readFileSync(path.join(__dirname, "package.nls.nightly.json"), "utf8"),
  86. )
  87. fs.writeFileSync(
  88. path.join(buildDir, "package.nls.json"),
  89. JSON.stringify({ ...nlsPkg, ...nlsNightlyPkg }, null, 2),
  90. )
  91. console.log(`[copy-src] Generated package.nls.json`)
  92. })
  93. },
  94. },
  95. {
  96. name: "copy-wasms",
  97. setup(build) {
  98. build.onEnd(() => copyWasms(srcDir, distDir))
  99. },
  100. },
  101. {
  102. name: "copy-locales",
  103. setup(build) {
  104. build.onEnd(() => copyLocales(srcDir, distDir))
  105. },
  106. },
  107. ]
  108. /**
  109. * @type {import('esbuild').BuildOptions}
  110. */
  111. const extensionBuildOptions = {
  112. ...buildOptions,
  113. plugins,
  114. entryPoints: [path.join(srcDir, "extension.ts")],
  115. outfile: path.join(distDir, "extension.js"),
  116. external: ["vscode"],
  117. }
  118. /**
  119. * @type {import('esbuild').BuildOptions}
  120. */
  121. const workerBuildOptions = {
  122. ...buildOptions,
  123. entryPoints: [path.join(srcDir, "workers", "countTokens.ts")],
  124. outdir: path.join(distDir, "workers"),
  125. }
  126. const [extensionBuildContext, workerBuildContext] = await Promise.all([
  127. esbuild.context(extensionBuildOptions),
  128. esbuild.context(workerBuildOptions),
  129. ])
  130. await Promise.all([
  131. extensionBuildContext.rebuild(),
  132. extensionBuildContext.dispose(),
  133. workerBuildContext.rebuild(),
  134. workerBuildContext.dispose(),
  135. ])
  136. }
  137. main().catch((e) => {
  138. console.error(e)
  139. process.exit(1)
  140. })