{"version":3,"file":"to-safe-table-name.mjs","names":["constants"],"sources":["../../../../src/libs/collection/helpers/to-safe-table-name.ts"],"sourcesContent":["import { crc32 } from \"node:zlib\";\nimport constants from \"../../../constants/constants.js\";\n\nconst HASH_LENGTH = 8;\n\nconst crc32Hex = (value: string): string => {\n\treturn (crc32(value) >>> 0).toString(16).padStart(HASH_LENGTH, \"0\");\n};\n\nconst byteLength = (value: string): number => Buffer.byteLength(value, \"utf8\");\n\n/**\n * Converts a table name to a safe table name by truncating the name if it exceeds the limit\n */\nconst toSafeTableName = (name: string, limit: number | null) => {\n\tif (limit === null || limit === undefined || !Number.isFinite(limit)) {\n\t\treturn {\n\t\t\tname,\n\t\t\trawName: name,\n\t\t};\n\t}\n\tconst effectiveLimit = Math.max(limit, constants.db.minTableNameByteLimit);\n\tif (byteLength(name) <= effectiveLimit) {\n\t\treturn {\n\t\t\tname,\n\t\t\trawName: name,\n\t\t};\n\t}\n\n\tconst hash = crc32Hex(name);\n\tconst segments = name.split(constants.db.nameSeparator);\n\tconst suffix = `_${hash}`;\n\t// Keep the first sections stable. For relation tables this preserves:\n\t// lucid_document__{collection}__{scope}__{relation-separator}\n\t// and only hashes what's after it.\n\tif (segments.length > 4) {\n\t\tconst stablePrefix = segments.slice(0, 4).join(constants.db.nameSeparator);\n\t\tconst candidate = `${stablePrefix}${suffix}`;\n\t\tif (byteLength(candidate) <= effectiveLimit) {\n\t\t\treturn {\n\t\t\t\tname: candidate,\n\t\t\t\trawName: name,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (!name.startsWith(constants.db.generatedIndexPrefix)) {\n\t\treturn {\n\t\t\tname,\n\t\t\trawName: name,\n\t\t};\n\t}\n\n\tconst maxPrefixBytes = effectiveLimit - byteLength(suffix);\n\tlet truncated = \"\";\n\tfor (const char of name) {\n\t\tconst candidate = `${truncated}${char}`;\n\t\tif (byteLength(candidate) > maxPrefixBytes) break;\n\t\ttruncated = candidate;\n\t}\n\n\treturn {\n\t\tname: `${truncated}${suffix}`,\n\t\trawName: name,\n\t};\n};\n\nexport default toSafeTableName;\n"],"mappings":"kFAGA,MAEM,EAAY,IACT,EAAM,CAAK,IAAM,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,EAAa,GAAG,EAG7D,EAAc,GAA0B,OAAO,WAAW,EAAO,MAAM,EAKvE,GAAmB,EAAc,IAAyB,CAC/D,GAAI,GAAU,MAA+B,CAAC,OAAO,SAAS,CAAK,EAClE,MAAO,CACN,OACA,QAAS,CACV,EAED,IAAM,EAAiB,KAAK,IAAI,EAAOA,EAAU,GAAG,qBAAqB,EACzE,GAAI,EAAW,CAAI,GAAK,EACvB,MAAO,CACN,OACA,QAAS,CACV,EAGD,IAAM,EAAO,EAAS,CAAI,EACpB,EAAW,EAAK,MAAMA,EAAU,GAAG,aAAa,EAChD,EAAS,IAAI,IAInB,GAAI,EAAS,OAAS,EAAG,CAExB,IAAM,EAAY,GADG,EAAS,MAAM,EAAG,CAAC,CAAC,CAAC,KAAKA,EAAU,GAAG,aAC5B,IAAI,IACpC,GAAI,EAAW,CAAS,GAAK,EAC5B,MAAO,CACN,KAAM,EACN,QAAS,CACV,CAEF,CAEA,GAAI,CAAC,EAAK,WAAWA,EAAU,GAAG,oBAAoB,EACrD,MAAO,CACN,OACA,QAAS,CACV,EAGD,IAAM,EAAiB,EAAiB,EAAW,CAAM,EACrD,EAAY,GAChB,IAAK,IAAM,KAAQ,EAAM,CACxB,IAAM,EAAY,GAAG,IAAY,IACjC,GAAI,EAAW,CAAS,EAAI,EAAgB,MAC5C,EAAY,CACb,CAEA,MAAO,CACN,KAAM,GAAG,IAAY,IACrB,QAAS,CACV,CACD"}