{
  "version": 3,
  "sources": ["../../src/builder/esbuild.builder.mts"],
  "sourcesContent": ["/*\n * Copyright (c) 2022 Kiyozz.\n *\n * All rights reserved.\n */\n\nimport chokidar from 'chokidar'\nimport compression from 'compression'\nimport connect from 'connect'\nimport debounce from 'debounce-fn'\nimport esbuild, { BuildContext, BuildOptions } from 'esbuild'\nimport httpProxy from 'http-proxy'\nimport livereload from 'livereload'\nimport fs from 'node:fs/promises'\nimport { createServer } from 'node:http'\nimport path from 'node:path'\n\nimport { BaseBuilder } from './base.builder.mjs'\nimport type { Item } from '../config/config.mjs'\nimport { Logger } from '../console.mjs'\nimport { getDeps } from '../deps.mjs'\n\nconst _logger = new Logger('Builder/Esbuild')\n\nexport class EsbuildBuilder extends BaseBuilder<BuildOptions> {\n  readonly hasInitialBuild = true\n\n  private _builder: BuildContext | undefined\n\n  constructor(protected readonly _config: Item<BuildOptions>) {\n    super(_config)\n  }\n\n  async build(): Promise<void> {\n    _logger.log('Building', this.env.toLowerCase())\n\n    if (this._builder) {\n      await this._builder.rebuild()\n    } else {\n      this._builder = (await esbuild.context(\n        this._config.config,\n      )) as BuildContext\n      await this._builder.rebuild()\n      await this._copyHtml()\n    }\n\n    _logger.log(this.env, 'built')\n  }\n\n  async dev(start: () => void): Promise<void> {\n    if (this._config.fileConfig === null) {\n      return\n    }\n\n    if (this._config.isMain) {\n      //region isMain\n      const sources = path.join(\n        path.resolve(path.dirname(this._config.fileConfig.src)),\n        '**',\n        '*.{js,ts,tsx}',\n      )\n      const watcher = chokidar.watch([\n        sources,\n        ...getDeps(path.resolve(this._config.fileConfig.src)),\n      ])\n\n      watcher.on('ready', () => {\n        watcher.on(\n          'all',\n          debounce(\n            async () => {\n              if (this._builder) await this._builder.cancel()\n              await this.build()\n\n              start()\n\n              await watcher.close()\n              this.dev(start)\n            },\n            { wait: 200 },\n          ),\n        )\n      })\n\n      process.on('exit', async () => {\n        await watcher.close()\n      })\n      //endregion\n    } else if (this._config.isRenderer) {\n      //region isRenderer\n      if (typeof this._config.fileConfig.html === 'undefined') {\n        _logger.end(\n          'Cannot use esbuild in renderer without specifying a html file in `rendererConfig.html`',\n        )\n      }\n\n      const srcDir = path.resolve(\n        process.cwd(),\n        path.dirname(this._config.fileConfig.src),\n      )\n      const host = '127.0.0.1'\n      const port = 9081\n      const livereloadPort = 35729\n      const ctx = await esbuild.context(this._config.config)\n\n      ctx\n        .serve({\n          host,\n          port,\n        })\n        .then(async (builder) => {\n          if (typeof this._config.fileConfig?.html === 'undefined') {\n            _logger.end(\n              'Cannot use esbuild in renderer without specifying a html file in `rendererConfig.html`',\n            )\n            return\n          }\n\n          const htmlPath = path.resolve(\n            process.cwd(),\n            this._config.fileConfig.html,\n          )\n          const html = (await fs.readFile(htmlPath))\n            .toString()\n            .replace(\n              '</body>',\n              `<script src='/livereload.js?snipver=1'></script></body>`,\n            )\n\n          const proxy = httpProxy.createProxy({\n            target: `http://${host}:${port}`,\n          })\n          const proxyLr = httpProxy.createProxy({\n            target: `http://${host}:${livereloadPort}`,\n          })\n          const lrServer = livereload.createServer({ port: livereloadPort })\n\n          const handler = connect()\n\n          handler.use(compression() as never)\n          handler.use((req, res) => {\n            if (req.url === '/' || req.url === '') {\n              res.setHeader('Content-Type', 'text/html')\n              res.writeHead(200)\n              res.end(html)\n            } else if (req.url?.includes('livereload.js')) {\n              proxyLr.web(req, res)\n            } else {\n              proxy.web(req, res)\n            }\n          })\n\n          const server = createServer(handler)\n\n          server.on('upgrade', (req, socket, head) => {\n            proxyLr.ws(req, socket, head)\n          })\n\n          const sources = `${srcDir}/**/*.{js,jsx,ts,tsx,css,scss}`\n          const watcher = chokidar.watch(sources, { disableGlobbing: false })\n\n          watcher.on('ready', () => {\n            watcher.on('all', async (eventName, file) => {\n              _logger.log('Refresh', this.env.toLowerCase())\n              lrServer.refresh(file)\n            })\n          })\n\n          process.on('exit', async () => {\n            server.close()\n            lrServer.close()\n            await watcher.close()\n            await this._builder?.cancel()\n            await ctx.dispose()\n          })\n\n          server.listen(9080)\n        })\n      //endregion\n    }\n  }\n\n  private async _copyHtml() {\n    if (this._config.fileConfig?.html) {\n      const out = path.resolve(\n        process.cwd(),\n        this._config.fileConfig.output.dir,\n      )\n      const html = path.resolve(process.cwd(), this._config.fileConfig.html)\n\n      await fs.copyFile(html, path.join(out, path.basename(html)))\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
