@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 7.01 kB
Source Map (JSON)
{"version":3,"file":"paths.mjs","names":[],"sources":["../../../../src/libs/email/storage/paths.ts"],"sourcesContent":["import type {\n\tEmailStorageConcretePath,\n\tEmailStoragePathSegment,\n} from \"./types.js\";\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === \"object\" && value !== null && !Array.isArray(value);\n\nexport const cloneValue = <T>(value: T): T => {\n\ttry {\n\t\treturn structuredClone(value);\n\t} catch (_) {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.map((item) => cloneValue(item)) as T;\n\t\t}\n\n\t\tif (isRecord(value)) {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries(value).map(([key, item]) => [key, cloneValue(item)]),\n\t\t\t) as T;\n\t\t}\n\n\t\treturn value;\n\t}\n};\n\n/**\n * Resolves selector segments to concrete paths that already exist in data.\n */\nexport const resolveExistingEmailStoragePaths = (\n\tvalue: unknown,\n\tsegments: EmailStoragePathSegment[],\n\tpath: EmailStorageConcretePath = [],\n): EmailStorageConcretePath[] => {\n\tif (segments.length === 0) return [path];\n\n\tconst [segment, ...remainingSegments] = segments;\n\tif (!segment) return [path];\n\n\tif (segment.type === \"key\") {\n\t\tif (!isRecord(value) || !Object.hasOwn(value, segment.key)) return [];\n\t\treturn resolveExistingEmailStoragePaths(\n\t\t\tvalue[segment.key],\n\t\t\tremainingSegments,\n\t\t\t[...path, segment.key],\n\t\t);\n\t}\n\n\tif (segment.type === \"index\") {\n\t\tif (!Array.isArray(value) || segment.index >= value.length) return [];\n\t\treturn resolveExistingEmailStoragePaths(\n\t\t\tvalue[segment.index],\n\t\t\tremainingSegments,\n\t\t\t[...path, segment.index],\n\t\t);\n\t}\n\n\tif (!Array.isArray(value)) return [];\n\n\treturn value.flatMap((item, itemIndex) =>\n\t\tresolveExistingEmailStoragePaths(item, remainingSegments, [\n\t\t\t...path,\n\t\t\titemIndex,\n\t\t]),\n\t);\n};\n\nexport const getValueAtEmailStoragePath = (\n\tvalue: unknown,\n\tpath: EmailStorageConcretePath,\n): unknown => {\n\tlet current = value;\n\n\tfor (const segment of path) {\n\t\tif (typeof segment === \"number\") {\n\t\t\tif (!Array.isArray(current)) return undefined;\n\t\t\tcurrent = current[segment];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isRecord(current)) return undefined;\n\t\tcurrent = current[segment];\n\t}\n\n\treturn current;\n};\n\nexport const setValueAtEmailStoragePath = (\n\tvalue: unknown,\n\tpath: EmailStorageConcretePath,\n\tnewValue: unknown,\n\toptions?: {\n\t\tcreateMissing?: boolean;\n\t},\n) => {\n\tif (path.length === 0) return;\n\n\tlet current = value;\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst segment = path[i];\n\t\tif (segment === undefined) return;\n\n\t\tconst nextSegment = path[i + 1];\n\n\t\tif (typeof segment === \"number\") {\n\t\t\tif (!Array.isArray(current)) return;\n\t\t\tif (current[segment] === undefined && options?.createMissing) {\n\t\t\t\tcurrent[segment] = typeof nextSegment === \"number\" ? [] : {};\n\t\t\t}\n\t\t\tcurrent = current[segment];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isRecord(current)) return;\n\t\tif (current[segment] === undefined && options?.createMissing) {\n\t\t\tcurrent[segment] = typeof nextSegment === \"number\" ? [] : {};\n\t\t}\n\t\tcurrent = current[segment];\n\t}\n\n\tconst finalSegment = path[path.length - 1];\n\tif (finalSegment === undefined) return;\n\n\tif (typeof finalSegment === \"number\") {\n\t\tif (!Array.isArray(current)) return;\n\t\tcurrent[finalSegment] = newValue;\n\t\treturn;\n\t}\n\n\tif (!isRecord(current)) return;\n\tcurrent[finalSegment] = newValue;\n};\n\nexport const removeValueAtEmailStoragePath = (\n\tvalue: unknown,\n\tpath: EmailStorageConcretePath,\n) => {\n\tif (path.length === 0) return;\n\n\tlet current = value;\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst segment = path[i];\n\t\tif (segment === undefined) return;\n\n\t\tif (typeof segment === \"number\") {\n\t\t\tif (!Array.isArray(current)) return;\n\t\t\tcurrent = current[segment];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isRecord(current)) return;\n\t\tcurrent = current[segment];\n\t}\n\n\tconst finalSegment = path[path.length - 1];\n\tif (finalSegment === undefined) return;\n\n\tif (typeof finalSegment === \"number\") {\n\t\tif (!Array.isArray(current)) return;\n\t\tcurrent[finalSegment] = null;\n\t\treturn;\n\t}\n\n\tif (!isRecord(current)) return;\n\tdelete current[finalSegment];\n};\n\nexport const emailStorageSegmentsToPath = (\n\tsegments: EmailStoragePathSegment[],\n): EmailStorageConcretePath =>\n\tsegments.map((segment) => {\n\t\tif (segment.type === \"key\") return segment.key;\n\t\tif (segment.type === \"index\") return segment.index;\n\t\treturn 0;\n\t});\n"],"mappings":"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"}