{"version":3,"file":"nodeId.cjs","sources":["@gensx/core/../../../../src/utils/nodeId.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { deterministicString } from \"deterministic-object-hash\";\nimport { isZodSchemaObject } from \"src/zod.js\";\n\nimport { ContentId, NodeId, PathId } from \"../checkpoint-types.js\";\n\nexport function generateNodeId(\n  componentName: string,\n  props: Record<string, unknown>,\n  idPropsKeys: string[] | undefined,\n  parentPath = \"\",\n  callIndex = 0,\n): NodeId {\n  // Generate hierarchical path\n  const pathId: PathId =\n    parentPath && parentPath.length > 0\n      ? `${parentPath}-${componentName}`\n      : componentName;\n\n  const propsStr = stringifyProps(props, idPropsKeys);\n  // Generate content hash from component name + props\n  const contentId: ContentId = createHash(\"sha1\")\n    .update(componentName)\n    .update(propsStr)\n    .digest(\"hex\")\n    .slice(0, 8);\n\n  // Create primary ID: path:contentHash:callIndex\n  const nodeId: NodeId = `${pathId}:${contentId}:${callIndex}`;\n\n  return nodeId;\n}\n\nexport function stringifyProps(\n  props: Record<string, unknown> | undefined | null,\n  idPropsKeys?: string[],\n): string {\n  if (!props) {\n    if (idPropsKeys?.length) {\n      console.warn(\n        `[Checkpoint] No props provided for node id generation, but idPropsKeys are provided.`,\n      );\n    }\n    return `${props}`;\n  }\n  return deterministicString(\n    deterministicProps(\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      JSON.parse(JSON.stringify(props)),\n      idPropsKeys,\n    ),\n  );\n}\n\nfunction deterministicProps(\n  props: Record<string, unknown>,\n  idPropsKeys: string[] | undefined,\n  path = \"\",\n): Record<string, unknown> {\n  const filteredProps: Record<string, unknown> = !idPropsKeys\n    ? props\n    : filterProps(props, idPropsKeys);\n  // Do some processing on certain types of props that are hard to serialize like zod schemas\n  for (const key in filteredProps) {\n    const value = filteredProps[key];\n    if (isZodSchemaObject(value)) {\n      // eslint-disable-next-line @typescript-eslint/no-base-to-string\n      filteredProps[key] = value.toString();\n    } else if (typeof value === \"function\") {\n      console.warn(\n        `[Checkpoint] Function prop found in ${path}.${key}, this is not serializable and cannot be used for node id generation.`,\n        {\n          path: `${path}.${key}`,\n          value,\n        },\n      );\n      filteredProps[key] = \"[Function]\";\n    } else if (typeof value === \"object\" && value !== null) {\n      filteredProps[key] = deterministicProps(\n        value as Record<string, unknown>,\n        undefined,\n        `${path}.${key}`,\n      );\n    }\n  }\n  return filteredProps;\n}\n\n/**\n * Filter the props to only include the keys in idPropsKeys\n * @param props - The props to filter\n * @param idPropsKeys - A list of paths to values in the props to include in the id.\n * @returns The filtered props\n */\nfunction filterProps(\n  props: Record<string, unknown>,\n  idPropsKeys: string[],\n): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n\n  for (const path of idPropsKeys) {\n    const parts = path.split(\".\");\n    let current: Record<string, unknown> | undefined = props;\n    let target = result;\n\n    // Traverse the path\n    for (let i = 0; i < parts.length - 1; i++) {\n      const part = parts[i];\n      current = current[part] as Record<string, unknown> | undefined;\n      if (!current) break;\n\n      target[part] ??= {};\n      target = target[part] as Record<string, unknown>;\n    }\n\n    // Set the final value\n    const lastPart = parts[parts.length - 1];\n    if (current && lastPart in current) {\n      const value = current[lastPart];\n      // If the value is not a primitive, copy the whole thing\n      if (\n        value &&\n        typeof value !== \"string\" &&\n        typeof value !== \"number\" &&\n        typeof value !== \"boolean\" &&\n        typeof value !== \"bigint\"\n      ) {\n        target[lastPart] = structuredClone(value);\n      } else {\n        target[lastPart] = value;\n      }\n    }\n  }\n\n  return result;\n}\n"],"names":["createHash","deterministicString","isZodSchemaObject"],"mappings":"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"}