{"version":3,"sources":["../../src/track/rdt.ts"],"sourcesContent":["import type { Item } from './gtag';\nimport type { EventName, TrackName, TrackProperties } from './types';\n\n/** https://business.reddithelp.com/s/article/about-event-metadata */\nexport type Product = {\n  /**\n   * (Required) Product ID: Either the SKU or GTIN, which represents the variant ID, not the\n   * parent ID. If there are no variants, pass the assigned ID for that item.\n   */\n  id: string;\n\n  /** (Optional) Product Category: The group the product belongs to. */\n  name?: string;\n\n  /** (Optional) Product Name: The title of the product. */\n  category?: string;\n};\n\n/**\n * https://business.reddithelp.com/s/article/supported-conversion-events#supported-conversion-events\n * https://business.reddithelp.com/s/article/about-event-metadata\n * https://business.reddithelp.com/s/article/map-a-catalog-to-a-signal-source\n */\nexport type StandardEvents = {\n  PageVisit: {\n    conversionId?: string;\n    products?: Product[];\n  };\n  ViewContent: {\n    conversionId?: string;\n    products?: Product[];\n  };\n  Search: {\n    conversionId?: string;\n    products?: Product[];\n  };\n  AddToCart: {\n    value?: number;\n    currency?: string;\n    itemCount?: number;\n    conversionId?: string;\n    products?: Product[];\n  };\n  AddToWishlist: {\n    value?: number;\n    currency?: string;\n    itemCount?: number;\n    conversionId?: string;\n    products?: Product[];\n  };\n  Purchase: {\n    value?: number;\n    currency?: string;\n    itemCount?: number;\n    conversionId?: string;\n    products?: Product[];\n  };\n  Lead: {\n    value?: number;\n    currency?: string;\n    conversionId?: string;\n    products?: Product[];\n  };\n  SignUp: {\n    value?: number;\n    currency?: string;\n    conversionId?: string;\n    products?: Product[];\n  };\n};\n\nexport type PixelId = `a2_${string}`;\n\nexport type MatchKeys = {\n  email?: string;\n  phoneNumber?: string;\n  externalId?: string;\n  idfa?: string;\n  aaid?: string;\n};\n\nexport type CustomEventParams<T extends string = string> = {\n  customEventName: T;\n  value?: number;\n  currency?: string;\n  itemCount?: number;\n  conversionId?: string;\n  products?: Product[];\n};\n\nexport interface RDT {\n  rdt(event: 'init', pixelId: PixelId, matchKeys?: MatchKeys): void;\n\n  rdt<T extends keyof StandardEvents>(event: 'track', type: T, params?: StandardEvents[T]): void;\n\n  rdt(event: 'track', type: 'Custom', params: CustomEventParams): void;\n}\n\ntype Mapped<F extends keyof StandardEvents> = [F, StandardEvents[F]];\ntype Missed<F extends string> = ['Custom', CustomEventParams<F>];\n\nexport function mapItems(items?: Item[]): undefined | Product[] {\n  if (!items || items.length === 0) return undefined;\n  return items.map((item) => ({\n    id: item.item_id,\n    name: item.item_name,\n    category: item.item_category,\n  }));\n}\n\nexport function mapRDTEvent<T extends EventName>(\n  name: TrackName<T>,\n  properties?: TrackProperties<T>,\n  eventId?: string\n): Mapped<keyof StandardEvents> | Missed<TrackName<T>> {\n  // standard events\n  if (name === 'page_view') {\n    return ['PageVisit', { conversionId: eventId }];\n  } else if (name === 'view_item') {\n    return ['ViewContent', { conversionId: eventId }];\n  } else if (name === 'search') {\n    return ['Search', { conversionId: eventId }];\n  } else if (name === 'add_to_cart') {\n    const p = properties as TrackProperties<'add_to_cart'> | undefined;\n    return [\n      'AddToCart',\n      {\n        conversionId: eventId,\n        value: p?.value,\n        currency: p?.currency.toUpperCase(),\n        itemCount: p?.items?.reduce((acc, i) => acc + (i.quantity ?? 1), 0),\n        products: mapItems(p?.items),\n      },\n    ];\n  } else if (name === 'add_to_wishlist') {\n    const p = properties as TrackProperties<'add_to_wishlist'> | undefined;\n    return [\n      'AddToWishlist',\n      {\n        conversionId: eventId,\n        value: p?.value,\n        currency: p?.currency.toUpperCase(),\n        itemCount: p?.items?.reduce((acc, i) => acc + (i.quantity ?? 1), 0),\n        products: mapItems(p?.items),\n      },\n    ];\n  } else if (name === 'purchase') {\n    const p = properties as TrackProperties<'purchase'> | undefined;\n    return [\n      'Purchase',\n      {\n        conversionId: eventId,\n        value: p?.value,\n        currency: p?.currency.toUpperCase(),\n        itemCount: p?.items?.reduce((acc, i) => acc + (i.quantity ?? 1), 0),\n        products: mapItems(p?.items),\n      },\n    ];\n  } else if (name === 'generate_lead') {\n    const p = properties as TrackProperties<'generate_lead'> | undefined;\n    return [\n      'Lead',\n      { conversionId: eventId, value: p?.value, currency: p?.currency.toUpperCase() },\n    ];\n  } else if (name === 'sign_up' || name === 'login') {\n    return ['SignUp', { conversionId: eventId }];\n  } else {\n    // custom event\n    return [\n      'Custom',\n      {\n        customEventName: name,\n        conversionId: eventId,\n        value:\n          properties && 'value' in properties && typeof properties.value === 'number'\n            ? properties.value\n            : undefined,\n        currency:\n          properties && 'currency' in properties && typeof properties.currency === 'string'\n            ? properties.currency.toUpperCase()\n            : undefined,\n      },\n    ];\n  }\n}\n\nexport type ServerStandardEvent =\n  | 'PAGE_VISIT'\n  | 'VIEW_CONTENT'\n  | 'SEARCH'\n  | 'ADD_TO_CART'\n  | 'ADD_TO_WISHLIST'\n  | 'PURCHASE'\n  | 'LEAD'\n  | 'SIGN_UP';\n\nexport function mapServerStandardEvent(name: keyof StandardEvents): ServerStandardEvent {\n  if (name === 'PageVisit') return 'PAGE_VISIT';\n  if (name === 'ViewContent') return 'VIEW_CONTENT';\n  if (name === 'Search') return 'SEARCH';\n  if (name === 'AddToCart') return 'ADD_TO_CART';\n  if (name === 'AddToWishlist') return 'ADD_TO_WISHLIST';\n  if (name === 'Purchase') return 'PURCHASE';\n  if (name === 'Lead') return 'LEAD';\n  if (name === 'SignUp') return 'SIGN_UP';\n  throw new Error(`Unsupported standard event: ${name}`);\n}\n"],"mappings":";AAqGO,SAAS,SAAS,OAAuC;AAC9D,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,EACjB,EAAE;AACJ;AAEO,SAAS,YACd,MACA,YACA,SACqD;AAlHvD;AAoHE,MAAI,SAAS,aAAa;AACxB,WAAO,CAAC,aAAa,EAAE,cAAc,QAAQ,CAAC;AAAA,EAChD,WAAW,SAAS,aAAa;AAC/B,WAAO,CAAC,eAAe,EAAE,cAAc,QAAQ,CAAC;AAAA,EAClD,WAAW,SAAS,UAAU;AAC5B,WAAO,CAAC,UAAU,EAAE,cAAc,QAAQ,CAAC;AAAA,EAC7C,WAAW,SAAS,eAAe;AACjC,UAAM,IAAI;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,OAAO,uBAAG;AAAA,QACV,UAAU,uBAAG,SAAS;AAAA,QACtB,YAAW,4BAAG,UAAH,mBAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,YAAY,IAAI;AAAA,QACjE,UAAU,SAAS,uBAAG,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,WAAW,SAAS,mBAAmB;AACrC,UAAM,IAAI;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,OAAO,uBAAG;AAAA,QACV,UAAU,uBAAG,SAAS;AAAA,QACtB,YAAW,4BAAG,UAAH,mBAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,YAAY,IAAI;AAAA,QACjE,UAAU,SAAS,uBAAG,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,WAAW,SAAS,YAAY;AAC9B,UAAM,IAAI;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,OAAO,uBAAG;AAAA,QACV,UAAU,uBAAG,SAAS;AAAA,QACtB,YAAW,4BAAG,UAAH,mBAAU,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,YAAY,IAAI;AAAA,QACjE,UAAU,SAAS,uBAAG,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,WAAW,SAAS,iBAAiB;AACnC,UAAM,IAAI;AACV,WAAO;AAAA,MACL;AAAA,MACA,EAAE,cAAc,SAAS,OAAO,uBAAG,OAAO,UAAU,uBAAG,SAAS,cAAc;AAAA,IAChF;AAAA,EACF,WAAW,SAAS,aAAa,SAAS,SAAS;AACjD,WAAO,CAAC,UAAU,EAAE,cAAc,QAAQ,CAAC;AAAA,EAC7C,OAAO;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,OACE,cAAc,WAAW,cAAc,OAAO,WAAW,UAAU,WAC/D,WAAW,QACX;AAAA,QACN,UACE,cAAc,cAAc,cAAc,OAAO,WAAW,aAAa,WACrE,WAAW,SAAS,YAAY,IAChC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,uBAAuB,MAAiD;AACtF,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,cAAe,QAAO;AACnC,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,gBAAiB,QAAO;AACrC,MAAI,SAAS,WAAY,QAAO;AAChC,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,SAAS,SAAU,QAAO;AAC9B,QAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;AACvD;","names":[]}