@cunpingtai/webad-react-ad-scripts 0.2.2 → 0.2.3

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/README.md CHANGED
@@ -86,13 +86,13 @@ import {
86
86
 
87
87
  ## 策略
88
88
 
89
- | 模式 | Banner / Native | Smartlink | Social Bar / Popunder |
90
- | ----------------- | --------------- | --------- | --------------------- |
91
- | `none` | 否 | 否 | 否 |
92
- | `adsense` | 否 | 否 | 否 |
93
- | `adsense-limited` | 是 | 否 | 否 |
94
- | `adsterra-safe` | 是 | 是 | 否 |
95
- | `adsterra-full` | 是 | 是 | 是 |
89
+ | 模式 | Banner / Native | Smartlink | Social Bar | Popunder |
90
+ | ----------------- | --------------- | --------- | ---------- | -------- |
91
+ | `none` | 否 | 否 | 否 | 否 |
92
+ | `adsense` | 否 | 否 | 否 | 否 |
93
+ | `adsense-limited` | 是 | 否 | 否 | 否 |
94
+ | `adsterra-safe` | 是 | 是 | 是 | 否 |
95
+ | `adsterra-full` | 是 | 是 | 是 | 是 |
96
96
 
97
97
  同一个 `pageKey` 中,同一个 `placement` 只初始化一次。普通 React re-render 和 Strict Mode 不会重复请求;真实 SPA 路由切换后可以重新初始化。Social Bar 和 Popunder 在整个文档生命周期各只加载一次。
98
98
 
package/dist/index.js CHANGED
@@ -615,7 +615,12 @@ var FORMATS_BY_MODE = {
615
615
  none: /* @__PURE__ */ new Set(),
616
616
  adsense: /* @__PURE__ */ new Set(),
617
617
  "adsense-limited": /* @__PURE__ */ new Set(["native-banner", "banner"]),
618
- "adsterra-safe": /* @__PURE__ */ new Set(["native-banner", "banner", "smartlink"]),
618
+ "adsterra-safe": /* @__PURE__ */ new Set([
619
+ "social-bar",
620
+ "native-banner",
621
+ "banner",
622
+ "smartlink"
623
+ ]),
619
624
  "adsterra-full": /* @__PURE__ */ new Set([
620
625
  "native-banner",
621
626
  "banner",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../shared-contract/src/types.ts","../../shared-contract/src/schemas.ts","../../shared-contract/src/adsterra.ts","../../shared-contract/src/hostname.ts","../../shared-contract/src/scripts.ts","../src/AdsProvider.tsx","../src/context.ts","../src/dom.ts","../src/request.ts","../src/validation.ts","../src/AdsterraBanner.tsx","../src/lifecycle.ts","../src/policy.ts","../src/AdsterraNativeBanner.tsx","../src/AdsterraSmartlink.tsx","../src/page-scripts.tsx"],"sourcesContent":["export const AD_MODES = [\n \"none\",\n \"adsense\",\n \"adsense-limited\",\n \"adsterra-safe\",\n \"adsterra-full\",\n] as const;\n\nexport type AdMode = (typeof AD_MODES)[number];\nexport type SiteMode = AdMode | \"inherit\";\n\nexport interface ScriptDescriptor {\n id: string;\n src: string;\n async?: boolean | undefined;\n defer?: boolean | undefined;\n attributes?: Record<string, string> | undefined;\n}\n\nexport interface ProviderConfig {\n adsense: {\n scripts: ScriptDescriptor[];\n };\n adsterra: {\n safeScripts: ScriptDescriptor[];\n fullScripts: ScriptDescriptor[];\n };\n}\n\nexport interface ProviderOverrides {\n adsense?:\n | {\n scripts?: ScriptDescriptor[] | undefined;\n }\n | undefined;\n adsterra?:\n | {\n safeScripts?: ScriptDescriptor[] | undefined;\n fullScripts?: ScriptDescriptor[] | undefined;\n }\n | undefined;\n}\n\nexport type AdsterraValue = string | number | boolean;\nexport type AdsterraParams = Record<string, AdsterraValue>;\n\nexport interface AdsterraBannerPlacement {\n kind: \"banner\";\n scriptSrc: string;\n zoneKey: string;\n width: number;\n height: number;\n params: AdsterraParams;\n}\n\nexport interface AdsterraNativePlacement {\n kind: \"native\";\n scriptSrc: string;\n containerId: string;\n}\n\nexport type AdsterraPlacement =\n AdsterraBannerPlacement | AdsterraNativePlacement;\n\nexport interface SiteAdsterraConfig {\n placements: Record<string, AdsterraPlacement>;\n socialBar?: { scriptSrc: string } | undefined;\n popunder?: { scriptSrc: string } | undefined;\n smartlink?: { href: string } | undefined;\n}\n\nexport interface GlobalConfig {\n enabled: boolean;\n defaultMode: AdMode;\n providers: ProviderConfig;\n}\n\nexport interface SiteConfig {\n enabled: boolean;\n mode: SiteMode;\n aliases: string[];\n providers: ProviderOverrides;\n adsterra?: SiteAdsterraConfig | undefined;\n}\n\nexport interface Snapshot {\n schemaVersion: 1;\n revision: string;\n updatedAt: string;\n global: GlobalConfig;\n sites: Record<string, SiteConfig>;\n}\n\nexport interface PublicConfig {\n version: 1;\n revision: string;\n site: string;\n enabled: boolean;\n mode: AdMode;\n allowedScriptHosts: string[];\n scripts: ScriptDescriptor[];\n ttlSeconds: number;\n adsterra?: SiteAdsterraConfig | undefined;\n}\n","import { z } from \"zod\";\n\nimport { AD_MODES } from \"./types\";\nimport { SiteAdsterraConfigSchema } from \"./adsterra\";\n\nexport const ScriptDescriptorSchema = z\n .object({\n id: z.string().min(1).max(80),\n src: z.string().min(1).max(2048),\n async: z.boolean().optional(),\n defer: z.boolean().optional(),\n attributes: z\n .record(z.string(), z.string().max(256))\n .refine((attributes) => Object.keys(attributes).length <= 8, {\n message: \"Attributes must contain at most 8 keys\",\n })\n .optional(),\n })\n .strict();\n\nconst ProviderConfigSchema = z\n .object({\n adsense: z\n .object({\n scripts: z.array(ScriptDescriptorSchema).max(16),\n })\n .strict(),\n adsterra: z\n .object({\n safeScripts: z.array(ScriptDescriptorSchema).max(16),\n fullScripts: z.array(ScriptDescriptorSchema).max(16),\n })\n .strict(),\n })\n .strict();\n\nconst ProviderOverridesSchema = z\n .object({\n adsense: z\n .object({\n scripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n })\n .strict()\n .optional(),\n adsterra: z\n .object({\n safeScripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n fullScripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const GlobalConfigSchema = z\n .object({\n enabled: z.boolean(),\n defaultMode: z.enum(AD_MODES),\n providers: ProviderConfigSchema,\n })\n .strict();\n\nexport const SiteConfigSchema = z\n .object({\n enabled: z.boolean(),\n mode: z.union([z.enum(AD_MODES), z.literal(\"inherit\")]),\n aliases: z.array(z.string()).max(32),\n providers: ProviderOverridesSchema,\n adsterra: SiteAdsterraConfigSchema.optional(),\n })\n .strict();\n\nexport const SnapshotSchema = z\n .object({\n schemaVersion: z.literal(1),\n revision: z.string().uuid(),\n updatedAt: z.iso.datetime(),\n global: GlobalConfigSchema,\n sites: z\n .record(z.string(), SiteConfigSchema)\n .refine((sites) => Object.keys(sites).length <= 1000, {\n message: \"Sites must contain at most 1000 entries\",\n }),\n })\n .strict();\n\nexport const PublicConfigSchema = z\n .object({\n version: z.literal(1),\n revision: z.string().uuid(),\n site: z.string().min(1).max(253),\n enabled: z.boolean(),\n mode: z.enum(AD_MODES),\n allowedScriptHosts: z.array(z.string().min(1).max(253)).max(64),\n scripts: z.array(ScriptDescriptorSchema).max(32),\n ttlSeconds: z.number().int().min(0).max(300),\n adsterra: SiteAdsterraConfigSchema.optional(),\n })\n .strict();\n","import { z } from \"zod\";\n\nconst PLACEMENT_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CONTAINER_ID = /^[A-Za-z][A-Za-z0-9:_-]{0,127}$/;\nconst ZONE_KEY = /^[A-Za-z0-9]{1,128}$/;\nconst PARAM_KEY = /^[A-Za-z0-9_-]{1,64}$/;\nconst MAX_URL_LENGTH = 2048;\n\nconst AdsterraValueSchema = z.union([\n z.string().max(256),\n z.number().finite(),\n z.boolean(),\n]);\n\nconst AdsterraParamsSchema = z\n .record(z.string().regex(PARAM_KEY), AdsterraValueSchema)\n .refine((params) => Object.keys(params).length <= 16, {\n message: \"Adsterra params must contain at most 16 entries\",\n });\n\nexport const ManagedAdsterraUrlSchema = z\n .string()\n .min(1)\n .max(MAX_URL_LENGTH)\n .refine(isSafeManagedUrl, { message: \"Invalid managed Adsterra URL\" });\n\nexport const AdsterraBannerPlacementSchema = z\n .object({\n kind: z.literal(\"banner\"),\n scriptSrc: ManagedAdsterraUrlSchema,\n zoneKey: z.string().regex(ZONE_KEY),\n width: z.number().int().min(1).max(2048),\n height: z.number().int().min(1).max(2048),\n params: AdsterraParamsSchema,\n })\n .strict();\n\nexport const AdsterraNativePlacementSchema = z\n .object({\n kind: z.literal(\"native\"),\n scriptSrc: ManagedAdsterraUrlSchema,\n containerId: z.string().regex(CONTAINER_ID),\n })\n .strict();\n\nexport const AdsterraPlacementSchema = z.discriminatedUnion(\"kind\", [\n AdsterraBannerPlacementSchema,\n AdsterraNativePlacementSchema,\n]);\n\nconst AdsterraPlacementsSchema = z\n .record(\n z.string().min(1).max(80).regex(PLACEMENT_NAME),\n AdsterraPlacementSchema,\n )\n .refine((placements) => Object.keys(placements).length <= 64, {\n message: \"A site may contain at most 64 Adsterra placements\",\n });\n\nconst ManagedScriptSchema = z\n .object({ scriptSrc: ManagedAdsterraUrlSchema })\n .strict();\n\nconst ManagedSmartlinkSchema = z\n .object({ href: ManagedAdsterraUrlSchema })\n .strict();\n\nexport const SiteAdsterraConfigSchema = z\n .object({\n placements: AdsterraPlacementsSchema,\n socialBar: ManagedScriptSchema.optional(),\n popunder: ManagedScriptSchema.optional(),\n smartlink: ManagedSmartlinkSchema.optional(),\n })\n .strict();\n\nfunction isSafeManagedUrl(value: string): boolean {\n if (/\\s/.test(value) || value.includes(\"#\") || hasExplicitPort(value)) {\n return false;\n }\n\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.port === \"\" &&\n url.hash === \"\"\n );\n } catch {\n return false;\n }\n}\n\nfunction hasExplicitPort(value: string): boolean {\n const schemeEnd = value.indexOf(\":\");\n if (schemeEnd < 0) return false;\n const remainder = value.slice(schemeEnd + 1).replace(/^[\\\\/]+/, \"\");\n const authorityEnd = remainder.search(/[\\\\/?#]/);\n const authority =\n authorityEnd < 0 ? remainder : remainder.slice(0, authorityEnd);\n const host = authority.slice(authority.lastIndexOf(\"@\") + 1);\n return host.startsWith(\"[\") ? host.includes(\"]:\") : host.includes(\":\");\n}\n","const DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\nexport function normalizeHostname(input: string): string {\n let hostname = input.trim().toLowerCase();\n\n if (hostname.endsWith(\".\")) {\n hostname = hostname.slice(0, -1);\n }\n\n if (hostname.includes(\":\")) {\n throw new Error(\"Hostname must not include a port\");\n }\n\n if (hostname.length === 0 || hostname.length > 253) {\n throw new Error(\"Invalid hostname length\");\n }\n\n const labels = hostname.split(\".\");\n if (labels.some((label) => label.length === 0 || !DNS_LABEL.test(label))) {\n throw new Error(\"Invalid hostname\");\n }\n\n return hostname;\n}\n","import { ScriptDescriptorSchema } from \"./schemas\";\nimport type { ScriptDescriptor } from \"./types\";\n\nconst SCRIPT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nconst ALLOWED_ATTRIBUTES = new Map<string, ReadonlySet<string>>([\n [\"crossorigin\", new Set([\"anonymous\", \"use-credentials\"])],\n [\n \"referrerpolicy\",\n new Set([\n \"no-referrer\",\n \"no-referrer-when-downgrade\",\n \"origin\",\n \"origin-when-cross-origin\",\n \"same-origin\",\n \"strict-origin\",\n \"strict-origin-when-cross-origin\",\n ]),\n ],\n]);\n\nexport function dedupeAndValidateScripts(\n input: readonly ScriptDescriptor[],\n allowedHosts: readonly string[],\n): ScriptDescriptor[] {\n const normalizedAllowedHosts = new Set(\n allowedHosts.map((hostname) => hostname.toLowerCase()),\n );\n const sourceById = new Map<string, string>();\n const seenSources = new Set<string>();\n const scripts: ScriptDescriptor[] = [];\n\n for (const inputDescriptor of input) {\n const descriptor = ScriptDescriptorSchema.parse(inputDescriptor);\n\n if (!SCRIPT_ID.test(descriptor.id)) {\n throw new Error(\"Invalid script ID\");\n }\n\n let url: URL;\n try {\n url = new URL(descriptor.src);\n } catch {\n throw new Error(\"Invalid script URL\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"Script URL must use HTTPS\");\n }\n\n if (url.port !== \"\") {\n throw new Error(\"Script URL must not include a port\");\n }\n\n if (!normalizedAllowedHosts.has(url.hostname.toLowerCase())) {\n throw new Error(\"Script URL hostname is not allowed\");\n }\n\n if (url.href.includes(\"#\")) {\n throw new Error(\"Script URL must not include a fragment\");\n }\n\n validateAttributes(descriptor.attributes);\n\n const normalizedSrc = url.toString();\n const previousSource = sourceById.get(descriptor.id);\n if (previousSource !== undefined && previousSource !== normalizedSrc) {\n throw new Error(\"Script ID must not reference multiple URLs\");\n }\n sourceById.set(descriptor.id, normalizedSrc);\n\n if (seenSources.has(normalizedSrc)) {\n continue;\n }\n\n seenSources.add(normalizedSrc);\n scripts.push({ ...descriptor, src: normalizedSrc });\n }\n\n return scripts;\n}\n\nfunction validateAttributes(\n attributes: Record<string, string> | undefined,\n): void {\n if (attributes === undefined) {\n return;\n }\n\n for (const [name, value] of Object.entries(attributes)) {\n const allowedValues = ALLOWED_ATTRIBUTES.get(name);\n if (allowedValues === undefined || !allowedValues.has(value)) {\n throw new Error(`Unsupported script attribute: ${name}`);\n }\n }\n}\n","\"use client\";\n\nimport {\n normalizeHostname,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\nimport {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { AdsContext, type AdsContextValue } from \"./context\";\nimport { preparePlanScripts } from \"./dom\";\nimport { requestConfig } from \"./request\";\nimport type { AdsProviderStatus } from \"./status\";\nimport { validatePageKey } from \"./validation\";\n\nexport type AdsProviderProps = {\n endpoint: string;\n pageKey: string;\n timeoutMs?: number;\n nonce?: string;\n onStatusChange?: (status: AdsProviderStatus) => void;\n children: ReactNode;\n};\n\ntype PageView = {\n key: string | null;\n sequence: number;\n id: string;\n};\n\nexport function AdsProvider({\n endpoint,\n pageKey,\n timeoutMs = 3000,\n nonce,\n onStatusChange,\n children,\n}: AdsProviderProps) {\n const providerId = useId();\n const callback = useRef(onStatusChange);\n callback.current = onStatusChange;\n const pageView = useRef<PageView>({ key: null, sequence: 0, id: \"\" });\n const [plan, setPlan] = useState<PublicConfig | null>(null);\n\n let validatedPageKey: string | null = null;\n try {\n validatedPageKey = validatePageKey(pageKey);\n } catch {\n validatedPageKey = null;\n }\n const pageKeyIsValid = validatedPageKey !== null;\n\n if (validatedPageKey !== null && pageView.current.key !== validatedPageKey) {\n pageView.current = {\n key: validatedPageKey,\n sequence: pageView.current.sequence + 1,\n id: `${providerId}:${pageView.current.sequence + 1}`,\n };\n }\n\n useEffect(() => {\n let mounted = true;\n const emit = (status: AdsProviderStatus) => {\n if (mounted) callback.current?.(status);\n };\n\n if (!pageKeyIsValid) {\n setPlan(null);\n emit({ state: \"error\", reason: \"invalid pageKey\" });\n return () => {\n mounted = false;\n };\n }\n\n if (isLocalHostname(window.location.hostname)) {\n setPlan(null);\n emit({ state: \"disabled\", mode: \"none\" });\n return () => {\n mounted = false;\n };\n }\n\n const load = async () => {\n setPlan(null);\n emit({ state: \"loading-config\" });\n try {\n const nextPlan = await requestConfig(\n endpoint,\n normalizeHostname(window.location.hostname),\n timeoutMs,\n );\n if (!mounted) return;\n if (!nextPlan.enabled) {\n emit({ state: \"disabled\", mode: nextPlan.mode });\n return;\n }\n\n const elements = preparePlanScripts(nextPlan, nonce);\n setPlan(nextPlan);\n if (elements.length === 0) {\n emit({ state: \"ready\", mode: nextPlan.mode });\n return;\n }\n\n emit({ state: \"loading-scripts\", mode: nextPlan.mode });\n let pending = elements.length;\n let failed = false;\n const settle = (ok: boolean) => {\n failed ||= !ok;\n pending -= 1;\n if (pending === 0) {\n emit(\n failed\n ? { state: \"error\", reason: \"script_load_failed\" }\n : { state: \"ready\", mode: nextPlan.mode },\n );\n }\n };\n for (const element of elements) {\n element.addEventListener(\"load\", () => settle(true), { once: true });\n element.addEventListener(\"error\", () => settle(false), {\n once: true,\n });\n }\n document.head.append(...elements);\n } catch (error: unknown) {\n if (!mounted) return;\n setPlan(null);\n emit({\n state: \"error\",\n reason:\n error instanceof Error ? error.message : \"configuration_failed\",\n });\n }\n };\n\n void load();\n return () => {\n mounted = false;\n };\n }, [endpoint, nonce, pageKeyIsValid, timeoutMs]);\n\n const context = useMemo<AdsContextValue | null>(() => {\n if (plan === null || validatedPageKey === null) return null;\n return {\n providerId,\n pageViewId: pageView.current.id,\n plan,\n ...(nonce === undefined ? {} : { nonce }),\n };\n }, [nonce, plan, providerId, validatedPageKey]);\n\n return <AdsContext.Provider value={context}>{children}</AdsContext.Provider>;\n}\n\nfunction isLocalHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized.endsWith(\".localhost\") ||\n normalized === \"127.0.0.1\" ||\n normalized === \"[::1]\" ||\n normalized === \"::1\"\n );\n}\n","import type { PublicConfig } from \"@cunpingtai/shared-contract\";\nimport { createContext, useContext } from \"react\";\n\nexport type AdsContextValue = {\n providerId: string;\n pageViewId: string;\n plan: PublicConfig;\n nonce?: string;\n};\n\nexport const AdsContext = createContext<AdsContextValue | null>(null);\n\nexport function useAdsContext(): AdsContextValue | null {\n return useContext(AdsContext);\n}\n","import {\n dedupeAndValidateScripts,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\n\nexport function preparePlanScripts(\n plan: PublicConfig,\n nonce?: string,\n): HTMLScriptElement[] {\n const scripts = dedupeAndValidateScripts(\n plan.scripts,\n plan.allowedScriptHosts,\n );\n const existingIds = new Set(\n Array.from(\n document.querySelectorAll<HTMLScriptElement>(\n \"script[data-webad-script-id]\",\n ),\n (element) => element.dataset.webadScriptId,\n ),\n );\n const existingSources = new Set(\n Array.from(document.scripts, (element) => {\n try {\n return new URL(element.src, document.baseURI).toString();\n } catch {\n return \"\";\n }\n }),\n );\n\n const elements: HTMLScriptElement[] = [];\n for (const descriptor of scripts) {\n if (existingIds.has(descriptor.id) || existingSources.has(descriptor.src)) {\n continue;\n }\n\n const element = document.createElement(\"script\");\n element.dataset.webadScriptId = descriptor.id;\n element.src = descriptor.src;\n element.async = descriptor.async ?? false;\n element.defer = descriptor.defer ?? false;\n if (nonce !== undefined) {\n element.nonce = nonce;\n }\n for (const [name, value] of Object.entries(descriptor.attributes ?? {})) {\n element.setAttribute(name, value);\n }\n elements.push(element);\n }\n\n return elements;\n}\n","import {\n PublicConfigSchema,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\n\nconst requests = new Map<string, Promise<PublicConfig>>();\n\nexport function requestConfig(\n endpoint: string,\n host: string,\n timeoutMs: number,\n): Promise<PublicConfig> {\n const base = new URL(endpoint);\n const pathname = base.pathname.replace(/\\/+$/, \"\");\n const key = `${base.origin}${pathname}|${host}`;\n const existing = requests.get(key);\n if (existing !== undefined) {\n return existing;\n }\n\n const promise = (async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const url = new URL(`${pathname}/v1/config`, base.origin);\n url.searchParams.set(\"host\", host);\n const response = await fetch(url, {\n signal: controller.signal,\n credentials: \"omit\",\n });\n if (!response.ok) {\n throw new Error(`configuration request failed: ${response.status}`);\n }\n return PublicConfigSchema.parse(await response.json());\n } finally {\n clearTimeout(timeout);\n }\n })();\n\n requests.set(key, promise);\n return promise;\n}\n\nexport function clearRequestRegistryForTests(): void {\n requests.clear();\n}\n","const SLOT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CONTAINER_ID = /^[A-Za-z][A-Za-z0-9:_-]{0,127}$/;\nconst ZONE_KEY = /^[A-Za-z0-9]{1,128}$/;\nconst PARAM_KEY = /^[A-Za-z0-9_-]{1,64}$/;\nconst MAX_URL_LENGTH = 2048;\n\nexport type AdsterraParams = Record<string, string | number | boolean>;\n\nexport function validatePageKey(value: string): string {\n if (typeof value !== \"string\" || value.length < 1 || value.length > 2048) {\n throw new Error(\"invalid pageKey\");\n }\n return value;\n}\n\nexport function validateSlotId(value: string): string {\n if (typeof value !== \"string\" || value.length > 80 || !SLOT_ID.test(value)) {\n throw new Error(\"invalid slotId\");\n }\n return value;\n}\n\nexport function validateScriptUrl(\n value: string,\n allowedHosts: readonly string[],\n): string {\n const url = parseAbsoluteUrl(value, \"scriptSrc\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"scriptSrc must use HTTPS\");\n }\n if (!allowedHosts.some((host) => host.toLowerCase() === url.hostname)) {\n throw new Error(\"scriptSrc hostname is not allowed\");\n }\n return url.toString();\n}\n\nexport function validateComponentScriptUrl(value: string): string {\n const url = parseAbsoluteUrl(value, \"scriptSrc\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"scriptSrc must use HTTPS\");\n }\n if (/[\\t\\n\\r]/.test(value) || value.includes(\"#\") || hasExplicitPort(value)) {\n throw new Error(\"invalid scriptSrc\");\n }\n return url.toString();\n}\n\nexport function validateSmartlinkUrl(value: string): string {\n const url = parseAbsoluteUrl(value, \"smartlink href\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"smartlink href must use HTTPS\");\n }\n return url.toString();\n}\n\nexport function validateContainerId(value: string): string {\n if (typeof value !== \"string\" || !CONTAINER_ID.test(value)) {\n throw new Error(\"invalid containerId\");\n }\n return value;\n}\n\nexport function validateZoneKey(value: string): string {\n if (typeof value !== \"string\" || !ZONE_KEY.test(value)) {\n throw new Error(\"invalid zoneKey\");\n }\n return value;\n}\n\nexport function validateDimensions(\n width: number,\n height: number,\n): { width: number; height: number } {\n if (!validDimension(width) || !validDimension(height)) {\n throw new Error(\"invalid dimensions\");\n }\n return { width, height };\n}\n\nexport function validateParams(\n params: AdsterraParams | undefined,\n): AdsterraParams {\n if (params === undefined) {\n return {};\n }\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n throw new Error(\"invalid params\");\n }\n\n const entries = Object.entries(params);\n if (entries.length > 16) {\n throw new Error(\"invalid params\");\n }\n for (const [key, value] of entries) {\n if (!PARAM_KEY.test(key)) {\n throw new Error(\"invalid params\");\n }\n if (typeof value === \"string\") {\n if (value.length > 256) {\n throw new Error(\"invalid params\");\n }\n continue;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"invalid params\");\n }\n continue;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(\"invalid params\");\n }\n }\n\n return { ...params };\n}\n\nfunction parseAbsoluteUrl(value: string, name: string): URL {\n if (\n typeof value !== \"string\" ||\n value.length < 1 ||\n value.length > MAX_URL_LENGTH\n ) {\n throw new Error(`invalid ${name}`);\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`invalid ${name}`);\n }\n if (\n url.username !== \"\" ||\n url.password !== \"\" ||\n url.port !== \"\" ||\n url.hash !== \"\"\n ) {\n throw new Error(`invalid ${name}`);\n }\n return url;\n}\n\nfunction hasExplicitPort(value: string): boolean {\n const source = value.trim();\n const schemeEnd = source.indexOf(\":\");\n if (schemeEnd < 0) {\n return false;\n }\n\n const remainder = source.slice(schemeEnd + 1).replace(/^[\\\\/]+/, \"\");\n const authorityEnd = remainder.search(/[\\\\/?#]/);\n const authority =\n authorityEnd < 0 ? remainder : remainder.slice(0, authorityEnd);\n const host = authority.slice(authority.lastIndexOf(\"@\") + 1);\n if (host.startsWith(\"[\")) {\n return host.includes(\"]:\");\n }\n return host.includes(\":\");\n}\n\nfunction validDimension(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 1 && value <= 2048;\n}\n","\"use client\";\n\nimport { useEffect, useRef, type CSSProperties } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimPageSlot, enqueueBanner } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport {\n type AdsterraParams,\n validateComponentScriptUrl,\n validateDimensions,\n validateParams,\n validateSlotId,\n validateZoneKey,\n} from \"./validation\";\n\nexport type AdsterraBannerProps = {\n placement: string;\n className?: string;\n style?: CSSProperties;\n};\n\ntype AtOptionsWindow = Window & {\n atOptions?: Record<string, unknown> | undefined;\n};\n\nexport function AdsterraBanner({\n placement,\n className,\n style,\n}: AdsterraBannerProps) {\n const context = useAdsContext();\n const containerRef = useRef<HTMLDivElement>(null);\n\n let validated:\n | {\n src: string;\n zoneKey: string;\n width: number;\n height: number;\n params: AdsterraParams;\n }\n | undefined;\n\n if (context !== null && isFormatAllowed(context.plan.mode, \"banner\")) {\n try {\n validateSlotId(placement);\n const managed = context.plan.adsterra?.placements[placement];\n if (managed?.kind === \"banner\") {\n const dimensions = validateDimensions(managed.width, managed.height);\n validated = {\n src: validateComponentScriptUrl(managed.scriptSrc),\n zoneKey: validateZoneKey(managed.zoneKey),\n ...dimensions,\n params: validateParams(managed.params),\n };\n }\n } catch {\n validated = undefined;\n }\n }\n\n useEffect(() => {\n const container = containerRef.current;\n if (context === null || validated === undefined || container === null) {\n return;\n }\n if (\n !claimPageSlot(\n document,\n context.providerId,\n context.pageViewId,\n placement,\n )\n ) {\n return;\n }\n\n void enqueueBanner(document, async () => {\n if (!container.isConnected) {\n return;\n }\n\n const targetWindow = window as AtOptionsWindow;\n const hadAtOptions = Object.hasOwn(targetWindow, \"atOptions\");\n const previousAtOptions = targetWindow.atOptions;\n targetWindow.atOptions = {\n key: validated.zoneKey,\n format: \"iframe\",\n width: validated.width,\n height: validated.height,\n params: validated.params,\n };\n\n try {\n await appendBannerScript(\n container,\n validated.src,\n placement,\n context.nonce,\n );\n } finally {\n if (hadAtOptions) {\n targetWindow.atOptions = previousAtOptions;\n } else {\n delete targetWindow.atOptions;\n }\n }\n }).catch(() => undefined);\n }, [context, placement, validated]);\n\n if (validated === undefined) {\n return null;\n }\n\n return (\n <div\n ref={containerRef}\n data-webad-banner-slot={placement}\n className={className}\n style={{ ...style, width: validated.width, minHeight: validated.height }}\n />\n );\n}\n\nfunction appendBannerScript(\n container: HTMLElement,\n src: string,\n slotId: string,\n nonce: string | undefined,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = src;\n script.async = false;\n script.dataset.webadSlotId = slotId;\n script.dataset.webadAdsterraFormat = \"banner\";\n if (nonce !== undefined) {\n script.nonce = nonce;\n }\n script.addEventListener(\"load\", () => resolve(), { once: true });\n script.addEventListener(\n \"error\",\n () => reject(new Error(\"Adsterra banner script failed to load\")),\n { once: true },\n );\n container.append(script);\n });\n}\n","type PageLifecycle = {\n pageViewId: string;\n slots: Set<string>;\n};\n\ntype DocumentLifecycle = {\n providers: Map<string, PageLifecycle>;\n formats: Set<\"social-bar\" | \"popunder\">;\n bannerQueue: Promise<void>;\n};\n\nconst lifecycles = new WeakMap<Document, DocumentLifecycle>();\n\nexport function claimPageSlot(\n document: Document,\n providerId: string,\n pageViewId: string,\n slotId: string,\n): boolean {\n const lifecycle = getLifecycle(document);\n let page = lifecycle.providers.get(providerId);\n if (page === undefined || page.pageViewId !== pageViewId) {\n page = { pageViewId, slots: new Set() };\n lifecycle.providers.set(providerId, page);\n }\n if (page.slots.has(slotId)) {\n return false;\n }\n page.slots.add(slotId);\n return true;\n}\n\nexport function claimDocumentFormat(\n document: Document,\n format: \"social-bar\" | \"popunder\",\n): boolean {\n const formats = getLifecycle(document).formats;\n if (formats.has(format)) {\n return false;\n }\n formats.add(format);\n return true;\n}\n\nexport function enqueueBanner(\n document: Document,\n job: () => Promise<void>,\n): Promise<void> {\n const lifecycle = getLifecycle(document);\n const result = lifecycle.bannerQueue.then(job);\n lifecycle.bannerQueue = result.catch(() => undefined);\n return result;\n}\n\nexport function clearLifecycleForTests(document: Document): void {\n lifecycles.delete(document);\n}\n\nfunction getLifecycle(document: Document): DocumentLifecycle {\n const existing = lifecycles.get(document);\n if (existing !== undefined) {\n return existing;\n }\n const lifecycle: DocumentLifecycle = {\n providers: new Map(),\n formats: new Set(),\n bannerQueue: Promise.resolve(),\n };\n lifecycles.set(document, lifecycle);\n return lifecycle;\n}\n","import type { AdMode } from \"@cunpingtai/shared-contract\";\n\nexport type AdsterraFormat =\n \"social-bar\" | \"native-banner\" | \"banner\" | \"smartlink\" | \"popunder\";\n\nconst FORMATS_BY_MODE: Record<AdMode, ReadonlySet<AdsterraFormat>> = {\n none: new Set(),\n adsense: new Set(),\n \"adsense-limited\": new Set([\"native-banner\", \"banner\"]),\n \"adsterra-safe\": new Set([\"native-banner\", \"banner\", \"smartlink\"]),\n \"adsterra-full\": new Set([\n \"native-banner\",\n \"banner\",\n \"smartlink\",\n \"social-bar\",\n \"popunder\",\n ]),\n};\n\nexport function isFormatAllowed(mode: AdMode, format: AdsterraFormat): boolean {\n return FORMATS_BY_MODE[mode].has(format);\n}\n","\"use client\";\n\nimport { useEffect, useRef, type CSSProperties } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimPageSlot } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport {\n validateComponentScriptUrl,\n validateContainerId,\n validateSlotId,\n} from \"./validation\";\n\nexport type AdsterraNativeBannerProps = {\n placement: string;\n className?: string;\n style?: CSSProperties;\n};\n\nexport function AdsterraNativeBanner({\n placement,\n className,\n style,\n}: AdsterraNativeBannerProps) {\n const context = useAdsContext();\n const containerRef = useRef<HTMLDivElement>(null);\n\n let validatedSrc: string | null = null;\n let validatedContainerId: string | null = null;\n if (context !== null && isFormatAllowed(context.plan.mode, \"native-banner\")) {\n try {\n validateSlotId(placement);\n const managed = context.plan.adsterra?.placements[placement];\n if (managed?.kind === \"native\") {\n validatedContainerId = validateContainerId(managed.containerId);\n validatedSrc = validateComponentScriptUrl(managed.scriptSrc);\n }\n } catch {\n validatedSrc = null;\n validatedContainerId = null;\n }\n }\n\n useEffect(() => {\n const container = containerRef.current;\n if (\n context === null ||\n validatedSrc === null ||\n validatedContainerId === null ||\n container === null ||\n document.getElementById(validatedContainerId) !== container\n ) {\n return;\n }\n if (\n !claimPageSlot(\n document,\n context.providerId,\n context.pageViewId,\n placement,\n )\n ) {\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = validatedSrc;\n script.async = true;\n script.dataset.cfasync = \"false\";\n script.dataset.webadSlotId = placement;\n if (context.nonce !== undefined) {\n script.nonce = context.nonce;\n }\n container.append(script);\n }, [context, placement, validatedContainerId, validatedSrc]);\n\n if (validatedSrc === null || validatedContainerId === null) {\n return null;\n }\n return (\n <div\n ref={containerRef}\n id={validatedContainerId}\n className={className}\n style={style}\n />\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributeAnchorTarget, ReactNode } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { isFormatAllowed } from \"./policy\";\nimport { validateSmartlinkUrl } from \"./validation\";\n\nexport type AdsterraSmartlinkProps = {\n children: ReactNode;\n target?: HTMLAttributeAnchorTarget;\n className?: string;\n};\n\nexport function AdsterraSmartlink({\n children,\n target = \"_blank\",\n className,\n}: AdsterraSmartlinkProps) {\n const context = useAdsContext();\n if (context === null || !isFormatAllowed(context.plan.mode, \"smartlink\")) {\n return null;\n }\n\n let validatedHref: string;\n try {\n const href = context.plan.adsterra?.smartlink?.href;\n if (href === undefined) return null;\n validatedHref = validateSmartlinkUrl(href);\n } catch {\n return null;\n }\n\n return (\n <a\n href={validatedHref}\n target={target}\n rel=\"noopener noreferrer sponsored\"\n className={className}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimDocumentFormat } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport { validateComponentScriptUrl } from \"./validation\";\n\nexport type AdsterraSocialBarProps = Record<string, never>;\n\nexport type AdsterraPopunderProps = Record<string, never>;\n\ntype PageScriptProps = {\n format: \"social-bar\" | \"popunder\";\n target: \"head\" | \"body\";\n};\n\nexport function AdsterraSocialBar(_props: AdsterraSocialBarProps) {\n return <PageScript format=\"social-bar\" target=\"body\" />;\n}\n\nexport function AdsterraPopunder(_props: AdsterraPopunderProps) {\n return <PageScript format=\"popunder\" target=\"head\" />;\n}\n\nfunction PageScript({ format, target }: PageScriptProps) {\n const context = useAdsContext();\n const slotId =\n format === \"social-bar\" ? \"global-social-bar\" : \"global-popunder\";\n\n useEffect(() => {\n if (context === null || !isFormatAllowed(context.plan.mode, format)) {\n return;\n }\n\n let validatedSrc: string;\n try {\n const managed =\n format === \"social-bar\"\n ? context.plan.adsterra?.socialBar\n : context.plan.adsterra?.popunder;\n if (managed === undefined) return;\n validatedSrc = validateComponentScriptUrl(managed.scriptSrc);\n } catch {\n return;\n }\n if (!claimDocumentFormat(document, format)) {\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = validatedSrc;\n script.async = false;\n script.dataset.webadAdsterraFormat = format;\n script.dataset.webadSlotId = slotId;\n if (context.nonce !== undefined) {\n script.nonce = context.nonce;\n }\n document[target].append(script);\n }, [context, format, slotId, target]);\n\n return null;\n}\n"],"mappings":";;;AAAO,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACNA,SAAS,KAAAA,UAAS;;;ACAlB,SAAS,SAAS;AAElB,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,iBAAiB;AAEvB,IAAM,sBAAsB,EAAE,MAAM;AAAA,EAClC,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,EAClB,EAAE,OAAO,EAAE,OAAO;AAAA,EAClB,EAAE,QAAQ;AACZ,CAAC;AAED,IAAM,uBAAuB,EAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,GAAG,mBAAmB,EACvD,OAAO,CAAC,WAAW,OAAO,KAAK,MAAM,EAAE,UAAU,IAAI;AAAA,EACpD,SAAS;AACX,CAAC;AAEI,IAAM,2BAA2B,EACrC,OAAO,EACP,IAAI,CAAC,EACL,IAAI,cAAc,EAClB,OAAO,kBAAkB,EAAE,SAAS,+BAA+B,CAAC;AAEhE,IAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,EACxB,WAAW;AAAA,EACX,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ;AAAA,EAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,EACvC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,EACxC,QAAQ;AACV,CAAC,EACA,OAAO;AAEH,IAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,EACxB,WAAW;AAAA,EACX,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY;AAC5C,CAAC,EACA,OAAO;AAEH,IAAM,0BAA0B,EAAE,mBAAmB,QAAQ;AAAA,EAClE;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,EAC9B;AAAA,EACC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,cAAc;AAAA,EAC9C;AACF,EACC,OAAO,CAAC,eAAe,OAAO,KAAK,UAAU,EAAE,UAAU,IAAI;AAAA,EAC5D,SAAS;AACX,CAAC;AAEH,IAAM,sBAAsB,EACzB,OAAO,EAAE,WAAW,yBAAyB,CAAC,EAC9C,OAAO;AAEV,IAAM,yBAAyB,EAC5B,OAAO,EAAE,MAAM,yBAAyB,CAAC,EACzC,OAAO;AAEH,IAAM,2BAA2B,EACrC,OAAO;AAAA,EACN,YAAY;AAAA,EACZ,WAAW,oBAAoB,SAAS;AAAA,EACxC,UAAU,oBAAoB,SAAS;AAAA,EACvC,WAAW,uBAAuB,SAAS;AAC7C,CAAC,EACA,OAAO;AAEV,SAAS,iBAAiB,OAAwB;AAChD,MAAI,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK,gBAAgB,KAAK,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WACE,IAAI,aAAa,YACjB,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,IAAI,SAAS,MACb,IAAI,SAAS;AAAA,EAEjB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,QAAM,YAAY,MAAM,QAAQ,GAAG;AACnC,MAAI,YAAY,EAAG,QAAO;AAC1B,QAAM,YAAY,MAAM,MAAM,YAAY,CAAC,EAAE,QAAQ,WAAW,EAAE;AAClE,QAAM,eAAe,UAAU,OAAO,SAAS;AAC/C,QAAM,YACJ,eAAe,IAAI,YAAY,UAAU,MAAM,GAAG,YAAY;AAChE,QAAM,OAAO,UAAU,MAAM,UAAU,YAAY,GAAG,IAAI,CAAC;AAC3D,SAAO,KAAK,WAAW,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,GAAG;AACvE;;;ADnGO,IAAM,yBAAyBC,GACnC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC5B,KAAKA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,EAC/B,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,YAAYA,GACT,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,IAAI,GAAG,CAAC,EACtC,OAAO,CAAC,eAAe,OAAO,KAAK,UAAU,EAAE,UAAU,GAAG;AAAA,IAC3D,SAAS;AAAA,EACX,CAAC,EACA,SAAS;AACd,CAAC,EACA,OAAO;AAEV,IAAM,uBAAuBA,GAC1B,OAAO;AAAA,EACN,SAASA,GACN,OAAO;AAAA,IACN,SAASA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACV,UAAUA,GACP,OAAO;AAAA,IACN,aAAaA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE;AAAA,IACnD,aAAaA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE;AAAA,EACrD,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAEV,IAAM,0BAA0BA,GAC7B,OAAO;AAAA,EACN,SAASA,GACN,OAAO;AAAA,IACN,SAASA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAC5D,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACZ,UAAUA,GACP,OAAO;AAAA,IACN,aAAaA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAC9D,aAAaA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAChE,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAEH,IAAM,qBAAqBA,GAC/B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ;AAAA,EACnB,aAAaA,GAAE,KAAK,QAAQ;AAAA,EAC5B,WAAW;AACb,CAAC,EACA,OAAO;AAEH,IAAM,mBAAmBA,GAC7B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ;AAAA,EACnB,MAAMA,GAAE,MAAM,CAACA,GAAE,KAAK,QAAQ,GAAGA,GAAE,QAAQ,SAAS,CAAC,CAAC;AAAA,EACtD,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,EAAE;AAAA,EACnC,WAAW;AAAA,EACX,UAAU,yBAAyB,SAAS;AAC9C,CAAC,EACA,OAAO;AAEH,IAAM,iBAAiBA,GAC3B,OAAO;AAAA,EACN,eAAeA,GAAE,QAAQ,CAAC;AAAA,EAC1B,UAAUA,GAAE,OAAO,EAAE,KAAK;AAAA,EAC1B,WAAWA,GAAE,IAAI,SAAS;AAAA,EAC1B,QAAQ;AAAA,EACR,OAAOA,GACJ,OAAOA,GAAE,OAAO,GAAG,gBAAgB,EACnC,OAAO,CAAC,UAAU,OAAO,KAAK,KAAK,EAAE,UAAU,KAAM;AAAA,IACpD,SAAS;AAAA,EACX,CAAC;AACL,CAAC,EACA,OAAO;AAEH,IAAM,qBAAqBA,GAC/B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,UAAUA,GAAE,OAAO,EAAE,KAAK;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/B,SAASA,GAAE,QAAQ;AAAA,EACnB,MAAMA,GAAE,KAAK,QAAQ;AAAA,EACrB,oBAAoBA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE;AAAA,EAC9D,SAASA,GAAE,MAAM,sBAAsB,EAAE,IAAI,EAAE;AAAA,EAC/C,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,UAAU,yBAAyB,SAAS;AAC9C,CAAC,EACA,OAAO;;;AElGV,IAAM,YAAY;AAEX,SAAS,kBAAkB,OAAuB;AACvD,MAAI,WAAW,MAAM,KAAK,EAAE,YAAY;AAExC,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AAEA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,MAAI,SAAS,WAAW,KAAK,SAAS,SAAS,KAAK;AAClD,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,SAAS,SAAS,MAAM,GAAG;AACjC,MAAI,OAAO,KAAK,CAAC,UAAU,MAAM,WAAW,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,GAAG;AACxE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,SAAO;AACT;;;ACpBA,IAAM,YAAY;AAElB,IAAM,qBAAqB,oBAAI,IAAiC;AAAA,EAC9D,CAAC,eAAe,oBAAI,IAAI,CAAC,aAAa,iBAAiB,CAAC,CAAC;AAAA,EACzD;AAAA,IACE;AAAA,IACA,oBAAI,IAAI;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAEM,SAAS,yBACd,OACA,cACoB;AACpB,QAAM,yBAAyB,IAAI;AAAA,IACjC,aAAa,IAAI,CAAC,aAAa,SAAS,YAAY,CAAC;AAAA,EACvD;AACA,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,UAA8B,CAAC;AAErC,aAAW,mBAAmB,OAAO;AACnC,UAAM,aAAa,uBAAuB,MAAM,eAAe;AAE/D,QAAI,CAAC,UAAU,KAAK,WAAW,EAAE,GAAG;AAClC,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,IAAI,WAAW,GAAG;AAAA,IAC9B,QAAQ;AACN,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAEA,QAAI,IAAI,aAAa,UAAU;AAC7B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,QAAI,IAAI,SAAS,IAAI;AACnB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,QAAI,CAAC,uBAAuB,IAAI,IAAI,SAAS,YAAY,CAAC,GAAG;AAC3D,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,QAAI,IAAI,KAAK,SAAS,GAAG,GAAG;AAC1B,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,uBAAmB,WAAW,UAAU;AAExC,UAAM,gBAAgB,IAAI,SAAS;AACnC,UAAM,iBAAiB,WAAW,IAAI,WAAW,EAAE;AACnD,QAAI,mBAAmB,UAAa,mBAAmB,eAAe;AACpE,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,eAAW,IAAI,WAAW,IAAI,aAAa;AAE3C,QAAI,YAAY,IAAI,aAAa,GAAG;AAClC;AAAA,IACF;AAEA,gBAAY,IAAI,aAAa;AAC7B,YAAQ,KAAK,EAAE,GAAG,YAAY,KAAK,cAAc,CAAC;AAAA,EACpD;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,YACM;AACN,MAAI,eAAe,QAAW;AAC5B;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,UAAM,gBAAgB,mBAAmB,IAAI,IAAI;AACjD,QAAI,kBAAkB,UAAa,CAAC,cAAc,IAAI,KAAK,GAAG;AAC5D,YAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AAAA,IACzD;AAAA,EACF;AACF;;;ACzFA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACZP,SAAS,eAAe,kBAAkB;AASnC,IAAM,aAAa,cAAsC,IAAI;AAE7D,SAAS,gBAAwC;AACtD,SAAO,WAAW,UAAU;AAC9B;;;ACTO,SAAS,mBACd,MACA,OACqB;AACrB,QAAM,UAAU;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,QAAM,cAAc,IAAI;AAAA,IACtB,MAAM;AAAA,MACJ,SAAS;AAAA,QACP;AAAA,MACF;AAAA,MACA,CAAC,YAAY,QAAQ,QAAQ;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,kBAAkB,IAAI;AAAA,IAC1B,MAAM,KAAK,SAAS,SAAS,CAAC,YAAY;AACxC,UAAI;AACF,eAAO,IAAI,IAAI,QAAQ,KAAK,SAAS,OAAO,EAAE,SAAS;AAAA,MACzD,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,WAAgC,CAAC;AACvC,aAAW,cAAc,SAAS;AAChC,QAAI,YAAY,IAAI,WAAW,EAAE,KAAK,gBAAgB,IAAI,WAAW,GAAG,GAAG;AACzE;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,YAAQ,QAAQ,gBAAgB,WAAW;AAC3C,YAAQ,MAAM,WAAW;AACzB,YAAQ,QAAQ,WAAW,SAAS;AACpC,YAAQ,QAAQ,WAAW,SAAS;AACpC,QAAI,UAAU,QAAW;AACvB,cAAQ,QAAQ;AAAA,IAClB;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,WAAW,cAAc,CAAC,CAAC,GAAG;AACvE,cAAQ,aAAa,MAAM,KAAK;AAAA,IAClC;AACA,aAAS,KAAK,OAAO;AAAA,EACvB;AAEA,SAAO;AACT;;;AC/CA,IAAM,WAAW,oBAAI,IAAmC;AAEjD,SAAS,cACd,UACA,MACA,WACuB;AACvB,QAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAM,WAAW,KAAK,SAAS,QAAQ,QAAQ,EAAE;AACjD,QAAM,MAAM,GAAG,KAAK,MAAM,GAAG,QAAQ,IAAI,IAAI;AAC7C,QAAM,WAAW,SAAS,IAAI,GAAG;AACjC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC9D,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,cAAc,KAAK,MAAM;AACxD,UAAI,aAAa,IAAI,QAAQ,IAAI;AACjC,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ,WAAW;AAAA,QACnB,aAAa;AAAA,MACf,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,iCAAiC,SAAS,MAAM,EAAE;AAAA,MACpE;AACA,aAAO,mBAAmB,MAAM,MAAM,SAAS,KAAK,CAAC;AAAA,IACvD,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG;AAEH,WAAS,IAAI,KAAK,OAAO;AACzB,SAAO;AACT;;;ACzCA,IAAM,UAAU;AAChB,IAAMC,gBAAe;AACrB,IAAMC,YAAW;AACjB,IAAMC,aAAY;AAClB,IAAMC,kBAAiB;AAIhB,SAAS,gBAAgB,OAAuB;AACrD,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,MAAM,SAAS,MAAM;AACxE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAAuB;AACpD,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,MAAM,CAAC,QAAQ,KAAK,KAAK,GAAG;AAC1E,UAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AACA,SAAO;AACT;AAgBO,SAAS,2BAA2B,OAAuB;AAChE,QAAM,MAAM,iBAAiB,OAAO,WAAW;AAC/C,MAAI,IAAI,aAAa,UAAU;AAC7B,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,MAAI,WAAW,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,KAAKC,iBAAgB,KAAK,GAAG;AAC3E,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AACA,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,QAAM,MAAM,iBAAiB,OAAO,gBAAgB;AACpD,MAAI,IAAI,aAAa,UAAU;AAC7B,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,oBAAoB,OAAuB;AACzD,MAAI,OAAO,UAAU,YAAY,CAACC,cAAa,KAAK,KAAK,GAAG;AAC1D,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAuB;AACrD,MAAI,OAAO,UAAU,YAAY,CAACC,UAAS,KAAK,KAAK,GAAG;AACtD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACA,SAAO;AACT;AAEO,SAAS,mBACd,OACA,QACmC;AACnC,MAAI,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,MAAM,GAAG;AACrD,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,eACd,QACgB;AAChB,MAAI,WAAW,QAAW;AACxB,WAAO,CAAC;AAAA,EACV;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AAEA,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,MAAI,QAAQ,SAAS,IAAI;AACvB,UAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,QAAI,CAACC,WAAU,KAAK,GAAG,GAAG;AACxB,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,MAAM,SAAS,KAAK;AACtB,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,OAAO;AACrB;AAEA,SAAS,iBAAiB,OAAe,MAAmB;AAC1D,MACE,OAAO,UAAU,YACjB,MAAM,SAAS,KACf,MAAM,SAASC,iBACf;AACA,UAAM,IAAI,MAAM,WAAW,IAAI,EAAE;AAAA,EACnC;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,IAAI,MAAM,WAAW,IAAI,EAAE;AAAA,EACnC;AACA,MACE,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,IAAI,SAAS,MACb,IAAI,SAAS,IACb;AACA,UAAM,IAAI,MAAM,WAAW,IAAI,EAAE;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAASJ,iBAAgB,OAAwB;AAC/C,QAAM,SAAS,MAAM,KAAK;AAC1B,QAAM,YAAY,OAAO,QAAQ,GAAG;AACpC,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,MAAM,YAAY,CAAC,EAAE,QAAQ,WAAW,EAAE;AACnE,QAAM,eAAe,UAAU,OAAO,SAAS;AAC/C,QAAM,YACJ,eAAe,IAAI,YAAY,UAAU,MAAM,GAAG,YAAY;AAChE,QAAM,OAAO,UAAU,MAAM,UAAU,YAAY,GAAG,IAAI,CAAC;AAC3D,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,KAAK,SAAS,IAAI;AAAA,EAC3B;AACA,SAAO,KAAK,SAAS,GAAG;AAC1B;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,OAAO,cAAc,KAAK,KAAK,SAAS,KAAK,SAAS;AAC/D;;;AJLS;AA1HF,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,aAAa,MAAM;AACzB,QAAM,WAAW,OAAO,cAAc;AACtC,WAAS,UAAU;AACnB,QAAM,WAAW,OAAiB,EAAE,KAAK,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;AACpE,QAAM,CAAC,MAAM,OAAO,IAAI,SAA8B,IAAI;AAE1D,MAAI,mBAAkC;AACtC,MAAI;AACF,uBAAmB,gBAAgB,OAAO;AAAA,EAC5C,QAAQ;AACN,uBAAmB;AAAA,EACrB;AACA,QAAM,iBAAiB,qBAAqB;AAE5C,MAAI,qBAAqB,QAAQ,SAAS,QAAQ,QAAQ,kBAAkB;AAC1E,aAAS,UAAU;AAAA,MACjB,KAAK;AAAA,MACL,UAAU,SAAS,QAAQ,WAAW;AAAA,MACtC,IAAI,GAAG,UAAU,IAAI,SAAS,QAAQ,WAAW,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,UAAU;AACd,UAAM,OAAO,CAAC,WAA8B;AAC1C,UAAI,QAAS,UAAS,UAAU,MAAM;AAAA,IACxC;AAEA,QAAI,CAAC,gBAAgB;AACnB,cAAQ,IAAI;AACZ,WAAK,EAAE,OAAO,SAAS,QAAQ,kBAAkB,CAAC;AAClD,aAAO,MAAM;AACX,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,gBAAgB,OAAO,SAAS,QAAQ,GAAG;AAC7C,cAAQ,IAAI;AACZ,WAAK,EAAE,OAAO,YAAY,MAAM,OAAO,CAAC;AACxC,aAAO,MAAM;AACX,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OAAO,YAAY;AACvB,cAAQ,IAAI;AACZ,WAAK,EAAE,OAAO,iBAAiB,CAAC;AAChC,UAAI;AACF,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA,kBAAkB,OAAO,SAAS,QAAQ;AAAA,UAC1C;AAAA,QACF;AACA,YAAI,CAAC,QAAS;AACd,YAAI,CAAC,SAAS,SAAS;AACrB,eAAK,EAAE,OAAO,YAAY,MAAM,SAAS,KAAK,CAAC;AAC/C;AAAA,QACF;AAEA,cAAM,WAAW,mBAAmB,UAAU,KAAK;AACnD,gBAAQ,QAAQ;AAChB,YAAI,SAAS,WAAW,GAAG;AACzB,eAAK,EAAE,OAAO,SAAS,MAAM,SAAS,KAAK,CAAC;AAC5C;AAAA,QACF;AAEA,aAAK,EAAE,OAAO,mBAAmB,MAAM,SAAS,KAAK,CAAC;AACtD,YAAI,UAAU,SAAS;AACvB,YAAI,SAAS;AACb,cAAM,SAAS,CAAC,OAAgB;AAC9B,qBAAW,CAAC;AACZ,qBAAW;AACX,cAAI,YAAY,GAAG;AACjB;AAAA,cACE,SACI,EAAE,OAAO,SAAS,QAAQ,qBAAqB,IAC/C,EAAE,OAAO,SAAS,MAAM,SAAS,KAAK;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AACA,mBAAW,WAAW,UAAU;AAC9B,kBAAQ,iBAAiB,QAAQ,MAAM,OAAO,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AACnE,kBAAQ,iBAAiB,SAAS,MAAM,OAAO,KAAK,GAAG;AAAA,YACrD,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,iBAAS,KAAK,OAAO,GAAG,QAAQ;AAAA,MAClC,SAAS,OAAgB;AACvB,YAAI,CAAC,QAAS;AACd,gBAAQ,IAAI;AACZ,aAAK;AAAA,UACH,OAAO;AAAA,UACP,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,KAAK;AACV,WAAO,MAAM;AACX,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,UAAU,OAAO,gBAAgB,SAAS,CAAC;AAE/C,QAAM,UAAU,QAAgC,MAAM;AACpD,QAAI,SAAS,QAAQ,qBAAqB,KAAM,QAAO;AACvD,WAAO;AAAA,MACL;AAAA,MACA,YAAY,SAAS,QAAQ;AAAA,MAC7B;AAAA,MACA,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,YAAY,gBAAgB,CAAC;AAE9C,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAO,SAAU,UAAS;AACxD;AAEA,SAAS,gBAAgB,UAA2B;AAClD,QAAM,aAAa,SAAS,YAAY;AACxC,SACE,eAAe,eACf,WAAW,SAAS,YAAY,KAChC,eAAe,eACf,eAAe,WACf,eAAe;AAEnB;;;AKxKA,SAAS,aAAAK,YAAW,UAAAC,eAAkC;;;ACStD,IAAM,aAAa,oBAAI,QAAqC;AAErD,SAAS,cACdC,WACA,YACA,YACA,QACS;AACT,QAAM,YAAY,aAAaA,SAAQ;AACvC,MAAI,OAAO,UAAU,UAAU,IAAI,UAAU;AAC7C,MAAI,SAAS,UAAa,KAAK,eAAe,YAAY;AACxD,WAAO,EAAE,YAAY,OAAO,oBAAI,IAAI,EAAE;AACtC,cAAU,UAAU,IAAI,YAAY,IAAI;AAAA,EAC1C;AACA,MAAI,KAAK,MAAM,IAAI,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,OAAK,MAAM,IAAI,MAAM;AACrB,SAAO;AACT;AAEO,SAAS,oBACdA,WACA,QACS;AACT,QAAM,UAAU,aAAaA,SAAQ,EAAE;AACvC,MAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,WAAO;AAAA,EACT;AACA,UAAQ,IAAI,MAAM;AAClB,SAAO;AACT;AAEO,SAAS,cACdA,WACA,KACe;AACf,QAAM,YAAY,aAAaA,SAAQ;AACvC,QAAM,SAAS,UAAU,YAAY,KAAK,GAAG;AAC7C,YAAU,cAAc,OAAO,MAAM,MAAM,MAAS;AACpD,SAAO;AACT;AAMA,SAAS,aAAaC,WAAuC;AAC3D,QAAM,WAAW,WAAW,IAAIA,SAAQ;AACxC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,YAA+B;AAAA,IACnC,WAAW,oBAAI,IAAI;AAAA,IACnB,SAAS,oBAAI,IAAI;AAAA,IACjB,aAAa,QAAQ,QAAQ;AAAA,EAC/B;AACA,aAAW,IAAIA,WAAU,SAAS;AAClC,SAAO;AACT;;;ACjEA,IAAM,kBAA+D;AAAA,EACnE,MAAM,oBAAI,IAAI;AAAA,EACd,SAAS,oBAAI,IAAI;AAAA,EACjB,mBAAmB,oBAAI,IAAI,CAAC,iBAAiB,QAAQ,CAAC;AAAA,EACtD,iBAAiB,oBAAI,IAAI,CAAC,iBAAiB,UAAU,WAAW,CAAC;AAAA,EACjE,iBAAiB,oBAAI,IAAI;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,SAAS,gBAAgB,MAAc,QAAiC;AAC7E,SAAO,gBAAgB,IAAI,EAAE,IAAI,MAAM;AACzC;;;AF+FI,gBAAAC,YAAA;AA1FG,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,UAAU,cAAc;AAC9B,QAAM,eAAeC,QAAuB,IAAI;AAEhD,MAAI;AAUJ,MAAI,YAAY,QAAQ,gBAAgB,QAAQ,KAAK,MAAM,QAAQ,GAAG;AACpE,QAAI;AACF,qBAAe,SAAS;AACxB,YAAM,UAAU,QAAQ,KAAK,UAAU,WAAW,SAAS;AAC3D,UAAI,SAAS,SAAS,UAAU;AAC9B,cAAM,aAAa,mBAAmB,QAAQ,OAAO,QAAQ,MAAM;AACnE,oBAAY;AAAA,UACV,KAAK,2BAA2B,QAAQ,SAAS;AAAA,UACjD,SAAS,gBAAgB,QAAQ,OAAO;AAAA,UACxC,GAAG;AAAA,UACH,QAAQ,eAAe,QAAQ,MAAM;AAAA,QACvC;AAAA,MACF;AAAA,IACF,QAAQ;AACN,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,YAAY,QAAQ,cAAc,UAAa,cAAc,MAAM;AACrE;AAAA,IACF;AACA,QACE,CAAC;AAAA,MACC;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF,GACA;AACA;AAAA,IACF;AAEA,SAAK,cAAc,UAAU,YAAY;AACvC,UAAI,CAAC,UAAU,aAAa;AAC1B;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,eAAe,OAAO,OAAO,cAAc,WAAW;AAC5D,YAAM,oBAAoB,aAAa;AACvC,mBAAa,YAAY;AAAA,QACvB,KAAK,UAAU;AAAA,QACf,QAAQ;AAAA,QACR,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,QAAQ,UAAU;AAAA,MACpB;AAEA,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,UAAE;AACA,YAAI,cAAc;AAChB,uBAAa,YAAY;AAAA,QAC3B,OAAO;AACL,iBAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC1B,GAAG,CAAC,SAAS,WAAW,SAAS,CAAC;AAElC,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,0BAAwB;AAAA,MACxB;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,OAAO,UAAU,OAAO,WAAW,UAAU,OAAO;AAAA;AAAA,EACzE;AAEJ;AAEA,SAAS,mBACP,WACA,KACA,QACA,OACe;AACf,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,QAAQ,cAAc;AAC7B,WAAO,QAAQ,sBAAsB;AACrC,QAAI,UAAU,QAAW;AACvB,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO,iBAAiB,QAAQ,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/D,WAAO;AAAA,MACL;AAAA,MACA,MAAM,OAAO,IAAI,MAAM,uCAAuC,CAAC;AAAA,MAC/D,EAAE,MAAM,KAAK;AAAA,IACf;AACA,cAAU,OAAO,MAAM;AAAA,EACzB,CAAC;AACH;;;AGlJA,SAAS,aAAAG,YAAW,UAAAC,eAAkC;AA8ElD,gBAAAC,YAAA;AA7DG,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,UAAU,cAAc;AAC9B,QAAM,eAAeC,QAAuB,IAAI;AAEhD,MAAI,eAA8B;AAClC,MAAI,uBAAsC;AAC1C,MAAI,YAAY,QAAQ,gBAAgB,QAAQ,KAAK,MAAM,eAAe,GAAG;AAC3E,QAAI;AACF,qBAAe,SAAS;AACxB,YAAM,UAAU,QAAQ,KAAK,UAAU,WAAW,SAAS;AAC3D,UAAI,SAAS,SAAS,UAAU;AAC9B,+BAAuB,oBAAoB,QAAQ,WAAW;AAC9D,uBAAe,2BAA2B,QAAQ,SAAS;AAAA,MAC7D;AAAA,IACF,QAAQ;AACN,qBAAe;AACf,6BAAuB;AAAA,IACzB;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QACE,YAAY,QACZ,iBAAiB,QACjB,yBAAyB,QACzB,cAAc,QACd,SAAS,eAAe,oBAAoB,MAAM,WAClD;AACA;AAAA,IACF;AACA,QACE,CAAC;AAAA,MACC;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF,GACA;AACA;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,QAAQ,UAAU;AACzB,WAAO,QAAQ,cAAc;AAC7B,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,cAAU,OAAO,MAAM;AAAA,EACzB,GAAG,CAAC,SAAS,WAAW,sBAAsB,YAAY,CAAC;AAE3D,MAAI,iBAAiB,QAAQ,yBAAyB,MAAM;AAC1D,WAAO;AAAA,EACT;AACA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACrDI,gBAAAG,YAAA;AApBG,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAA2B;AACzB,QAAM,UAAU,cAAc;AAC9B,MAAI,YAAY,QAAQ,CAAC,gBAAgB,QAAQ,KAAK,MAAM,WAAW,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,QAAQ,KAAK,UAAU,WAAW;AAC/C,QAAI,SAAS,OAAW,QAAO;AAC/B,oBAAgB,qBAAqB,IAAI;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA,KAAI;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;ACzCA,SAAS,aAAAC,kBAAiB;AAiBjB,gBAAAC,YAAA;AADF,SAAS,kBAAkB,QAAgC;AAChE,SAAO,gBAAAA,KAAC,cAAW,QAAO,cAAa,QAAO,QAAO;AACvD;AAEO,SAAS,iBAAiB,QAA+B;AAC9D,SAAO,gBAAAA,KAAC,cAAW,QAAO,YAAW,QAAO,QAAO;AACrD;AAEA,SAAS,WAAW,EAAE,QAAQ,OAAO,GAAoB;AACvD,QAAM,UAAU,cAAc;AAC9B,QAAM,SACJ,WAAW,eAAe,sBAAsB;AAElD,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY,QAAQ,CAAC,gBAAgB,QAAQ,KAAK,MAAM,MAAM,GAAG;AACnE;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,UACJ,WAAW,eACP,QAAQ,KAAK,UAAU,YACvB,QAAQ,KAAK,UAAU;AAC7B,UAAI,YAAY,OAAW;AAC3B,qBAAe,2BAA2B,QAAQ,SAAS;AAAA,IAC7D,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,UAAU,MAAM,GAAG;AAC1C;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,QAAQ,sBAAsB;AACrC,WAAO,QAAQ,cAAc;AAC7B,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,aAAS,MAAM,EAAE,OAAO,MAAM;AAAA,EAChC,GAAG,CAAC,SAAS,QAAQ,QAAQ,MAAM,CAAC;AAEpC,SAAO;AACT;","names":["z","z","CONTAINER_ID","ZONE_KEY","PARAM_KEY","MAX_URL_LENGTH","hasExplicitPort","CONTAINER_ID","ZONE_KEY","PARAM_KEY","MAX_URL_LENGTH","useEffect","useRef","document","document","jsx","useRef","useEffect","useEffect","useRef","jsx","useRef","useEffect","jsx","useEffect","jsx","useEffect"]}
1
+ {"version":3,"sources":["../../shared-contract/src/types.ts","../../shared-contract/src/schemas.ts","../../shared-contract/src/adsterra.ts","../../shared-contract/src/hostname.ts","../../shared-contract/src/scripts.ts","../src/AdsProvider.tsx","../src/context.ts","../src/dom.ts","../src/request.ts","../src/validation.ts","../src/AdsterraBanner.tsx","../src/lifecycle.ts","../src/policy.ts","../src/AdsterraNativeBanner.tsx","../src/AdsterraSmartlink.tsx","../src/page-scripts.tsx"],"sourcesContent":["export const AD_MODES = [\n \"none\",\n \"adsense\",\n \"adsense-limited\",\n \"adsterra-safe\",\n \"adsterra-full\",\n] as const;\n\nexport type AdMode = (typeof AD_MODES)[number];\nexport type SiteMode = AdMode | \"inherit\";\n\nexport interface ScriptDescriptor {\n id: string;\n src: string;\n async?: boolean | undefined;\n defer?: boolean | undefined;\n attributes?: Record<string, string> | undefined;\n}\n\nexport interface ProviderConfig {\n adsense: {\n scripts: ScriptDescriptor[];\n };\n adsterra: {\n safeScripts: ScriptDescriptor[];\n fullScripts: ScriptDescriptor[];\n };\n}\n\nexport interface ProviderOverrides {\n adsense?:\n | {\n scripts?: ScriptDescriptor[] | undefined;\n }\n | undefined;\n adsterra?:\n | {\n safeScripts?: ScriptDescriptor[] | undefined;\n fullScripts?: ScriptDescriptor[] | undefined;\n }\n | undefined;\n}\n\nexport type AdsterraValue = string | number | boolean;\nexport type AdsterraParams = Record<string, AdsterraValue>;\n\nexport interface AdsterraBannerPlacement {\n kind: \"banner\";\n scriptSrc: string;\n zoneKey: string;\n width: number;\n height: number;\n params: AdsterraParams;\n}\n\nexport interface AdsterraNativePlacement {\n kind: \"native\";\n scriptSrc: string;\n containerId: string;\n}\n\nexport type AdsterraPlacement =\n AdsterraBannerPlacement | AdsterraNativePlacement;\n\nexport interface SiteAdsterraConfig {\n placements: Record<string, AdsterraPlacement>;\n socialBar?: { scriptSrc: string } | undefined;\n popunder?: { scriptSrc: string } | undefined;\n smartlink?: { href: string } | undefined;\n}\n\nexport interface GlobalConfig {\n enabled: boolean;\n defaultMode: AdMode;\n providers: ProviderConfig;\n}\n\nexport interface SiteConfig {\n enabled: boolean;\n mode: SiteMode;\n aliases: string[];\n providers: ProviderOverrides;\n adsterra?: SiteAdsterraConfig | undefined;\n}\n\nexport interface Snapshot {\n schemaVersion: 1;\n revision: string;\n updatedAt: string;\n global: GlobalConfig;\n sites: Record<string, SiteConfig>;\n}\n\nexport interface PublicConfig {\n version: 1;\n revision: string;\n site: string;\n enabled: boolean;\n mode: AdMode;\n allowedScriptHosts: string[];\n scripts: ScriptDescriptor[];\n ttlSeconds: number;\n adsterra?: SiteAdsterraConfig | undefined;\n}\n","import { z } from \"zod\";\n\nimport { AD_MODES } from \"./types\";\nimport { SiteAdsterraConfigSchema } from \"./adsterra\";\n\nexport const ScriptDescriptorSchema = z\n .object({\n id: z.string().min(1).max(80),\n src: z.string().min(1).max(2048),\n async: z.boolean().optional(),\n defer: z.boolean().optional(),\n attributes: z\n .record(z.string(), z.string().max(256))\n .refine((attributes) => Object.keys(attributes).length <= 8, {\n message: \"Attributes must contain at most 8 keys\",\n })\n .optional(),\n })\n .strict();\n\nconst ProviderConfigSchema = z\n .object({\n adsense: z\n .object({\n scripts: z.array(ScriptDescriptorSchema).max(16),\n })\n .strict(),\n adsterra: z\n .object({\n safeScripts: z.array(ScriptDescriptorSchema).max(16),\n fullScripts: z.array(ScriptDescriptorSchema).max(16),\n })\n .strict(),\n })\n .strict();\n\nconst ProviderOverridesSchema = z\n .object({\n adsense: z\n .object({\n scripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n })\n .strict()\n .optional(),\n adsterra: z\n .object({\n safeScripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n fullScripts: z.array(ScriptDescriptorSchema).max(16).optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const GlobalConfigSchema = z\n .object({\n enabled: z.boolean(),\n defaultMode: z.enum(AD_MODES),\n providers: ProviderConfigSchema,\n })\n .strict();\n\nexport const SiteConfigSchema = z\n .object({\n enabled: z.boolean(),\n mode: z.union([z.enum(AD_MODES), z.literal(\"inherit\")]),\n aliases: z.array(z.string()).max(32),\n providers: ProviderOverridesSchema,\n adsterra: SiteAdsterraConfigSchema.optional(),\n })\n .strict();\n\nexport const SnapshotSchema = z\n .object({\n schemaVersion: z.literal(1),\n revision: z.string().uuid(),\n updatedAt: z.iso.datetime(),\n global: GlobalConfigSchema,\n sites: z\n .record(z.string(), SiteConfigSchema)\n .refine((sites) => Object.keys(sites).length <= 1000, {\n message: \"Sites must contain at most 1000 entries\",\n }),\n })\n .strict();\n\nexport const PublicConfigSchema = z\n .object({\n version: z.literal(1),\n revision: z.string().uuid(),\n site: z.string().min(1).max(253),\n enabled: z.boolean(),\n mode: z.enum(AD_MODES),\n allowedScriptHosts: z.array(z.string().min(1).max(253)).max(64),\n scripts: z.array(ScriptDescriptorSchema).max(32),\n ttlSeconds: z.number().int().min(0).max(300),\n adsterra: SiteAdsterraConfigSchema.optional(),\n })\n .strict();\n","import { z } from \"zod\";\n\nconst PLACEMENT_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CONTAINER_ID = /^[A-Za-z][A-Za-z0-9:_-]{0,127}$/;\nconst ZONE_KEY = /^[A-Za-z0-9]{1,128}$/;\nconst PARAM_KEY = /^[A-Za-z0-9_-]{1,64}$/;\nconst MAX_URL_LENGTH = 2048;\n\nconst AdsterraValueSchema = z.union([\n z.string().max(256),\n z.number().finite(),\n z.boolean(),\n]);\n\nconst AdsterraParamsSchema = z\n .record(z.string().regex(PARAM_KEY), AdsterraValueSchema)\n .refine((params) => Object.keys(params).length <= 16, {\n message: \"Adsterra params must contain at most 16 entries\",\n });\n\nexport const ManagedAdsterraUrlSchema = z\n .string()\n .min(1)\n .max(MAX_URL_LENGTH)\n .refine(isSafeManagedUrl, { message: \"Invalid managed Adsterra URL\" });\n\nexport const AdsterraBannerPlacementSchema = z\n .object({\n kind: z.literal(\"banner\"),\n scriptSrc: ManagedAdsterraUrlSchema,\n zoneKey: z.string().regex(ZONE_KEY),\n width: z.number().int().min(1).max(2048),\n height: z.number().int().min(1).max(2048),\n params: AdsterraParamsSchema,\n })\n .strict();\n\nexport const AdsterraNativePlacementSchema = z\n .object({\n kind: z.literal(\"native\"),\n scriptSrc: ManagedAdsterraUrlSchema,\n containerId: z.string().regex(CONTAINER_ID),\n })\n .strict();\n\nexport const AdsterraPlacementSchema = z.discriminatedUnion(\"kind\", [\n AdsterraBannerPlacementSchema,\n AdsterraNativePlacementSchema,\n]);\n\nconst AdsterraPlacementsSchema = z\n .record(\n z.string().min(1).max(80).regex(PLACEMENT_NAME),\n AdsterraPlacementSchema,\n )\n .refine((placements) => Object.keys(placements).length <= 64, {\n message: \"A site may contain at most 64 Adsterra placements\",\n });\n\nconst ManagedScriptSchema = z\n .object({ scriptSrc: ManagedAdsterraUrlSchema })\n .strict();\n\nconst ManagedSmartlinkSchema = z\n .object({ href: ManagedAdsterraUrlSchema })\n .strict();\n\nexport const SiteAdsterraConfigSchema = z\n .object({\n placements: AdsterraPlacementsSchema,\n socialBar: ManagedScriptSchema.optional(),\n popunder: ManagedScriptSchema.optional(),\n smartlink: ManagedSmartlinkSchema.optional(),\n })\n .strict();\n\nfunction isSafeManagedUrl(value: string): boolean {\n if (/\\s/.test(value) || value.includes(\"#\") || hasExplicitPort(value)) {\n return false;\n }\n\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.port === \"\" &&\n url.hash === \"\"\n );\n } catch {\n return false;\n }\n}\n\nfunction hasExplicitPort(value: string): boolean {\n const schemeEnd = value.indexOf(\":\");\n if (schemeEnd < 0) return false;\n const remainder = value.slice(schemeEnd + 1).replace(/^[\\\\/]+/, \"\");\n const authorityEnd = remainder.search(/[\\\\/?#]/);\n const authority =\n authorityEnd < 0 ? remainder : remainder.slice(0, authorityEnd);\n const host = authority.slice(authority.lastIndexOf(\"@\") + 1);\n return host.startsWith(\"[\") ? host.includes(\"]:\") : host.includes(\":\");\n}\n","const DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\nexport function normalizeHostname(input: string): string {\n let hostname = input.trim().toLowerCase();\n\n if (hostname.endsWith(\".\")) {\n hostname = hostname.slice(0, -1);\n }\n\n if (hostname.includes(\":\")) {\n throw new Error(\"Hostname must not include a port\");\n }\n\n if (hostname.length === 0 || hostname.length > 253) {\n throw new Error(\"Invalid hostname length\");\n }\n\n const labels = hostname.split(\".\");\n if (labels.some((label) => label.length === 0 || !DNS_LABEL.test(label))) {\n throw new Error(\"Invalid hostname\");\n }\n\n return hostname;\n}\n","import { ScriptDescriptorSchema } from \"./schemas\";\nimport type { ScriptDescriptor } from \"./types\";\n\nconst SCRIPT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nconst ALLOWED_ATTRIBUTES = new Map<string, ReadonlySet<string>>([\n [\"crossorigin\", new Set([\"anonymous\", \"use-credentials\"])],\n [\n \"referrerpolicy\",\n new Set([\n \"no-referrer\",\n \"no-referrer-when-downgrade\",\n \"origin\",\n \"origin-when-cross-origin\",\n \"same-origin\",\n \"strict-origin\",\n \"strict-origin-when-cross-origin\",\n ]),\n ],\n]);\n\nexport function dedupeAndValidateScripts(\n input: readonly ScriptDescriptor[],\n allowedHosts: readonly string[],\n): ScriptDescriptor[] {\n const normalizedAllowedHosts = new Set(\n allowedHosts.map((hostname) => hostname.toLowerCase()),\n );\n const sourceById = new Map<string, string>();\n const seenSources = new Set<string>();\n const scripts: ScriptDescriptor[] = [];\n\n for (const inputDescriptor of input) {\n const descriptor = ScriptDescriptorSchema.parse(inputDescriptor);\n\n if (!SCRIPT_ID.test(descriptor.id)) {\n throw new Error(\"Invalid script ID\");\n }\n\n let url: URL;\n try {\n url = new URL(descriptor.src);\n } catch {\n throw new Error(\"Invalid script URL\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"Script URL must use HTTPS\");\n }\n\n if (url.port !== \"\") {\n throw new Error(\"Script URL must not include a port\");\n }\n\n if (!normalizedAllowedHosts.has(url.hostname.toLowerCase())) {\n throw new Error(\"Script URL hostname is not allowed\");\n }\n\n if (url.href.includes(\"#\")) {\n throw new Error(\"Script URL must not include a fragment\");\n }\n\n validateAttributes(descriptor.attributes);\n\n const normalizedSrc = url.toString();\n const previousSource = sourceById.get(descriptor.id);\n if (previousSource !== undefined && previousSource !== normalizedSrc) {\n throw new Error(\"Script ID must not reference multiple URLs\");\n }\n sourceById.set(descriptor.id, normalizedSrc);\n\n if (seenSources.has(normalizedSrc)) {\n continue;\n }\n\n seenSources.add(normalizedSrc);\n scripts.push({ ...descriptor, src: normalizedSrc });\n }\n\n return scripts;\n}\n\nfunction validateAttributes(\n attributes: Record<string, string> | undefined,\n): void {\n if (attributes === undefined) {\n return;\n }\n\n for (const [name, value] of Object.entries(attributes)) {\n const allowedValues = ALLOWED_ATTRIBUTES.get(name);\n if (allowedValues === undefined || !allowedValues.has(value)) {\n throw new Error(`Unsupported script attribute: ${name}`);\n }\n }\n}\n","\"use client\";\n\nimport {\n normalizeHostname,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\nimport {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { AdsContext, type AdsContextValue } from \"./context\";\nimport { preparePlanScripts } from \"./dom\";\nimport { requestConfig } from \"./request\";\nimport type { AdsProviderStatus } from \"./status\";\nimport { validatePageKey } from \"./validation\";\n\nexport type AdsProviderProps = {\n endpoint: string;\n pageKey: string;\n timeoutMs?: number;\n nonce?: string;\n onStatusChange?: (status: AdsProviderStatus) => void;\n children: ReactNode;\n};\n\ntype PageView = {\n key: string | null;\n sequence: number;\n id: string;\n};\n\nexport function AdsProvider({\n endpoint,\n pageKey,\n timeoutMs = 3000,\n nonce,\n onStatusChange,\n children,\n}: AdsProviderProps) {\n const providerId = useId();\n const callback = useRef(onStatusChange);\n callback.current = onStatusChange;\n const pageView = useRef<PageView>({ key: null, sequence: 0, id: \"\" });\n const [plan, setPlan] = useState<PublicConfig | null>(null);\n\n let validatedPageKey: string | null = null;\n try {\n validatedPageKey = validatePageKey(pageKey);\n } catch {\n validatedPageKey = null;\n }\n const pageKeyIsValid = validatedPageKey !== null;\n\n if (validatedPageKey !== null && pageView.current.key !== validatedPageKey) {\n pageView.current = {\n key: validatedPageKey,\n sequence: pageView.current.sequence + 1,\n id: `${providerId}:${pageView.current.sequence + 1}`,\n };\n }\n\n useEffect(() => {\n let mounted = true;\n const emit = (status: AdsProviderStatus) => {\n if (mounted) callback.current?.(status);\n };\n\n if (!pageKeyIsValid) {\n setPlan(null);\n emit({ state: \"error\", reason: \"invalid pageKey\" });\n return () => {\n mounted = false;\n };\n }\n\n if (isLocalHostname(window.location.hostname)) {\n setPlan(null);\n emit({ state: \"disabled\", mode: \"none\" });\n return () => {\n mounted = false;\n };\n }\n\n const load = async () => {\n setPlan(null);\n emit({ state: \"loading-config\" });\n try {\n const nextPlan = await requestConfig(\n endpoint,\n normalizeHostname(window.location.hostname),\n timeoutMs,\n );\n if (!mounted) return;\n if (!nextPlan.enabled) {\n emit({ state: \"disabled\", mode: nextPlan.mode });\n return;\n }\n\n const elements = preparePlanScripts(nextPlan, nonce);\n setPlan(nextPlan);\n if (elements.length === 0) {\n emit({ state: \"ready\", mode: nextPlan.mode });\n return;\n }\n\n emit({ state: \"loading-scripts\", mode: nextPlan.mode });\n let pending = elements.length;\n let failed = false;\n const settle = (ok: boolean) => {\n failed ||= !ok;\n pending -= 1;\n if (pending === 0) {\n emit(\n failed\n ? { state: \"error\", reason: \"script_load_failed\" }\n : { state: \"ready\", mode: nextPlan.mode },\n );\n }\n };\n for (const element of elements) {\n element.addEventListener(\"load\", () => settle(true), { once: true });\n element.addEventListener(\"error\", () => settle(false), {\n once: true,\n });\n }\n document.head.append(...elements);\n } catch (error: unknown) {\n if (!mounted) return;\n setPlan(null);\n emit({\n state: \"error\",\n reason:\n error instanceof Error ? error.message : \"configuration_failed\",\n });\n }\n };\n\n void load();\n return () => {\n mounted = false;\n };\n }, [endpoint, nonce, pageKeyIsValid, timeoutMs]);\n\n const context = useMemo<AdsContextValue | null>(() => {\n if (plan === null || validatedPageKey === null) return null;\n return {\n providerId,\n pageViewId: pageView.current.id,\n plan,\n ...(nonce === undefined ? {} : { nonce }),\n };\n }, [nonce, plan, providerId, validatedPageKey]);\n\n return <AdsContext.Provider value={context}>{children}</AdsContext.Provider>;\n}\n\nfunction isLocalHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n return (\n normalized === \"localhost\" ||\n normalized.endsWith(\".localhost\") ||\n normalized === \"127.0.0.1\" ||\n normalized === \"[::1]\" ||\n normalized === \"::1\"\n );\n}\n","import type { PublicConfig } from \"@cunpingtai/shared-contract\";\nimport { createContext, useContext } from \"react\";\n\nexport type AdsContextValue = {\n providerId: string;\n pageViewId: string;\n plan: PublicConfig;\n nonce?: string;\n};\n\nexport const AdsContext = createContext<AdsContextValue | null>(null);\n\nexport function useAdsContext(): AdsContextValue | null {\n return useContext(AdsContext);\n}\n","import {\n dedupeAndValidateScripts,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\n\nexport function preparePlanScripts(\n plan: PublicConfig,\n nonce?: string,\n): HTMLScriptElement[] {\n const scripts = dedupeAndValidateScripts(\n plan.scripts,\n plan.allowedScriptHosts,\n );\n const existingIds = new Set(\n Array.from(\n document.querySelectorAll<HTMLScriptElement>(\n \"script[data-webad-script-id]\",\n ),\n (element) => element.dataset.webadScriptId,\n ),\n );\n const existingSources = new Set(\n Array.from(document.scripts, (element) => {\n try {\n return new URL(element.src, document.baseURI).toString();\n } catch {\n return \"\";\n }\n }),\n );\n\n const elements: HTMLScriptElement[] = [];\n for (const descriptor of scripts) {\n if (existingIds.has(descriptor.id) || existingSources.has(descriptor.src)) {\n continue;\n }\n\n const element = document.createElement(\"script\");\n element.dataset.webadScriptId = descriptor.id;\n element.src = descriptor.src;\n element.async = descriptor.async ?? false;\n element.defer = descriptor.defer ?? false;\n if (nonce !== undefined) {\n element.nonce = nonce;\n }\n for (const [name, value] of Object.entries(descriptor.attributes ?? {})) {\n element.setAttribute(name, value);\n }\n elements.push(element);\n }\n\n return elements;\n}\n","import {\n PublicConfigSchema,\n type PublicConfig,\n} from \"@cunpingtai/shared-contract\";\n\nconst requests = new Map<string, Promise<PublicConfig>>();\n\nexport function requestConfig(\n endpoint: string,\n host: string,\n timeoutMs: number,\n): Promise<PublicConfig> {\n const base = new URL(endpoint);\n const pathname = base.pathname.replace(/\\/+$/, \"\");\n const key = `${base.origin}${pathname}|${host}`;\n const existing = requests.get(key);\n if (existing !== undefined) {\n return existing;\n }\n\n const promise = (async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const url = new URL(`${pathname}/v1/config`, base.origin);\n url.searchParams.set(\"host\", host);\n const response = await fetch(url, {\n signal: controller.signal,\n credentials: \"omit\",\n });\n if (!response.ok) {\n throw new Error(`configuration request failed: ${response.status}`);\n }\n return PublicConfigSchema.parse(await response.json());\n } finally {\n clearTimeout(timeout);\n }\n })();\n\n requests.set(key, promise);\n return promise;\n}\n\nexport function clearRequestRegistryForTests(): void {\n requests.clear();\n}\n","const SLOT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst CONTAINER_ID = /^[A-Za-z][A-Za-z0-9:_-]{0,127}$/;\nconst ZONE_KEY = /^[A-Za-z0-9]{1,128}$/;\nconst PARAM_KEY = /^[A-Za-z0-9_-]{1,64}$/;\nconst MAX_URL_LENGTH = 2048;\n\nexport type AdsterraParams = Record<string, string | number | boolean>;\n\nexport function validatePageKey(value: string): string {\n if (typeof value !== \"string\" || value.length < 1 || value.length > 2048) {\n throw new Error(\"invalid pageKey\");\n }\n return value;\n}\n\nexport function validateSlotId(value: string): string {\n if (typeof value !== \"string\" || value.length > 80 || !SLOT_ID.test(value)) {\n throw new Error(\"invalid slotId\");\n }\n return value;\n}\n\nexport function validateScriptUrl(\n value: string,\n allowedHosts: readonly string[],\n): string {\n const url = parseAbsoluteUrl(value, \"scriptSrc\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"scriptSrc must use HTTPS\");\n }\n if (!allowedHosts.some((host) => host.toLowerCase() === url.hostname)) {\n throw new Error(\"scriptSrc hostname is not allowed\");\n }\n return url.toString();\n}\n\nexport function validateComponentScriptUrl(value: string): string {\n const url = parseAbsoluteUrl(value, \"scriptSrc\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"scriptSrc must use HTTPS\");\n }\n if (/[\\t\\n\\r]/.test(value) || value.includes(\"#\") || hasExplicitPort(value)) {\n throw new Error(\"invalid scriptSrc\");\n }\n return url.toString();\n}\n\nexport function validateSmartlinkUrl(value: string): string {\n const url = parseAbsoluteUrl(value, \"smartlink href\");\n if (url.protocol !== \"https:\") {\n throw new Error(\"smartlink href must use HTTPS\");\n }\n return url.toString();\n}\n\nexport function validateContainerId(value: string): string {\n if (typeof value !== \"string\" || !CONTAINER_ID.test(value)) {\n throw new Error(\"invalid containerId\");\n }\n return value;\n}\n\nexport function validateZoneKey(value: string): string {\n if (typeof value !== \"string\" || !ZONE_KEY.test(value)) {\n throw new Error(\"invalid zoneKey\");\n }\n return value;\n}\n\nexport function validateDimensions(\n width: number,\n height: number,\n): { width: number; height: number } {\n if (!validDimension(width) || !validDimension(height)) {\n throw new Error(\"invalid dimensions\");\n }\n return { width, height };\n}\n\nexport function validateParams(\n params: AdsterraParams | undefined,\n): AdsterraParams {\n if (params === undefined) {\n return {};\n }\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n throw new Error(\"invalid params\");\n }\n\n const entries = Object.entries(params);\n if (entries.length > 16) {\n throw new Error(\"invalid params\");\n }\n for (const [key, value] of entries) {\n if (!PARAM_KEY.test(key)) {\n throw new Error(\"invalid params\");\n }\n if (typeof value === \"string\") {\n if (value.length > 256) {\n throw new Error(\"invalid params\");\n }\n continue;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"invalid params\");\n }\n continue;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(\"invalid params\");\n }\n }\n\n return { ...params };\n}\n\nfunction parseAbsoluteUrl(value: string, name: string): URL {\n if (\n typeof value !== \"string\" ||\n value.length < 1 ||\n value.length > MAX_URL_LENGTH\n ) {\n throw new Error(`invalid ${name}`);\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`invalid ${name}`);\n }\n if (\n url.username !== \"\" ||\n url.password !== \"\" ||\n url.port !== \"\" ||\n url.hash !== \"\"\n ) {\n throw new Error(`invalid ${name}`);\n }\n return url;\n}\n\nfunction hasExplicitPort(value: string): boolean {\n const source = value.trim();\n const schemeEnd = source.indexOf(\":\");\n if (schemeEnd < 0) {\n return false;\n }\n\n const remainder = source.slice(schemeEnd + 1).replace(/^[\\\\/]+/, \"\");\n const authorityEnd = remainder.search(/[\\\\/?#]/);\n const authority =\n authorityEnd < 0 ? remainder : remainder.slice(0, authorityEnd);\n const host = authority.slice(authority.lastIndexOf(\"@\") + 1);\n if (host.startsWith(\"[\")) {\n return host.includes(\"]:\");\n }\n return host.includes(\":\");\n}\n\nfunction validDimension(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 1 && value <= 2048;\n}\n","\"use client\";\n\nimport { useEffect, useRef, type CSSProperties } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimPageSlot, enqueueBanner } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport {\n type AdsterraParams,\n validateComponentScriptUrl,\n validateDimensions,\n validateParams,\n validateSlotId,\n validateZoneKey,\n} from \"./validation\";\n\nexport type AdsterraBannerProps = {\n placement: string;\n className?: string;\n style?: CSSProperties;\n};\n\ntype AtOptionsWindow = Window & {\n atOptions?: Record<string, unknown> | undefined;\n};\n\nexport function AdsterraBanner({\n placement,\n className,\n style,\n}: AdsterraBannerProps) {\n const context = useAdsContext();\n const containerRef = useRef<HTMLDivElement>(null);\n\n let validated:\n | {\n src: string;\n zoneKey: string;\n width: number;\n height: number;\n params: AdsterraParams;\n }\n | undefined;\n\n if (context !== null && isFormatAllowed(context.plan.mode, \"banner\")) {\n try {\n validateSlotId(placement);\n const managed = context.plan.adsterra?.placements[placement];\n if (managed?.kind === \"banner\") {\n const dimensions = validateDimensions(managed.width, managed.height);\n validated = {\n src: validateComponentScriptUrl(managed.scriptSrc),\n zoneKey: validateZoneKey(managed.zoneKey),\n ...dimensions,\n params: validateParams(managed.params),\n };\n }\n } catch {\n validated = undefined;\n }\n }\n\n useEffect(() => {\n const container = containerRef.current;\n if (context === null || validated === undefined || container === null) {\n return;\n }\n if (\n !claimPageSlot(\n document,\n context.providerId,\n context.pageViewId,\n placement,\n )\n ) {\n return;\n }\n\n void enqueueBanner(document, async () => {\n if (!container.isConnected) {\n return;\n }\n\n const targetWindow = window as AtOptionsWindow;\n const hadAtOptions = Object.hasOwn(targetWindow, \"atOptions\");\n const previousAtOptions = targetWindow.atOptions;\n targetWindow.atOptions = {\n key: validated.zoneKey,\n format: \"iframe\",\n width: validated.width,\n height: validated.height,\n params: validated.params,\n };\n\n try {\n await appendBannerScript(\n container,\n validated.src,\n placement,\n context.nonce,\n );\n } finally {\n if (hadAtOptions) {\n targetWindow.atOptions = previousAtOptions;\n } else {\n delete targetWindow.atOptions;\n }\n }\n }).catch(() => undefined);\n }, [context, placement, validated]);\n\n if (validated === undefined) {\n return null;\n }\n\n return (\n <div\n ref={containerRef}\n data-webad-banner-slot={placement}\n className={className}\n style={{ ...style, width: validated.width, minHeight: validated.height }}\n />\n );\n}\n\nfunction appendBannerScript(\n container: HTMLElement,\n src: string,\n slotId: string,\n nonce: string | undefined,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = src;\n script.async = false;\n script.dataset.webadSlotId = slotId;\n script.dataset.webadAdsterraFormat = \"banner\";\n if (nonce !== undefined) {\n script.nonce = nonce;\n }\n script.addEventListener(\"load\", () => resolve(), { once: true });\n script.addEventListener(\n \"error\",\n () => reject(new Error(\"Adsterra banner script failed to load\")),\n { once: true },\n );\n container.append(script);\n });\n}\n","type PageLifecycle = {\n pageViewId: string;\n slots: Set<string>;\n};\n\ntype DocumentLifecycle = {\n providers: Map<string, PageLifecycle>;\n formats: Set<\"social-bar\" | \"popunder\">;\n bannerQueue: Promise<void>;\n};\n\nconst lifecycles = new WeakMap<Document, DocumentLifecycle>();\n\nexport function claimPageSlot(\n document: Document,\n providerId: string,\n pageViewId: string,\n slotId: string,\n): boolean {\n const lifecycle = getLifecycle(document);\n let page = lifecycle.providers.get(providerId);\n if (page === undefined || page.pageViewId !== pageViewId) {\n page = { pageViewId, slots: new Set() };\n lifecycle.providers.set(providerId, page);\n }\n if (page.slots.has(slotId)) {\n return false;\n }\n page.slots.add(slotId);\n return true;\n}\n\nexport function claimDocumentFormat(\n document: Document,\n format: \"social-bar\" | \"popunder\",\n): boolean {\n const formats = getLifecycle(document).formats;\n if (formats.has(format)) {\n return false;\n }\n formats.add(format);\n return true;\n}\n\nexport function enqueueBanner(\n document: Document,\n job: () => Promise<void>,\n): Promise<void> {\n const lifecycle = getLifecycle(document);\n const result = lifecycle.bannerQueue.then(job);\n lifecycle.bannerQueue = result.catch(() => undefined);\n return result;\n}\n\nexport function clearLifecycleForTests(document: Document): void {\n lifecycles.delete(document);\n}\n\nfunction getLifecycle(document: Document): DocumentLifecycle {\n const existing = lifecycles.get(document);\n if (existing !== undefined) {\n return existing;\n }\n const lifecycle: DocumentLifecycle = {\n providers: new Map(),\n formats: new Set(),\n bannerQueue: Promise.resolve(),\n };\n lifecycles.set(document, lifecycle);\n return lifecycle;\n}\n","import type { AdMode } from \"@cunpingtai/shared-contract\";\n\nexport type AdsterraFormat =\n \"social-bar\" | \"native-banner\" | \"banner\" | \"smartlink\" | \"popunder\";\n\nconst FORMATS_BY_MODE: Record<AdMode, ReadonlySet<AdsterraFormat>> = {\n none: new Set(),\n adsense: new Set(),\n \"adsense-limited\": new Set([\"native-banner\", \"banner\"]),\n \"adsterra-safe\": new Set([\n \"social-bar\",\n \"native-banner\",\n \"banner\",\n \"smartlink\",\n ]),\n \"adsterra-full\": new Set([\n \"native-banner\",\n \"banner\",\n \"smartlink\",\n \"social-bar\",\n \"popunder\",\n ]),\n};\n\nexport function isFormatAllowed(mode: AdMode, format: AdsterraFormat): boolean {\n return FORMATS_BY_MODE[mode].has(format);\n}\n","\"use client\";\n\nimport { useEffect, useRef, type CSSProperties } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimPageSlot } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport {\n validateComponentScriptUrl,\n validateContainerId,\n validateSlotId,\n} from \"./validation\";\n\nexport type AdsterraNativeBannerProps = {\n placement: string;\n className?: string;\n style?: CSSProperties;\n};\n\nexport function AdsterraNativeBanner({\n placement,\n className,\n style,\n}: AdsterraNativeBannerProps) {\n const context = useAdsContext();\n const containerRef = useRef<HTMLDivElement>(null);\n\n let validatedSrc: string | null = null;\n let validatedContainerId: string | null = null;\n if (context !== null && isFormatAllowed(context.plan.mode, \"native-banner\")) {\n try {\n validateSlotId(placement);\n const managed = context.plan.adsterra?.placements[placement];\n if (managed?.kind === \"native\") {\n validatedContainerId = validateContainerId(managed.containerId);\n validatedSrc = validateComponentScriptUrl(managed.scriptSrc);\n }\n } catch {\n validatedSrc = null;\n validatedContainerId = null;\n }\n }\n\n useEffect(() => {\n const container = containerRef.current;\n if (\n context === null ||\n validatedSrc === null ||\n validatedContainerId === null ||\n container === null ||\n document.getElementById(validatedContainerId) !== container\n ) {\n return;\n }\n if (\n !claimPageSlot(\n document,\n context.providerId,\n context.pageViewId,\n placement,\n )\n ) {\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = validatedSrc;\n script.async = true;\n script.dataset.cfasync = \"false\";\n script.dataset.webadSlotId = placement;\n if (context.nonce !== undefined) {\n script.nonce = context.nonce;\n }\n container.append(script);\n }, [context, placement, validatedContainerId, validatedSrc]);\n\n if (validatedSrc === null || validatedContainerId === null) {\n return null;\n }\n return (\n <div\n ref={containerRef}\n id={validatedContainerId}\n className={className}\n style={style}\n />\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributeAnchorTarget, ReactNode } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { isFormatAllowed } from \"./policy\";\nimport { validateSmartlinkUrl } from \"./validation\";\n\nexport type AdsterraSmartlinkProps = {\n children: ReactNode;\n target?: HTMLAttributeAnchorTarget;\n className?: string;\n};\n\nexport function AdsterraSmartlink({\n children,\n target = \"_blank\",\n className,\n}: AdsterraSmartlinkProps) {\n const context = useAdsContext();\n if (context === null || !isFormatAllowed(context.plan.mode, \"smartlink\")) {\n return null;\n }\n\n let validatedHref: string;\n try {\n const href = context.plan.adsterra?.smartlink?.href;\n if (href === undefined) return null;\n validatedHref = validateSmartlinkUrl(href);\n } catch {\n return null;\n }\n\n return (\n <a\n href={validatedHref}\n target={target}\n rel=\"noopener noreferrer sponsored\"\n className={className}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { useAdsContext } from \"./context\";\nimport { claimDocumentFormat } from \"./lifecycle\";\nimport { isFormatAllowed } from \"./policy\";\nimport { validateComponentScriptUrl } from \"./validation\";\n\nexport type AdsterraSocialBarProps = Record<string, never>;\n\nexport type AdsterraPopunderProps = Record<string, never>;\n\ntype PageScriptProps = {\n format: \"social-bar\" | \"popunder\";\n target: \"head\" | \"body\";\n};\n\nexport function AdsterraSocialBar(_props: AdsterraSocialBarProps) {\n return <PageScript format=\"social-bar\" target=\"body\" />;\n}\n\nexport function AdsterraPopunder(_props: AdsterraPopunderProps) {\n return <PageScript format=\"popunder\" target=\"head\" />;\n}\n\nfunction PageScript({ format, target }: PageScriptProps) {\n const context = useAdsContext();\n const slotId =\n format === \"social-bar\" ? \"global-social-bar\" : \"global-popunder\";\n\n useEffect(() => {\n if (context === null || !isFormatAllowed(context.plan.mode, format)) {\n return;\n }\n\n let validatedSrc: string;\n try {\n const managed =\n format === \"social-bar\"\n ? context.plan.adsterra?.socialBar\n : context.plan.adsterra?.popunder;\n if (managed === undefined) return;\n validatedSrc = validateComponentScriptUrl(managed.scriptSrc);\n } catch {\n return;\n }\n if (!claimDocumentFormat(document, format)) {\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = validatedSrc;\n script.async = false;\n script.dataset.webadAdsterraFormat = format;\n script.dataset.webadSlotId = slotId;\n if (context.nonce !== undefined) {\n script.nonce = context.nonce;\n }\n document[target].append(script);\n }, [context, format, slotId, target]);\n\n return null;\n}\n"],"mappings":"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","names":["z","z","CONTAINER_ID","ZONE_KEY","PARAM_KEY","MAX_URL_LENGTH","hasExplicitPort","CONTAINER_ID","ZONE_KEY","PARAM_KEY","MAX_URL_LENGTH","useEffect","useRef","document","document","jsx","useRef","useEffect","useEffect","useRef","jsx","useRef","useEffect","jsx","useEffect","jsx","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cunpingtai/webad-react-ad-scripts",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Fail-closed React loader for a WebAd monetization control plane",
5
5
  "license": "MIT",
6
6
  "type": "module",