{"version":3,"file":"log-rotation.cjs","names":["constants","Writable","createGzip","exec","createReadStream","createWriteStream","open","readFile","stat","unlink","process","sep","TextDecoder"],"sources":["../../../src/node/log/log-rotation.ts"],"sourcesContent":["// MIT https://github.com/iccicci/rotating-file-stream\n\nimport type { Buffer } from 'node:buffer'\nimport type { Stats } from 'node:fs'\nimport type { FileHandle } from 'node:fs/promises'\nimport type { Gzip } from 'node:zlib'\nimport { exec } from 'node:child_process'\nimport { access, constants, createReadStream, createWriteStream } from 'node:fs'\nimport { mkdir, open, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises'\nimport { sep } from 'node:path'\nimport process from 'node:process'\nimport { Writable } from 'node:stream'\nimport { setTimeout } from 'node:timers'\nimport { TextDecoder } from 'node:util'\nimport { createGzip } from 'node:zlib'\n\nasync function exists(filename: string): Promise<boolean> {\n  return new Promise(resolve => access(filename, constants.F_OK, error => resolve(!error)))\n}\n\nexport class RotatingFileStreamError extends Error {\n  public code = 'RFS-TOO-MANY'\n\n  constructor() {\n    super('Too many destination file attempts')\n  }\n}\n\nexport type RotationCompressor = (source: string, dest: string) => string\nexport type RotationGenerator = (time: number | Date | null, index?: number) => string\n\n// Flattened event signatures are available via 'RotatingFileStreamEvents' above.\n\nexport type RotationIntervalUnit = 'M' | 'd' | 'h' | 'm' | 's'\nexport type RotationInterval = `${number}${RotationIntervalUnit}`\n\nexport type RotationFileSizeUnit = 'B' | 'K' | 'M' | 'G'\nexport type RotationFileSize = `${number}${RotationFileSizeUnit}`\n\nexport interface RotationOptions {\n  compress?: boolean | 'gzip' | RotationCompressor\n  encoding?: BufferEncoding\n  history?: string\n  immutable?: boolean\n  initialRotation?: boolean\n  interval?: RotationInterval\n  intervalBoundary?: boolean\n  intervalUTC?: boolean\n  maxFiles?: number\n  maxSize?: RotationFileSize\n  mode?: number\n  omitExtension?: boolean\n  path?: string\n  rotate?: number\n  size?: RotationFileSize\n  teeToStdout?: boolean\n}\n\ninterface Opts {\n  compress?: boolean | 'gzip' | RotationCompressor\n  encoding?: BufferEncoding\n  history?: string\n  immutable?: boolean\n  initialRotation?: boolean\n  interval?: { num: number, unit: RotationIntervalUnit }\n  intervalBoundary?: boolean\n  intervalUTC?: boolean\n  maxFiles?: number\n  maxSize?: number\n  mode?: number\n  omitExtension?: boolean\n  path?: string\n  rotate?: number\n  size?: number\n  teeToStdout?: boolean\n}\n\ntype RotationCallback = (error?: Error) => void\n\ninterface RotationChunk {\n  chunk: Buffer\n  encoding: BufferEncoding\n}\n\ninterface RotationHistory {\n  name: string\n  size: number\n  time: number\n}\n\nexport class RotatingFileStream extends Writable {\n  private createGzip: () => Gzip\n  private exec: typeof exec\n  private file: FileHandle | null\n  private filename: string\n  private finished: boolean\n  private fsCreateReadStream: typeof createReadStream\n  private fsCreateWriteStream: typeof createWriteStream\n  private fsOpen: typeof open\n  private fsReadFile: typeof readFile\n  private fsStat: typeof stat\n  private fsUnlink: typeof unlink\n  private generator: RotationGenerator\n  private last: string\n  private maxTimeout: number\n  private next: number | null\n  private options: Opts\n  private size: number\n  private stdout: typeof process.stdout\n  private prev: number | null\n  private rotation: Date | null\n  private initPromise: Promise<void> | null\n  private timeout: NodeJS.Timeout | null\n  private timeoutPromise: Promise<void> | null\n\n  constructor(generator: RotationGenerator, options: Opts) {\n    const { encoding, history, maxFiles, maxSize, path } = options\n\n    super({ decodeStrings: true, defaultEncoding: encoding })\n\n    this.createGzip = createGzip\n    this.exec = exec\n    this.filename = (path || '') + generator(null)\n    this.fsCreateReadStream = createReadStream\n    this.fsCreateWriteStream = createWriteStream\n    this.fsOpen = open\n    this.fsReadFile = readFile\n    this.fsStat = stat\n    this.fsUnlink = unlink\n    this.generator = generator\n    this.maxTimeout = 2147483640\n    this.options = options\n    this.stdout = process.stdout\n    this.file = null\n    this.initPromise = null\n    this.timeout = null\n    this.timeoutPromise = null\n    this.prev = null\n    this.next = null\n    this.rotation = null\n    this.last = ''\n    this.finished = false\n    this.size = 0\n\n    if (maxFiles || maxSize)\n      options.history = (path || '') + (history || `${this.generator(null)}.txt`)\n\n    this.on('close', () => (this.finished ? null : this.emit('finish')))\n    this.on('finish', () => (this.finished = this.clear()));\n\n    // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n    // Until v16 will be not deprecated we still need this.initPromise\n    // https://nodejs.org/api/stream.html#stream_writable_construct_callback\n\n    (async () => {\n      try {\n        this.initPromise = this.init()\n\n        await this.initPromise\n        this.initPromise = null\n      }\n      catch (e: any) {}\n    })()\n  }\n\n  _destroy(error: Error, callback: RotationCallback): void {\n    this.refinal(error, callback)\n  }\n\n  _final(callback: RotationCallback): void {\n    this.refinal(undefined, callback)\n  }\n\n  _write(chunk: Buffer, encoding: BufferEncoding, callback: RotationCallback): void {\n    this.rewrite([{ chunk, encoding }], 0, callback)\n  }\n\n  _writev(chunks: RotationChunk[], callback: RotationCallback): void {\n    this.rewrite(chunks, 0, callback)\n  }\n\n  private async refinal(error: Error | undefined, callback: RotationCallback): Promise<void> {\n    try {\n      this.clear()\n\n      if (this.initPromise)\n        await this.initPromise\n      if (this.timeoutPromise)\n        await this.timeoutPromise\n\n      await this.reclose()\n    }\n    catch (e: any) {\n      return callback(error || e)\n    }\n\n    callback(error)\n  }\n\n  private async rewrite(chunks: RotationChunk[], index: number, callback: RotationCallback): Promise<void> {\n    const { size, teeToStdout } = this.options\n\n    try {\n      if (this.initPromise)\n        await this.initPromise\n\n      for (let i = 0; i < chunks.length; ++i) {\n        const { chunk } = chunks[i]\n\n        this.size += chunk.length\n        if (this.timeoutPromise)\n          await this.timeoutPromise\n        await this.file!.write(chunk)\n\n        if (teeToStdout && !this.stdout.destroyed)\n          this.stdout.write(chunk)\n        if (size && this.size >= size)\n          await this.rotate()\n      }\n    }\n    catch (e: any) {\n      return callback(e)\n    }\n\n    callback()\n  }\n\n  private async init(): Promise<void> {\n    const { immutable, initialRotation, interval, size } = this.options\n\n    // In v15 was introduced the _constructor method to delay any _write(), _final() and _destroy() calls\n    // Once v16 will be deprecated we can restore only following line\n    // if(immutable) return this.immutate(true);\n    if (immutable)\n      return new Promise<void>((resolve, reject) => process.nextTick(() => this.immutate(true).then(resolve).catch((err: any) => reject(err))))\n\n    let stats: Stats\n\n    try {\n      stats = await stat(this.filename)\n    }\n    catch (e: any) {\n      if (e.code !== 'ENOENT')\n        throw e\n\n      return this.reopen(0)\n    }\n\n    if (!stats.isFile())\n      throw new Error(`Can't write on: ${this.filename} (it is not a file)`)\n\n    if (initialRotation) {\n      this.intervalBounds(this.now())\n      const prev = this.prev\n      this.intervalBounds(new Date(stats.mtime.getTime()))\n\n      if (prev !== this.prev)\n        return this.rotate()\n    }\n\n    this.size = stats.size\n    if (!size || stats.size < size)\n      return this.reopen(stats.size)\n    if (interval)\n      this.intervalBounds(this.now())\n\n    return this.rotate()\n  }\n\n  private async makePath(name: string): Promise<string> {\n    await mkdir(name.split(sep).slice(0, -1).join(sep), { recursive: true })\n    return name\n  }\n\n  private async reopen(size: number): Promise<void> {\n    let file: FileHandle\n\n    try {\n      file = await open(this.filename, 'a', this.options.mode)\n    }\n    catch (e: any) {\n      if (e.code !== 'ENOENT')\n        throw e\n\n      await this.makePath(this.filename)\n      file = await open(this.filename, 'a', this.options.mode)\n    }\n\n    this.file = file\n    this.size = size\n    this.interval()\n    this.emit('open', this.filename)\n  }\n\n  private async reclose(): Promise<void> {\n    const { file } = this\n\n    if (!file)\n      return\n\n    this.file = null\n    return file.close()\n  }\n\n  private now(): Date {\n    return new Date()\n  }\n\n  private async rotate(): Promise<void> {\n    const { immutable, rotate } = this.options\n\n    this.size = 0\n    this.rotation = this.now()\n\n    this.clear()\n    this.emit('rotation')\n    await this.reclose()\n\n    if (rotate)\n      return this.classical()\n    if (immutable)\n      return this.immutate(false)\n\n    return this.move()\n  }\n\n  private async findName(): Promise<string> {\n    const { interval, path, intervalBoundary } = this.options\n\n    for (let index = 1; index < 1000; ++index) {\n      const filename = (path || '') + this.generator(interval && intervalBoundary ? new Date(this.prev as number) : this.rotation, index)\n\n      if (!(await exists(filename)))\n        return filename\n    }\n\n    throw new RotatingFileStreamError()\n  }\n\n  private async move(): Promise<void> {\n    const { compress } = this.options\n\n    const filename = await this.findName()\n    await this.touch(filename)\n\n    if (compress)\n      await this.compress(filename)\n    else await rename(this.filename, filename)\n\n    return this.rotated(filename)\n  }\n\n  private async touch(filename: string): Promise<void> {\n    let file: FileHandle\n\n    try {\n      file = await this.fsOpen(filename, 'a')\n    }\n    catch (e: any) {\n      if (e.code !== 'ENOENT')\n        throw e\n\n      await this.makePath(filename)\n      file = await open(filename, 'a')\n    }\n\n    await file.close()\n    return this.unlink(filename)\n  }\n\n  private async classical(): Promise<void> {\n    const { compress, path, rotate = 0 } = this.options\n    let rotatedName = ''\n\n    for (let count = rotate; count > 0; --count) {\n      const currName = path + this.generator(count)\n      const prevName = count === 1 ? this.filename : path + this.generator(count - 1)\n\n      if (!(await exists(prevName)))\n        continue\n      if (!rotatedName)\n        rotatedName = currName\n\n      if (count === 1 && compress) {\n        await this.compress(currName)\n      }\n      else {\n        try {\n          await rename(prevName, currName)\n        }\n        catch (e: any) {\n          if (e.code !== 'ENOENT')\n            throw e\n\n          await this.makePath(currName)\n          await rename(prevName, currName)\n        }\n      }\n    }\n\n    return this.rotated(rotatedName)\n  }\n\n  private clear(): boolean {\n    if (this.timeout) {\n      clearTimeout(this.timeout as NodeJS.Timeout)\n      this.timeout = null\n    }\n\n    return true\n  }\n\n  private intervalBoundsBig(now: Date): void {\n    const year = this.options.intervalUTC ? now.getUTCFullYear() : now.getFullYear()\n    let month = this.options.intervalUTC ? now.getUTCMonth() : now.getMonth()\n    let day = this.options.intervalUTC ? now.getUTCDate() : now.getDate()\n    let hours = this.options.intervalUTC ? now.getUTCHours() : now.getHours()\n    const { num, unit } = this.options.interval!\n\n    if (unit === 'M') {\n      day = 1\n      hours = 0\n    }\n    else if (unit === 'd') {\n      hours = 0\n    }\n    else {\n      hours = Number.parseInt((hours / num) as unknown as string, 10) * num\n    }\n\n    this.prev = new Date(year, month, day, hours, 0, 0, 0).getTime()\n\n    if (unit === 'M')\n      month += num\n    else if (unit === 'd')\n      day += num\n    else hours += num\n\n    this.next = new Date(year, month, day, hours, 0, 0, 0).getTime()\n  }\n\n  private intervalBounds(now: Date): Date {\n    const unit = this.options.interval!.unit\n\n    if (unit === 'M' || unit === 'd' || unit === 'h') {\n      this.intervalBoundsBig(now)\n    }\n    else {\n      let period = 1000 * this.options.interval!.num\n\n      if (unit === 'm')\n        period *= 60\n\n      this.prev = Number.parseInt(String(now.getTime() / period), 10) * period\n      this.next = this.prev + period\n    }\n\n    // this.prev is guaranteed to be a number here\n    return new Date(this.prev as number)\n  }\n\n  private interval(): void {\n    if (!this.options.interval)\n      return\n\n    this.intervalBounds(this.now())\n\n    const set = async (): Promise<void> => {\n      const next = this.next as number\n      const time = next - this.now().getTime()\n\n      if (time <= 0) {\n        try {\n          this.timeoutPromise = this.rotate()\n\n          await this.timeoutPromise\n          this.timeoutPromise = null\n        }\n        catch (e: any) {}\n      }\n      else {\n        this.timeout = setTimeout(set, time > this.maxTimeout ? this.maxTimeout : time)\n        if (this.timeout && typeof (this.timeout as any).unref === 'function')\n          (this.timeout as any).unref()\n      }\n    }\n\n    set()\n  }\n\n  private async compress(filename: string): Promise<void> {\n    const { compress } = this.options\n\n    if (typeof compress === 'function') {\n      await new Promise<void>((resolve, reject) => {\n        this.exec(compress(this.filename, filename), (error, stdout, stderr) => {\n          this.emit('external', stdout, stderr)\n          error ? reject(error) : resolve()\n        })\n      })\n    }\n    else {\n      await this.gzip(filename)\n    }\n\n    return this.unlink(this.filename)\n  }\n\n  private async gzip(filename: string): Promise<void> {\n    const { mode } = this.options\n    const options = mode ? { mode } : {}\n    const inp = this.fsCreateReadStream(this.filename, {})\n    const out = this.fsCreateWriteStream(filename, options)\n    const zip = this.createGzip()\n\n    return new Promise((resolve, reject) => {\n      inp.once('error', reject)\n      out.once('error', reject)\n      zip.once('error', reject)\n      out.once('finish', resolve)\n      inp.pipe(zip).pipe(out)\n    })\n  }\n\n  private async rotated(filename: string): Promise<void> {\n    const { maxFiles, maxSize } = this.options\n\n    if (maxFiles || maxSize)\n      await this.history(filename)\n\n    this.emit('rotated', filename)\n\n    return this.reopen(0)\n  }\n\n  private async history(filename: string): Promise<void> {\n    const { history, maxFiles, maxSize } = this.options\n    const res: RotationHistory[] = []\n    let files = [filename]\n\n    try {\n      if (history) {\n        const content = await this.fsReadFile(history, 'utf8')\n\n        files = [...content.toString().split('\\n'), filename]\n      }\n    }\n    catch (e: any) {\n      if (e.code !== 'ENOENT')\n        throw e\n    }\n\n    for (const file of files) {\n      if (file) {\n        try {\n          const stats = await this.fsStat(file)\n\n          if (stats.isFile()) {\n            res.push({\n              name: file,\n              size: stats.size,\n              time: stats.mtime.getTime(),\n            })\n          }\n          else {\n            this.emit('warning', new Error(`File '${file}' contained in history is not a regular file`))\n          }\n        }\n        catch (e: any) {\n          if (e.code !== 'ENOENT')\n            throw e\n        }\n      }\n    }\n\n    res.sort((a, b) => a.time - b.time)\n\n    if (maxFiles) {\n      while (res.length > maxFiles) {\n        const file = res.shift()\n\n        if (file)\n          await this.unlink(file.name)\n        if (file)\n          this.emit('removed', file.name, true)\n      }\n    }\n\n    if (maxSize) {\n      while (res.reduce((size, file) => size + file.size, 0) > maxSize) {\n        const file = res.shift()\n\n        if (file)\n          await this.unlink(file.name)\n        if (file)\n          this.emit('removed', file.name, false)\n      }\n    }\n\n    if (history)\n      await writeFile(history, `${res.map(e => e.name).join('\\n')}\\n`, 'utf-8')\n    this.emit('history')\n  }\n\n  private async immutate(first: boolean): Promise<void> {\n    const { size } = this.options\n    const now = this.now()\n\n    for (let index = 1; index < 1000; ++index) {\n      let fileSize = 0\n      let stats: Stats | undefined\n\n      this.filename = this.options.path + this.generator(now, index)\n\n      try {\n        const s = await this.fsStat(this.filename)\n        stats = s\n      }\n      catch (e: any) {\n        if (e.code !== 'ENOENT')\n          throw e\n      }\n\n      if (stats) {\n        fileSize = stats.size\n\n        if (!stats.isFile())\n          throw new Error(`Can't write on: '${this.filename}' (it is not a file)`)\n        if (size && fileSize >= size)\n          continue\n      }\n\n      if (first) {\n        this.last = this.filename\n\n        return this.reopen(fileSize)\n      }\n\n      await this.rotated(this.last)\n      this.last = this.filename\n\n      return\n    }\n\n    throw new RotatingFileStreamError()\n  }\n\n  private async unlink(filename: string): Promise<void> {\n    try {\n      await this.fsUnlink(filename)\n    }\n    catch (e: any) {\n      if (e.code !== 'ENOENT')\n        throw e\n\n      this.emit('warning', e)\n    }\n  }\n}\n\nfunction buildNumberCheck(field: string): (type: string, options: Opts, value: number) => void {\n  return (type: string, options: Opts, value: number): void => {\n    const converted: number = Number.parseInt(String(value), 10)\n\n    if (type !== 'number' || Number.isNaN(converted) || converted <= 0)\n      throw new Error(`'${field}' option must be a positive integer number`)\n  }\n}\n\nfunction buildStringCheck(field: keyof Opts, check: (value: string) => any) {\n  return (type: string, options: Opts, value: string): void => {\n    if (type !== 'string')\n      throw new Error(`Don't know how to handle 'options.${String(field)}' type: ${type}`)\n\n    options[field] = check(value) as never\n  }\n}\n\nfunction checkMeasure(value: string, what: string, units: any): any {\n  const ret: any = {}\n\n  ret.num = Number.parseInt(value, 10)\n\n  if (Number.isNaN(ret.num))\n    throw new Error(`Unknown 'options.${what}' format: ${value}`)\n  if (ret.num <= 0)\n    throw new Error(`A positive integer number is expected for 'options.${what}'`)\n\n  ret.unit = value.replace(/^[ 0]*/g, '').substr((`${ret.num}`).length, 1)\n\n  if (ret.unit.length === 0)\n    throw new Error(`Missing unit for 'options.${what}'`)\n  if (!units[ret.unit])\n    throw new Error(`Unknown 'options.${what}' unit: ${ret.unit}`)\n\n  return ret\n}\n\nconst intervalUnits: any = { M: true, d: true, h: true, m: true, s: true }\n\nfunction checkIntervalUnit(ret: any, unit: string, amount: number): void {\n  if (Number.parseInt((amount / ret.num) as unknown as string, 10) * ret.num !== amount)\n    throw new Error(`An integer divider of ${amount} is expected as ${unit} for 'options.interval'`)\n}\n\nfunction checkInterval(value: string): any {\n  const ret = checkMeasure(value, 'interval', intervalUnits)\n\n  switch (ret.unit) {\n    case 'h':\n      checkIntervalUnit(ret, 'hours', 24)\n      break\n\n    case 'm':\n      checkIntervalUnit(ret, 'minutes', 60)\n      break\n\n    case 's':\n      checkIntervalUnit(ret, 'seconds', 60)\n      break\n  }\n\n  return ret\n}\n\nconst sizeUnits: any = { B: true, G: true, K: true, M: true }\n\nfunction checkSize(value: string): any {\n  const ret = checkMeasure(value, 'size', sizeUnits)\n\n  if (ret.unit === 'K')\n    return ret.num * 1024\n  if (ret.unit === 'M')\n    return ret.num * 1048576\n  if (ret.unit === 'G')\n    return ret.num * 1073741824\n\n  return ret.num\n}\n\nconst checks: any = {\n  encoding: (type: string, options: Opts, value: string): any => new TextDecoder(value),\n  immutable: (): void => {},\n  initialRotation: (): void => {},\n  interval: buildStringCheck('interval', checkInterval),\n  intervalBoundary: (): void => {},\n  intervalUTC: (): void => {},\n  maxFiles: buildNumberCheck('maxFiles'),\n  maxSize: buildStringCheck('maxSize', checkSize),\n  mode: (): void => {},\n  omitExtension: (): void => {},\n  rotate: buildNumberCheck('rotate'),\n  size: buildStringCheck('size', checkSize),\n  teeToStdout: (): void => {},\n  ...{\n    compress: (type: string, options: Opts, value: boolean | string | RotationCompressor): any => {\n      if (value === false)\n        return\n      if (!value)\n        throw new Error('A value for \\'options.compress\\' must be specified')\n      if (type === 'boolean')\n        return (options.compress = (source: string, dest: string): string => `cat ${source} | gzip -c9 > ${dest}`)\n      if (type === 'function')\n        return\n      if (type !== 'string')\n        throw new Error(`Don't know how to handle 'options.compress' type: ${type}`)\n      if ((value as unknown as string) !== 'gzip')\n        throw new Error(`Don't know how to handle compression method: ${value}`)\n    },\n    history: (type: string): void => {\n      if (type !== 'string')\n        throw new Error(`Don't know how to handle 'options.history' type: ${type}`)\n    },\n    path: (type: string, options: Opts, value: string): void => {\n      if (type !== 'string')\n        throw new Error(`Don't know how to handle 'options.path' type: ${type}`)\n      if (value.at(-1) !== sep)\n        options.path = value + sep\n    },\n  },\n}\n\nfunction checkOpts(options: RotationOptions): Opts {\n  const ret: Opts = {}\n  for (const k of Object.keys(options)) {\n    const opt = k as keyof RotationOptions\n    const value = options[opt]\n    const type = typeof value\n\n  // assign raw value first\n  ;(ret as any)[opt as string] = value as any\n\n    if (!(opt in checks))\n      throw new Error(`Unknown option: ${opt}`)\n\n    checks[opt](type, ret, value as any)\n  }\n\n  if (!ret.path)\n    ret.path = ''\n\n  if (!ret.interval) {\n    delete ret.immutable\n    delete ret.initialRotation\n    delete ret.intervalBoundary\n    delete ret.intervalUTC\n  }\n\n  if (ret.rotate) {\n    delete ret.history\n    delete ret.immutable\n    delete ret.maxFiles\n    delete ret.maxSize\n    delete ret.intervalBoundary\n    delete ret.intervalUTC\n  }\n\n  if (ret.immutable)\n    delete ret.compress\n  if (!ret.intervalBoundary)\n    delete ret.initialRotation\n\n  return ret\n}\n\nfunction createClassical(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n  return (time: number | Date | null, index?: number): string => {\n    const idx = index || 0\n    return (idx ? `${filename}.${idx}${compress && !omitExtension ? '.gz' : ''}` : filename)\n  }\n}\n\nfunction createGenerator(filename: string, compress: boolean, omitExtension: boolean): RotationGenerator {\n  const pad = (num: number): string => (num > 9 ? '' : '0') + num\n\n  return (time: number | Date | null, index?: number): string => {\n    if (!time)\n      return filename\n\n    const t = typeof time === 'number' ? new Date(time) : time\n\n    const month = `${t.getFullYear()}${pad(t.getMonth() + 1)}`\n    const day = pad(t.getDate())\n    const hour = pad(t.getHours())\n    const minute = pad(t.getMinutes())\n\n    return `${month + day}-${hour}${minute}-${pad(index || 0)}-${filename}${compress && !omitExtension ? '.gz' : ''}`\n  }\n}\n\nexport function createRotationStream(filename: string | RotationGenerator, options?: RotationOptions): RotatingFileStream {\n  if (typeof options === 'undefined')\n    options = {}\n  else if (typeof options !== 'object')\n    throw new Error(`The \"options\" argument must be of type object. Received type ${typeof options}`)\n\n  const opts = checkOpts(options)\n  const { compress, omitExtension } = opts\n  let generator: RotationGenerator\n\n  if (typeof filename === 'string')\n    generator = (opts.rotate ? createClassical(filename, !!compress, !!omitExtension) : createGenerator(filename, !!compress, !!omitExtension))\n  else if (typeof filename === 'function')\n    generator = filename\n  else throw new Error(`The \"filename\" argument must be one of type string or function. Received type ${typeof filename}`)\n\n  return new RotatingFileStream(generator, opts)\n}\n"],"mappings":"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"}