{"version":3,"file":"analytics-utils.mjs","names":[],"sources":["../../src/analytics-utils.ts"],"sourcesContent":["import type {\n  ShopifyMonorailPayload,\n  ShopifyMonorailEvent,\n  ShopifyGid,\n} from './analytics-types.js';\n\n/**\n * Builds a Shopify Monorail event from a Shopify Monorail payload and a schema ID.\n * @param payload - The Monorail payload\n * @param schemaId - The schema ID to use\n * @returns The formatted payload\n **/\nexport function schemaWrapper(\n  schemaId: string,\n  payload: ShopifyMonorailPayload,\n): ShopifyMonorailEvent {\n  return {\n    schema_id: schemaId,\n    payload,\n    metadata: {\n      event_created_at_ms: Date.now(),\n    },\n  };\n}\n\n/**\n * Parses global id (gid) and returns the resource type and id.\n * @see https://shopify.dev/api/usage/gids\n * @param gid - A shopify GID (string)\n *\n * @example\n * ```ts\n * const {id, resource} = parseGid('gid://shopify/Order/123')\n * // => id = \"123\", resource = 'Order'\n *\n *  * const {id, resource} = parseGid('gid://shopify/Cart/abc123')\n * // => id = \"abc123\", resource = 'Cart'\n * ```\n * @publicDocs\n **/\nexport function parseGid(gid: string | undefined): ShopifyGid {\n  const defaultReturn: ShopifyGid = {\n    id: '',\n    resource: null,\n    resourceId: null,\n    search: '',\n    searchParams: new URLSearchParams(),\n    hash: '',\n  };\n\n  if (typeof gid !== 'string') {\n    return defaultReturn;\n  }\n\n  try {\n    const {search, searchParams, pathname, hash} = new URL(gid);\n    const pathnameParts = pathname.split('/');\n    const lastPathnamePart = pathnameParts[pathnameParts.length - 1];\n    const resourcePart = pathnameParts[pathnameParts.length - 2];\n\n    if (!lastPathnamePart || !resourcePart) {\n      return defaultReturn;\n    }\n\n    const id = `${lastPathnamePart}${search}${hash}` || '';\n    const resourceId = lastPathnamePart || null;\n    const resource = resourcePart ?? null;\n\n    return {id, resource, resourceId, search, searchParams, hash};\n  } catch {\n    return defaultReturn;\n  }\n}\n\n/**\n * Filters properties from an object and returns a new object with only the properties that have a truthy value.\n * @param keyValuePairs - An object of key-value pairs\n * @param formattedData - An object which will hold the truthy values\n * @returns The formatted object\n **/\nexport function addDataIf(\n  keyValuePairs: ShopifyMonorailPayload,\n  formattedData: ShopifyMonorailPayload,\n): ShopifyMonorailPayload {\n  if (typeof keyValuePairs !== 'object') {\n    return {};\n  }\n  Object.entries(keyValuePairs).forEach(([key, value]) => {\n    if (value) {\n      formattedData[key] = value;\n    }\n  });\n  return formattedData;\n}\n\n/**\n * Utility that errors if a function is called on the server.\n * @param fnName - The name of the function\n * @returns A boolean\n **/\nexport function errorIfServer(fnName: string): boolean {\n  if (typeof document === 'undefined') {\n    console.error(\n      `${fnName} should only be used within the useEffect callback or event handlers`,\n    );\n    return true;\n  }\n  return false;\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,cACd,UACA,SACsB;AACtB,QAAO;EACL,WAAW;EACX;EACA,UAAU,EACR,qBAAqB,KAAK,KAAK,EAChC;EACF;;;;;;;;;;;;;;;;;AAkBH,SAAgB,SAAS,KAAqC;CAC5D,MAAM,gBAA4B;EAChC,IAAI;EACJ,UAAU;EACV,YAAY;EACZ,QAAQ;EACR,cAAc,IAAI,iBAAiB;EACnC,MAAM;EACP;AAED,KAAI,OAAO,QAAQ,SACjB,QAAO;AAGT,KAAI;EACF,MAAM,EAAC,QAAQ,cAAc,UAAU,SAAQ,IAAI,IAAI,IAAI;EAC3D,MAAM,gBAAgB,SAAS,MAAM,IAAI;EACzC,MAAM,mBAAmB,cAAc,cAAc,SAAS;EAC9D,MAAM,eAAe,cAAc,cAAc,SAAS;AAE1D,MAAI,CAAC,oBAAoB,CAAC,aACxB,QAAO;AAOT,SAAO;GAAC,IAJG,GAAG,mBAAmB,SAAS,UAAU;GAIxC,UAFK,gBAAgB;GAEX,YAHH,oBAAoB;GAGL;GAAQ;GAAc;GAAK;SACvD;AACN,SAAO;;;;;;;;;AAUX,SAAgB,UACd,eACA,eACwB;AACxB,KAAI,OAAO,kBAAkB,SAC3B,QAAO,EAAE;AAEX,QAAO,QAAQ,cAAc,CAAC,SAAS,CAAC,KAAK,WAAW;AACtD,MAAI,MACF,eAAc,OAAO;GAEvB;AACF,QAAO;;;;;;;AAQT,SAAgB,cAAc,QAAyB;AACrD,KAAI,OAAO,aAAa,aAAa;AACnC,UAAQ,MACN,GAAG,OAAO,sEACX;AACD,SAAO;;AAET,QAAO"}