{
  "version": 3,
  "sources": ["../../src/commands/dev.mts"],
  "sourcesContent": ["/*\n * Copyright (c) 2022 Kiyozz.\n *\n * All rights reserved.\n */\n\nimport { ChildProcess, spawn } from 'child_process'\nimport path from 'node:path'\n\nimport { Builder } from '../builder.mjs'\nimport { Cli, CliResult } from '../cli.mjs'\nimport { Config } from '../config/config.mjs'\nimport { CONFIG_FILE_NAME } from '../config/constants.mjs'\nimport { PossibleConfiguration } from '../config/types.mjs'\nimport { Logger } from '../console.mjs'\nimport { Worker } from '../worker.mjs'\n\nconst _isWindows = process.platform === 'win32'\nconst _electronBin = _isWindows ? 'electron.cmd' : 'electron'\nconst _logger = new Logger('Commands/Dev')\n\nclass _ApplicationStarter {\n  private _electronProcess: ChildProcess | undefined\n  private readonly _args: readonly string[]\n\n  constructor(unknownInputs: string[]) {\n    this._cleanupProcess()\n    this._args = [...unknownInputs]\n  }\n\n  async start(outputEntryFile: string): Promise<void> {\n    if (this._electronProcess) {\n      try {\n        this._kill()\n      } catch (e) {\n        _logger.end('Error occurred while killing latest main', e)\n      }\n\n      this._electronProcess = undefined\n    }\n\n    _logger.log('Start application')\n\n    this._electronProcess = spawn(\n      path.resolve(`node_modules/.bin/${_electronBin}`),\n      [outputEntryFile, ...this._args],\n      {\n        stdio: 'inherit',\n      },\n    )\n\n    this._cleanupElectronProcess()\n  }\n\n  private _kill(): void {\n    if (this._electronProcess) {\n      this._electronProcess.removeAllListeners('close')\n\n      if (_isWindows) {\n        _logger.debug('kill electron process on windows')\n\n        spawn('taskkill', ['/pid', `${this._electronProcess.pid}`, '/f', '/t'])\n      } else {\n        _logger.debug('kill electron process on macOS/linux')\n        const pid = this._electronProcess.pid\n        const killed = this._electronProcess.killed\n        this._electronProcess = undefined\n\n        if (pid !== undefined && !killed) {\n          process.kill(pid)\n        }\n      }\n    }\n  }\n\n  private _cleanupElectronProcess() {\n    this._electronProcess?.on('close', (code, signal) => {\n      if (code === null) {\n        _logger.error('Main Process exited with signal', signal)\n        process.exit(1)\n      }\n\n      process.exit(code)\n    })\n  }\n\n  private _cleanupProcess() {\n    // eslint-disable-next-line no-undef\n    const clean = (signal: NodeJS.Signals) => {\n      process.on(signal, () => {\n        _logger.log('Cleanup before exit...')\n        _logger.debug('Signal', signal)\n\n        if (!this._electronProcess?.killed ?? false) {\n          this._kill()\n        }\n\n        process.exit(0)\n      })\n    }\n\n    clean('SIGINT')\n    clean('SIGTERM')\n  }\n}\n\nexport class Dev extends Cli {\n  private readonly _mainBuilder: Builder\n  private readonly _rendererBuilder: Builder | null\n  private readonly _applicationStarter: _ApplicationStarter\n  private readonly _config: Config<PossibleConfiguration, PossibleConfiguration>\n\n  static async create(cli: CliResult, unknownInputs: string[]): Promise<Dev> {\n    process.env.NODE_ENV = 'development'\n\n    _logger.debug('Creating worker')\n\n    const worker = Worker.fromFile({\n      file: CONFIG_FILE_NAME,\n      env: 'development',\n    })\n\n    _logger.debug('Created worker')\n\n    const config = await worker.toConfigAsync()\n\n    _logger.debug('Parsed config')\n\n    const [mainBuilder, rendererBuilder] = await config.toBuildersAsync()\n\n    _logger.debug('Created builders')\n\n    return new Dev(cli, {\n      mainBuilder,\n      rendererBuilder,\n      unknownInputs,\n      config,\n    })\n  }\n\n  constructor(\n    cli: CliResult,\n    {\n      mainBuilder,\n      rendererBuilder,\n      unknownInputs,\n      config,\n    }: {\n      mainBuilder: Builder\n      rendererBuilder: Builder | null\n      unknownInputs: string[]\n      config: Config<PossibleConfiguration, PossibleConfiguration>\n    },\n  ) {\n    super(cli)\n\n    this._applicationStarter = new _ApplicationStarter(unknownInputs)\n    this._mainBuilder = mainBuilder\n    this._rendererBuilder = rendererBuilder\n    this._config = config\n  }\n\n  async init(): Promise<void> {\n    _logger.debug('Start')\n\n    const start = () =>\n      this._applicationStarter.start(\n        path.join(\n          this._config.main.fileConfig.output.dir,\n          this._config.main.fileConfig.output.filename,\n        ),\n      )\n\n    _logger.debug('Starting dev builders')\n    await this._mainBuilder.dev(start)\n    this._rendererBuilder?.dev(start)\n    _logger.debug('Started dev builders')\n    _logger.debug('Starting initial builds')\n\n    await Promise.all([\n      this._mainBuilder.hasInitialBuild\n        ? this._mainBuilder.build()\n        : Promise.resolve(),\n      this._rendererBuilder?.hasInitialBuild\n        ? this._rendererBuilder.build()\n        : Promise.resolve(),\n    ])\n\n    _logger.debug('Initial builds finished')\n\n    await start()\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
