/* auto-generated by NAPI-RS */
/* eslint-disable */

/**
 * Which binding artifact the generated loader actually loaded: `'native'` for
 * a native addon, otherwise the `platformArchABI` of the WASI flavor. Every
 * flavor napi-rs can build is listed, because `NAPI_RS_NATIVE_LIBRARY_PATH`
 * can point the loader at a WASI artifact this package does not build itself.
 */
export declare const __napiBindingTarget: 'native' | 'wasm32-wasi' | 'wasm32-wasip1'

export interface CodegenOptions {
  /**
   * Remove whitespace.
   *
   * @default true
   */
  removeWhitespace?: boolean
  /**
   * Escape non-ASCII characters in string literals, untagged template literals, regular
   * expression literals and identifier names.
   *
   * Uses `\uXXXX` for characters up to U+FFFF and `\u{...}` for higher code points.
   * Regular expressions use escaped UTF-16 surrogate pairs for higher code points instead;
   * escaping changes the observable `RegExp.prototype.source` value.
   *
   * Code point escapes (`\u{...}`) require ES2015 or later; this option does not provide
   * ES5-compatible output.
   *
   * Non-ASCII characters are left unescaped in tagged template quasis (whose raw text is
   * observable), JSX names and text, JSX attribute strings, hashbangs and preserved comments.
   * JavaScript expressions inside tagged templates and JSX are escaped normally.
   *
   * @default false
   */
  asciiOnly?: boolean
  /**
   * How to handle legal comments (comments containing `@license`, `@preserve`, or starting with `//!`/`/*!`).
   *
   * * `"none"` - Do not preserve any legal comments.
   * * `"inline"` - Preserve all legal comments inline.
   * * `"eof"` - Move all legal comments to the end of the file.
   * * `"external"` - Extract legal comments without linking.
   * * `{ linked: "path/to/legal.txt" }` - Extract legal comments and add a link comment to the given path.
   *
   * @default "none" (when minifying)
   */
  legalComments?: 'none' | 'inline' | 'eof' | 'external' | { linked: string }
}

export interface CompressOptions {
  /**
   * Set desired EcmaScript standard version for output.
   *
   * Set `esnext` to enable all target highering.
   *
   * Example:
   *
   * * `'es2015'`
   * * `['es2020', 'chrome58', 'edge16', 'firefox57', 'node12', 'safari11']`
   *
   * @default 'esnext'
   *
   * @see [oxc#target](https://oxc.rs/docs/guide/usage/transformer/lowering#target)
   */
  target?: string | Array<string>
  /**
   * Pass true to discard calls to `console.*`.
   *
   * @default false
   */
  dropConsole?: boolean
  /**
   * Remove `debugger;` statements.
   *
   * @default true
   */
  dropDebugger?: boolean
  /**
   * Pass `true` to drop unreferenced functions and variables.
   *
   * Simple direct variable assignments do not count as references unless set to `keep_assign`.
   * @default true
   */
  unused?: boolean | 'keep_assign'
  /** Keep function / class names. */
  keepNames?: CompressOptionsKeepNames
  /**
   * Join consecutive var, let and const statements.
   *
   * @default true
   */
  joinVars?: boolean
  /**
   * Join consecutive simple statements using the comma operator.
   *
   * `a; b` -> `a, b`
   *
   * @default true
   */
  sequences?: boolean
  /**
   * Set of label names to drop from the code.
   *
   * Labeled statements matching these names will be removed during minification.
   *
   * @default []
   */
  dropLabels?: Array<string>
  /** Limit the maximum number of iterations for debugging purpose. */
  maxIterations?: number
  /** Treeshake options. */
  treeshake?: TreeShakeOptions
}

