@walkeros/web-destination-snowplow 4.2.0 → 4.2.1-next-1781538735002
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +9 -9
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @walkeros/web-destination-snowplow
|
|
2
2
|
|
|
3
|
+
## 4.2.1-next-1781538735002
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [5cbcd23]
|
|
8
|
+
- @walkeros/core@4.2.1-next-1781538735002
|
|
9
|
+
- @walkeros/web-core@4.2.1-next-1781538735002
|
|
10
|
+
|
|
3
11
|
## 4.2.0
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
package/dist/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/types/index.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport {\n SettingsSchema,\n TrackerContextsSchema,\n UrlBasedPluginSchema,\n ActivityTrackingSchema,\n type Settings,\n type SnowplowSettings,\n type TrackerContexts,\n type UrlBasedPlugin,\n type ActivityTracking,\n} from './settings';\nexport {\n MappingSchema,\n type Mapping,\n type SnowplowMappingSettings,\n} from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * Snowplow-specific settings schema (similar to GA4Settings in gtag)\n */\nexport const SnowplowSettingsSchema = z.object({\n actionSchema: z.string().optional().describe('Ecommerce action schema URI'),\n productSchema: z.string().optional().describe('Product entity schema URI'),\n cartSchema: z.string().optional().describe('Cart entity schema URI'),\n transactionSchema: z\n .string()\n .optional()\n .describe('Transaction entity schema URI'),\n refundSchema: z.string().optional().describe('Refund entity schema URI'),\n checkoutStepSchema: z\n .string()\n .optional()\n .describe('Checkout step entity schema URI'),\n promotionSchema: z\n .string()\n .optional()\n .describe('Promotion entity schema URI'),\n userSchema: z.string().optional().describe('User entity schema URI'),\n customSchemas: z\n .record(z.string(), z.string())\n .optional()\n .describe('Custom entity schemas'),\n currency: z.string().optional().describe('Default currency code (ISO 4217)'),\n});\n\n/**\n * Tracker contexts schema\n */\nexport const TrackerContextsSchema = z.object({\n webPage: z.boolean().optional().describe('Web page context'),\n session: z\n .boolean()\n .optional()\n .describe('Client session context - enables client_session schema'),\n performanceTiming: z\n .boolean()\n .optional()\n .describe('Performance timing context'),\n geolocation: z.boolean().optional().describe('Geolocation context'),\n});\n\n/**\n * Anonymous tracking configuration schema\n */\nexport const AnonymousTrackingConfigSchema = z.object({\n withServerAnonymisation: z\n .boolean()\n .optional()\n .describe('Request server-side anonymisation'),\n withSessionTracking: z\n .boolean()\n .optional()\n .describe('Continue session tracking in anonymous mode'),\n});\n\n/**\n * Anonymous tracking schema - can be boolean or config object\n */\nexport const AnonymousTrackingSchema = z.union([\n z.boolean(),\n AnonymousTrackingConfigSchema,\n]);\n\n/**\n * URL-based plugin schema\n */\nexport const UrlBasedPluginSchema = z.object({\n url: z.string().describe('Plugin script URL'),\n name: z\n .tuple([z.string(), z.string()])\n .describe('[globalName, constructorName]'),\n enableMethod: z.string().optional().describe('Override enable method name'),\n options: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Options for enable method'),\n});\n\n/**\n * Activity tracking configuration schema\n */\nexport const ActivityTrackingSchema = z.object({\n minimumVisitLength: z.number().describe('Seconds before first ping'),\n heartbeatDelay: z.number().describe('Seconds between pings'),\n});\n\n/**\n * Static global context schema\n */\nexport const StaticGlobalContextSchema = z.object({\n schema: z.string().describe('Iglu schema URI'),\n data: z.record(z.string(), z.unknown()).describe('Context data'),\n});\n\n/**\n * Mapped global context schema\n */\nexport const MappedGlobalContextSchema = z.object({\n schema: z.string().describe('Iglu schema URI'),\n data: z.record(z.string(), z.unknown()).describe('walkerOS mapping'),\n __mapped: z.literal(true),\n});\n\n/**\n * Configuration settings schema for Snowplow destination\n */\nexport const SettingsSchema = z.object({\n collectorUrl: z\n .string()\n .optional()\n .describe('Snowplow collector endpoint URL'),\n appId: z.string().optional().describe('Application identifier'),\n trackerName: z.string().optional().describe('Tracker instance name'),\n platform: z.string().optional().describe('Platform identifier'),\n pageViewTracking: z\n .boolean()\n .optional()\n .describe('Enable automatic page view tracking'),\n snowplow: SnowplowSettingsSchema.optional().describe(\n 'Snowplow-specific ecommerce configuration',\n ),\n // New tracker configuration options\n discoverRootDomain: z\n .boolean()\n .optional()\n .describe('Discover root domain for cookies'),\n cookieSameSite: z\n .enum(['Strict', 'Lax', 'None'])\n .optional()\n .describe('Cookie SameSite attribute'),\n appVersion: z.string().optional().describe('Application version'),\n contexts: TrackerContextsSchema.optional().describe(\n 'Built-in context entities',\n ),\n // Anonymous tracking\n anonymousTracking: AnonymousTrackingSchema.optional().describe(\n 'Enable anonymous tracking (no user identifiers)',\n ),\n // Plugins - validated loosely since BrowserPlugin is complex\n plugins: z\n .array(z.union([UrlBasedPluginSchema, z.any()]))\n .optional()\n .describe('Snowplow plugins'),\n // Activity tracking\n activityTracking: ActivityTrackingSchema.optional().describe(\n 'Page ping configuration',\n ),\n // Global contexts - validated loosely to allow functions\n globalContexts: z\n .array(z.any())\n .optional()\n .describe('Global context entities'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type SnowplowSettings = z.infer<typeof SnowplowSettingsSchema>;\nexport type TrackerContexts = z.infer<typeof TrackerContextsSchema>;\nexport type UrlBasedPlugin = z.infer<typeof UrlBasedPluginSchema>;\nexport type ActivityTracking = z.infer<typeof ActivityTrackingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * Context entity schema\n *\n * Each context entity has a schema URI and data mapping.\n */\nexport const ContextEntitySchema = z.object({\n schema: z.string().describe('Iglu schema URI for this context entity'),\n data: z\n .record(z.string(), z.unknown())\n .describe('Data mapping for this context entity'),\n});\n\n/**\n * Per-event Snowplow settings override schema\n */\nexport const SnowplowMappingSettingsSchema = z.object({\n actionSchema: z\n .string()\n .optional()\n .describe('Override action schema for this specific event'),\n});\n\n/**\n * Custom mapping parameters schema for Snowplow events\n *\n * Use the standard `name` field from mapping rules for the action type.\n * The `name` maps to Snowplow's event.data.type.\n */\nexport const MappingSchema = z.object({\n context: z\n .array(ContextEntitySchema)\n .optional()\n .describe('Context entities to attach to this event'),\n snowplow: SnowplowMappingSettingsSchema.optional().describe(\n 'Snowplow-specific settings override',\n ),\n});\n\nexport type ContextEntity = z.infer<typeof ContextEntitySchema>;\nexport type Mapping = z.infer<typeof MappingSchema>;\nexport type SnowplowMappingSettings = z.infer<\n typeof SnowplowMappingSettingsSchema\n>;\n","export * as env from './env';\nexport * as step from './step';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for Snowplow destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\nexport const init: Env | undefined = {\n window: {\n // snowplow absent: setup() is expected to install the queue stub.\n },\n document: {\n createElement: () => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n snowplow: Object.assign(noop, {\n q: [],\n }),\n },\n document: {\n createElement: () => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const simulation = [\n 'call:window.snowplow', // Track snowplow function calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { ACTIONS, SCHEMAS } from '../types';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init sets up the Snowplow queue and creates\n * a tracker pointed at the collector URL. Reproduce by passing the same\n * settings to `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap creates a Snowplow tracker pointed at the configured collector URL.',\n in: {\n loadScript: true,\n settings: {\n collectorUrl: 'https://collector.example.com',\n appId: 'my-app',\n pageViewEvent: 'page view',\n },\n },\n out: [\n [\n 'snowplow.newTracker',\n 'sp',\n 'https://collector.example.com',\n {\n appId: 'my-app',\n platform: 'web',\n discoverRootDomain: undefined,\n cookieSameSite: undefined,\n appVersion: undefined,\n contexts: undefined,\n anonymousTracking: undefined,\n },\n ],\n ],\n};\n\nexport const productView: Flow.StepExample = {\n title: 'Product view',\n description:\n 'A product view fires a Snowplow ecommerce action with a product context schema and pricing fields.',\n in: getEvent('product view', { timestamp: 1700000400 }),\n mapping: {\n name: ACTIONS.PRODUCT_VIEW,\n settings: {\n context: [\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n id: 'data.id',\n name: 'data.name',\n category: 'data.category',\n price: 'data.price',\n currency: { key: 'data.currency', value: 'USD' },\n brand: 'data.brand',\n variant: 'data.variant',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'product_view',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n currency: 'USD',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const addToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires a Snowplow ecommerce add_to_cart action with product, cart, page, and user contexts.',\n in: getEvent('product add', { timestamp: 1700000401 }),\n mapping: {\n name: ACTIONS.ADD_TO_CART,\n settings: {\n context: [\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n id: 'data.id',\n name: 'data.name',\n category: 'data.category',\n price: 'data.price',\n currency: { key: 'data.currency', value: 'USD' },\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n {\n schema: SCHEMAS.CART,\n data: {\n total_value: 'globals.cart_value',\n currency: { key: 'globals.cart_currency', value: 'USD' },\n },\n },\n {\n schema: SCHEMAS.PAGE,\n data: {\n type: 'globals.page_type',\n language: 'globals.language',\n },\n },\n {\n schema: SCHEMAS.USER,\n data: {\n id: 'user.id',\n email: 'user.email',\n is_guest: {\n fn: (event: unknown) =>\n (event as { user?: { id?: string } }).user?.id\n ? true\n : undefined,\n },\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'add_to_cart',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n currency: 'USD',\n quantity: 1,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0',\n data: {\n currency: 'USD',\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/page/jsonschema/1-0-0',\n data: {},\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/user/jsonschema/1-0-0',\n data: {\n id: 'us3r',\n is_guest: true,\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const transaction: Flow.StepExample = {\n title: 'Transaction',\n description:\n 'A completed order fires a Snowplow ecommerce transaction action with transaction id, revenue, tax, and shipping.',\n in: getEvent('order complete', { timestamp: 1700000402 }),\n mapping: {\n name: ACTIONS.TRANSACTION,\n settings: {\n context: [\n {\n schema: SCHEMAS.TRANSACTION,\n data: {\n transaction_id: 'data.id',\n revenue: 'data.total',\n currency: { key: 'data.currency', value: 'USD' },\n payment_method: { value: 'credit_card' },\n tax: 'data.taxes',\n shipping: 'data.shipping',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'transaction',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n data: {\n transaction_id: '0rd3r1d',\n revenue: 555,\n currency: 'EUR',\n payment_method: 'credit_card',\n tax: 73.76,\n shipping: 5.22,\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const promoView: Flow.StepExample = {\n title: 'Promo view',\n description:\n 'A promotion visible event fires a Snowplow promo_view action with a promotion context.',\n in: getEvent('promotion visible', { timestamp: 1700000403 }),\n mapping: {\n name: ACTIONS.PROMO_VIEW,\n settings: {\n context: [\n {\n schema: SCHEMAS.PROMOTION,\n data: {\n id: 'data.id',\n name: 'data.name',\n creative_id: 'data.creative_id',\n type: 'data.type',\n position: 'data.position',\n slot: 'data.slot',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'promo_view',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0',\n data: {\n name: 'Setting up tracking easily',\n position: 'hero',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view calls Snowplow trackPageView directly instead of a self-describing event.',\n in: getEvent('page view', { timestamp: 1700000404 }),\n mapping: undefined,\n out: [['snowplow.trackPageView']],\n};\n\nexport const checkoutStep: Flow.StepExample = {\n title: 'Checkout step',\n description:\n 'A checkout view fires a Snowplow checkout_step action with the current step and option.',\n in: getEvent('checkout view', { timestamp: 1700000405 }),\n mapping: {\n name: ACTIONS.CHECKOUT_STEP,\n settings: {\n context: [\n {\n schema: SCHEMAS.CHECKOUT_STEP,\n data: {\n step: 'data.step',\n option: 'data.option',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'checkout_step',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0',\n data: {\n step: 'payment',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const structuredEvent: Flow.StepExample = {\n title: 'Struct event',\n description:\n 'A custom event is tracked via Snowplow trackStructEvent with category, action, label, property, and value.',\n in: getEvent('product visible', { timestamp: 1700000406 }),\n mapping: {\n settings: {\n struct: {\n category: { value: 'ecommerce' },\n action: { value: 'impression' },\n label: 'data.name',\n property: 'data.color',\n value: 'data.price',\n },\n },\n },\n out: [\n [\n 'snowplow.trackStructEvent',\n {\n category: 'ecommerce',\n action: 'impression',\n label: 'Everyday Ruck Snack',\n property: 'black',\n value: 420,\n },\n ],\n ],\n};\n\nexport const contextLoop: Flow.StepExample = {\n title: 'Transaction with products',\n description:\n 'A transaction event adds one Snowplow product context per nested product via a loop mapping.',\n in: getEvent('order complete', { timestamp: 1700000407 }),\n mapping: {\n name: ACTIONS.TRANSACTION,\n settings: {\n context: [\n {\n schema: SCHEMAS.TRANSACTION,\n data: {\n transaction_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n loop: [\n 'nested',\n {\n map: {\n id: 'data.id',\n name: 'data.name',\n price: 'data.price',\n },\n },\n ],\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'transaction',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n data: {\n transaction_id: '0rd3r1d',\n revenue: 555,\n currency: 'EUR',\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'cc',\n name: 'Cool Cap',\n price: 42,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n name: 'Surprise',\n },\n },\n ],\n },\n ],\n ],\n};\n","import type {\n Mapping as WalkerOSMapping,\n WalkerOS,\n Destination as CoreDestination,\n Mapping as CoreMapping,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Official Snowplow types\nimport type {\n SelfDescribingJson,\n CommonEventProperties,\n} from '@snowplow/tracker-core';\nimport type {\n BrowserPlugin,\n ActivityTrackingConfiguration,\n} from '@snowplow/browser-tracker-core';\nimport type {\n Action,\n Product,\n Cart,\n SPTransaction,\n SPPromotion,\n CheckoutStep,\n Refund,\n TransactionError,\n User,\n Page,\n} from '@snowplow/browser-plugin-snowplow-ecommerce';\n\n// Re-export official Snowplow entity types\nexport type {\n SelfDescribingJson,\n CommonEventProperties,\n Action,\n Product,\n Cart,\n SPTransaction,\n SPPromotion,\n CheckoutStep,\n Refund,\n TransactionError,\n User,\n Page,\n};\n\n// Re-export Snowplow tracker core types\nexport type { BrowserPlugin, ActivityTrackingConfiguration };\n\ndeclare global {\n interface Window {\n snowplow?: SnowplowFunction;\n GlobalSnowplowNamespace?: string[];\n }\n}\n\n// Snowplow tracker queue function type (similar to gtag or fbq)\nexport interface SnowplowFunction {\n (...args: unknown[]): void;\n q?: unknown[];\n}\n\n/**\n * Tracker factory function type (from @snowplow/browser-tracker)\n *\n * This is the `newTracker` function signature. When provided via `settings.code`,\n * the destination uses this directly instead of loading sp.js.\n */\nexport type TrackerFactory = (\n trackerId: string,\n endpoint: string,\n configuration?: Record<string, unknown>,\n) => void;\n\n/**\n * Browser-tracker module functions passed via $code: for npm mode\n *\n * These are the individual tracking functions imported from @snowplow/browser-tracker\n * that replace the sp.js command queue approach.\n */\nexport interface TrackerFunctions {\n /** Initialize tracker - always required */\n newTracker: TrackerFactory;\n /** Track self-describing events - required for event tracking */\n trackSelfDescribingEvent: (\n event: SelfDescribingEvent,\n trackers?: string[],\n ) => void;\n /** Track page views */\n trackPageView?: (\n event?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Track structured events */\n trackStructEvent?: (\n event: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Set user ID */\n setUserId?: (userId?: string | null, trackers?: string[]) => void;\n /** Enable activity tracking */\n enableActivityTracking?: (\n config: ActivityTrackingConfiguration,\n trackers?: string[],\n ) => void;\n /** Add plugin */\n addPlugin?: (config: { plugin: BrowserPlugin }, trackers?: string[]) => void;\n /** Add global contexts */\n addGlobalContexts?: (contexts: unknown[], trackers?: string[]) => void;\n /** Clear user data */\n clearUserData?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Enable anonymous tracking */\n enableAnonymousTracking?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Disable anonymous tracking */\n disableAnonymousTracking?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Consent tracking - from Enhanced Consent plugin */\n trackConsentAllow?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n trackConsentDeny?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n trackConsentSelected?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Set page context - from Snowplow Ecommerce plugin */\n setPageType?: (\n page: { type: string; language?: string; locale?: string },\n trackers?: string[],\n ) => void;\n}\n\n/**\n * Unified adapter interface for Snowplow tracking\n *\n * Provides a consistent API regardless of whether using sp.js command queue\n * or @snowplow/browser-tracker module functions.\n */\nexport interface SnowplowAdapter {\n trackPageView(event?: Record<string, unknown>): void;\n trackSelfDescribingEvent(event: SelfDescribingEvent): void;\n trackStructEvent(event: Record<string, unknown>): void;\n setUserId(userId?: string | null): void;\n enableActivityTracking(config: ActivityTrackingConfiguration): void;\n addPlugin(\n config: { plugin: BrowserPlugin } | [string, [string, string]],\n ): void;\n addGlobalContexts(contexts: unknown[]): void;\n clearUserData(config?: Record<string, unknown>): void;\n enableAnonymousTracking(config?: Record<string, unknown>): void;\n disableAnonymousTracking(config?: Record<string, unknown>): void;\n trackConsentAllow(params: Record<string, unknown>): void;\n trackConsentDeny(params: Record<string, unknown>): void;\n trackConsentSelected(params: Record<string, unknown>): void;\n /** Set page context - from Snowplow Ecommerce plugin */\n setPageType(page: { type: string; language?: string; locale?: string }): void;\n /** For URL-based plugins that need enable methods */\n call(method: string, ...args: unknown[]): void;\n}\n\n/**\n * Complete self-describing event structure\n * This is the full parameter passed to window.snowplow('trackSelfDescribingEvent', ...)\n */\nexport type SelfDescribingEvent<T = WalkerOS.Properties> = {\n event: SelfDescribingJson<T>;\n} & CommonEventProperties<T>;\n\n/**\n * Page context settings for setPageType\n *\n * Each field is resolved via getMappingValue, allowing dynamic values\n * from event data or static values.\n *\n * @example\n * // Dynamic values from globals\n * page: {\n * type: 'globals.page_type',\n * language: 'globals.language',\n * locale: 'globals.locale'\n * }\n *\n * // Mixed static and dynamic\n * page: {\n * type: 'globals.page_type',\n * language: { value: 'en' },\n * locale: { value: 'en-US' }\n * }\n */\nexport interface PageSettings {\n /** Page type (required) */\n type: CoreMapping.Value;\n /** Page language (optional) */\n language?: CoreMapping.Value;\n /** Page locale (optional) */\n locale?: CoreMapping.Value;\n}\n\n/**\n * URL-based plugin configuration (for sp.js JavaScript tracker)\n */\nexport interface UrlBasedPlugin {\n /** CDN or self-hosted URL to the plugin script */\n url: string;\n /** [globalName, constructorName] for the plugin */\n name: [string, string];\n /** Optional override for enable method (derived by convention if omitted) */\n enableMethod?: string;\n /** Options passed to the enable method */\n options?: Record<string, unknown>;\n}\n\n/**\n * Code-based plugin configuration (for @snowplow/browser-tracker npm approach)\n *\n * Use when the plugin is imported via packages.imports and passed via $code:\n */\nexport interface CodeBasedPlugin {\n /** The plugin factory function passed via $code: */\n code: BrowserPlugin | ((...args: unknown[]) => BrowserPlugin);\n /** Configuration options passed to the plugin factory */\n config?: Record<string, unknown>;\n}\n\n/**\n * Union type for all supported plugin forms\n */\nexport type SnowplowPlugin = BrowserPlugin | UrlBasedPlugin | CodeBasedPlugin;\n\n/**\n * Built-in context entity types for tracker initialization\n */\nexport interface TrackerContexts {\n /** Web page context (default: true) */\n webPage?: boolean;\n /** Client session context - enables client_session schema */\n session?: boolean;\n /** Browser context - device info, viewport, language, etc. */\n browser?: boolean;\n /** Performance timing context */\n performanceTiming?: boolean;\n /** Geolocation context */\n geolocation?: boolean;\n}\n\n/**\n * Anonymous tracking configuration\n *\n * When enabled, the tracker will not set any user identifiers (domain_userid, network_userid).\n * This is useful for privacy-focused tracking or when user consent has not been given.\n */\nexport interface AnonymousTrackingConfig {\n /**\n * Request server-side anonymisation\n *\n * When true, the collector will anonymise the user's IP address\n * and not set the network_userid cookie.\n */\n withServerAnonymisation?: boolean;\n /**\n * Continue session tracking in anonymous mode\n *\n * When true, session context will still be attached to events\n * even when anonymous tracking is enabled.\n */\n withSessionTracking?: boolean;\n}\n\n/**\n * Basis for processing under GDPR\n */\nexport type BasisForProcessing =\n | 'consent'\n | 'contract'\n | 'legal_obligation'\n | 'vital_interests'\n | 'public_task'\n | 'legitimate_interests';\n\n/**\n * Consent tracking configuration\n *\n * Enables consent event tracking via the Snowplow Enhanced Consent plugin.\n * When configured, walkerOS consent events are translated to Snowplow\n * trackConsentAllow/Deny/Selected calls via the `on('consent')` handler.\n *\n * Requires @snowplow/browser-plugin-enhanced-consent to be loaded.\n *\n * @example\n * consent: {\n * required: ['analytics', 'marketing'],\n * basisForProcessing: 'consent',\n * consentUrl: 'https://example.com/privacy',\n * consentVersion: '2.0',\n * domainsApplied: ['example.com'],\n * gdprApplies: true,\n * }\n */\nexport interface ConsentConfig {\n /**\n * walkerOS consent groups to check\n *\n * If not specified, all consent groups from the event are used.\n * Use this to filter which consent groups are relevant for Snowplow.\n *\n * @example ['analytics', 'marketing']\n */\n required?: string[];\n\n /**\n * Legal basis for processing under GDPR\n *\n * @default 'consent'\n */\n basisForProcessing?: BasisForProcessing;\n\n /**\n * URL to the privacy policy or consent document\n */\n consentUrl?: string;\n\n /**\n * Version of the consent document/policy\n */\n consentVersion?: string;\n\n /**\n * Domains where this consent applies\n *\n * @example ['example.com', 'shop.example.com']\n */\n domainsApplied?: string[];\n\n /**\n * Whether GDPR applies to this user/region\n */\n gdprApplies?: boolean;\n}\n\n/**\n * walkerOS mapping-based global context\n */\nexport interface MappedGlobalContext {\n /** Iglu schema URI */\n schema: string;\n /** Data mapping using walkerOS syntax */\n data: WalkerOSMapping.Map;\n /** Discriminator flag */\n __mapped: true;\n}\n\n/**\n * Static global context (same for all events)\n */\nexport interface StaticGlobalContext {\n schema: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Dynamic global context generator function\n */\nexport type GlobalContextGenerator = () => StaticGlobalContext | null;\n\n/**\n * Union type for all global context forms\n */\nexport type GlobalContext =\n | StaticGlobalContext\n | GlobalContextGenerator\n | MappedGlobalContext;\n\n/**\n * Internal runtime state for the destination\n *\n * This state is instance-scoped and managed by the destination,\n * not configured by users. It solves SSR/serverless state leakage.\n */\nexport interface RuntimeState {\n /** JSON stringified page object for setPageType change detection */\n page?: string;\n /** Whether setUserId has been called for this instance */\n userIdSet?: boolean;\n /** The initialized adapter instance */\n adapter?: SnowplowAdapter;\n}\n\n/**\n * Configuration settings for Snowplow destination\n */\nexport interface Settings {\n /**\n * Snowplow collector endpoint URL\n *\n * Required. The URL of your Snowplow collector.\n *\n * @example \"https://collector.example.com\"\n */\n collectorUrl?: string;\n\n /**\n * URL to the Snowplow JavaScript tracker script\n *\n * Used when `loadScript: true`. If not provided, defaults to the jsdelivr CDN\n * with `@latest` version tag.\n *\n * **Security Recommendation:** Always pin to a specific version in production.\n *\n * @example 'https://cdn.jsdelivr.net/npm/@snowplow/javascript-tracker@3.24.0/dist/sp.js'\n * @default 'https://cdn.jsdelivr.net/npm/@snowplow/javascript-tracker@latest/dist/sp.js'\n */\n scriptUrl?: string;\n\n /**\n * Tracker functions for bundled browser-tracker mode\n *\n * When provided, the destination uses these functions directly instead of\n * loading sp.js via script tag. Use with flow.json `$code:` syntax:\n *\n * @example\n * ```json\n * {\n * \"packages\": {\n * \"@snowplow/browser-tracker\": {\n * \"imports\": [\"newTracker\", \"trackSelfDescribingEvent\", \"trackPageView\"]\n * }\n * },\n * \"settings\": {\n * \"tracker\": {\n * \"newTracker\": \"$code:newTracker\",\n * \"trackSelfDescribingEvent\": \"$code:trackSelfDescribingEvent\",\n * \"trackPageView\": \"$code:trackPageView\"\n * },\n * \"collectorUrl\": \"https://collector.example.com\"\n * }\n * }\n * ```\n */\n tracker?: TrackerFunctions;\n\n /**\n * Application ID\n *\n * Identifier for your application in Snowplow.\n *\n * @default undefined\n */\n appId?: string;\n\n /**\n * Tracker instance name\n *\n * Name for the tracker instance. Useful when running multiple trackers.\n *\n * @default \"sp\"\n */\n trackerName?: string;\n\n /**\n * Platform identifier\n *\n * Platform the tracker is running on.\n *\n * @default \"web\"\n */\n platform?: string;\n\n /**\n * Enable automatic page view tracking\n *\n * If true, page view events will be tracked automatically.\n *\n * @default false\n */\n pageViewTracking?: boolean;\n\n /**\n * Track page view on tracker initialization\n *\n * When true, calls `trackPageView()` immediately after tracker init.\n * This uses Snowplow's built-in page view tracking.\n *\n * @default false\n */\n trackPageView?: boolean;\n\n /**\n * Event name that triggers trackPageView\n *\n * When a walkerOS event matches this name, `trackPageView()` is called\n * instead of `trackSelfDescribingEvent()`.\n *\n * @example 'page view'\n * @example 'pageview'\n * @example 'screen view'\n */\n pageViewEvent?: string;\n\n /**\n * Snowplow-specific ecommerce configuration\n */\n snowplow?: SnowplowSettings;\n\n /**\n * Global page context (calls setPageType)\n *\n * Each field is resolved via getMappingValue. When the resolved page object\n * changes, setPageType is called to update the global Page context.\n *\n * @example\n * // Dynamic from globals\n * page: {\n * type: 'globals.page_type',\n * language: 'globals.language'\n * }\n *\n * // Static values\n * page: {\n * type: { value: 'product' },\n * language: { value: 'en' },\n * locale: { value: 'en-US' }\n * }\n */\n page?: PageSettings;\n\n /**\n * User ID for Snowplow's cross-session user stitching\n *\n * Called once via setUserId() on the first event where the value resolves.\n * Subsequent events automatically include this user_id.\n *\n * @example\n * // From walkerOS user object (recommended)\n * userId: 'user.id'\n *\n * // From globals\n * userId: 'globals.user_id'\n */\n userId?: CoreMapping.Value;\n\n /**\n * Discover and set the root domain for cookies\n * @default true\n */\n discoverRootDomain?: boolean;\n\n /**\n * SameSite attribute for cookies\n * @default undefined (browser default)\n */\n cookieSameSite?: 'Strict' | 'Lax' | 'None';\n\n /**\n * Application version string\n */\n appVersion?: string;\n\n /**\n * Built-in context entities to attach to events\n */\n contexts?: TrackerContexts;\n\n /**\n * Enable anonymous tracking\n *\n * When enabled, the tracker will not set user identifiers.\n * Can be a boolean (true enables basic anonymous tracking) or\n * a configuration object for fine-grained control.\n *\n * @example\n * // Basic anonymous tracking\n * anonymousTracking: true\n *\n * @example\n * // With server-side anonymisation\n * anonymousTracking: {\n * withServerAnonymisation: true,\n * withSessionTracking: true\n * }\n */\n anonymousTracking?: boolean | AnonymousTrackingConfig;\n\n /**\n * Snowplow plugins to load (BrowserPlugin or URL-based)\n */\n plugins?: SnowplowPlugin[];\n\n /**\n * Activity tracking configuration (page pings)\n */\n activityTracking?: ActivityTrackingConfiguration;\n\n /**\n * Global context entities attached to all events\n */\n globalContexts?: GlobalContext[];\n\n /**\n * Consent tracking configuration\n *\n * When configured, enables consent event tracking via the `on('consent')` handler.\n * Requires @snowplow/browser-plugin-enhanced-consent to be loaded.\n *\n * @example\n * consent: {\n * required: ['analytics', 'marketing'],\n * basisForProcessing: 'consent',\n * consentUrl: 'https://example.com/privacy',\n * consentVersion: '2.0',\n * }\n */\n consent?: ConsentConfig;\n\n /**\n * Internal runtime state (managed by destination, not user-configured)\n * @internal\n */\n _state?: RuntimeState;\n}\n\n/**\n * Snowplow-specific settings (similar to GA4Settings in gtag)\n */\nexport interface SnowplowSettings {\n /**\n * Ecommerce action schema URI\n *\n * Schema used for all ecommerce action events.\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2\"\n */\n actionSchema?: string;\n\n /**\n * Product entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0\"\n */\n productSchema?: string;\n\n /**\n * Cart entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0\"\n */\n cartSchema?: string;\n\n /**\n * Transaction entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0\"\n */\n transactionSchema?: string;\n\n /**\n * Refund entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/refund/jsonschema/1-0-0\"\n */\n refundSchema?: string;\n\n /**\n * Checkout step entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0\"\n */\n checkoutStepSchema?: string;\n\n /**\n * Promotion entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0\"\n */\n promotionSchema?: string;\n\n /**\n * User entity schema URI (optional)\n *\n * @example \"iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-0\"\n */\n userSchema?: string;\n\n /**\n * Custom entity schemas\n *\n * Define schemas for custom context entities.\n *\n * @example { custom_entity: \"iglu:com.example/custom/jsonschema/1-0-0\" }\n */\n customSchemas?: {\n [entityType: string]: string;\n };\n\n /**\n * Default currency code (ISO 4217)\n *\n * Used as fallback when currency is not specified in event data.\n *\n * @example \"USD\", \"EUR\", \"GBP\"\n * @default \"USD\"\n */\n currency?: string;\n\n /**\n * Data mapping at destination level\n *\n * Global data transformation applied to all events.\n */\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n/**\n * Context entity definition for Snowplow\n *\n * Each context entity has a schema URI and data mapping.\n */\nexport interface ContextEntity {\n /**\n * Iglu schema URI for this context entity\n *\n * @example SCHEMAS.PRODUCT, SCHEMAS.TRANSACTION\n */\n schema: string;\n\n /**\n * Data mapping for this context entity\n *\n * Uses standard walkerOS mapping syntax.\n *\n * @example { id: 'data.id', name: 'data.name', price: 'data.price' }\n */\n data: WalkerOSMapping.Map;\n}\n\n/**\n * Structured event mapping for Snowplow's trackStructEvent\n *\n * When configured, bypasses self-describing events entirely\n * and calls trackStructEvent with the resolved values.\n *\n * @example\n * struct: {\n * category: { value: 'ui' },\n * action: { value: 'click' },\n * label: 'data.button_name',\n * property: 'data.section',\n * value: 'data.position',\n * }\n */\nexport interface StructuredEventMapping {\n /** Event category (required) */\n category: CoreMapping.Value;\n /** Event action (required) */\n action: CoreMapping.Value;\n /** Event label (optional) */\n label?: CoreMapping.Value;\n /** Event property (optional) */\n property?: CoreMapping.Value;\n /** Event value - must resolve to a number (optional) */\n value?: CoreMapping.Value;\n}\n\n/**\n * Custom mapping parameters for Snowplow events\n *\n * Uses standard `name` field for action type.\n * The `name` from the mapping rule becomes Snowplow's event.data.type.\n */\nexport interface Mapping {\n /**\n * Context entities to attach to this event\n *\n * Each entry defines a schema and data mapping.\n * Explicit - no auto-detection.\n *\n * @example\n * context: [\n * { schema: SCHEMAS.PRODUCT, data: { id: 'data.id', name: 'data.name' } }\n * ]\n */\n context?: ContextEntity[];\n\n /**\n * Snowplow-specific settings override\n */\n snowplow?: SnowplowMappingSettings;\n\n /**\n * Custom data mapping for self-describing event payload\n *\n * When specified with a `map` property, the mapped values are used\n * as the event data instead of the default ecommerce pattern.\n * Useful for media events (percent_progress) and custom schemas.\n *\n * @example\n * data: { map: { percentProgress: 'data.progress' } }\n */\n data?: WalkerOSMapping.Value;\n\n /**\n * Structured event mapping (bypasses self-describing events)\n *\n * When configured, calls trackStructEvent instead of trackSelfDescribingEvent.\n * No schema is used - this completely bypasses the self-describing event path.\n *\n * @example\n * struct: {\n * category: { value: 'ui' },\n * action: { value: 'click' },\n * label: 'data.button_name',\n * }\n */\n struct?: StructuredEventMapping;\n}\n\n/**\n * Per-event Snowplow settings override\n */\nexport interface SnowplowMappingSettings {\n /**\n * Override action schema for this specific event\n */\n actionSchema?: string;\n}\n\n/**\n * Environment dependencies for Snowplow destination\n */\nexport interface Env extends DestinationWeb.Env {\n window: {\n snowplow?: SnowplowFunction;\n };\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\n/**\n * Snowplow Ecommerce Schema URIs\n * Based on Snowplow Analytics official ecommerce schema\n */\nexport const SCHEMAS = {\n ACTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n PRODUCT:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n CART: 'iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0',\n TRANSACTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n REFUND:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/refund/jsonschema/1-0-0',\n CHECKOUT_STEP:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0',\n PROMOTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0',\n PAGE: 'iglu:com.snowplowanalytics.snowplow.ecommerce/page/jsonschema/1-0-0',\n USER: 'iglu:com.snowplowanalytics.snowplow.ecommerce/user/jsonschema/1-0-0',\n} as const;\n\n/**\n * Snowplow ecommerce action types\n * Type-safe values matching official Action['type']\n */\nexport const ACTIONS = {\n PRODUCT_VIEW: 'product_view',\n LIST_VIEW: 'list_view',\n LIST_CLICK: 'list_click',\n ADD_TO_CART: 'add_to_cart',\n REMOVE_FROM_CART: 'remove_from_cart',\n CHECKOUT_STEP: 'checkout_step',\n TRANSACTION: 'transaction',\n REFUND: 'refund',\n PROMO_VIEW: 'promo_view',\n PROMO_CLICK: 'promo_click',\n TRANSACTION_ERROR: 'trns_error',\n} as const satisfies Record<string, Action['type']>;\n\n/**\n * Snowplow Web Schema URIs\n * Events and contexts for web analytics tracking\n */\nexport const WEB_SCHEMAS = {\n // Events\n LINK_CLICK: 'iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1',\n CHANGE_FORM:\n 'iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0',\n FOCUS_FORM: 'iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0',\n SUBMIT_FORM:\n 'iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0',\n SITE_SEARCH:\n 'iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0',\n SOCIAL:\n 'iglu:com.snowplowanalytics.snowplow/social_interaction/jsonschema/1-0-0',\n TIMING: 'iglu:com.snowplowanalytics.snowplow/timing/jsonschema/1-0-0',\n WEB_VITALS: 'iglu:com.snowplowanalytics.snowplow/web_vitals/jsonschema/1-0-0',\n // Contexts\n WEB_PAGE: 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0',\n BROWSER:\n 'iglu:com.snowplowanalytics.snowplow/browser_context/jsonschema/2-0-0',\n CLIENT_SESSION:\n 'iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2',\n GEOLOCATION:\n 'iglu:com.snowplowanalytics.snowplow/geolocation_context/jsonschema/1-1-0',\n} as const;\n\n/**\n * Snowplow Consent Schema URIs\n * For Enhanced Consent plugin events and contexts\n */\nexport const CONSENT_SCHEMAS = {\n // Events (fired by Enhanced Consent plugin)\n PREFERENCES:\n 'iglu:com.snowplowanalytics.snowplow/consent_preferences/jsonschema/1-0-0',\n CMP_VISIBLE:\n 'iglu:com.snowplowanalytics.snowplow/cmp_visible/jsonschema/1-0-0',\n // Contexts\n DOCUMENT:\n 'iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0',\n GDPR: 'iglu:com.snowplowanalytics.snowplow/gdpr/jsonschema/1-0-0',\n} as const;\n\n/**\n * Snowplow Media Schema URIs\n * Events and contexts for media (video/audio) tracking\n *\n * Requires @snowplow/browser-plugin-media-tracking for automatic tracking\n * or can be used manually with trackSelfDescribingEvent\n *\n * @see https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/web-tracker/tracking-events/media/\n */\nexport const MEDIA_SCHEMAS = {\n // Core playback events\n PLAY: 'iglu:com.snowplowanalytics.snowplow.media/play_event/jsonschema/1-0-0',\n PAUSE:\n 'iglu:com.snowplowanalytics.snowplow.media/pause_event/jsonschema/1-0-0',\n END: 'iglu:com.snowplowanalytics.snowplow.media/end_event/jsonschema/1-0-0',\n READY:\n 'iglu:com.snowplowanalytics.snowplow.media/ready_event/jsonschema/1-0-0',\n\n // Seek events\n SEEK_START:\n 'iglu:com.snowplowanalytics.snowplow.media/seek_start_event/jsonschema/1-0-0',\n SEEK_END:\n 'iglu:com.snowplowanalytics.snowplow.media/seek_end_event/jsonschema/1-0-0',\n\n // Buffer events\n BUFFER_START:\n 'iglu:com.snowplowanalytics.snowplow.media/buffer_start_event/jsonschema/1-0-0',\n BUFFER_END:\n 'iglu:com.snowplowanalytics.snowplow.media/buffer_end_event/jsonschema/1-0-0',\n\n // Player state change events\n QUALITY_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/quality_change_event/jsonschema/1-0-0',\n FULLSCREEN_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/fullscreen_change_event/jsonschema/1-0-0',\n VOLUME_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/volume_change_event/jsonschema/1-0-0',\n PLAYBACK_RATE_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/playback_rate_change_event/jsonschema/1-0-0',\n PIP_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/picture_in_picture_change_event/jsonschema/1-0-0',\n\n // Progress events\n PING: 'iglu:com.snowplowanalytics.snowplow.media/ping_event/jsonschema/1-0-0',\n PERCENT_PROGRESS:\n 'iglu:com.snowplowanalytics.snowplow.media/percent_progress_event/jsonschema/1-0-0',\n\n // Error event\n ERROR:\n 'iglu:com.snowplowanalytics.snowplow.media/error_event/jsonschema/1-0-0',\n\n // Ad events\n AD_BREAK_START:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break_start_event/jsonschema/1-0-0',\n AD_BREAK_END:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break_end_event/jsonschema/1-0-0',\n AD_START:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_start_event/jsonschema/1-0-0',\n AD_COMPLETE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_complete_event/jsonschema/1-0-0',\n AD_SKIP:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_skip_event/jsonschema/1-0-0',\n AD_CLICK:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_click_event/jsonschema/1-0-0',\n AD_PAUSE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_pause_event/jsonschema/1-0-0',\n AD_RESUME:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_resume_event/jsonschema/1-0-0',\n AD_QUARTILE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_quartile_event/jsonschema/1-0-0',\n\n // Contexts (attached to media events)\n MEDIA_PLAYER:\n 'iglu:com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0',\n SESSION: 'iglu:com.snowplowanalytics.snowplow.media/session/jsonschema/1-0-0',\n AD: 'iglu:com.snowplowanalytics.snowplow.media/ad/jsonschema/1-0-0',\n AD_BREAK:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break/jsonschema/1-0-0',\n} as const;\n\n/**\n * Media action types for event mapping\n * Use with mapping.name to specify the action type\n */\nexport const MEDIA_ACTIONS = {\n PLAY: 'play',\n PAUSE: 'pause',\n END: 'end',\n READY: 'ready',\n SEEK_START: 'seek_start',\n SEEK_END: 'seek_end',\n BUFFER_START: 'buffer_start',\n BUFFER_END: 'buffer_end',\n QUALITY_CHANGE: 'quality_change',\n FULLSCREEN_CHANGE: 'fullscreen_change',\n VOLUME_CHANGE: 'volume_change',\n PLAYBACK_RATE_CHANGE: 'playback_rate_change',\n PIP_CHANGE: 'pip_change',\n PING: 'ping',\n PERCENT_PROGRESS: 'percent_progress',\n ERROR: 'error',\n AD_BREAK_START: 'ad_break_start',\n AD_BREAK_END: 'ad_break_end',\n AD_START: 'ad_start',\n AD_COMPLETE: 'ad_complete',\n AD_SKIP: 'ad_skip',\n AD_CLICK: 'ad_click',\n AD_PAUSE: 'ad_pause',\n AD_RESUME: 'ad_resume',\n AD_QUARTILE: 'ad_quartile',\n} as const;\n\n/**\n * Type guard for URL-based plugins\n */\nexport function isUrlBasedPlugin(\n plugin: SnowplowPlugin,\n): plugin is UrlBasedPlugin {\n return typeof plugin === 'object' && 'url' in plugin && 'name' in plugin;\n}\n\n/**\n * Type guard for code-based plugins\n */\nexport function isCodeBasedPlugin(\n plugin: SnowplowPlugin,\n): plugin is CodeBasedPlugin {\n return typeof plugin === 'object' && 'code' in plugin && !('url' in plugin);\n}\n\n/**\n * Type guard for mapped global contexts\n */\nexport function isMappedGlobalContext(\n ctx: GlobalContext,\n): ctx is MappedGlobalContext {\n return typeof ctx === 'object' && ctx !== null && '__mapped' in ctx;\n}\n\n/**\n * Derive enable method from plugin constructor name\n * 'LinkClickTrackingPlugin' -> 'enableLinkClickTracking'\n */\nexport function deriveEnableMethod(constructorName: string): string {\n return 'enable' + constructorName.replace('Plugin', '');\n}\n"],"mappings":"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","names":["import_dev","import_dev","init","init"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/types/index.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport {\n SettingsSchema,\n TrackerContextsSchema,\n UrlBasedPluginSchema,\n ActivityTrackingSchema,\n type Settings,\n type SnowplowSettings,\n type TrackerContexts,\n type UrlBasedPlugin,\n type ActivityTracking,\n} from './settings';\nexport {\n MappingSchema,\n type Mapping,\n type SnowplowMappingSettings,\n} from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * Snowplow-specific settings schema (similar to GA4Settings in gtag)\n */\nexport const SnowplowSettingsSchema = z.object({\n actionSchema: z.string().optional().describe('Ecommerce action schema URI'),\n productSchema: z.string().optional().describe('Product entity schema URI'),\n cartSchema: z.string().optional().describe('Cart entity schema URI'),\n transactionSchema: z\n .string()\n .optional()\n .describe('Transaction entity schema URI'),\n refundSchema: z.string().optional().describe('Refund entity schema URI'),\n checkoutStepSchema: z\n .string()\n .optional()\n .describe('Checkout step entity schema URI'),\n promotionSchema: z\n .string()\n .optional()\n .describe('Promotion entity schema URI'),\n userSchema: z.string().optional().describe('User entity schema URI'),\n customSchemas: z\n .record(z.string(), z.string())\n .optional()\n .describe('Custom entity schemas'),\n currency: z.string().optional().describe('Default currency code (ISO 4217)'),\n});\n\n/**\n * Tracker contexts schema\n */\nexport const TrackerContextsSchema = z.object({\n webPage: z.boolean().optional().describe('Web page context'),\n session: z\n .boolean()\n .optional()\n .describe('Client session context - enables client_session schema'),\n performanceTiming: z\n .boolean()\n .optional()\n .describe('Performance timing context'),\n geolocation: z.boolean().optional().describe('Geolocation context'),\n});\n\n/**\n * Anonymous tracking configuration schema\n */\nexport const AnonymousTrackingConfigSchema = z.object({\n withServerAnonymisation: z\n .boolean()\n .optional()\n .describe('Request server-side anonymisation'),\n withSessionTracking: z\n .boolean()\n .optional()\n .describe('Continue session tracking in anonymous mode'),\n});\n\n/**\n * Anonymous tracking schema - can be boolean or config object\n */\nexport const AnonymousTrackingSchema = z.union([\n z.boolean(),\n AnonymousTrackingConfigSchema,\n]);\n\n/**\n * URL-based plugin schema\n */\nexport const UrlBasedPluginSchema = z.object({\n url: z.string().describe('Plugin script URL'),\n name: z\n .tuple([z.string(), z.string()])\n .describe('[globalName, constructorName]'),\n enableMethod: z.string().optional().describe('Override enable method name'),\n options: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Options for enable method'),\n});\n\n/**\n * Activity tracking configuration schema\n */\nexport const ActivityTrackingSchema = z.object({\n minimumVisitLength: z.number().describe('Seconds before first ping'),\n heartbeatDelay: z.number().describe('Seconds between pings'),\n});\n\n/**\n * Static global context schema\n */\nexport const StaticGlobalContextSchema = z.object({\n schema: z.string().describe('Iglu schema URI'),\n data: z.record(z.string(), z.unknown()).describe('Context data'),\n});\n\n/**\n * Mapped global context schema\n */\nexport const MappedGlobalContextSchema = z.object({\n schema: z.string().describe('Iglu schema URI'),\n data: z.record(z.string(), z.unknown()).describe('walkerOS mapping'),\n __mapped: z.literal(true),\n});\n\n/**\n * Configuration settings schema for Snowplow destination\n */\nexport const SettingsSchema = z.object({\n collectorUrl: z\n .string()\n .optional()\n .describe('Snowplow collector endpoint URL'),\n appId: z.string().optional().describe('Application identifier'),\n trackerName: z.string().optional().describe('Tracker instance name'),\n platform: z.string().optional().describe('Platform identifier'),\n pageViewTracking: z\n .boolean()\n .optional()\n .describe('Enable automatic page view tracking'),\n snowplow: SnowplowSettingsSchema.optional().describe(\n 'Snowplow-specific ecommerce configuration',\n ),\n // New tracker configuration options\n discoverRootDomain: z\n .boolean()\n .optional()\n .describe('Discover root domain for cookies'),\n cookieSameSite: z\n .enum(['Strict', 'Lax', 'None'])\n .optional()\n .describe('Cookie SameSite attribute'),\n appVersion: z.string().optional().describe('Application version'),\n contexts: TrackerContextsSchema.optional().describe(\n 'Built-in context entities',\n ),\n // Anonymous tracking\n anonymousTracking: AnonymousTrackingSchema.optional().describe(\n 'Enable anonymous tracking (no user identifiers)',\n ),\n // Plugins - validated loosely since BrowserPlugin is complex\n plugins: z\n .array(z.union([UrlBasedPluginSchema, z.any()]))\n .optional()\n .describe('Snowplow plugins'),\n // Activity tracking\n activityTracking: ActivityTrackingSchema.optional().describe(\n 'Page ping configuration',\n ),\n // Global contexts - validated loosely to allow functions\n globalContexts: z\n .array(z.any())\n .optional()\n .describe('Global context entities'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type SnowplowSettings = z.infer<typeof SnowplowSettingsSchema>;\nexport type TrackerContexts = z.infer<typeof TrackerContextsSchema>;\nexport type UrlBasedPlugin = z.infer<typeof UrlBasedPluginSchema>;\nexport type ActivityTracking = z.infer<typeof ActivityTrackingSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * Context entity schema\n *\n * Each context entity has a schema URI and data mapping.\n */\nexport const ContextEntitySchema = z.object({\n schema: z.string().describe('Iglu schema URI for this context entity'),\n data: z\n .record(z.string(), z.unknown())\n .describe('Data mapping for this context entity'),\n});\n\n/**\n * Per-event Snowplow settings override schema\n */\nexport const SnowplowMappingSettingsSchema = z.object({\n actionSchema: z\n .string()\n .optional()\n .describe('Override action schema for this specific event'),\n});\n\n/**\n * Custom mapping parameters schema for Snowplow events\n *\n * Use the standard `name` field from mapping rules for the action type.\n * The `name` maps to Snowplow's event.data.type.\n */\nexport const MappingSchema = z.object({\n context: z\n .array(ContextEntitySchema)\n .optional()\n .describe('Context entities to attach to this event'),\n snowplow: SnowplowMappingSettingsSchema.optional().describe(\n 'Snowplow-specific settings override',\n ),\n});\n\nexport type ContextEntity = z.infer<typeof ContextEntitySchema>;\nexport type Mapping = z.infer<typeof MappingSchema>;\nexport type SnowplowMappingSettings = z.infer<\n typeof SnowplowMappingSettingsSchema\n>;\n","export * as env from './env';\nexport * as step from './step';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for Snowplow destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\nexport const init: Env | undefined = {\n window: {\n // snowplow absent: setup() is expected to install the queue stub.\n },\n document: {\n createElement: () => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n snowplow: Object.assign(noop, {\n q: [],\n }),\n },\n document: {\n createElement: () => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const simulation = [\n 'call:window.snowplow', // Track snowplow function calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport { ACTIONS, SCHEMAS } from '../types';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init sets up the Snowplow queue and creates\n * a tracker pointed at the collector URL. Reproduce by passing the same\n * settings to `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap creates a Snowplow tracker pointed at the configured collector URL.',\n in: {\n loadScript: true,\n settings: {\n collectorUrl: 'https://collector.example.com',\n appId: 'my-app',\n pageViewEvent: 'page view',\n },\n },\n out: [\n [\n 'snowplow.newTracker',\n 'sp',\n 'https://collector.example.com',\n {\n appId: 'my-app',\n platform: 'web',\n discoverRootDomain: undefined,\n cookieSameSite: undefined,\n appVersion: undefined,\n contexts: undefined,\n anonymousTracking: undefined,\n },\n ],\n ],\n};\n\nexport const productView: Flow.StepExample = {\n title: 'Product view',\n description:\n 'A product view fires a Snowplow ecommerce action with a product context schema and pricing fields.',\n in: getEvent('product view', { timestamp: 1700000400 }),\n mapping: {\n name: ACTIONS.PRODUCT_VIEW,\n settings: {\n context: [\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n id: 'data.id',\n name: 'data.name',\n category: 'data.category',\n price: 'data.price',\n currency: { key: 'data.currency', value: 'USD' },\n brand: 'data.brand',\n variant: 'data.variant',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'product_view',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n currency: 'USD',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const addToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires a Snowplow ecommerce add_to_cart action with product, cart, page, and user contexts.',\n in: getEvent('product add', { timestamp: 1700000401 }),\n mapping: {\n name: ACTIONS.ADD_TO_CART,\n settings: {\n context: [\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n id: 'data.id',\n name: 'data.name',\n category: 'data.category',\n price: 'data.price',\n currency: { key: 'data.currency', value: 'USD' },\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n {\n schema: SCHEMAS.CART,\n data: {\n total_value: 'globals.cart_value',\n currency: { key: 'globals.cart_currency', value: 'USD' },\n },\n },\n {\n schema: SCHEMAS.PAGE,\n data: {\n type: 'globals.page_type',\n language: 'globals.language',\n },\n },\n {\n schema: SCHEMAS.USER,\n data: {\n id: 'user.id',\n email: 'user.email',\n is_guest: {\n fn: (event: unknown) =>\n (event as { user?: { id?: string } }).user?.id\n ? true\n : undefined,\n },\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'add_to_cart',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n currency: 'USD',\n quantity: 1,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0',\n data: {\n currency: 'USD',\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/page/jsonschema/1-0-0',\n data: {},\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/user/jsonschema/1-0-0',\n data: {\n id: 'us3r',\n is_guest: true,\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const transaction: Flow.StepExample = {\n title: 'Transaction',\n description:\n 'A completed order fires a Snowplow ecommerce transaction action with transaction id, revenue, tax, and shipping.',\n in: getEvent('order complete', { timestamp: 1700000402 }),\n mapping: {\n name: ACTIONS.TRANSACTION,\n settings: {\n context: [\n {\n schema: SCHEMAS.TRANSACTION,\n data: {\n transaction_id: 'data.id',\n revenue: 'data.total',\n currency: { key: 'data.currency', value: 'USD' },\n payment_method: { value: 'credit_card' },\n tax: 'data.taxes',\n shipping: 'data.shipping',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'transaction',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n data: {\n transaction_id: '0rd3r1d',\n revenue: 555,\n currency: 'EUR',\n payment_method: 'credit_card',\n tax: 73.76,\n shipping: 5.22,\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const promoView: Flow.StepExample = {\n title: 'Promo view',\n description:\n 'A promotion visible event fires a Snowplow promo_view action with a promotion context.',\n in: getEvent('promotion visible', { timestamp: 1700000403 }),\n mapping: {\n name: ACTIONS.PROMO_VIEW,\n settings: {\n context: [\n {\n schema: SCHEMAS.PROMOTION,\n data: {\n id: 'data.id',\n name: 'data.name',\n creative_id: 'data.creative_id',\n type: 'data.type',\n position: 'data.position',\n slot: 'data.slot',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'promo_view',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0',\n data: {\n name: 'Setting up tracking easily',\n position: 'hero',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view calls Snowplow trackPageView directly instead of a self-describing event.',\n in: getEvent('page view', { timestamp: 1700000404 }),\n mapping: undefined,\n out: [['snowplow.trackPageView']],\n};\n\nexport const checkoutStep: Flow.StepExample = {\n title: 'Checkout step',\n description:\n 'A checkout view fires a Snowplow checkout_step action with the current step and option.',\n in: getEvent('checkout view', { timestamp: 1700000405 }),\n mapping: {\n name: ACTIONS.CHECKOUT_STEP,\n settings: {\n context: [\n {\n schema: SCHEMAS.CHECKOUT_STEP,\n data: {\n step: 'data.step',\n option: 'data.option',\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'checkout_step',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0',\n data: {\n step: 'payment',\n },\n },\n ],\n },\n ],\n ],\n};\n\nexport const structuredEvent: Flow.StepExample = {\n title: 'Struct event',\n description:\n 'A custom event is tracked via Snowplow trackStructEvent with category, action, label, property, and value.',\n in: getEvent('product visible', { timestamp: 1700000406 }),\n mapping: {\n settings: {\n struct: {\n category: { value: 'ecommerce' },\n action: { value: 'impression' },\n label: 'data.name',\n property: 'data.color',\n value: 'data.price',\n },\n },\n },\n out: [\n [\n 'snowplow.trackStructEvent',\n {\n category: 'ecommerce',\n action: 'impression',\n label: 'Everyday Ruck Snack',\n property: 'black',\n value: 420,\n },\n ],\n ],\n};\n\nexport const contextLoop: Flow.StepExample = {\n title: 'Transaction with products',\n description:\n 'A transaction event adds one Snowplow product context per nested product via a loop mapping.',\n in: getEvent('order complete', { timestamp: 1700000407 }),\n mapping: {\n name: ACTIONS.TRANSACTION,\n settings: {\n context: [\n {\n schema: SCHEMAS.TRANSACTION,\n data: {\n transaction_id: 'data.id',\n revenue: 'data.total',\n currency: 'data.currency',\n },\n },\n {\n schema: SCHEMAS.PRODUCT,\n data: {\n loop: [\n 'nested',\n {\n map: {\n id: 'data.id',\n name: 'data.name',\n price: 'data.price',\n },\n },\n ],\n },\n },\n ],\n },\n },\n out: [\n [\n 'snowplow.trackSelfDescribingEvent',\n {\n event: {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n data: {\n type: 'transaction',\n },\n },\n context: [\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n data: {\n transaction_id: '0rd3r1d',\n revenue: 555,\n currency: 'EUR',\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n id: 'cc',\n name: 'Cool Cap',\n price: 42,\n },\n },\n {\n schema:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n data: {\n name: 'Surprise',\n },\n },\n ],\n },\n ],\n ],\n};\n","import type {\n Mapping as WalkerOSMapping,\n WalkerOS,\n Destination as CoreDestination,\n Mapping as CoreMapping,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Official Snowplow types\nimport type {\n SelfDescribingJson,\n CommonEventProperties,\n} from '@snowplow/tracker-core';\nimport type {\n BrowserPlugin,\n ActivityTrackingConfiguration,\n} from '@snowplow/browser-tracker-core';\n// Action is used in a type position below (Action['type']), so it must stay\n// imported. The other entity types are only re-exported.\nimport type { Action } from '@snowplow/browser-plugin-snowplow-ecommerce';\n\n// Re-export official Snowplow entity types\nexport type { SelfDescribingJson, CommonEventProperties };\nexport type {\n Action,\n Product,\n Cart,\n SPTransaction,\n SPPromotion,\n CheckoutStep,\n Refund,\n TransactionError,\n User,\n Page,\n} from '@snowplow/browser-plugin-snowplow-ecommerce';\n\n// Re-export Snowplow tracker core types\nexport type { BrowserPlugin, ActivityTrackingConfiguration };\n\ndeclare global {\n interface Window {\n snowplow?: SnowplowFunction;\n GlobalSnowplowNamespace?: string[];\n }\n}\n\n// Snowplow tracker queue function type (similar to gtag or fbq)\nexport interface SnowplowFunction {\n (...args: unknown[]): void;\n q?: unknown[];\n}\n\n/**\n * Tracker factory function type (from @snowplow/browser-tracker)\n *\n * This is the `newTracker` function signature. When provided via `settings.code`,\n * the destination uses this directly instead of loading sp.js.\n */\nexport type TrackerFactory = (\n trackerId: string,\n endpoint: string,\n configuration?: Record<string, unknown>,\n) => void;\n\n/**\n * Browser-tracker module functions passed via $code: for npm mode\n *\n * These are the individual tracking functions imported from @snowplow/browser-tracker\n * that replace the sp.js command queue approach.\n */\nexport interface TrackerFunctions {\n /** Initialize tracker - always required */\n newTracker: TrackerFactory;\n /** Track self-describing events - required for event tracking */\n trackSelfDescribingEvent: (\n event: SelfDescribingEvent,\n trackers?: string[],\n ) => void;\n /** Track page views */\n trackPageView?: (\n event?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Track structured events */\n trackStructEvent?: (\n event: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Set user ID */\n setUserId?: (userId?: string | null, trackers?: string[]) => void;\n /** Enable activity tracking */\n enableActivityTracking?: (\n config: ActivityTrackingConfiguration,\n trackers?: string[],\n ) => void;\n /** Add plugin */\n addPlugin?: (config: { plugin: BrowserPlugin }, trackers?: string[]) => void;\n /** Add global contexts */\n addGlobalContexts?: (contexts: unknown[], trackers?: string[]) => void;\n /** Clear user data */\n clearUserData?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Enable anonymous tracking */\n enableAnonymousTracking?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Disable anonymous tracking */\n disableAnonymousTracking?: (\n config?: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Consent tracking - from Enhanced Consent plugin */\n trackConsentAllow?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n trackConsentDeny?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n trackConsentSelected?: (\n params: Record<string, unknown>,\n trackers?: string[],\n ) => void;\n /** Set page context - from Snowplow Ecommerce plugin */\n setPageType?: (\n page: { type: string; language?: string; locale?: string },\n trackers?: string[],\n ) => void;\n}\n\n/**\n * Unified adapter interface for Snowplow tracking\n *\n * Provides a consistent API regardless of whether using sp.js command queue\n * or @snowplow/browser-tracker module functions.\n */\nexport interface SnowplowAdapter {\n trackPageView(event?: Record<string, unknown>): void;\n trackSelfDescribingEvent(event: SelfDescribingEvent): void;\n trackStructEvent(event: Record<string, unknown>): void;\n setUserId(userId?: string | null): void;\n enableActivityTracking(config: ActivityTrackingConfiguration): void;\n addPlugin(\n config: { plugin: BrowserPlugin } | [string, [string, string]],\n ): void;\n addGlobalContexts(contexts: unknown[]): void;\n clearUserData(config?: Record<string, unknown>): void;\n enableAnonymousTracking(config?: Record<string, unknown>): void;\n disableAnonymousTracking(config?: Record<string, unknown>): void;\n trackConsentAllow(params: Record<string, unknown>): void;\n trackConsentDeny(params: Record<string, unknown>): void;\n trackConsentSelected(params: Record<string, unknown>): void;\n /** Set page context - from Snowplow Ecommerce plugin */\n setPageType(page: { type: string; language?: string; locale?: string }): void;\n /** For URL-based plugins that need enable methods */\n call(method: string, ...args: unknown[]): void;\n}\n\n/**\n * Complete self-describing event structure\n * This is the full parameter passed to window.snowplow('trackSelfDescribingEvent', ...)\n */\nexport type SelfDescribingEvent<T = WalkerOS.Properties> = {\n event: SelfDescribingJson<T>;\n} & CommonEventProperties<T>;\n\n/**\n * Page context settings for setPageType\n *\n * Each field is resolved via getMappingValue, allowing dynamic values\n * from event data or static values.\n *\n * @example\n * // Dynamic values from globals\n * page: {\n * type: 'globals.page_type',\n * language: 'globals.language',\n * locale: 'globals.locale'\n * }\n *\n * // Mixed static and dynamic\n * page: {\n * type: 'globals.page_type',\n * language: { value: 'en' },\n * locale: { value: 'en-US' }\n * }\n */\nexport interface PageSettings {\n /** Page type (required) */\n type: CoreMapping.Value;\n /** Page language (optional) */\n language?: CoreMapping.Value;\n /** Page locale (optional) */\n locale?: CoreMapping.Value;\n}\n\n/**\n * URL-based plugin configuration (for sp.js JavaScript tracker)\n */\nexport interface UrlBasedPlugin {\n /** CDN or self-hosted URL to the plugin script */\n url: string;\n /** [globalName, constructorName] for the plugin */\n name: [string, string];\n /** Optional override for enable method (derived by convention if omitted) */\n enableMethod?: string;\n /** Options passed to the enable method */\n options?: Record<string, unknown>;\n}\n\n/**\n * Code-based plugin configuration (for @snowplow/browser-tracker npm approach)\n *\n * Use when the plugin is imported via packages.imports and passed via $code:\n */\nexport interface CodeBasedPlugin {\n /** The plugin factory function passed via $code: */\n code: BrowserPlugin | ((...args: unknown[]) => BrowserPlugin);\n /** Configuration options passed to the plugin factory */\n config?: Record<string, unknown>;\n}\n\n/**\n * Union type for all supported plugin forms\n */\nexport type SnowplowPlugin = BrowserPlugin | UrlBasedPlugin | CodeBasedPlugin;\n\n/**\n * Built-in context entity types for tracker initialization\n */\nexport interface TrackerContexts {\n /** Web page context (default: true) */\n webPage?: boolean;\n /** Client session context - enables client_session schema */\n session?: boolean;\n /** Browser context - device info, viewport, language, etc. */\n browser?: boolean;\n /** Performance timing context */\n performanceTiming?: boolean;\n /** Geolocation context */\n geolocation?: boolean;\n}\n\n/**\n * Anonymous tracking configuration\n *\n * When enabled, the tracker will not set any user identifiers (domain_userid, network_userid).\n * This is useful for privacy-focused tracking or when user consent has not been given.\n */\nexport interface AnonymousTrackingConfig {\n /**\n * Request server-side anonymisation\n *\n * When true, the collector will anonymise the user's IP address\n * and not set the network_userid cookie.\n */\n withServerAnonymisation?: boolean;\n /**\n * Continue session tracking in anonymous mode\n *\n * When true, session context will still be attached to events\n * even when anonymous tracking is enabled.\n */\n withSessionTracking?: boolean;\n}\n\n/**\n * Basis for processing under GDPR\n */\nexport type BasisForProcessing =\n | 'consent'\n | 'contract'\n | 'legal_obligation'\n | 'vital_interests'\n | 'public_task'\n | 'legitimate_interests';\n\n/**\n * Consent tracking configuration\n *\n * Enables consent event tracking via the Snowplow Enhanced Consent plugin.\n * When configured, walkerOS consent events are translated to Snowplow\n * trackConsentAllow/Deny/Selected calls via the `on('consent')` handler.\n *\n * Requires @snowplow/browser-plugin-enhanced-consent to be loaded.\n *\n * @example\n * consent: {\n * required: ['analytics', 'marketing'],\n * basisForProcessing: 'consent',\n * consentUrl: 'https://example.com/privacy',\n * consentVersion: '2.0',\n * domainsApplied: ['example.com'],\n * gdprApplies: true,\n * }\n */\nexport interface ConsentConfig {\n /**\n * walkerOS consent groups to check\n *\n * If not specified, all consent groups from the event are used.\n * Use this to filter which consent groups are relevant for Snowplow.\n *\n * @example ['analytics', 'marketing']\n */\n required?: string[];\n\n /**\n * Legal basis for processing under GDPR\n *\n * @default 'consent'\n */\n basisForProcessing?: BasisForProcessing;\n\n /**\n * URL to the privacy policy or consent document\n */\n consentUrl?: string;\n\n /**\n * Version of the consent document/policy\n */\n consentVersion?: string;\n\n /**\n * Domains where this consent applies\n *\n * @example ['example.com', 'shop.example.com']\n */\n domainsApplied?: string[];\n\n /**\n * Whether GDPR applies to this user/region\n */\n gdprApplies?: boolean;\n}\n\n/**\n * walkerOS mapping-based global context\n */\nexport interface MappedGlobalContext {\n /** Iglu schema URI */\n schema: string;\n /** Data mapping using walkerOS syntax */\n data: WalkerOSMapping.Map;\n /** Discriminator flag */\n __mapped: true;\n}\n\n/**\n * Static global context (same for all events)\n */\nexport interface StaticGlobalContext {\n schema: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Dynamic global context generator function\n */\nexport type GlobalContextGenerator = () => StaticGlobalContext | null;\n\n/**\n * Union type for all global context forms\n */\nexport type GlobalContext =\n | StaticGlobalContext\n | GlobalContextGenerator\n | MappedGlobalContext;\n\n/**\n * Internal runtime state for the destination\n *\n * This state is instance-scoped and managed by the destination,\n * not configured by users. It solves SSR/serverless state leakage.\n */\nexport interface RuntimeState {\n /** JSON stringified page object for setPageType change detection */\n page?: string;\n /** Whether setUserId has been called for this instance */\n userIdSet?: boolean;\n /** The initialized adapter instance */\n adapter?: SnowplowAdapter;\n}\n\n/**\n * Configuration settings for Snowplow destination\n */\nexport interface Settings {\n /**\n * Snowplow collector endpoint URL\n *\n * Required. The URL of your Snowplow collector.\n *\n * @example \"https://collector.example.com\"\n */\n collectorUrl?: string;\n\n /**\n * URL to the Snowplow JavaScript tracker script\n *\n * Used when `loadScript: true`. If not provided, defaults to the jsdelivr CDN\n * with `@latest` version tag.\n *\n * **Security Recommendation:** Always pin to a specific version in production.\n *\n * @example 'https://cdn.jsdelivr.net/npm/@snowplow/javascript-tracker@3.24.0/dist/sp.js'\n * @default 'https://cdn.jsdelivr.net/npm/@snowplow/javascript-tracker@latest/dist/sp.js'\n */\n scriptUrl?: string;\n\n /**\n * Tracker functions for bundled browser-tracker mode\n *\n * When provided, the destination uses these functions directly instead of\n * loading sp.js via script tag. Use with flow.json `$code:` syntax:\n *\n * @example\n * ```json\n * {\n * \"packages\": {\n * \"@snowplow/browser-tracker\": {\n * \"imports\": [\"newTracker\", \"trackSelfDescribingEvent\", \"trackPageView\"]\n * }\n * },\n * \"settings\": {\n * \"tracker\": {\n * \"newTracker\": \"$code:newTracker\",\n * \"trackSelfDescribingEvent\": \"$code:trackSelfDescribingEvent\",\n * \"trackPageView\": \"$code:trackPageView\"\n * },\n * \"collectorUrl\": \"https://collector.example.com\"\n * }\n * }\n * ```\n */\n tracker?: TrackerFunctions;\n\n /**\n * Application ID\n *\n * Identifier for your application in Snowplow.\n *\n * @default undefined\n */\n appId?: string;\n\n /**\n * Tracker instance name\n *\n * Name for the tracker instance. Useful when running multiple trackers.\n *\n * @default \"sp\"\n */\n trackerName?: string;\n\n /**\n * Platform identifier\n *\n * Platform the tracker is running on.\n *\n * @default \"web\"\n */\n platform?: string;\n\n /**\n * Enable automatic page view tracking\n *\n * If true, page view events will be tracked automatically.\n *\n * @default false\n */\n pageViewTracking?: boolean;\n\n /**\n * Track page view on tracker initialization\n *\n * When true, calls `trackPageView()` immediately after tracker init.\n * This uses Snowplow's built-in page view tracking.\n *\n * @default false\n */\n trackPageView?: boolean;\n\n /**\n * Event name that triggers trackPageView\n *\n * When a walkerOS event matches this name, `trackPageView()` is called\n * instead of `trackSelfDescribingEvent()`.\n *\n * @example 'page view'\n * @example 'pageview'\n * @example 'screen view'\n */\n pageViewEvent?: string;\n\n /**\n * Snowplow-specific ecommerce configuration\n */\n snowplow?: SnowplowSettings;\n\n /**\n * Global page context (calls setPageType)\n *\n * Each field is resolved via getMappingValue. When the resolved page object\n * changes, setPageType is called to update the global Page context.\n *\n * @example\n * // Dynamic from globals\n * page: {\n * type: 'globals.page_type',\n * language: 'globals.language'\n * }\n *\n * // Static values\n * page: {\n * type: { value: 'product' },\n * language: { value: 'en' },\n * locale: { value: 'en-US' }\n * }\n */\n page?: PageSettings;\n\n /**\n * User ID for Snowplow's cross-session user stitching\n *\n * Called once via setUserId() on the first event where the value resolves.\n * Subsequent events automatically include this user_id.\n *\n * @example\n * // From walkerOS user object (recommended)\n * userId: 'user.id'\n *\n * // From globals\n * userId: 'globals.user_id'\n */\n userId?: CoreMapping.Value;\n\n /**\n * Discover and set the root domain for cookies\n * @default true\n */\n discoverRootDomain?: boolean;\n\n /**\n * SameSite attribute for cookies\n * @default undefined (browser default)\n */\n cookieSameSite?: 'Strict' | 'Lax' | 'None';\n\n /**\n * Application version string\n */\n appVersion?: string;\n\n /**\n * Built-in context entities to attach to events\n */\n contexts?: TrackerContexts;\n\n /**\n * Enable anonymous tracking\n *\n * When enabled, the tracker will not set user identifiers.\n * Can be a boolean (true enables basic anonymous tracking) or\n * a configuration object for fine-grained control.\n *\n * @example\n * // Basic anonymous tracking\n * anonymousTracking: true\n *\n * @example\n * // With server-side anonymisation\n * anonymousTracking: {\n * withServerAnonymisation: true,\n * withSessionTracking: true\n * }\n */\n anonymousTracking?: boolean | AnonymousTrackingConfig;\n\n /**\n * Snowplow plugins to load (BrowserPlugin or URL-based)\n */\n plugins?: SnowplowPlugin[];\n\n /**\n * Activity tracking configuration (page pings)\n */\n activityTracking?: ActivityTrackingConfiguration;\n\n /**\n * Global context entities attached to all events\n */\n globalContexts?: GlobalContext[];\n\n /**\n * Consent tracking configuration\n *\n * When configured, enables consent event tracking via the `on('consent')` handler.\n * Requires @snowplow/browser-plugin-enhanced-consent to be loaded.\n *\n * @example\n * consent: {\n * required: ['analytics', 'marketing'],\n * basisForProcessing: 'consent',\n * consentUrl: 'https://example.com/privacy',\n * consentVersion: '2.0',\n * }\n */\n consent?: ConsentConfig;\n\n /**\n * Internal runtime state (managed by destination, not user-configured)\n * @internal\n */\n _state?: RuntimeState;\n}\n\n/**\n * Snowplow-specific settings (similar to GA4Settings in gtag)\n */\nexport interface SnowplowSettings {\n /**\n * Ecommerce action schema URI\n *\n * Schema used for all ecommerce action events.\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2\"\n */\n actionSchema?: string;\n\n /**\n * Product entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0\"\n */\n productSchema?: string;\n\n /**\n * Cart entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0\"\n */\n cartSchema?: string;\n\n /**\n * Transaction entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0\"\n */\n transactionSchema?: string;\n\n /**\n * Refund entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/refund/jsonschema/1-0-0\"\n */\n refundSchema?: string;\n\n /**\n * Checkout step entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0\"\n */\n checkoutStepSchema?: string;\n\n /**\n * Promotion entity schema URI\n *\n * @default \"iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0\"\n */\n promotionSchema?: string;\n\n /**\n * User entity schema URI (optional)\n *\n * @example \"iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-0\"\n */\n userSchema?: string;\n\n /**\n * Custom entity schemas\n *\n * Define schemas for custom context entities.\n *\n * @example { custom_entity: \"iglu:com.example/custom/jsonschema/1-0-0\" }\n */\n customSchemas?: {\n [entityType: string]: string;\n };\n\n /**\n * Default currency code (ISO 4217)\n *\n * Used as fallback when currency is not specified in event data.\n *\n * @example \"USD\", \"EUR\", \"GBP\"\n * @default \"USD\"\n */\n currency?: string;\n\n /**\n * Data mapping at destination level\n *\n * Global data transformation applied to all events.\n */\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n/**\n * Context entity definition for Snowplow\n *\n * Each context entity has a schema URI and data mapping.\n */\nexport interface ContextEntity {\n /**\n * Iglu schema URI for this context entity\n *\n * @example SCHEMAS.PRODUCT, SCHEMAS.TRANSACTION\n */\n schema: string;\n\n /**\n * Data mapping for this context entity\n *\n * Uses standard walkerOS mapping syntax.\n *\n * @example { id: 'data.id', name: 'data.name', price: 'data.price' }\n */\n data: WalkerOSMapping.Map;\n}\n\n/**\n * Structured event mapping for Snowplow's trackStructEvent\n *\n * When configured, bypasses self-describing events entirely\n * and calls trackStructEvent with the resolved values.\n *\n * @example\n * struct: {\n * category: { value: 'ui' },\n * action: { value: 'click' },\n * label: 'data.button_name',\n * property: 'data.section',\n * value: 'data.position',\n * }\n */\nexport interface StructuredEventMapping {\n /** Event category (required) */\n category: CoreMapping.Value;\n /** Event action (required) */\n action: CoreMapping.Value;\n /** Event label (optional) */\n label?: CoreMapping.Value;\n /** Event property (optional) */\n property?: CoreMapping.Value;\n /** Event value - must resolve to a number (optional) */\n value?: CoreMapping.Value;\n}\n\n/**\n * Custom mapping parameters for Snowplow events\n *\n * Uses standard `name` field for action type.\n * The `name` from the mapping rule becomes Snowplow's event.data.type.\n */\nexport interface Mapping {\n /**\n * Context entities to attach to this event\n *\n * Each entry defines a schema and data mapping.\n * Explicit - no auto-detection.\n *\n * @example\n * context: [\n * { schema: SCHEMAS.PRODUCT, data: { id: 'data.id', name: 'data.name' } }\n * ]\n */\n context?: ContextEntity[];\n\n /**\n * Snowplow-specific settings override\n */\n snowplow?: SnowplowMappingSettings;\n\n /**\n * Custom data mapping for self-describing event payload\n *\n * When specified with a `map` property, the mapped values are used\n * as the event data instead of the default ecommerce pattern.\n * Useful for media events (percent_progress) and custom schemas.\n *\n * @example\n * data: { map: { percentProgress: 'data.progress' } }\n */\n data?: WalkerOSMapping.Value;\n\n /**\n * Structured event mapping (bypasses self-describing events)\n *\n * When configured, calls trackStructEvent instead of trackSelfDescribingEvent.\n * No schema is used - this completely bypasses the self-describing event path.\n *\n * @example\n * struct: {\n * category: { value: 'ui' },\n * action: { value: 'click' },\n * label: 'data.button_name',\n * }\n */\n struct?: StructuredEventMapping;\n}\n\n/**\n * Per-event Snowplow settings override\n */\nexport interface SnowplowMappingSettings {\n /**\n * Override action schema for this specific event\n */\n actionSchema?: string;\n}\n\n/**\n * Environment dependencies for Snowplow destination\n */\nexport interface Env extends DestinationWeb.Env {\n window: {\n snowplow?: SnowplowFunction;\n };\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\n/**\n * Snowplow Ecommerce Schema URIs\n * Based on Snowplow Analytics official ecommerce schema\n */\nexport const SCHEMAS = {\n ACTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/snowplow_ecommerce_action/jsonschema/1-0-2',\n PRODUCT:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/product/jsonschema/1-0-0',\n CART: 'iglu:com.snowplowanalytics.snowplow.ecommerce/cart/jsonschema/1-0-0',\n TRANSACTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/transaction/jsonschema/1-0-0',\n REFUND:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/refund/jsonschema/1-0-0',\n CHECKOUT_STEP:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/checkout_step/jsonschema/1-0-0',\n PROMOTION:\n 'iglu:com.snowplowanalytics.snowplow.ecommerce/promotion/jsonschema/1-0-0',\n PAGE: 'iglu:com.snowplowanalytics.snowplow.ecommerce/page/jsonschema/1-0-0',\n USER: 'iglu:com.snowplowanalytics.snowplow.ecommerce/user/jsonschema/1-0-0',\n} as const;\n\n/**\n * Snowplow ecommerce action types\n * Type-safe values matching official Action['type']\n */\nexport const ACTIONS = {\n PRODUCT_VIEW: 'product_view',\n LIST_VIEW: 'list_view',\n LIST_CLICK: 'list_click',\n ADD_TO_CART: 'add_to_cart',\n REMOVE_FROM_CART: 'remove_from_cart',\n CHECKOUT_STEP: 'checkout_step',\n TRANSACTION: 'transaction',\n REFUND: 'refund',\n PROMO_VIEW: 'promo_view',\n PROMO_CLICK: 'promo_click',\n TRANSACTION_ERROR: 'trns_error',\n} as const satisfies Record<string, Action['type']>;\n\n/**\n * Snowplow Web Schema URIs\n * Events and contexts for web analytics tracking\n */\nexport const WEB_SCHEMAS = {\n // Events\n LINK_CLICK: 'iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1',\n CHANGE_FORM:\n 'iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0',\n FOCUS_FORM: 'iglu:com.snowplowanalytics.snowplow/focus_form/jsonschema/1-0-0',\n SUBMIT_FORM:\n 'iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0',\n SITE_SEARCH:\n 'iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0',\n SOCIAL:\n 'iglu:com.snowplowanalytics.snowplow/social_interaction/jsonschema/1-0-0',\n TIMING: 'iglu:com.snowplowanalytics.snowplow/timing/jsonschema/1-0-0',\n WEB_VITALS: 'iglu:com.snowplowanalytics.snowplow/web_vitals/jsonschema/1-0-0',\n // Contexts\n WEB_PAGE: 'iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0',\n BROWSER:\n 'iglu:com.snowplowanalytics.snowplow/browser_context/jsonschema/2-0-0',\n CLIENT_SESSION:\n 'iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2',\n GEOLOCATION:\n 'iglu:com.snowplowanalytics.snowplow/geolocation_context/jsonschema/1-1-0',\n} as const;\n\n/**\n * Snowplow Consent Schema URIs\n * For Enhanced Consent plugin events and contexts\n */\nexport const CONSENT_SCHEMAS = {\n // Events (fired by Enhanced Consent plugin)\n PREFERENCES:\n 'iglu:com.snowplowanalytics.snowplow/consent_preferences/jsonschema/1-0-0',\n CMP_VISIBLE:\n 'iglu:com.snowplowanalytics.snowplow/cmp_visible/jsonschema/1-0-0',\n // Contexts\n DOCUMENT:\n 'iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0',\n GDPR: 'iglu:com.snowplowanalytics.snowplow/gdpr/jsonschema/1-0-0',\n} as const;\n\n/**\n * Snowplow Media Schema URIs\n * Events and contexts for media (video/audio) tracking\n *\n * Requires @snowplow/browser-plugin-media-tracking for automatic tracking\n * or can be used manually with trackSelfDescribingEvent\n *\n * @see https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/web-tracker/tracking-events/media/\n */\nexport const MEDIA_SCHEMAS = {\n // Core playback events\n PLAY: 'iglu:com.snowplowanalytics.snowplow.media/play_event/jsonschema/1-0-0',\n PAUSE:\n 'iglu:com.snowplowanalytics.snowplow.media/pause_event/jsonschema/1-0-0',\n END: 'iglu:com.snowplowanalytics.snowplow.media/end_event/jsonschema/1-0-0',\n READY:\n 'iglu:com.snowplowanalytics.snowplow.media/ready_event/jsonschema/1-0-0',\n\n // Seek events\n SEEK_START:\n 'iglu:com.snowplowanalytics.snowplow.media/seek_start_event/jsonschema/1-0-0',\n SEEK_END:\n 'iglu:com.snowplowanalytics.snowplow.media/seek_end_event/jsonschema/1-0-0',\n\n // Buffer events\n BUFFER_START:\n 'iglu:com.snowplowanalytics.snowplow.media/buffer_start_event/jsonschema/1-0-0',\n BUFFER_END:\n 'iglu:com.snowplowanalytics.snowplow.media/buffer_end_event/jsonschema/1-0-0',\n\n // Player state change events\n QUALITY_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/quality_change_event/jsonschema/1-0-0',\n FULLSCREEN_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/fullscreen_change_event/jsonschema/1-0-0',\n VOLUME_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/volume_change_event/jsonschema/1-0-0',\n PLAYBACK_RATE_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/playback_rate_change_event/jsonschema/1-0-0',\n PIP_CHANGE:\n 'iglu:com.snowplowanalytics.snowplow.media/picture_in_picture_change_event/jsonschema/1-0-0',\n\n // Progress events\n PING: 'iglu:com.snowplowanalytics.snowplow.media/ping_event/jsonschema/1-0-0',\n PERCENT_PROGRESS:\n 'iglu:com.snowplowanalytics.snowplow.media/percent_progress_event/jsonschema/1-0-0',\n\n // Error event\n ERROR:\n 'iglu:com.snowplowanalytics.snowplow.media/error_event/jsonschema/1-0-0',\n\n // Ad events\n AD_BREAK_START:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break_start_event/jsonschema/1-0-0',\n AD_BREAK_END:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break_end_event/jsonschema/1-0-0',\n AD_START:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_start_event/jsonschema/1-0-0',\n AD_COMPLETE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_complete_event/jsonschema/1-0-0',\n AD_SKIP:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_skip_event/jsonschema/1-0-0',\n AD_CLICK:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_click_event/jsonschema/1-0-0',\n AD_PAUSE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_pause_event/jsonschema/1-0-0',\n AD_RESUME:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_resume_event/jsonschema/1-0-0',\n AD_QUARTILE:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_quartile_event/jsonschema/1-0-0',\n\n // Contexts (attached to media events)\n MEDIA_PLAYER:\n 'iglu:com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0',\n SESSION: 'iglu:com.snowplowanalytics.snowplow.media/session/jsonschema/1-0-0',\n AD: 'iglu:com.snowplowanalytics.snowplow.media/ad/jsonschema/1-0-0',\n AD_BREAK:\n 'iglu:com.snowplowanalytics.snowplow.media/ad_break/jsonschema/1-0-0',\n} as const;\n\n/**\n * Media action types for event mapping\n * Use with mapping.name to specify the action type\n */\nexport const MEDIA_ACTIONS = {\n PLAY: 'play',\n PAUSE: 'pause',\n END: 'end',\n READY: 'ready',\n SEEK_START: 'seek_start',\n SEEK_END: 'seek_end',\n BUFFER_START: 'buffer_start',\n BUFFER_END: 'buffer_end',\n QUALITY_CHANGE: 'quality_change',\n FULLSCREEN_CHANGE: 'fullscreen_change',\n VOLUME_CHANGE: 'volume_change',\n PLAYBACK_RATE_CHANGE: 'playback_rate_change',\n PIP_CHANGE: 'pip_change',\n PING: 'ping',\n PERCENT_PROGRESS: 'percent_progress',\n ERROR: 'error',\n AD_BREAK_START: 'ad_break_start',\n AD_BREAK_END: 'ad_break_end',\n AD_START: 'ad_start',\n AD_COMPLETE: 'ad_complete',\n AD_SKIP: 'ad_skip',\n AD_CLICK: 'ad_click',\n AD_PAUSE: 'ad_pause',\n AD_RESUME: 'ad_resume',\n AD_QUARTILE: 'ad_quartile',\n} as const;\n\n/**\n * Type guard for URL-based plugins\n */\nexport function isUrlBasedPlugin(\n plugin: SnowplowPlugin,\n): plugin is UrlBasedPlugin {\n return typeof plugin === 'object' && 'url' in plugin && 'name' in plugin;\n}\n\n/**\n * Type guard for code-based plugins\n */\nexport function isCodeBasedPlugin(\n plugin: SnowplowPlugin,\n): plugin is CodeBasedPlugin {\n return typeof plugin === 'object' && 'code' in plugin && !('url' in plugin);\n}\n\n/**\n * Type guard for mapped global contexts\n */\nexport function isMappedGlobalContext(\n ctx: GlobalContext,\n): ctx is MappedGlobalContext {\n return typeof ctx === 'object' && ctx !== null && '__mapped' in ctx;\n}\n\n/**\n * Derive enable method from plugin constructor name\n * 'LinkClickTrackingPlugin' -> 'enableLinkClickTracking'\n */\nexport function deriveEnableMethod(constructorName: string): string {\n return 'enable' + constructorName.replace('Plugin', '');\n}\n"],"mappings":"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","names":["import_dev","import_dev","init","init"]}
|