{"version":3,"file":"writer.mjs","sources":["../../src/output/writer.ts"],"sourcesContent":["export const IncIndent = Symbol('Increase Indent')\nexport const DecIndent = Symbol('Decrease Indent')\nexport const DecIndentAndCloseBlock = Symbol('Decrease Indent and write a closing brace')\nexport const NewLineMode = Symbol('New Line Mode')\nexport const RestoreLineMode = Symbol('Restore Line Mode')\nexport const PropertyDelimiter = Symbol('Property Delimiter')\nexport const InlineMode = Symbol('Inline Mode')\nexport const NewLine = Symbol('New Line')\n\nexport type Part =\n  | string\n  | typeof IncIndent\n  | typeof DecIndent\n  | typeof NewLineMode\n  | typeof DecIndentAndCloseBlock\n  | typeof InlineMode\n  | typeof NewLine\n  | typeof RestoreLineMode\n  | typeof PropertyDelimiter\nexport type DocumentParts = Generator<Part, void>\n\nexport type WriteOptions = {\n  indent?: string\n  disableEslint?: boolean\n  header?: string\n}\n\ninterface StringWriter {\n  write(value: string): void\n  get last(): string\n}\n\nexport function writeDocumentPartsToStream(document: DocumentParts, stream: { write(chunk: string): void }, options: WriteOptions = {}) {\n  const writer = {\n    _last: '',\n    write(val: string) {\n      this._last = val\n      stream.write(val)\n    },\n    get last() {\n      return this._last\n    },\n  }\n  writeDocumentPartsTo(document, options, writer)\n}\n\nexport function writeDocumentPartsToString(document: DocumentParts, options: WriteOptions = {}) {\n  const writer = {\n    result: [] as string[],\n    _last: '',\n    write(val: string) {\n      this._last = val\n      this.result.push(val)\n    },\n    get last() {\n      return this._last\n    },\n    toString() {\n      return this.result.join('')\n    },\n  }\n  writeDocumentPartsTo(document, options, writer)\n  return writer.toString()\n}\n\nexport function* inline(...parts: Array<Part | DocumentParts>) {\n  yield InlineMode\n  for (const part of parts) {\n    if (typeof part === 'string' || typeof part === 'symbol') yield part\n    else yield* part\n  }\n  yield RestoreLineMode\n}\n\nexport function* indent(...parts: Array<Part | DocumentParts>) {\n  yield IncIndent\n  for (const part of parts) {\n    if (typeof part === 'string' || typeof part === 'symbol') yield part\n    else yield* part\n  }\n  yield DecIndent\n}\n\nexport function* jsDoc(\n  docs: string | string[] | { description: string | string[]; abiDescription?: string; params?: Record<string, string>; returns?: string },\n) {\n  yield `/**`\n  if (typeof docs === 'string' || Array.isArray(docs)) {\n    const description = typeof docs === 'string' ? [docs] : docs\n    for (const line of description) {\n      yield ` * ${line}`\n    }\n  } else {\n    const description = typeof docs.description === 'string' ? [docs.description] : docs.description\n    for (const line of description) {\n      yield ` * ${line}`\n    }\n    if (docs.abiDescription) {\n      yield ' *'\n      yield ` * ${docs.abiDescription}`\n    }\n    if (docs.params || docs.returns) {\n      yield ' *'\n    }\n    for (const [paramName, paramDesc] of Object.entries(docs.params ?? {})) {\n      yield ` * @param ${paramName} ${paramDesc}`\n    }\n    if (docs.returns) yield ` * @returns ${docs.returns}`\n  }\n  yield ' */'\n}\n\nfunction writeDocumentPartsTo(document: DocumentParts, { indent = '  ', ...options }: WriteOptions, writer: StringWriter): void {\n  if (options.header) writer.write(`${options.header}\\n`)\n  if (options.disableEslint) writer.write('/* eslint-disable */\\n')\n\n  const lineModes = [NewLineMode]\n  const currentLineMode = () => lineModes.at(-1) ?? NewLineMode\n\n  let curIndent = ''\n  for (const part of document) {\n    switch (part) {\n      case IncIndent:\n        curIndent += indent\n        break\n      case DecIndent:\n        curIndent = curIndent.slice(0, -indent.length)\n        break\n      case DecIndentAndCloseBlock:\n        curIndent = curIndent.slice(0, -indent.length)\n        writer.write(`${curIndent}}\\n`)\n        break\n      case NewLineMode:\n        lineModes.push(NewLineMode)\n        if (writer.last.slice(-1)[0] !== '\\n') {\n          writer.write('\\n')\n        }\n        break\n      case InlineMode:\n        lineModes.push(InlineMode)\n        break\n      case RestoreLineMode:\n        lineModes.pop()\n\n        if (currentLineMode() === NewLineMode && writer.last.slice(-1)[0] !== '\\n') {\n          writer.write('\\n')\n        }\n        break\n      case PropertyDelimiter:\n        if (currentLineMode() === NewLineMode) {\n          writer.write('\\n')\n        } else {\n          writer.write(', ')\n        }\n        break\n      case NewLine:\n        writer.write('\\n')\n        break\n      default:\n        // Multi-line\n        if (part.includes('\\n') || part.includes('\\r')) {\n          if (writer.last.slice(-1)[0] !== '\\n') writer.write('\\n')\n          const normalisedLineEndings = part.replaceAll(/\\r\\n/g, '\\n').replaceAll(/\\r/g, '\\n').replace(/^\\n/, '').trimEnd()\n          const lines = normalisedLineEndings.split('\\n')\n          const baseIndent = lines[0].match(/^\\s+/)?.[0] ?? ''\n          for (const line of lines) {\n            writer.write(curIndent + line.replace(new RegExp(`^${baseIndent}`, ''), '').trimEnd())\n            writer.write('\\n')\n          }\n        } else {\n          if (writer.last.slice(-1)[0] === '\\n') writer.write(curIndent)\n          writer.write(part)\n        }\n        if (currentLineMode() === NewLineMode) writer.write('\\n')\n        break\n    }\n  }\n}\n"],"names":[],"mappings":"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"}