export interface CompressOptionsKeepNames {
  /**
   * Keep function names so that `Function.prototype.name` is preserved.
   *
   * This does not guarantee that the `undefined` name is preserved.
   *
   * @default false
   */
  function: boolean
  /**
   * Keep class names so that `Class.prototype.name` is preserved.
   *
   * This does not guarantee that the `undefined` name is preserved.
   *
   * @default false
   */
  class: boolean
}

export interface LegalCommentsLinked {
  /**
   * Extract legal comments and write them to the given path, with a link
   * comment appended to the generated code.
   */
  linked: string
}

export declare const enum LegalCommentsMode {
  /** Do not preserve any legal comments. */
  None = 'none',
  /** Preserve all legal comments inline. */
  Inline = 'inline',
  /** Move all legal comments to the end of the file. */
  Eof = 'eof',
  /** Extract legal comments without linking. */
  External = 'external',
}

export interface MangleOptions {
  /**
   * Pass `true` to mangle names declared in the top level scope.
   *
   * @default true for modules and commonjs, otherwise false
   */
  toplevel?: boolean
  /**
   * Preserve `name` property for functions and classes.
   *
   * @default false
   */
  keepNames?: boolean | MangleOptionsKeepNames
  /**
   * Names that bindings must not be renamed to, and that bindings already
   * carrying them keep. Equivalent to terser's `mangle.reserved`.
   *
   * Pass `['exports', 'module']` when minifying prebuilt CommonJS / UMD files
   * that Node consumers `import` directly, so Node's cjs-module-lexer can still
   * detect the mangled module's named exports.
   *
   * @default []
   */
  reserved?: Array<string>
  /** Debug mangled names. */
  debug?: boolean
}

export interface MangleOptionsKeepNames {
  /**
   * Preserve `name` property for functions.
   *
   * @default false
   */
  function: boolean
  /**
   * Preserve `name` property for classes.
   *
   * @default false
   */
  class: boolean
}

export interface ManglePropertiesOptions {
  /**
   * JavaScript `RegExp` selecting property names to mangle. The source and flags are compiled
   * with Rust's regex engine. Flags `i`, `m`, `s`, and `u` are supported.
   */
  include: RegExp
  /** JavaScript `RegExp` excluding property names selected by `include`. */
  exclude?: RegExp
  /** Exact names that are neither mangled nor emitted as automatic output names. */
  reserved?: Array<string>
  /**
   * Mangle quoted property occurrences in addition to unquoted occurrences.
   *
   * @default false
   */
  quoted?: boolean
  /**
   * Generate readable `_$name$_`-style output names.
   *
   * @default false
   */
  debug?: boolean
  /**
   * Stable mappings from original names to output names. `false` reserves an original name.
   * Entries that do not match `include`, or that match `exclude`, remain inert but are
   * preserved in the returned `mangleCache`. String targets must be `IdentifierName` values
   * other than `__proto__`, `constructor`, or `prototype`. The original name `__proto__` is
   * always reserved and cannot be used as a cache key.
   */
  cache?: Record<string, string | false>
}

/**
 * Minify asynchronously.
 *
 * Note: This function can be slower than `minifySync` due to the overhead of spawning a thread.
 */
export declare function minify(filename: string, sourceText: string, options?: MinifyOptions | undefined | null): Promise<MinifyResult>

export interface MinifyOptions {
  /** Use when minifying an ES module. */
  module?: boolean
  compress?: boolean | CompressOptions
  mangle?: boolean | MangleOptions
  /**
   * Mangle matching property names independently of identifier mangling. Properties owned by
   * unminified code, imported module namespaces, globals, or host APIs must be excluded or
   * reserved.
   */
  mangleProps?: ManglePropertiesOptions
  codegen?: boolean | CodegenOptions
  sourcemap?: boolean
}

export interface MinifyResult {
  code: string
  map?: SourceMap
  errors: Array<OxcError>
  /**
   * Legal comments extracted from the source code.
   * Only populated when `codegen.legalComments` is `"linked"` or `"external"`.
   */
  legalComments: Array<string>
  /**
   * Updated property-name cache sorted by original name. Present when `mangleProps` ran on a
   * parse without errors.
   */
  mangleCache?: Record<string, string | false>
}

