{
  "version": 3,
  "sources": ["../src/worker.mts"],
  "sourcesContent": ["/*\n * Copyright (c) 2022 Kiyozz.\n *\n * All rights reserved.\n */\n\nimport deepMerge from 'deepmerge'\nimport { buildSync } from 'esbuild'\nimport has from 'has'\nimport yaml from 'js-yaml'\nimport fs from 'node:fs'\nimport fsAsync from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { Config, Item } from './config/config.mjs'\nimport { Configurator } from './config/configurators/base.configurator.mjs'\nimport { Target, TypeConfig } from './config/enums.mjs'\nimport { PossibleConfiguration } from './config/types.mjs'\nimport { configByEnv } from './config/utils.mjs'\nimport { ConfigFile } from './config/validation.mjs'\nimport { Yaml, YamlSkeleton } from './config/yaml.mjs'\nimport { Logger } from './console.mjs'\nimport { Env } from './env.mjs'\n\nconst _outMain = 'out_main.mjs'\nconst _outRenderer = 'out_renderer.mjs'\nconst _logger = new Logger('Config')\nconst _cwd = process.cwd()\nconst _resolve = (...paths: string[]): string => path.resolve(_cwd, ...paths)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _require = async (module: string): Promise<any> => {\n  return await import(`file://${module}`)\n}\nconst _silentRemove = async (file: string) => {\n  try {\n    await fsAsync.unlink(file)\n  } catch {\n    // Silent error\n  }\n}\nconst _buildUserConfig = async <C extends PossibleConfiguration>(\n  configPath: string,\n  target: Target,\n): Promise<C> => {\n  const outName = target === Target.main ? _outMain : _outRenderer\n  const out = _resolve(outName)\n\n  buildSync({\n    target: 'node19',\n    outfile: out,\n    entryPoints: [configPath],\n    platform: 'node',\n    format: 'esm',\n  })\n\n  try {\n    let userConfig = await _require(out)\n\n    if (has(userConfig, 'default')) {\n      userConfig = userConfig.default\n    }\n\n    await _silentRemove(out)\n\n    return userConfig as C\n  } catch (e) {\n    await _silentRemove(out)\n\n    _logger.error('electron-esbuild could not load file', configPath)\n    _logger.error('below stack:')\n    _logger.end(e)\n    process.exit(1)\n  }\n}\nconst _loadYaml = (file: string): Yaml => {\n  let fileContent = ''\n\n  try {\n    fileContent = fs.readFileSync(path.resolve(file)).toString()\n  } catch (e) {\n    _logger.end('Unable to find electron-esbuild config file at:', file)\n  }\n\n  const configFile = new ConfigFile(\n    yaml.load(fileContent) as unknown as YamlSkeleton,\n  )\n\n  configFile.ensureValid()\n\n  return configFile.toYaml()\n}\n\nclass _WorkerConfigurator {\n  readonly main: Configurator<TypeConfig>\n  readonly renderer: Configurator<TypeConfig> | null\n\n  constructor({\n    main,\n    renderer,\n  }: {\n    main: Configurator<TypeConfig>\n    renderer: Configurator<TypeConfig> | null\n  }) {\n    this.main = main\n    this.renderer = renderer\n  }\n\n  static fromYaml(yaml: Yaml): _WorkerConfigurator {\n    const main = yaml.main.toConfigurator()\n    const renderer = yaml.renderer ? yaml.renderer.toConfigurator() : null\n\n    return new this({ main, renderer })\n  }\n}\n\nexport class Worker<\n  M extends PossibleConfiguration,\n  R extends PossibleConfiguration,\n> {\n  private readonly _file: string\n  private readonly _main: Partial<M>\n  private readonly _renderer: Partial<R>\n\n  readonly env: Env\n  readonly configurator: _WorkerConfigurator\n\n  constructor({\n    file,\n    env,\n    main,\n    renderer,\n    configurator,\n  }: {\n    file: string\n    env: Env\n    configurator: _WorkerConfigurator\n    main: Partial<M>\n    renderer: Partial<R>\n  }) {\n    this._file = file\n    this.env = env\n    this._main = main\n    this._renderer = renderer\n    this.configurator = configurator\n  }\n\n  static fromFile<\n    M extends PossibleConfiguration,\n    R extends PossibleConfiguration,\n  >({ file, env }: { file: string; env: Env }): Worker<M, R> {\n    const yaml = _loadYaml(file)\n    const configurator = _WorkerConfigurator.fromYaml(yaml)\n    const main = configByEnv({\n      dev: env === 'development',\n      type: configurator.main.type,\n    }) as Partial<M>\n    const renderer = configByEnv({\n      dev: env === 'development',\n      type: configurator.renderer?.type ?? null,\n    }) as Partial<R>\n\n    return new this({\n      file,\n      env,\n      configurator,\n      main,\n      renderer,\n    })\n  }\n\n  async toConfigAsync(): Promise<Config<M, R>> {\n    const mainConfig = this.configurator.main.config\n    const rendererConfig = this.configurator.renderer?.config ?? null\n\n    if (!fs.existsSync(mainConfig.path)) {\n      _logger.end(\n        `Main config file '${mainConfig.path}' not found. Check your ${this._file} file`,\n      )\n    }\n\n    if (rendererConfig !== null && !fs.existsSync(rendererConfig.path)) {\n      _logger.end(\n        `Renderer config file '${rendererConfig.path}' not found. Check your ${this._file} file`,\n      )\n    }\n\n    process.env.NODE_ENV = this.env\n    const mainConfigPath = _resolve(mainConfig.path)\n    const rendererConfigPath =\n      rendererConfig !== null ? _resolve(rendererConfig.path) : null\n\n    const userMainConfig = await _buildUserConfig<M>(\n      mainConfigPath,\n      Target.main,\n    )\n\n    const userRendererConfig = rendererConfigPath\n      ? await _buildUserConfig<R>(rendererConfigPath, Target.renderer)\n      : null\n\n    let mainConfigFinal: M = deepMerge(this._main, userMainConfig, {\n      clone: false,\n    })\n    let rendererConfigFinal: R | null =\n      rendererConfig !== null && userRendererConfig !== null\n        ? deepMerge(this._renderer, userRendererConfig, { clone: false })\n        : null\n\n    mainConfigFinal = deepMerge(\n      this.configurator.main.toBuilderConfig(\n        this._main,\n        mainConfigFinal,\n        Target.main,\n      ) as Partial<M>,\n      mainConfigFinal,\n      { clone: false },\n    )\n\n    rendererConfigFinal =\n      rendererConfigFinal !== null\n        ? this.configurator.renderer\n          ? deepMerge(\n              this.configurator.renderer.toBuilderConfig(\n                this._renderer,\n                rendererConfigFinal,\n                Target.renderer,\n              ) as Partial<R>,\n              rendererConfigFinal,\n              { clone: false },\n            )\n          : null\n        : null\n\n    return new Config<M, R>({\n      main: new Item({\n        config: mainConfigFinal,\n        fileConfig: mainConfig,\n        target: Target.main,\n      }),\n      renderer: new Item({\n        config: rendererConfigFinal,\n        fileConfig: rendererConfig,\n        target: Target.renderer,\n      }),\n    })\n  }\n}\n"],
  "mappings": "AAMA,OAAO,eAAe;AACtB,SAAS,iBAAiB;AAC1B,OAAO,SAAS;AAChB,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,aAAa;AACpB,OAAO,UAAU;AAEjB,SAAS,QAAQ,YAAY;AAE7B,SAAS,cAA0B;AAEnC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAE3B,SAAS,cAAc;AAGvB,MAAM,WAAW;AACjB,MAAM,eAAe;AACrB,MAAM,UAAU,IAAI,OAAO,QAAQ;AACnC,MAAM,OAAO,QAAQ,IAAI;AACzB,MAAM,WAAW,IAAI,UAA4B,KAAK,QAAQ,MAAM,GAAG,KAAK;AAE5E,MAAM,WAAW,OAAO,WAAiC;AACvD,SAAO,MAAM,OAAO,UAAU;AAChC;AACA,MAAM,gBAAgB,OAAO,SAAiB;AAC5C,MAAI;AACF,UAAM,QAAQ,OAAO,IAAI;AAAA,EAC3B,QAAE;AAAA,EAEF;AACF;AACA,MAAM,mBAAmB,OACvB,YACA,WACe;AACf,QAAM,UAAU,WAAW,OAAO,OAAO,WAAW;AACpD,QAAM,MAAM,SAAS,OAAO;AAE5B,YAAU;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa,CAAC,UAAU;AAAA,IACxB,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,CAAC;AAED,MAAI;AACF,QAAI,aAAa,MAAM,SAAS,GAAG;AAEnC,QAAI,IAAI,YAAY,SAAS,GAAG;AAC9B,mBAAa,WAAW;AAAA,IAC1B;AAEA,UAAM,cAAc,GAAG;AAEvB,WAAO;AAAA,EACT,SAAS,GAAP;AACA,UAAM,cAAc,GAAG;AAEvB,YAAQ,MAAM,wCAAwC,UAAU;AAChE,YAAQ,MAAM,cAAc;AAC5B,YAAQ,IAAI,CAAC;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AACA,MAAM,YAAY,CAAC,SAAuB;AACxC,MAAI,cAAc;AAElB,MAAI;AACF,kBAAc,GAAG,aAAa,KAAK,QAAQ,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7D,SAAS,GAAP;AACA,YAAQ,IAAI,mDAAmD,IAAI;AAAA,EACrE;AAEA,QAAM,aAAa,IAAI;AAAA,IACrB,KAAK,KAAK,WAAW;AAAA,EACvB;AAEA,aAAW,YAAY;AAEvB,SAAO,WAAW,OAAO;AAC3B;AAEA,MAAM,oBAAoB;AAAA,EACf;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF,GAGG;AACD,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAO,SAASA,OAAiC;AAC/C,UAAM,OAAOA,MAAK,KAAK,eAAe;AACtC,UAAM,WAAWA,MAAK,WAAWA,MAAK,SAAS,eAAe,IAAI;AAElE,WAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,EACpC;AACF;AAEO,MAAM,OAGX;AAAA,EACiB;AAAA,EACA;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAMG;AACD,SAAK,QAAQ;AACb,SAAK,MAAM;AACX,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,OAAO,SAGL,EAAE,MAAM,IAAI,GAA6C;AACzD,UAAMA,QAAO,UAAU,IAAI;AAC3B,UAAM,eAAe,oBAAoB,SAASA,KAAI;AACtD,UAAM,OAAO,YAAY;AAAA,MACvB,KAAK,QAAQ;AAAA,MACb,MAAM,aAAa,KAAK;AAAA,IAC1B,CAAC;AACD,UAAM,WAAW,YAAY;AAAA,MAC3B,KAAK,QAAQ;AAAA,MACb,MAAM,aAAa,UAAU,QAAQ;AAAA,IACvC,CAAC;AAED,WAAO,IAAI,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAuC;AAC3C,UAAM,aAAa,KAAK,aAAa,KAAK;AAC1C,UAAM,iBAAiB,KAAK,aAAa,UAAU,UAAU;AAE7D,QAAI,CAAC,GAAG,WAAW,WAAW,IAAI,GAAG;AACnC,cAAQ;AAAA,QACN,qBAAqB,WAAW,+BAA+B,KAAK;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,mBAAmB,QAAQ,CAAC,GAAG,WAAW,eAAe,IAAI,GAAG;AAClE,cAAQ;AAAA,QACN,yBAAyB,eAAe,+BAA+B,KAAK;AAAA,MAC9E;AAAA,IACF;AAEA,YAAQ,IAAI,WAAW,KAAK;AAC5B,UAAM,iBAAiB,SAAS,WAAW,IAAI;AAC/C,UAAM,qBACJ,mBAAmB,OAAO,SAAS,eAAe,IAAI,IAAI;AAE5D,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,qBACvB,MAAM,iBAAoB,oBAAoB,OAAO,QAAQ,IAC7D;AAEJ,QAAI,kBAAqB,UAAU,KAAK,OAAO,gBAAgB;AAAA,MAC7D,OAAO;AAAA,IACT,CAAC;AACD,QAAI,sBACF,mBAAmB,QAAQ,uBAAuB,OAC9C,UAAU,KAAK,WAAW,oBAAoB,EAAE,OAAO,MAAM,CAAC,IAC9D;AAEN,sBAAkB;AAAA,MAChB,KAAK,aAAa,KAAK;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,EAAE,OAAO,MAAM;AAAA,IACjB;AAEA,0BACE,wBAAwB,OACpB,KAAK,aAAa,WAChB;AAAA,MACE,KAAK,aAAa,SAAS;AAAA,QACzB,KAAK;AAAA,QACL;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,EAAE,OAAO,MAAM;AAAA,IACjB,IACA,OACF;AAEN,WAAO,IAAI,OAAa;AAAA,MACtB,MAAM,IAAI,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,UAAU,IAAI,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;",
  "names": ["yaml"]
}
