{"version":3,"sources":["../src/core.ts","../src/appinsights.ts"],"names":[],"mappings":"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","file":"appinsights.cjs","sourcesContent":["import type { TelemetryProperties } from './types';\n\nexport interface ParsedConnectionString {\n  instrumentationKey: string;\n  /** Ingestion endpoint with any trailing slash removed. */\n  ingestionEndpoint: string;\n}\n\n/** Parse an Application Insights connection string into its key + ingestion endpoint. */\nexport function parseConnectionString(cs: string | undefined | null): ParsedConnectionString | null {\n  if (!cs) return null;\n  const parts: Record<string, string> = {};\n  for (const kv of cs.split(';')) {\n    const i = kv.indexOf('=');\n    if (i > 0) parts[kv.slice(0, i).trim().toLowerCase()] = kv.slice(i + 1).trim();\n  }\n  const instrumentationKey = parts['instrumentationkey'];\n  if (!instrumentationKey) return null;\n  const endpoint = parts['ingestionendpoint'] || 'https://dc.services.visualstudio.com';\n  return { instrumentationKey, ingestionEndpoint: endpoint.replace(/\\/+$/, '') };\n}\n\n/** True only in a real browser context (guards SSR / Node / test environments). */\nexport function isBrowser(): boolean {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/** RFC-4122-ish id; prefers `crypto.randomUUID` and falls back to Math.random. */\nexport function uuid(): string {\n  const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n  if (c?.randomUUID) return c.randomUUID();\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (ch) => {\n    const r = (Math.random() * 16) | 0;\n    return (ch === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n  });\n}\n\nexport function clamp01(n: number): number {\n  return Number.isFinite(n) ? Math.max(0, Math.min(1, n)) : 1;\n}\n\n/** Drop nullish props and coerce values to strings (Application Insights properties are strings). */\nexport function cleanProperties(props?: TelemetryProperties): Record<string, string> | undefined {\n  if (!props) return undefined;\n  const out: Record<string, string> = {};\n  for (const [k, v] of Object.entries(props)) {\n    if (v !== undefined && v !== null) out[k] = String(v);\n  }\n  return Object.keys(out).length ? out : undefined;\n}\n\n/** Create a per-client debouncer keyed by an id. */\nexport function createDebouncer(): (id: string, fn: () => void, delayMs: number) => void {\n  const timers = new Map<string, ReturnType<typeof setTimeout>>();\n  return (id, fn, delayMs) => {\n    const existing = timers.get(id);\n    if (existing) clearTimeout(existing);\n    timers.set(id, setTimeout(() => {\n      timers.delete(id);\n      fn();\n    }, delayMs));\n  };\n}\n","import type { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport type { Analytics, InitOptions } from './types';\nimport { clamp01, cleanProperties, createDebouncer, isBrowser } from './core';\n\n/**\n * Application Insights JavaScript SDK adapter — the same {@link Analytics} API\n * as the beacon client, but backed by `@microsoft/applicationinsights-web`\n * (install it as a dependency). Configured cookieless: `disableCookiesUsage`\n * plus no session/local storage, so there is no persistent identifier and no\n * consent banner is required. Returns a no-op client when disabled, outside a\n * browser, or when the peer dependency is missing.\n */\nexport async function initAppInsights(options: InitOptions): Promise<Analytics> {\n  const debounce = createDebouncer();\n  let enabled = options.enabled !== false && isBrowser() && !!options.connectionString;\n  let ai: ApplicationInsights | null = null;\n\n  if (enabled) {\n    try {\n      const mod = await import('@microsoft/applicationinsights-web');\n      ai = new mod.ApplicationInsights({\n        config: {\n          connectionString: options.connectionString,\n          disableCookiesUsage: true,\n          enableSessionStorageBuffer: false,\n          autoTrackPageVisitTime: true,\n          enableAutoRouteTracking: false,\n          disableAjaxTracking: true,\n          disableFetchTracking: true,\n          enableUnhandledPromiseRejectionTracking: true,\n          samplingPercentage: Math.round(clamp01(options.samplingRate ?? 1) * 100),\n        },\n      });\n      ai.loadAppInsights();\n      if (options.cloudRole) {\n        const role = options.cloudRole;\n        ai.addTelemetryInitializer((item) => {\n          const it = item as { tags?: Record<string, unknown> };\n          it.tags = it.tags || {};\n          it.tags['ai.cloud.role'] = role;\n        });\n      }\n      if (options.autoPageView !== false) ai.trackPageView();\n    } catch {\n      // Peer dependency missing or failed to load — degrade to a safe no-op.\n      ai = null;\n      enabled = false;\n    }\n  }\n\n  const api: Analytics = {\n    get enabled() {\n      return enabled && !!ai;\n    },\n    setEnabled(next: boolean) {\n      enabled = next && !!ai;\n    },\n    trackEvent(name, properties, measurements) {\n      if (enabled) ai?.trackEvent({ name, properties: cleanProperties(properties), measurements });\n    },\n    trackPageView(name, uri, properties) {\n      if (enabled) ai?.trackPageView({ name, uri, properties: cleanProperties(properties) });\n    },\n    trackChangeDebounced(name, key, delayMs = 700) {\n      if (!enabled) return;\n      debounce(`${name}::${key}`, () => api.trackEvent(name, { key }), delayMs);\n    },\n    flush() {\n      ai?.flush();\n    },\n  };\n\n  return api;\n}\n"]}