/** Minify synchronously. */
export declare function minifySync(filename: string, sourceText: string, options?: MinifyOptions | undefined | null): MinifyResult

export interface TreeShakeOptions {
  /**
   * Whether to respect the pure annotations.
   *
   * Pure annotations are comments that mark an expression as pure.
   * For example: @__PURE__ or #__NO_SIDE_EFFECTS__.
   *
   * @default true
   */
  annotations?: boolean
  /**
   * Whether to treat this function call as pure.
   *
   * This function is called for normal function calls, new calls, and
   * tagged template calls.
   */
  manualPureFunctions?: Array<string>
  /**
   * Whether property read accesses have side effects.
   *
   * @default 'always'
   */
  propertyReadSideEffects?: boolean | 'always'
  /**
   * Whether property write accesses (assignments to member expressions) have side effects.
   *
   * When false, assignments like `obj.prop = value` are considered side-effect-free
   * (assuming the object and value expressions themselves are side-effect-free).
   *
   * @default true
   */
  propertyWriteSideEffects?: boolean
  /**
   * Whether accessing a global variable has side effects.
   *
   * Accessing a non-existing global variable will throw an error.
   * Global variable may be a getter that has side effects.
   *
   * @default true
   */
  unknownGlobalSideEffects?: boolean
  /**
   * Whether invalid import statements have side effects.
   *
   * Accessing a non-existing import name will throw an error.
   * Also import statements that cannot be resolved will throw an error.
   *
   * @default true
   */
  invalidImportSideEffects?: boolean
}

export interface Comment {
  type: 'Line' | 'Block'
  value: string
  start: number
  end: number
}

export interface ErrorLabel {
  message: string | null
  start: number
  end: number
}

export interface OxcError {
  severity: Severity
  message: string
  labels: Array<ErrorLabel>
  helpMessage: string | null
  codeframe: string | null
}

export declare const enum Severity {
  Error = 'Error',
  Warning = 'Warning',
  Advice = 'Advice',
}

/** See <https://tc39.es/ecma426/#sec-source-map-format>. */
export interface JSONSourceMap {
  /** The version field, must be 3. */
  version: number
  /** An optional name of the generated code that this source map is associated with. */
  file?: string
  /** A string with the encoded mapping data. */
  mappings: string
  /**
   * An optional source root, useful for relocating source files on a server or removing repeated values in the "sources" entry.
   * This value is prepended to the individual entries in the "source" field.
   */
  sourceRoot?: string
  /** A list of original sources used by the "mappings" entry. */
  sources: Array<string>
  /**
   * An optional list of source content, useful when the "source" can't be hosted.
   * The contents are listed in the same order as the sources in line 5. "null" may be used if some original sources should be retrieved by name.
   */
  sourcesContent?: Array<string | undefined | null>
  /** A list of symbol names used by the "mappings" entry. */
  names: Array<string>
  /** An optional field containing the debugId for this sourcemap. */
  debugId?: string
  /**
   * Identifies third-party sources (such as framework code or bundler-generated code), allowing developers to avoid code that they don't want to see or step through, without having to configure this beforehand.
   * The `ignoreList` field refers to the `sources` array, and lists the indices of all the known third-party sources in that source map.
   * When parsing the source map, developer tools can use this to determine sections of the code that the browser loads and runs that could be automatically ignore-listed.
   * JSON input falls back to the deprecated `x_google_ignoreList` when `ignoreList` is missing or null.
   */
  ignoreList?: Array<number>
}

export interface SourceMap {
  file?: string
  mappings: string
  names: Array<string>
  sourceRoot?: string
  sources: Array<string>
  sourcesContent?: Array<string>
  version: number
  ignoreList?: Array<number>
}
