import { InputOptions, LogLevel, LogOrStringHandler, OutputOptions, RolldownPluginOption, RollupLog } from "rolldown";
import { Options as Options$1 } from "rolldown-plugin-dts";

//#region src/bin/build.d.ts
declare function build(options: Options): Promise<BuildStats>;
//#endregion
//#region src/types/build.d.ts
interface BuildLogs {
  level: LogLevel;
  log: RollupLog;
}
interface BuildEntryStats {
  /**
   * The root path of the project.
   */
  cwd: string;
  /**
   * Module output path.
   */
  path: string;
  /**
   * Module size.
   */
  size: number;
  /**
   * Build time of individual module.
   */
  buildTime: number;
  /**
   * Module format.
   */
  format: string;
  /**
   * List of warnings from build plugins.
   */
  logs: BuildLogs[];
}
interface BuildStats {
  /**
   * The root path of the project.
   */
  cwd: string;
  /**
   * Final bundle size.
   */
  size: number;
  /**
   * Total bundle build time.
   */
  buildTime: number;
  /**
   * List of generated bundle modules.
   */
  files: BuildEntryStats[];
}
type PickEntryChunkOptions = 'input' | 'name' | 'globals' | 'extend' | 'minify';
type PickEntryDtsOptions = 'dts' | 'dtsPlugin';
interface BuildEntryOptions extends EntryBase, Partial<Pick<EntryChunk, PickEntryChunkOptions>>, Partial<Pick<EntryDts, PickEntryDtsOptions>> {
  /**
   * Specifies the path to the processed file.
   *
   * @default undefined
   */
  output?: string;
}
//#endregion
//#region src/types/entries.d.ts
interface EntryBase {
  /**
   * Specifies the format of the generated module.
   *
   * - `'es'`, `'esm'` and `'module'` are the same format, all stand for ES module.
   * - `'cjs'` and `'commonjs'` are the same format, all stand for CommonJS module.
   * - `'iife'` stands for [Immediately Invoked Function Expression](https://developer.mozilla.org/en-US/docs/Glossary/IIFE).
   * - `'umd'` stands for [Universal Module Definition](https://github.com/umdjs/umd).
   *
   * @default 'esm'
   */
  format?: OutputOptions['format'];
  /**
   * Specifies the module IDs or regular expressions that match module IDs to be treated as external and excluded from the bundle.
   *
   * The IDs and regular expressions provided in this option are applied globally across all entries.
   *
   * Alternatively, externals can be defined individually for each entry using the `entry.externals` property.
   *
   * @default undefined
   */
  externals?: (string | RegExp)[];
  /**
   * Maps external module IDs to paths.
   *
   * @default undefined
   */
  paths?: {
    find: string | RegExp;
    replacement: string | ((path: string, match: RegExpExecArray | null) => string);
  }[];
  /**
   * Specifies the string to be inserted at the beginning of the module.
   *
   * @default undefined
   */
  banner?: OutputOptions['banner'];
  /**
   * Specifies the string to be inserted at the beginning of the module after minification
   *
   * @default undefined
   */
  postBanner?: OutputOptions['postBanner'];
  /**
   * Specifies the string to be inserted at the end of the module.
   *
   * @default undefined
   */
  footer?: OutputOptions['footer'];
  /**
   * Specifies the string to be inserted at the end of the module after minification.
   *
   * @default undefined
   */
  postFooter?: OutputOptions['postFooter'];
  /**
   * Specifies the code at the beginning that goes inside any _format-specific_ wrapper.
   *
   * @default undefined
   */
  intro?: OutputOptions['intro'];
  /**
   * Specifies the code at the end that goes inside any _format-specific_ wrapper.
   *
   * @default undefined
   */
  outro?: OutputOptions['outro'];
  /**
   * Intercepts log messages. If not supplied, logs are printed to the console.
   *
   * @default undefined
   */
  onLog?: (level: LogLevel, log: RollupLog, defaultHandler: LogOrStringHandler, buildLogs: BuildLogs[]) => void;
  /**
   * Specifies Rolldown `resolve` options.
   *
   * @default undefined
   */
  resolve?: InputOptions['resolve'];
  /**
   * Specifies Rolldown `define` options.
   *
   * @default undefined
   */
  define?: NonNullable<InputOptions['transform']>['define'];
  /**
   * Specifies Rolldown `inject` options.
   *
   * @default undefined
   */
  inject?: NonNullable<InputOptions['transform']>['inject'];
  /**
   * Specifies Rolldown plugins.
   *
   * @default undefined
   */
  plugins?: RolldownPluginOption;
  /**
   * Specifies the path to the `tsconfig` file.
   *
   * By default, if the file `tsconfig.json` exists in the project root, it will be used as the default config file.
   *
   * @default undefined
   */
  tsconfig?: InputOptions['tsconfig'];
  /**
   * Specifies which comments are preserved in the output.
   *
   * - `true` - Preserve legal, annotation, and JSDoc comments.
   * - `false` - Strip all comments.
   * - `object` - Granular control over comment categories:
   *   - `legal` - `@license`, `@preserve`, `//!`, `/*!`.
   *   - `annotation` - `@__PURE__`, `@__NO_SIDE_EFFECTS__`, `@vite-ignore`.
   *   - `jsdoc` - JSDoc comments.
   *
   * @default { legal: true, annotation: true, jsdoc: false }
   */
  comments?: OutputOptions['comments'];
}
interface EntryChunk extends EntryBase {
  /**
   * Specifies the path to the build source.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     { input: './src/index.ts' }, // outputs './dist/index.js'
   *   ]
   * })
   * ```
   */
  input: string;
  /**
   * Specifies the path to the processed file.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     {
   *       input: './src/index.ts',
   *       output: './out/index.js', // outputs './out/index.js'
   *     },
   *   ]
   * })
   * ```
   *
   * @default undefined
   */
  output?: string;
  /**
   * Specifies the global variable name that representing exported bundle.
   *
   * Intended for `umd/iife` formats.
   *
   * @default undefined
   */
  name?: OutputOptions['name'];
  /**
   * Specifies global _module ID_ and _variable name_ pairs necessary for external imports.
   *
   * Intended for `umd/iife` formats.
   *
   * @default undefined
   */
  globals?: OutputOptions['globals'];
  /**
   * Specifies whether to extend the global variable defined by the `name` option.
   *
   * Intended for `umd/iife` formats.
   */
  extend?: OutputOptions['extend'];
  /**
   * Controls code minification.
   *
   * - `true`: Enable full minification including code compression and dead code elimination.
   * - `false`: Disable minification (default).
   * - `'dce-only'`: Only perform dead code elimination without code compression.
   * - `MinifyOptions`: Fine-grained control over minification settings.
   *
   * @default undefined
   */
  minify?: OutputOptions['minify'];
  dts?: never;
  dtsPlugin?: never;
  copy?: never;
  recursive?: never;
  filter?: never;
  template?: never;
}
interface EntryDts extends EntryBase {
  /**
   * Specifies the path to the TypeScript `declaration` build source.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     { dts: './src/types.ts' }, // outputs './dist/types.d.ts'
   *   ]
   * })
   * ```
   */
  dts: string;
  /**
   * Specifies the path to the processed file.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     {
   *       dts: './src/types.ts',
   *       output: './out/types.d.ts', // outputs './out/types.d.ts'
   *     },
   *   ]
   * })
   * ```
   *
   * @default undefined
   */
  output?: string;
  /**
   * Specifies options for the `rolldown-plugin-dts` plugin.
   */
  dtsPlugin?: Options$1;
  input?: never;
  name?: never;
  globals?: never;
  extend?: never;
  minify?: never;
  copy?: never;
  recursive?: never;
  filter?: never;
  template?: never;
}
interface EntryCopy {
  /**
   * Copies either a single `file` or an entire `directory` structure from the source to the destination, including all subdirectories and files.
   *
   * This is especially useful for transferring assets that don't require any transformation, just a straightforward copy-paste operation.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     {
   *       // copies a single file
   *       copy: './src/path/file.ts', // outputs './dist/path/file.ts'
   *     },
   *     {
   *       // copies a single file
   *       copy: './src/path/file.ts',
   *       output: './dist/subdir/custom-file-name.ts',
   *     },
   *     {
   *       // copies the entire directory
   *       input: './src/path/srcdir',
   *       output: './dist/outdir',
   *     },
   *   ]
   * })
   * ```
   *
   * @default undefined
   */
  copy: string;
  /**
   * Specifies the path to the destination file or directory.
   */
  output?: string;
  /**
   * Copy directories recursively.
   *
   * @default true
   */
  recursive?: boolean;
  /**
   * Filters copied `files/directories`.
   *
   * Returns `true` to copy the item, `false` to ignore it.
   *
   * @default undefined
   */
  filter?(source: string, destination: string): boolean;
  input?: never;
  name?: never;
  globals?: never;
  extend?: never;
  minify?: never;
  dts?: never;
  dtsPlugin?: never;
  template?: never;
}
interface EntryTemplate {
  /**
   * Specifies the content of the `template` file.
   *
   * Provides the ability to dynamically inject template content during the build phase.
   *
   * @example
   *
   * ```ts
   * import { name, version } from './package.json'
   *
   * export default defineConfig({
   *   entries: [
   *     {
   *       template: `// Package ${name} v${version} ...`,
   *       output: './dist/template.ts',
   *     },
   *   ]
   * })
   * ```
   */
  template: string;
  /**
   * Specifies the path to the destination file.
   */
  output: string;
  input?: never;
  name?: never;
  globals?: never;
  extend?: never;
  minify?: never;
  dts?: never;
  dtsPlugin?: never;
  copy?: never;
  recursive?: never;
  filter?: never;
}
type EntryOptions = EntryChunk | EntryDts | EntryCopy | EntryTemplate;
//#endregion
//#region src/types/options.d.ts
interface Options {
  /**
   * Specifies the bundle's entry points.
   *
   * It allows you to manually set all build entries and adjust options for each one individually.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     { input: './src/index.ts' }, // outputs './dist/index.js'
   *     { dts: './src/types.ts' }, // outputs './dist/types.d.ts'
   *     // ...
   *   ]
   * })
   * ```
   */
  entries: EntryOptions[];
  /**
   * Specifies the output directory for production bundle.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   outDir: './output',
   * })
   * ```
   *
   * @default 'dist'
   */
  outDir?: string;
  /**
   * Specifies the module IDs, or regular expressions to match module IDs,
   * that should remain external to the bundle.
   *
   * IDs and regexps from this option are applied globally to all entries.
   *
   * Also, it is possible to define externals individually per entry (`entry.externals`).
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   externals: ['id-1', 'id-2', /regexp/],
   * })
   * ```
   *
   * @default [/^node:/,/^@types/,/^@rollup/,/^@rolldown/,/^@hypernym/,/^rollup/,/^rolldown/,...pkg.dependencies]
   */
  externals?: (string | RegExp)[];
  /**
   * Provides a powerful hooking system to further expand bundling mode.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'build:end': async (options, buildStats) => {
   *       // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  hooks?: HooksOptions;
  /**
   * Controls code minification for all `chunk` entries.
   *
   * - `true` - Enable full minification including code compression and dead code elimination.
   * - `false` - Disable minification (default).
   * - `'dce-only'` - Only perform dead code elimination without code compression.
   * - `MinifyOptions` - Fine-grained control over minification settings.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   minify: true,
   * })
   * ```
   *
   * It can also be set per entry.
   *
   * ```ts
   * export default defineConfig({
   *   entries: [
   *     {
   *       input: './src/index.ts',
   *       minify: true,
   *     },
   *   ],
   * })
   * ```
   *
   * @default undefined
   */
  minify?: OutputOptions['minify'];
  /**
   * Specifies the path to the project root (current working directory).
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   cwd: './dir',
   * })
   * ```
   *
   * @default undefined
   */
  cwd?: string;
  /**
   * Specifies the path to the `tsconfig` file.
   *
   * By default, if the file `tsconfig.json` exists in the project root, it will be used as the default config file.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   tsconfig: './path/to/tsconfig.json',
   * })
   * ```
   *
   * @default undefined
   */
  tsconfig?: string;
  /**
   * Specifies which comments are preserved in the output.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   comments: true,
   * })
   * ```
   *
   * @default { legal: true, annotation: true, jsdoc: false }
   */
  comments?: OutputOptions['comments'];
}
//#endregion
//#region src/types/hooks.d.ts
interface HooksOptions {
  /**
   * Called at the beginning of bundling.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'bundle:start': async (options) => {
   *       // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'bundle:start'?: (options: Options) => void | Promise<void>;
  /**
   * Called at the beginning of building.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'build:start': async (options, stats) => {
   *       // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'build:start'?: (options: Options, stats: BuildStats) => void | Promise<void>;
  /**
   * Called on each entry just before the build process.
   *
   * Provides the ability to customize entry options before they are passed to the next phase.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'build:entry:start': async (entry, stats) => {
   *      // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'build:entry:start'?: (entry: BuildEntryOptions, stats: BuildEntryStats) => void | Promise<void>;
  /**
   * Called on each entry right after the build process is completed.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'build:entry:end': async (entry, stats) => {
   *      // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'build:entry:end'?: (entry: BuildEntryOptions, stats: BuildEntryStats) => void | Promise<void>;
  /**
   * Called right after building is complete.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'build:end': async (options, stats) => {
   *       // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'build:end'?: (options: Options, stats: BuildStats) => void | Promise<void>;
  /**
   * Called right after bundling is complete.
   *
   * @example
   *
   * ```ts
   * export default defineConfig({
   *   hooks: {
   *     'bundle:end': async (options) => {
   *       // ...
   *     }
   *   }
   * })
   * ```
   *
   * @default undefined
   */
  'bundle:end'?: (options: Options) => void | Promise<void>;
}
//#endregion
//#region src/types/loader.d.ts
interface ConfigLoader {
  options: Options;
  path: string;
}
//#endregion
//#region src/config.d.ts
/**
 * List of global default patterns for external module identifiers.
 *
 * @example
 *
 * ```ts
 * import { externals } from '@hypernym/bundler'
 *
 * export default defineConfig({
 *   entries: [
 *     {
 *       input: './src/index.ts',
 *       externals: [...externals, 'id', /regexp/]
 *     },
 *   ]
 * })
 * ```
 */
declare const externals: RegExp[];
/**
 * ESM & TS module bundler.
 *
 * Automatically detects a custom configuration file at the project root, which can override or extend the build behavior.
 *
 * Configuration file also accepts `.js`, `.mjs`, `.ts`, `.mts` formats.
 *
 * @example
 *
 * ```ts
 * import { defineConfig } from '@hypernym/bundler'
 *
 * export default defineConfig({
 *   // ...
 * })
 * ```
 *
 * @see [Repository](https://github.com/hypernym-studio/bundler)
 */
declare function defineConfig(options: Options): Options;
//#endregion
export { BuildEntryOptions, BuildEntryStats, BuildLogs, BuildStats, ConfigLoader, EntryBase, EntryChunk, EntryCopy, EntryDts, EntryOptions, EntryTemplate, HooksOptions, Options, build, defineConfig, externals };