{"version":3,"file":"index.cjs","sources":["../src/isVizId.ts","../src/isImageFileName.ts","../src/generateVizId.ts","../src/generateVizFileId.ts","../src/generateRunId.ts","../src/getFileId.ts","../src/getFileText.ts","../src/vizFilesToFileCollection.ts","../src/fileCollectionToVizFiles.ts","../src/dateToTimestamp.ts","../src/timestampToDate.ts"],"sourcesContent":["import type { VizId } from \"@vizhub/viz-types\";\n\n// Checks if a string was generated by `generateId` from interactors.\nexport const isVizId = (str: string): boolean => {\n  // First check if the length is exactly 32 characters\n  if (str.length !== 32) {\n    return false;\n  }\n\n  // Regular expression for a 32-character hexadecimal string\n  let uuidV4NoDashRegex = /^[0-9a-f]{32}$/i;\n\n  // Check if the string matches the regular expression\n  if (!uuidV4NoDashRegex.test(str)) {\n    return false;\n  }\n\n  // Check if the 13th character is '4' (indicating UUID v4)\n  // and the 17th character is one of '8', '9', 'a', 'b' (indicating the variant)\n  return (\n    str[12] === \"4\"\n    // &&\n    // ['8', '9', 'a', 'b'].includes(str[16].toLowerCase())\n  );\n};\n","// Check if a file name has an image file extension\nexport const isImageFileName = (fileName: string): boolean => {\n  if (!fileName || typeof fileName !== \"string\" || fileName.trim() === \"\") {\n    return false;\n  }\n\n  // Check if it's an image file based on extension\n  // Also ensure there's at least one character before the dot\n  return /^.+\\.(png|jpg|jpeg|gif|bmp|svg|webp)$/i.test(fileName);\n};\n","import type { VizId } from \"@vizhub/viz-types\";\n\n// Resolve a Web‑Crypto‑compatible `crypto` object.\n// • Browsers & Node 19 +   → globalThis.crypto\n// • Anything else (rare)   → use node:crypto's webcrypto\nconst getCryptoObj = (): Crypto => {\n  if (typeof globalThis.crypto !== \"undefined\") {\n    return globalThis.crypto as Crypto;\n  }\n  // Use require instead of import to avoid top-level await\n  // This will only run in Node.js environments\n  return require(\"node:crypto\").webcrypto as Crypto;\n};\n\nconst cryptoObj = getCryptoObj();\n\n/**\n * Generates a dash‑free RFC 4122‑compliant UUID v4 (32 hex chars).\n * Works in all evergreen browsers and Node 19 + without extra deps.\n */\nexport const generateVizId = (): VizId => {\n  const bytes = new Uint8Array(16);\n  cryptoObj.getRandomValues(bytes);\n\n  // RFC 4122: set version (4) and variant (10xx)\n  bytes[6] = (bytes[6] & 0x0f) | 0x40;\n  bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n  return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n    \"\",\n  ) as VizId;\n};\n","import type { VizFileId } from \"@vizhub/viz-types\";\nimport { generateVizId } from \"./generateVizId\";\n\n// Generates a file id\nexport const generateVizFileId = (): VizFileId =>\n  generateVizId().substring(0, 8);\n","import { generateVizFileId } from \"./generateVizFileId\";\nexport const generateRunId = generateVizFileId;\n","import { VizContent, VizFileId } from \"@vizhub/viz-types\";\n\n// Gets the file id of a file with the given name.\n// Returns null if not found.\nexport const getFileId = (\n  content: VizContent,\n  fileName: string,\n): VizFileId | null => {\n  if (content && content.files) {\n    for (const fileId of Object.keys(content.files)) {\n      const file = content.files[fileId];\n      if (file.name === fileName) {\n        return fileId;\n      }\n    }\n  }\n  return null;\n};\n","import { VizContent } from \"@vizhub/viz-types\";\nimport { getFileId } from \"./getFileId\";\n\n// Gets the text content of a file with the given name.\n// Returns null if not found.\nexport const getFileText = (\n  content: VizContent,\n  fileName: string,\n): string | null => {\n  const fileId = getFileId(content, fileName);\n  if (fileId && content && content.files) {\n    return content.files[fileId].text;\n  }\n  return null;\n};\n","import type { VizFiles, FileCollection } from \"@vizhub/viz-types\";\n\n/**\n * Converts VizContent to FileCollection format.\n */\nexport const vizFilesToFileCollection = (files?: VizFiles): FileCollection => {\n  const fileCollection: FileCollection = {};\n\n  // Return empty object if files is undefined\n  if (!files) {\n    return fileCollection;\n  }\n\n  // Convert each VizFile to the FileCollection format\n  for (const file of Object.values(files)) {\n    fileCollection[file.name] = file.text;\n  }\n\n  return fileCollection;\n};\n","import { FileCollection, VizFiles } from \"@vizhub/viz-types\";\nimport { generateVizFileId } from \"./generateVizFileId\";\n\nexport const fileCollectionToVizFiles = (files: FileCollection): VizFiles => {\n  return Object.entries(files).reduce((acc, [name, text]) => {\n    acc[generateVizFileId()] = { name, text };\n    return acc;\n  }, {} as VizFiles);\n};\n","import type { VizTimestamp } from \"@vizhub/viz-types\";\n\nexport const dateToTimestamp = (date: Date): VizTimestamp =>\n  Math.floor(date.getTime() / 1000);\n","import type { VizTimestamp } from \"@vizhub/viz-types\";\n\nexport const timestampToDate = (timestamp: VizTimestamp): Date =>\n  new Date(timestamp * 1000);\n"],"names":["isVizId","str","isImageFileName","fileName","getCryptoObj","cryptoObj","generateVizId","bytes","b","generateVizFileId","generateRunId","getFileId","content","fileId","getFileText","vizFilesToFileCollection","files","fileCollection","file","fileCollectionToVizFiles","acc","name","text","dateToTimestamp","date","timestampToDate","timestamp"],"mappings":"gFAGO,MAAMA,EAAWC,GAElBA,EAAI,SAAW,IAQf,CAHoB,kBAGD,KAAKA,CAAG,EACtB,GAMPA,EAAI,EAAE,IAAM,ICnBHC,EAAmBC,GAC1B,CAACA,GAAY,OAAOA,GAAa,UAAYA,EAAS,KAAA,IAAW,GAC5D,GAKF,yCAAyC,KAAKA,CAAQ,ECHzDC,EAAe,IACf,OAAO,WAAW,OAAW,IACxB,WAAW,OAIb,QAAQ,aAAa,EAAE,UAG1BC,EAAYD,EAAA,EAMLE,EAAgB,IAAa,CACxC,MAAMC,EAAQ,IAAI,WAAW,EAAE,EAC/B,OAAAF,EAAU,gBAAgBE,CAAK,EAG/BA,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAI,GAAQ,GAC/BA,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAI,GAAQ,IAExB,MAAM,KAAKA,EAAQC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAC/D,EAAA,CAEJ,EC3BaC,EAAoB,IAC/BH,EAAA,EAAgB,UAAU,EAAG,CAAC,ECJnBI,EAAgBD,ECGhBE,EAAY,CACvBC,EACAT,IACqB,CACrB,GAAIS,GAAWA,EAAQ,OACrB,UAAWC,KAAU,OAAO,KAAKD,EAAQ,KAAK,EAE5C,GADaA,EAAQ,MAAMC,CAAM,EACxB,OAASV,EAChB,OAAOU,EAIb,OAAO,IACT,ECZaC,EAAc,CACzBF,EACAT,IACkB,CAClB,MAAMU,EAASF,EAAUC,EAAST,CAAQ,EAC1C,OAAIU,GAAUD,GAAWA,EAAQ,MACxBA,EAAQ,MAAMC,CAAM,EAAE,KAExB,IACT,ECTaE,EAA4BC,GAAqC,CAC5E,MAAMC,EAAiC,CAAA,EAGvC,GAAI,CAACD,EACH,OAAOC,EAIT,UAAWC,KAAQ,OAAO,OAAOF,CAAK,EACpCC,EAAeC,EAAK,IAAI,EAAIA,EAAK,KAGnC,OAAOD,CACT,EChBaE,EAA4BH,GAChC,OAAO,QAAQA,CAAK,EAAE,OAAO,CAACI,EAAK,CAACC,EAAMC,CAAI,KACnDF,EAAIX,EAAA,CAAmB,EAAI,CAAE,KAAAY,EAAM,KAAAC,CAAA,EAC5BF,GACN,CAAA,CAAc,ECLNG,EAAmBC,GAC9B,KAAK,MAAMA,EAAK,QAAA,EAAY,GAAI,ECDrBC,EAAmBC,GAC9B,IAAI,KAAKA,EAAY,GAAI"}