{"version":3,"file":"writer.cjs","names":[],"sources":["../../../src/codegen/writer.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport { emitTypeDeclarationsSource } from \"./emit.js\";\nimport { emitVirtualDeclarationsSource } from \"./virtual.js\";\nimport {\n  DEFAULT_GENERATED_TYPES_DIR,\n  DEFAULT_MANIFEST_HEADER,\n  DEFAULT_ROUTES_TYPES_FILENAME,\n  DEFAULT_VIRTUAL_TYPES_FILENAME,\n  ROUTES_ALIAS_ID,\n} from \"../constants.js\";\nimport { createAliasImportRewriter, toPosixPath } from \"../support/paths.js\";\nimport { relative } from \"node:path\";\nimport type { GeneratedModel } from \"../types.js\";\n\nexport type TypeWriterState = {\n  lastSignature?: string | undefined;\n};\n\nexport type WriteTypesOptions = {\n  rootDir?: string | undefined;\n  quotes?: \"single\" | \"double\" | undefined;\n  header?: string[] | undefined;\n  routesDir?: string | undefined;\n  routesImportBase?: string | undefined;\n  taserEntryPath?: string | undefined;\n  state?: TypeWriterState | undefined;\n};\n\nexport async function writeTaserTypes(\n  model: GeneratedModel,\n  options: WriteTypesOptions = {},\n): Promise<boolean> {\n  const rootDir = resolve(options.rootDir || process.cwd());\n  const typesDir = resolve(rootDir, DEFAULT_GENERATED_TYPES_DIR);\n  const routesTargetFile = join(typesDir, DEFAULT_ROUTES_TYPES_FILENAME);\n  const virtualTargetFile = join(typesDir, DEFAULT_VIRTUAL_TYPES_FILENAME);\n\n  const header = options.header ?? [...DEFAULT_MANIFEST_HEADER];\n  const aliasBase = options.routesImportBase ?? ROUTES_ALIAS_ID;\n\n  const rewriteImportPath = options.routesDir\n    ? createAliasImportRewriter({\n        outputDir: typesDir,\n        routesDir: resolve(options.routesDir),\n        aliasBase,\n      })\n    : undefined;\n\n  let taserImportPath: string | undefined;\n  if (options.taserEntryPath) {\n    const rel = toPosixPath(relative(typesDir, options.taserEntryPath)).replace(\n      /\\.(ts|js|mjs|cjs)$/,\n      \".js\",\n    );\n    taserImportPath = rel.startsWith(\".\") ? rel : `./${rel}`;\n  }\n\n  const routesCode = emitTypeDeclarationsSource(model, {\n    header,\n    quotes: options.quotes ?? \"double\",\n    rewriteImportPath,\n    taserImportPath,\n  });\n\n  const virtualCode = emitVirtualDeclarationsSource({ header });\n  const combinedSignature = `${routesCode}\\n---\\n${virtualCode}`;\n\n  if (options.state && options.state.lastSignature === combinedSignature) {\n    return false;\n  }\n\n  await mkdir(typesDir, { recursive: true });\n  await Promise.all([\n    writeFile(routesTargetFile, routesCode, \"utf8\"),\n    writeFile(virtualTargetFile, virtualCode, \"utf8\"),\n  ]);\n\n  if (options.state) {\n    options.state.lastSignature = combinedSignature;\n  }\n\n  return true;\n}\n"],"mappings":";;;;;;;AA8BA,eAAsB,gBACpB,OACA,UAA6B,CAAC,GACZ;CAElB,MAAM,YAAA,GAAA,UAAA,QAAA,EAAA,GAAA,UAAA,QAAA,CADkB,QAAQ,WAAW,QAAQ,IAAI,CAC9B,GAAS,kBAAA,2BAA2B;CAC7D,MAAM,oBAAA,GAAA,UAAA,KAAA,CAAwB,UAAU,kBAAA,6BAA6B;CACrE,MAAM,qBAAA,GAAA,UAAA,KAAA,CAAyB,UAAU,kBAAA,8BAA8B;CAEvE,MAAM,SAAS,QAAQ,UAAU,CAAC,GAAG,kBAAA,uBAAuB;CAC5D,MAAM,YAAY,QAAQ,oBAAA;CAE1B,MAAM,oBAAoB,QAAQ,YAC9B,cAAA,0BAA0B;EACxB,WAAW;EACX,YAAA,GAAA,UAAA,QAAA,CAAmB,QAAQ,SAAS;EACpC;CACF,CAAC,IACD,KAAA;CAEJ,IAAI;CACJ,IAAI,QAAQ,gBAAgB;EAC1B,MAAM,MAAM,cAAA,aAAA,GAAA,UAAA,SAAA,CAAqB,UAAU,QAAQ,cAAc,CAAC,CAAC,CAAC,QAClE,sBACA,KACF;EACA,kBAAkB,IAAI,WAAW,GAAG,IAAI,MAAM,KAAK;CACrD;CAEA,MAAM,aAAa,aAAA,2BAA2B,OAAO;EACnD;EACA,QAAQ,QAAQ,UAAU;EAC1B;EACA;CACF,CAAC;CAED,MAAM,cAAc,gBAAA,8BAA8B,EAAE,OAAO,CAAC;CAC5D,MAAM,oBAAoB,GAAG,WAAW,SAAS;CAEjD,IAAI,QAAQ,SAAS,QAAQ,MAAM,kBAAkB,mBACnD,OAAO;CAGT,OAAA,GAAA,iBAAA,MAAA,CAAY,UAAU,EAAE,WAAW,KAAK,CAAC;CACzC,MAAM,QAAQ,IAAI,EAAA,GAAA,iBAAA,UAAA,CACN,kBAAkB,YAAY,MAAM,IAAA,GAAA,iBAAA,UAAA,CACpC,mBAAmB,aAAa,MAAM,CAClD,CAAC;CAED,IAAI,QAAQ,OACV,QAAQ,MAAM,gBAAgB;CAGhC,OAAO;AACT"}