{
  "version": 3,
  "sources": ["../src/make.ts"],
  "sourceRoot": "file://",
  "sourcesContent": ["/**\n * @file Make\n * @module mkbuild/make\n */\n\nimport { ERR_MODULE_NOT_FOUND, type NodeError } from '@flex-development/errnode'\nimport * as mlly from '@flex-development/mlly'\nimport pathe from '@flex-development/pathe'\nimport type { PackageJson } from '@flex-development/pkg-types'\nimport {\n  DOT,\n  cast,\n  defaults,\n  get,\n  ksort,\n  regexp,\n  type Nullable\n} from '@flex-development/tutils'\nimport consola from 'consola'\nimport type * as esbuild from 'esbuild'\nimport { asyncExitHook as exitHook } from 'exit-hook'\nimport { fileURLToPath } from 'node:url'\nimport pb from 'pretty-bytes'\nimport color from 'tinyrainbow'\nimport loadBuildConfig from './config/load'\nimport type { Config, Context, Result, Task } from './interfaces'\nimport * as internal from './internal'\nimport type { OutputMetadata } from './types'\nimport { analyzeOutputs, fs as fsa } from './utils'\n\n/**\n * [esbuild][1] based file-to-file transformer and bundler.\n *\n * [1]: https://esbuild.github.io\n *\n * @todo hooks support\n * @todo validate build results against package.json\n *\n * @async\n *\n * @example\n *  await make({ entries: [{}] })\n * @example\n *  await make({ entries: [{ ext: '.mjs', format: 'esm' }] })\n * @example\n *  await make({ entries: [{ ext: '.cjs', format: 'cjs' }] })\n * @example\n *  await make({ entries: [{ ext: '.js', format: 'iife' }] })\n *\n * @param {Config} [config={}] - Build configuration options\n * @return {Promise<Result[]>} Build results\n * @throws {esbuild.BuildFailure | NodeError}\n */\nasync function make({\n  configfile = true,\n  cwd = DOT,\n  ...config\n}: Config = {}): Promise<Result[]> {\n  const { entries, fs, serve, watch, write, ...options } = defaults(\n    config,\n    configfile ? await loadBuildConfig(cwd) : {},\n    {\n      cwd,\n      entries: cast<Partial<Task>[]>([{}]),\n      fs: fsa,\n      logLevel: cast<esbuild.LogLevel>('info'),\n      outdir: 'dist',\n      serve: cast<esbuild.ServeOptions | boolean>(false),\n      watch: false,\n      write: false\n    }\n  )\n\n  /**\n   * Absolute path to current working directory.\n   *\n   * @const {string} absWorkingDir\n   */\n  const absWorkingDir: string = pathe.resolve(options.cwd)\n\n  /**\n   * `package.json` data.\n   *\n   * @const {Nullable<PackageJson>} pkg\n   */\n  const pkg: Nullable<PackageJson> = mlly.readPackageJson(absWorkingDir)\n\n  // throw if package.json was not found\n  if (!pkg) {\n    throw new ERR_MODULE_NOT_FOUND(\n      pathe.join(absWorkingDir, 'package.json'),\n      fileURLToPath(import.meta.url),\n      'module'\n    )\n  }\n\n  // print start info\n  if (serve !== false || watch || write) {\n    /**\n     * Start message prefix.\n     *\n     * @const {string} prefix\n     */\n    const prefix: string = serve !== false\n      ? 'Serving'\n      : watch\n      ? 'Watching'\n      : 'Building'\n\n    consola.info(color.cyan(`${prefix} ${pkg.name}`))\n  }\n\n  /**\n   * Build tasks.\n   *\n   * @const {Task[]} tasks\n   */\n  const tasks: Task[] = entries.map(entry => {\n    const {\n      bundle = options.bundle,\n      cwd = options.cwd,\n      dts = serve !== false || watch ? false : undefined,\n      outdir = options.outdir,\n      source = options.source ?? (bundle ? 'src/index' : 'src'),\n      ...rest\n    } = entry\n\n    return defaults(\n      {\n        bundle,\n        cwd,\n        dts,\n        outdir,\n        source,\n        write\n      },\n      rest,\n      options\n    )\n  })\n\n  /**\n   * Build results.\n   *\n   * @const {Result[]} results\n   */\n  const results: Result[] = []\n\n  /**\n   * Build context.\n   *\n   * @var {Context} context\n   */\n  let context: Context\n\n  // do static build\n  if (!watch && serve === false) {\n    for (const task of tasks) {\n      // create build context\n      context = await internal.createContext(task, pkg, fs)\n\n      /**\n       * esbuild build result.\n       *\n       * @const {esbuild.BuildResult<{ metafile: true; write: false }>} result\n       */\n      const result: esbuild.BuildResult<{ metafile: true; write: false }> =\n        await context.rebuild()\n\n      // add build results\n      results.push({\n        cwd: pathe.resolve(task.cwd),\n        errors: result.errors,\n        mangleCache: result.mangleCache,\n        metafile: result.metafile,\n        outdir: task.outdir,\n        outputs: result.outputFiles.map(output => {\n          /**\n           * Relative path to output file.\n           *\n           * **Note**: Relative to {@linkcode absWorkingDir}.\n           *\n           * @const {string} outfile\n           */\n          const outfile: string = output.path\n            .replace(new RegExp('^' + regexp(absWorkingDir)), '')\n            .replace(/^\\//, '')\n\n          /**\n           * Output metadata.\n           *\n           * @const {OutputMetadata} metadata\n           */\n          const metadata: OutputMetadata = get(result.metafile.outputs, outfile)\n\n          return ksort({\n            ...output,\n            bytes: metadata.bytes,\n            entryPoint: metadata.entryPoint,\n            exports: [...new Set(metadata.exports)],\n            imports: metadata.imports,\n            outfile\n          })\n        }),\n        warnings: result.warnings\n      })\n\n      // dispose build context\n      await context.dispose()\n    }\n\n    // print build done info, output analysis, and total size\n    if (write) {\n      /**\n       * Total build size (in bytes).\n       *\n       * @var {number} size\n       */\n      let size: number = 0\n\n      // print build done info\n      consola.success(color.green(`Build succeeded for ${pkg.name}`))\n\n      // print build output analysis and update total build size\n      for (const { outdir, metafile } of results) {\n        const { analysis, bytes } = analyzeOutputs(outdir, metafile.outputs)\n        size += bytes\n        consola.log(analysis)\n      }\n\n      // print total build size\n      consola.log('Σ Total build size:', color.cyan(pb(size)))\n    }\n  }\n\n  // enable serve or watch mode\n  if (serve !== false || watch) {\n    const [task] = cast<[Task]>(tasks)\n\n    // force clean output directory\n    task.clean = true\n\n    // force writing output files\n    task.write = true\n\n    // create build context\n    context = await internal.createContext(task, pkg, fs)\n\n    // watch files\n    watch && (await context.watch())\n\n    // serve files\n    if (serve !== false) {\n      await context.serve({ ...cast<esbuild.ServeOptions>(serve) })\n    }\n\n    // dispose build context on process exit\n    exitHook(context.dispose.bind(context), { minimumWait: 5 })\n  }\n\n  return results\n}\n\nexport default make\n"],
  "mappings": "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",
  "names": ["cwd"]
}
