diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..9765d145 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,97 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +rrweb is a web session recording and replay library. It records user interactions on web pages (DOM mutations, mouse movements, input events, etc.) and can replay them faithfully. The project is a TypeScript monorepo managed by Yarn workspaces and Turborepo. + +## Common Commands + +```bash +# Install dependencies (use yarn, NOT npm) +yarn install + +# Build all packages +yarn build:all + +# Watch mode for all packages (auto-rebuild on changes) +yarn dev + +# Run all tests across the monorepo +yarn test + +# Run tests for a specific package (run from package directory) +cd packages/rrweb && yarn test # builds then runs tests +cd packages/rrweb && yarn retest # runs tests without rebuild (faster) +cd packages/rrweb-snapshot && yarn test + +# Watch mode tests for a specific package +cd packages/rrweb && yarn test:watch + +# Update test snapshots +cd packages/rrweb && yarn test:update # or retest:update for no rebuild + +# Lint +yarn lint + +# Format +yarn format + +# Type check all packages +yarn check-types + +# REPL tool (interactive testing in browser) +yarn repl +``` + +## Architecture + +### Package Dependency Graph + +The core data flow is: **snapshot** captures DOM → **record** observes mutations → **replay** reconstructs events. + +``` +@rrweb/types (shared type definitions, no deps) +@rrweb/utils (shared utilities) +rrweb-snapshot (DOM serialization/deserialization, depends on types/utils) +rrdom / rrdom-nodejs (virtual DOM for Node.js environments) +rrweb (main package: record + replay, depends on all above) + ├── src/record/ (DOM mutation observers, event capture, canvas recording) + └── src/replay/ (event replay engine, timer, canvas replay, style injection) +rrweb-player (Svelte-based player UI) +@rrweb/all (convenience package combining record + replay) +@rrweb/packer (pack/unpack utilities for rrweb event data) +``` + +### Plugin System + +Plugins live in `packages/plugins/` and follow a record/replay pair pattern: +- `rrweb-plugin-console-record` / `rrweb-plugin-console-replay` — console logging +- `rrweb-plugin-canvas-webrtc-record` / `rrweb-plugin-canvas-webrtc-replay` — canvas via WebRTC +- `rrweb-plugin-sequential-id-record` / `rrweb-plugin-sequential-id-replay` — sequential IDs + +### Build System + +- **Turbo** orchestrates builds via `turbo.json` with task dependency graph +- Each package uses **Vite** in library mode (`vite.config.default.ts` shared config) +- Output formats: ES modules (`.js`), CommonJS (`.cjs`), UMD (`.umd.cjs`), plus TypeScript declarations (`.d.ts` / `.d.cts`) +- `DISABLE_WORKER_INLINING=true` env var disables worker inlining for Chrome extension builds +- Test runner is **Vitest** (some older packages still use Jest) +- Tests in `packages/rrweb` use **Puppeteer** for browser-based integration tests; set `PUPPETEER_HEADLESS=true` for headless mode + +### Key Source Paths + +- `packages/rrweb/src/record/` — recording logic (mutation observer, iframe/shadow-dom managers, canvas observers) +- `packages/rrweb/src/replay/` — replay engine (timer, state machine via @xstate/fsm, canvas replay, style injection) +- `packages/rrweb/src/entries/record.ts` / `replay.ts` — separate entry points for record-only or replay-only bundles +- `packages/rrweb-snapshot/src/snapshot.ts` — DOM → serializable data structure +- `packages/rrweb-snapshot/src/rebuild.ts` — serialized data → DOM reconstruction +- `packages/types/src/` — shared event types (`eventWithTime`, `EventType`, `IncrementalSource`) + +### ESLint Configuration + +- Uses `@typescript-eslint` with type-checked rules +- `camelCase` rule allows `rr_`, `legacy_`, `UNSAFE_`, `__rrweb_` prefixed identifiers +- TSDoc syntax is enforced via `eslint-plugin-tsdoc` +- Browser compatibility checked via `eslint-plugin-compat` diff --git a/docs/integration/superrpa-integration.zh_CN.md b/docs/integration/superrpa-integration.zh_CN.md new file mode 100644 index 00000000..2f61b114 --- /dev/null +++ b/docs/integration/superrpa-integration.zh_CN.md @@ -0,0 +1,819 @@ +# rrweb 与 SuperRPA 集成适配指南 + +本文档面向 SuperRPA(魔改版 Chromium)项目开发团队,说明如何将 rrweb 录制/回放能力集成到浏览器中。 + +--- + +## 1. rrweb 概述 + +rrweb 是一个 Web 页面操作录制与回放库。它通过以下机制工作: + +1. **全量快照 (Full Snapshot)**:将当前页面 DOM 树序列化为一个带唯一 ID 的 JSON 数据结构 +2. **增量快照 (Incremental Snapshot)**:通过 MutationObserver 和各种事件监听器,持续捕获 DOM 变更和用户交互 +3. **回放 (Replay)**:从全量快照重建 DOM,然后按时间戳顺序重放增量事件 + +所有录制产物都是纯 JSON 数据(`eventWithTime[]`),可序列化传输和持久存储。 + +### 录制覆盖的用户操作 + +| 类别 | 具体内容 | +|------|----------| +| DOM 变更 | 节点增删、属性变化、文本内容变化 | +| 鼠标操作 | 移动、点击、双击、右键、悬停 | +| 键盘输入 | 输入框文本变化、复选框/单选框状态 | +| 滚动 | 页面滚动、元素内滚动 | +| 触摸 | TouchStart、TouchMove、TouchEnd | +| Canvas | 2D 绑定调用记录、WebGL 调用记录 | +| 媒体 | 音视频播放、暂停、跳转、音量变化 | +| 样式 | CSS 规则增删改、行内样式变化 | +| 字体 | 动态加载的字体 | +| 文本选择 | 选区变化 | +| Shadow DOM | Shadow DOM 内的变更 | +| 自定义元素 | Custom Element 注册 | +| 跨域 iframe | 通过 postMessage 桥接录制 | + +--- + +## 2. 构建产物 + +### 2.1 构建 + +```bash +# 在 rrweb 项目根目录 +yarn install +yarn build:all +``` + +### 2.2 关键产物文件 + +| 文件 | 用途 | 大小参考 | +|------|------|----------| +| `packages/rrweb/dist/rrweb.umd.cjs` | 全量包(录制+回放),UMD 格式 | 较大 | +| `packages/rrweb/dist/rrweb.js` | 全量包,ESM 格式 | 较大 | +| `packages/record/dist/record.umd.cjs` | **仅录制**,UMD 格式(推荐用于注入) | ~40KB gzip | +| `packages/record/dist/record.js` | 仅录制,ESM 格式 | ~40KB gzip | +| `packages/replay/dist/replay.js` | 仅回放,ESM 格式 | ~50KB gzip | +| `packages/replay/dist/style.css` | 回放必需的 CSS 样式 | — | +| `packages/rrweb/dist/style.css` | 全量包回放样式 | — | + +**建议**:SuperRPA 注入录制脚本时,使用 `@rrweb/record`(仅录制)以减小注入体积。回放端使用 `@rrweb/replay` 或 `rrweb-player`。 + +### 2.3 UMD 全局变量名 + +注入后,rrweb 的 API 会挂载到全局变量上: + +- `rrweb.umd.cjs` → `window.rrweb`(包含 `record`、`Replayer`) +- `record.umd.cjs` → `window.rrwebRecord`(仅包含 `record`) + +--- + +## 3. 集成方案 + +SuperRPA 作为魔改版 Chromium,有以下几种集成方式: + +### 方案 A:通过 CDP 注入(推荐,改动最小) + +利用 Chrome DevTools Protocol 的 `Page.addScriptToEvaluateOnNewDocument` 在每个页面加载前注入录制脚本。 + +``` +┌─────────────────────────────────────────────┐ +│ SuperRPA (Chromium) │ +│ │ +│ ┌──────────┐ CDP ┌───────────────┐ │ +│ │ 控制层 │ ────────→ │ 渲染进程 │ │ +│ │ (Browser │ │ │ │ +│ │ Process)│ │ Web Page │ │ +│ │ │ │ ┌──────────┐ │ │ +│ │ 收集事件 │ ←──────── │ │ rrweb │ │ │ +│ │ 存储/转发 │ postMsg │ │ record() │ │ │ +│ └──────────┘ │ └──────────┘ │ │ +│ └───────────────┘ │ +└─────────────────────────────────────────────┘ +``` + +**步骤:** + +1. 读取录制脚本文件内容 +2. 在页面导航前通过 CDP 注入 + +```cpp +// C++ 侧伪代码(SuperRPA Browser Process) +std::string record_script = ReadFile("record.umd.cjs"); +std::string injection_code = record_script + R"( + (function() { + window.__rrweb_events = []; + window.__rrweb_stop = rrwebRecord.record({ + emit: function(event) { + // 方式1:存到全局变量,由 CDP 定时读取 + window.__rrweb_events.push(event); + // 方式2:通过 postMessage 发给 content script + window.postMessage({ + type: '__rrweb_event', + event: event + }, '*'); + } + }); + // 通知控制层录制已就绪 + window.postMessage({ type: '__rrweb_ready' }, '*'); + })(); +)"; + +// 通过 CDP 注入 +cdp_session->Send("Page.addScriptToEvaluateOnNewDocument", { + {"source", injection_code} +}); +``` + +```python +# Python 侧伪代码(如果用 Puppeteer/Playwright 驱动) +import json + +cdp = await page.context().new_cdp_session(page) +await cdp.send("Page.addScriptToEvaluateOnNewDocument", { + "source": record_script + """ + window.__rrweb_events = []; + window.__rrweb_stop = rrwebRecord.record({ + emit(event) { + window.__rrweb_events.push(event); + } + }); + """ +}) + +# 导航到目标页面 +await page.goto("https://example.com") + +# 定时采集事件 +events = await page.evaluate("window.__rrweb_events.splice(0)") + +# 停止录制 +await page.evaluate("window.__rrweb_stop()") +``` + +### 方案 B:Chromium 源码层注入(改动较大,性能最优) + +在 Chromium 的 `ContentRendererClient::RenderFrameCreated` 或 `RenderFrameImpl::DidCreateDocumentElement` 中直接注入。 + +```cpp +// content/renderer/render_frame_impl.cc 或对应的 SuperRPA 扩展点 +void SuperRPARenderFrameObserver::DidCreateDocumentElement() { + auto& web_frame = render_frame_->GetWebFrame(); + std::string script = Load rrweb_record_script + R"( + window.__rrweb_events = []; + window.__rrweb_stop = rrwebRecord.record({ + emit(event) { + window.__rrweb_events.push(event); + } + }); + )"; + + web_frame.ExecuteScript( + WebScriptSource(WebString::FromUTF8(script))); +} +``` + +### 方案 C:Chrome Extension 方式 + +rrweb 项目已包含一个浏览器扩展示例(`packages/web-extension/`),可直接参考或改造。 + +--- + +## 4. 核心 API + +### 4.1 录制 + +```js +// 开始录制 +const stopFn = rrwebRecord.record({ + emit(event) { + // event: eventWithTime 类型,每次用户操作或 DOM 变更触发 + // 必须保证所有 event 按 timestamp 顺序存储 + sendToBackend(event); + }, +}); + +// 停止录制 +stopFn(); +``` + +### 4.2 回放 + +```js +// 创建回放器 +const replayer = new rrweb.Replayer(events, { + root: document.getElementById('container'), // 回放容器 DOM + speed: 1, +}); + +// 获取元数据 +const meta = replayer.getMetaData(); +// meta = { startTime: number, endTime: number, totalTime: number } + +// 播放控制 +replayer.play(); // 从头播放 +replayer.play(5000); // 从 5000ms 处播放 +replayer.pause(); // 暂停在当前位置 +replayer.pause(3000); // 暂停在 3000ms 处 + +// 配置变更 +replayer.setConfig({ speed: 2 }); // 修改播放速度 + +// 销毁 +replayer.destroy(); +``` + +### 4.3 事件监听 + +```js +replayer.on('finish', () => { /* 回放结束 */ }); +replayer.on('resize', (dimension) => { /* 视口大小变化 */ }); +``` + +--- + +## 5. 事件数据结构 + +### 5.1 顶层结构 + +每个事件的顶层结构为 `eventWithTime`: + +```ts +{ + timestamp: number; // Unix 时间戳(毫秒),相对于页面加载的偏移量 + type: EventType; // 事件类型(数值枚举) + data: object; // 事件数据,结构因 type 不同而异 +} +``` + +### 5.2 EventType 枚举 + +```ts +enum EventType { + DomContentLoaded = 0, // DOM 加载完成 + Load = 1, // 页面完全加载 + FullSnapshot = 2, // 全量 DOM 快照 + IncrementalSnapshot = 3, // 增量快照(最重要的类型) + Meta = 4, // 页面元信息(URL、视口尺寸) + Custom = 5, // 自定义事件 + Plugin = 6, // 插件事件 +} +``` + +### 5.3 一个完整的录制会话包含的事件序列 + +``` +1. Meta → { href: "页面URL", width: 1920, height: 1080 } +2. FullSnapshot → 完整序列化的 DOM 树 +3. IncrementalSnapshot × N → 各种增量变更事件 +...(可选)DomContentLoaded / Load +``` + +**关键点**:每个会话必须以一个 `Meta` 事件 + 一个 `FullSnapshot` 事件开头,后续才有意义。 + +### 5.4 IncrementalSnapshot 的 data.source 枚举 + +```ts +enum IncrementalSource { + Mutation = 0, // DOM 变更(增删改节点/属性/文本) + MouseMove = 1, // 鼠标移动 + MouseInteraction = 2, // 鼠标交互(点击、双击、右键、聚焦等) + Scroll = 3, // 滚动 + ViewportResize = 4, // 视口尺寸变化 + Input = 5, // 输入框值变化 + TouchMove = 6, // 触摸移动 + MediaInteraction = 7, // 媒体播放/暂停/跳转 + StyleSheetRule = 8, // CSS 规则变更 + CanvasMutation = 9, // Canvas 绑定调用 + Font = 10, // 字体加载 + Log = 11, // 控制台日志(需插件) + Drag = 12, // 拖拽 + StyleDeclaration = 13, // 行内样式声明变更 + Selection = 14, // 文本选区变化 + AdoptedStyleSheet = 15, // Adopted Stylesheet + CustomElement = 16, // 自定义元素注册 +} +``` + +### 5.5 常见事件数据示例 + +**Meta 事件**: +```json +{ + "type": 4, + "data": { "href": "https://example.com/page", "width": 1920, "height": 1080 }, + "timestamp": 1712600000000 +} +``` + +**全量快照**: +```json +{ + "type": 2, + "data": { + "node": { + "type": 0, + "id": 1, + "childNodes": [ + { "type": 2, "tagName": "html", "id": 2, "attributes": { "lang": "zh" }, "childNodes": [...] } + ] + }, + "initialOffset": { "top": 0, "left": 0 } + }, + "timestamp": 1712600000001 +} +``` + +**鼠标点击**: +```json +{ + "type": 3, + "data": { + "source": 2, + "type": 2, + "id": 42, + "x": 320, + "y": 150 + }, + "timestamp": 1712600002500 +} +``` + +**输入框变化**: +```json +{ + "type": 3, + "data": { + "source": 5, + "id": 15, + "text": "用户输入的内容", + "isChecked": false + }, + "timestamp": 1712600003000 +} +``` + +**DOM 变更**: +```json +{ + "type": 3, + "data": { + "source": 0, + "texts": [], + "attributes": [{ "id": 7, "attributes": { "class": "active" } }], + "removes": [], + "adds": [ + { + "parentId": 5, + "nextId": null, + "node": { "type": 2, "tagName": "div", "id": 99, "attributes": {}, "childNodes": [] } + } + ] + }, + "timestamp": 1712600004000 +} +``` + +**滚动**: +```json +{ + "type": 3, + "data": { "source": 3, "id": 1, "x": 0, "y": 500 }, + "timestamp": 1712600005000 +} +``` + +### 5.6 序列化节点类型 + +全量快照和增量快照中的新增节点使用以下类型: + +```ts +enum NodeType { + Document = 0, // 文档节点 + DocumentType = 1, // + Element = 2, // HTML 元素 + Text = 3, // 文本节点 + CDATA = 4, // CDATA 节点 + Comment = 5, // 注释节点 +} +``` + +每个序列化节点都有唯一的 `id`(自增数字),用于增量快照中引用和定位。 + +--- + +## 6. 录制配置详解 + +```js +rrwebRecord.record({ + // 必填:事件回调 + emit(event) { + // 每个 event 都必须保存,不可丢弃 + // events 必须按 timestamp 有序 + }, + + // ---- 隐私保护 ---- + + // 遮挡所有输入框内容(记录为 *) + maskAllInputs: false, + + // 细粒度控制哪些输入类型被遮挡 + maskInputOptions: { + password: true, + text: false, + email: false, + // 支持所有 input type + }, + + // 自定义遮挡函数 + maskInputFn: (text) => text.replace(/./g, '*'), + + // 通过 CSS 选择器遮挡元素内的文本 + maskTextSelector: '.sensitive-data', + + // 自定义文本遮挡函数 + maskTextFn: (text) => '***', + + // CSS 类名方式遮挡文本(默认 'rr-mask') + maskTextClass: 'rr-mask', + + // ---- 屏蔽/忽略 ---- + + // 不录制该 CSS 类名的元素及其子树(显示为灰色色块) + blockClass: 'rr-block', + blockSelector: '.no-record-area', + + // 完全忽略该元素(不录制,回放时也不出现) + ignoreClass: 'rr-ignore', + ignoreSelector: '.ignore-me', + + // ---- 采样策略(影响性能和存储体积的关键配置)---- + + sampling: { + // 鼠标移动:false=不录制,数字=节流间隔(ms) + mousemove: 50, + + // 鼠标交互:false=不录制,true=全部录制,或细粒度控制 + mouseInteraction: { + MouseUp: true, + MouseDown: true, + Click: true, + ContextMenu: false, + DblClick: true, + Focus: true, + Blur: true, + TouchStart: true, + TouchEnd: true, + }, + + // 滚动节流间隔(ms) + scroll: 150, + + // 媒体交互节流间隔(ms) + media: 800, + + // 输入事件:'all'=记录每次按键,'last'=只记录最终值 + input: 'last', + + // Canvas:'all'=记录每次API调用,数字=每秒截图次数(1-60) + canvas: 'all', + }, + + // ---- 高级功能 ---- + + recordCanvas: false, // 是否录制 Canvas + recordCrossOriginIframes: false, // 是否录制跨域 iframe + recordAfter: 'DOMContentLoaded', // 何时开始录制: 'DOMContentLoaded' | 'load' + + inlineStylesheet: true, // 是否内联外部样式表 + inlineImages: false, // 是否内联图片为 base64 + collectFonts: false, // 是否收集动态加载的字体 + + // 定期生成全量快照(防止增量快照链过长导致回放失败) + checkoutEveryNth: 100, // 每 N 个增量事件生成一次 + checkoutEveryNms: 60000, // 每 N 毫秒生成一次 + + // 数据压缩(需配合 @rrweb/packer) + // packFn: pack, + + // 错误处理 + errorHandler: (error) => { + console.error('rrweb error:', error); + // return true 可跳过该错误继续录制 + }, + + // 插件 + plugins: [ + // console 录制插件 + // getRecordConsolePlugin(), + ], +}); +``` + +--- + +## 7. SuperRPA 集成注意事项 + +### 7.1 注入时机 + +录制脚本必须在页面的 DOM 构建之前或 `DOMContentLoaded` 之前注入。使用 `Page.addScriptToEvaluateOnNewDocument` 可以保证在页面任何脚本执行前注入。 + +如果注入太晚,会丢失页面初始状态的快照。 + +### 7.2 事件采集 + +在 SuperRPA 中,需要将录制事件从渲染进程传递到控制层。推荐方式: + +| 方式 | 适用场景 | 注意事项 | +|------|----------|----------| +| `Runtime.evaluate` 定时轮询 `window.__rrweb_events` | 简单场景 | 高频轮询有性能开销 | +| CDP `Runtime.binding` | 高性能 | 需要在 CDP session 上创建 binding | +| `window.postMessage` + Content Script | 扩展模式 | 需要 content script 中转 | +| V8 Inspector 自定义消息 | 深度集成 | 改动较大 | + +推荐 **CDP `Runtime.binding`** 方案: + +```js +// 注入脚本 +window.__rrweb_events = []; +rrwebRecord.record({ + emit(event) { + // 通过 CDP binding 发送 + if (typeof window.__rrwebSend === 'function') { + window.__rrwebSend(JSON.stringify(event)); + } + // 同时存入数组作为备份 + window.__rrweb_events.push(event); + } +}); +``` + +```python +# 控制端 +await cdp.send("Runtime.addBinding", {"name": "__rrwebSend"}) + +cdp.on("Runtime.bindingCalled", lambda params: handle_event( + json.loads(params["payload"]) +)) +``` + +### 7.3 会话管理 + +一个「录制会话」对应一次页面导航(navigation)。需要注意: + +1. **单页应用 (SPA)**:页面内路由切换不会触发新的导航,rrweb 会持续录制整个 SPA 会话 +2. **多页导航**:每次导航需要重新注入录制脚本并开始新会话 +3. **跨域 iframe**:每个跨域 iframe 也需要单独注入录制脚本,rrweb 会通过 `postMessage` 桥接 +4. **事件合并**:一个完整会话的所有事件必须按 `timestamp` 有序存储 + +### 7.4 性能影响 + +| 配置 | 性能影响 | 存储体积 | +|------|----------|----------| +| 默认配置 | 中等 | 中等 | +| `sampling.mousemove = false` | 低 | 小 | +| `sampling.input = 'last'` | 低 | 小 | +| `recordCanvas = true` | 高 | 大 | +| `recordCanvas = true` + `sampling.canvas = 10` | 中 | 中 | +| `inlineStylesheet = true` | 中 | 大(取决于页面样式复杂度) | +| `checkoutEveryNms = 30000` | 略高 | 略大(但提高回放鲁棒性) | + +**建议基线配置**: +```js +{ + sampling: { + mousemove: 50, + scroll: 150, + input: 'last', + media: 800, + }, + recordCanvas: false, + checkoutEveryNms: 300000, // 每 5 分钟一次全量快照 +} +``` + +### 7.5 存储优化 + +1. **使用 packFn 压缩**: +```js +import { pack } from '@rrweb/packer'; +record({ emit(event) {}, packFn: pack }); +``` + +2. **服务端批量压缩**:采集原始事件,服务端用 gzip/zstd 压缩效果更好 +3. **定期全量快照**:通过 `checkoutEveryNms` 避免增量链过长 +4. **跨会话去重**:相同样式表、相同页面的全量快照可以做去重 + +### 7.6 回放端集成 + +回放可以在 SuperRPA 内的专用标签页中展示,或在外部系统中: + +```js +// 在空白页面中创建回放器 +const replayer = new rrweb.Replayer(events, { + root: document.getElementById('replay-container'), + speed: 1, + skipInactive: true, // 跳过无操作的静默期 + inactivePeriodThreshold: 5000, // 超过 5 秒无操作则跳过 + showWarning: true, + insertStyleRules: [ // 注入自定义样式(如鼠标光标样式) + 'div.replayer-mouse { cursor: pointer; }' + ], +}); + +// 监听事件 +replayer.on('finish', () => console.log('回放结束')); +replayer.on('resize', (d) => console.log('视口变化', d)); + +// 播放控制 +replayer.play(); +replayer.pause(); +replayer.setConfig({ speed: 4 }); +``` + +回放需要加载 CSS 样式: +```html + +``` + +--- + +## 8. 录制事件中提取 RPA 可用信息 + +如果 SuperRPA 不仅需要视觉回放,还需要从事件中提取 **可复用的操作信息**(如元素定位、操作类型),可以从以下字段获取: + +### 8.1 鼠标点击事件 → 点击坐标 + 目标元素 + +```json +{ + "type": 3, + "data": { + "source": 2, + "type": 2, // MouseInteractions.Click = 2 + "id": 42, // 序列化节点 ID + "x": 320, "y": 150 // 相对于视口的坐标 + } +} +``` + +- `id` 对应全量快照中的节点 ID,可反查到 `tagName`、`attributes`(含 `class`、`id` 等) +- `x`、`y` 为点击坐标 + +### 8.2 输入事件 → 输入值 + 目标元素 + +```json +{ + "type": 3, + "data": { + "source": 5, + "id": 15, + "text": "用户输入", + "isChecked": false + } +} +``` + +### 8.3 滚动事件 → 滚动位置 + +```json +{ + "type": 3, + "data": { "source": 3, "id": 1, "x": 0, "y": 500 } +} +``` + +### 8.4 从全量快照反查元素定位信息 + +全量快照中包含完整的 DOM 树,每个节点有 `id`、`tagName`、`attributes`。可以通过 ID 反查来构造 CSS 选择器或 XPath。 + +```js +// 从全量快照中构建 ID → 节点映射 +function buildNodeMap(fullSnapshot) { + const map = {}; + function walk(node) { + map[node.id] = node; + if (node.childNodes) node.childNodes.forEach(walk); + } + walk(fullSnapshot.data.node); + return map; +} +``` + +### 8.5 MouseInteractions 枚举 + +```ts +enum MouseInteractions { + MouseUp = 0, + MouseDown = 1, + Click = 2, + ContextMenu = 3, + DblClick = 4, + Focus = 5, + Blur = 6, + TouchStart = 7, + TouchMove_Departed = 8, + TouchEnd = 9, + TouchCancel = 10, +} +``` + +--- + +## 9. 完整注入示例 + +以下是一个可直接使用的注入脚本模板: + +```js +// === rrweb-recorder-inject.js === +// 此文件应包含 record.umd.cjs 的完整内容 +// 然后附加以下启动代码 + +(function() { + 'use strict'; + + var SESSION_ID = '__SESSION_ID_PLACEHOLDER__'; // 由控制层替换 + var events = []; + + function sendEvent(event) { + // 使用 CDP binding(如果可用) + if (typeof window.__rrwebSendEvent === 'function') { + try { + window.__rrwebSendEvent(JSON.stringify({ + sessionId: SESSION_ID, + event: event + })); + } catch (e) { + // fallback + events.push(event); + } + } else { + events.push(event); + } + } + + // 开始录制 + var stopFn = rrwebRecord.record({ + emit: sendEvent, + maskAllInputs: false, + recordCanvas: false, + recordCrossOriginIframes: true, + recordAfter: 'DOMContentLoaded', + sampling: { + mousemove: 50, + scroll: 150, + input: 'last', + media: 800, + }, + checkoutEveryNms: 300000, + }); + + // 暴露控制接口 + window.__rrweb = { + stop: function() { + if (stopFn) stopFn(); + }, + getEvents: function() { + return events; + }, + drainEvents: function() { + var result = events.slice(); + events.length = 0; + return result; + }, + getSessionId: function() { + return SESSION_ID; + } + }; + + // 通知就绪 + if (typeof window.__rrwebReady === 'function') { + window.__rrwebReady(SESSION_ID); + } +})(); +``` + +--- + +## 10. 故障排查 + +| 问题 | 可能原因 | 解决方案 | +|------|----------|----------| +| 回放白屏 | 缺少 Meta + FullSnapshot 事件 | 确保从页面加载开始就注入了录制脚本 | +| 回放缺少样式 | `inlineStylesheet` 未开启或外部样式表加载失败 | 设置 `inlineStylesheet: true` | +| 回放中元素错位 | 视口尺寸与录制时不一致 | 使用 Meta 事件中的 width/height 创建同尺寸回放容器 | +| 录制数据过大 | Canvas 动画或频繁 DOM 更新 | 配置 `sampling`、`blockClass`,或关闭 `recordCanvas` | +| 跨域 iframe 无录制 | 未对 iframe 注入脚本 | 开启 `recordCrossOriginIframes: true` 并确保 iframe 中也注入了脚本 | +| 回放报错 "node not found" | 增量快照链中丢失了事件 | 确保所有事件都被保存,使用 `checkoutEveryNms` 定期全量快照 | +| 注入后页面行为异常 | rrweb 脚本与页面脚本冲突 | 使用 `ignoreSelector` 排除 rrweb 自身的 UI 元素 | + +--- + +## 11. 参考链接 + +- rrweb 官方文档:`docs/` 目录下 +- 事件数据结构定义:`packages/types/src/index.ts` +- 录制逻辑:`packages/rrweb/src/record/`、`packages/record/src/` +- 回放逻辑:`packages/rrweb/src/replay/`、`packages/replay/src/` +- 浏览器扩展示例:`packages/web-extension/` +- DOM 序列化设计:`docs/serialization.md` +- 增量快照设计:`docs/observer.md` +- 回放沙箱设计:`docs/sandbox.md` diff --git a/replay.html b/replay.html new file mode 100644 index 00000000..d5911678 --- /dev/null +++ b/replay.html @@ -0,0 +1,206 @@ + + + + + rrweb Replay + + + + + + + +
+

rrweb Replay

+

Drag & drop a recording JSON file here

+ + +
Or paste JSON via Ctrl+V
+
+ + +
+ + + + + 0 / 0s + +
+ +
+ + + + diff --git a/rrweb-simple-ext/background.js b/rrweb-simple-ext/background.js new file mode 100644 index 00000000..58648cfc --- /dev/null +++ b/rrweb-simple-ext/background.js @@ -0,0 +1,25 @@ +// background.js - service worker +const events = []; +let recording = false; +let activeTabId = null; + +chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { + if (msg.action === 'startRecording') { + events.length = 0; + recording = true; + activeTabId = msg.tabId; + chrome.tabs.sendMessage(msg.tabId, { action: 'startRecord' }); + sendResponse({ ok: true }); + } else if (msg.action === 'stopRecording') { + recording = false; + chrome.tabs.sendMessage(activeTabId, { action: 'stopRecord' }); + sendResponse({ ok: true, eventCount: events.length }); + } else if (msg.action === 'getEvents') { + sendResponse({ events: events }); + } else if (msg.action === 'event') { + events.push(msg.data); + } else if (msg.action === 'getStatus') { + sendResponse({ recording, eventCount: events.length }); + } + return true; +}); diff --git a/rrweb-simple-ext/content.js b/rrweb-simple-ext/content.js new file mode 100644 index 00000000..6599ae30 --- /dev/null +++ b/rrweb-simple-ext/content.js @@ -0,0 +1,46 @@ +// content.js - content script (runs in content script world) +(function() { + // Inject the record library + inject script into page + function loadScripts(callback) { + // Load record.umd.cjs first + const script1 = document.createElement('script'); + script1.src = chrome.runtime.getURL('record.umd.cjs'); + script1.onload = function() { + script1.remove(); + // Then load inject.js + const script2 = document.createElement('script'); + script2.src = chrome.runtime.getURL('inject.js'); + script2.onload = function() { + script2.remove(); + }; + (document.head || document.documentElement).appendChild(script2); + }; + (document.head || document.documentElement).appendChild(script1); + } + + // Listen for messages from inject.js (page context) + window.addEventListener('message', function(event) { + if (event.source !== window) return; + const data = event.data; + if (!data || !data.__rrweb_action) return; + + if (data.__rrweb_action === 'event') { + // Forward event to background + chrome.runtime.sendMessage({ action: 'event', data: data.__rrweb_data }); + } + }); + + // Listen for messages from background + chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { + if (msg.action === 'startRecord') { + loadScripts(); + sendResponse({ ok: true }); + } else if (msg.action === 'stopRecord') { + window.postMessage({ __rrweb_action: 'stop' }, '*'); + sendResponse({ ok: true }); + } + // Don't return true for unrelated messages + }); + + console.log('[rrweb] Content script loaded'); +})(); diff --git a/rrweb-simple-ext/inject.js b/rrweb-simple-ext/inject.js new file mode 100644 index 00000000..b0681b0f --- /dev/null +++ b/rrweb-simple-ext/inject.js @@ -0,0 +1,30 @@ +// inject.js - runs in page context, auto-starts recording +(function() { + 'use strict'; + + let stopFn = null; + + // Auto-start recording + stopFn = rrwebRecord.record({ + emit: function(event) { + window.postMessage({ + __rrweb_action: 'event', + __rrweb_data: event + }, '*'); + }, + recordCrossOriginIframes: true + }); + + // Listen for stop command + window.addEventListener('message', function(event) { + if (event.source !== window) return; + if (event.data && event.data.__rrweb_action === 'stop') { + if (stopFn) { + stopFn(); + stopFn = null; + } + } + }); + + console.log('[rrweb] Recording started'); +})(); diff --git a/rrweb-simple-ext/manifest.json b/rrweb-simple-ext/manifest.json new file mode 100644 index 00000000..ffde0298 --- /dev/null +++ b/rrweb-simple-ext/manifest.json @@ -0,0 +1,20 @@ +{ + "manifest_version": 3, + "name": "rrweb Simple Recorder", + "version": "1.0.0", + "description": "Simple rrweb page recorder", + "permissions": ["activeTab", "storage", "scripting"], + "background": { + "service_worker": "background.js" + }, + "action": { + "default_title": "rrweb Recorder", + "default_popup": "popup.html" + }, + "web_accessible_resources": [ + { + "resources": ["record.umd.cjs", "inject.js"], + "matches": [""] + } + ] +} diff --git a/rrweb-simple-ext/popup.html b/rrweb-simple-ext/popup.html new file mode 100644 index 00000000..01b3b5d9 --- /dev/null +++ b/rrweb-simple-ext/popup.html @@ -0,0 +1,34 @@ + + + + + + + +

rrweb Simple Recorder

+
+ + +
+
Ready
+
+ + +
+
+ + + + diff --git a/rrweb-simple-ext/popup.js b/rrweb-simple-ext/popup.js new file mode 100644 index 00000000..5d43acb7 --- /dev/null +++ b/rrweb-simple-ext/popup.js @@ -0,0 +1,93 @@ +const startBtn = document.getElementById('startBtn'); +const stopBtn = document.getElementById('stopBtn'); +const viewBtn = document.getElementById('viewBtn'); +const downloadBtn = document.getElementById('downloadBtn'); +const statusDiv = document.getElementById('status'); +const eventsDiv = document.getElementById('events'); + +function updateStatus(text) { + statusDiv.textContent = text; +} + +function setRecording(isRecording) { + startBtn.disabled = isRecording; + startBtn.classList.toggle('disabled', isRecording); + stopBtn.disabled = !isRecording; + stopBtn.classList.toggle('disabled', !isRecording); +} + +startBtn.addEventListener('click', async () => { + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + if (!tab) return; + + // First inject content script programmatically + try { + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + files: ['content.js'] + }); + } catch(e) { + // Might already be injected, that's ok + } + + chrome.runtime.sendMessage({ action: 'startRecording', tabId: tab.id }, (resp) => { + if (resp && resp.ok) { + setRecording(true); + updateStatus('Recording...'); + } + }); +}); + +stopBtn.addEventListener('click', () => { + chrome.runtime.sendMessage({ action: 'stopRecording' }, (resp) => { + if (resp && resp.ok) { + setRecording(false); + updateStatus('Stopped. Captured ' + resp.eventCount + ' events.'); + viewBtn.disabled = false; + viewBtn.classList.remove('disabled'); + downloadBtn.disabled = false; + downloadBtn.classList.remove('disabled'); + } + }); +}); + +viewBtn.addEventListener('click', () => { + chrome.runtime.sendMessage({ action: 'getEvents' }, (resp) => { + if (resp && resp.events) { + const summary = resp.events.map((e, i) => + `${i}: type=${e.type} ts=${e.timestamp}` + ).join('\n'); + eventsDiv.textContent = `Total: ${resp.events.length} events\n\n${summary}`; + } + }); +}); + +downloadBtn.addEventListener('click', () => { + chrome.runtime.sendMessage({ action: 'getEvents' }, (resp) => { + if (resp && resp.events) { + const blob = new Blob([JSON.stringify(resp.events, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'rrweb-events.json'; + a.click(); + URL.revokeObjectURL(url); + } + }); +}); + +// Check current status on open +chrome.runtime.sendMessage({ action: 'getStatus' }, (resp) => { + if (resp) { + setRecording(resp.recording); + updateStatus(resp.recording + ? 'Recording... (' + resp.eventCount + ' events)' + : 'Ready'); + if (resp.eventCount > 0) { + viewBtn.disabled = false; + viewBtn.classList.remove('disabled'); + downloadBtn.disabled = false; + downloadBtn.classList.remove('disabled'); + } + } +}); diff --git a/rrweb-simple-ext/record.umd.cjs b/rrweb-simple-ext/record.umd.cjs new file mode 100644 index 00000000..06ec77e2 --- /dev/null +++ b/rrweb-simple-ext/record.umd.cjs @@ -0,0 +1,12732 @@ +(function (g, f) { + if ("object" == typeof exports && "object" == typeof module) { + module.exports = f(); + } else if ("function" == typeof define && define.amd) { + define("rrwebRecord", [], f); + } else if ("object" == typeof exports) { + exports["rrwebRecord"] = f(); + } else { + g["rrwebRecord"] = f(); + } + }(this, () => { +var exports = {}; +var module = { exports }; +"use strict"; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; +}; +Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); +var __defProp2 = Object.defineProperty; +var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => __defNormalProp2(obj, typeof key !== "symbol" ? key + "" : key, value); +var _a; +var __defProp$1 = Object.defineProperty; +var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value); +var NodeType$3 = /* @__PURE__ */ ((NodeType2) => { + NodeType2[NodeType2["Document"] = 0] = "Document"; + NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType"; + NodeType2[NodeType2["Element"] = 2] = "Element"; + NodeType2[NodeType2["Text"] = 3] = "Text"; + NodeType2[NodeType2["CDATA"] = 4] = "CDATA"; + NodeType2[NodeType2["Comment"] = 5] = "Comment"; + return NodeType2; +})(NodeType$3 || {}); +const testableAccessors$1 = { + Node: [ + "childNodes", + "parentNode", + "parentElement", + "textContent", + "ownerDocument" + ], + ShadowRoot: ["host", "styleSheets"], + Element: ["shadowRoot", "querySelector", "querySelectorAll"], + MutationObserver: [] +}; +const testableMethods$1 = { + Node: ["contains", "getRootNode"], + ShadowRoot: ["getSelection"], + Element: [], + MutationObserver: ["constructor"] +}; +const untaintedBasePrototype$1 = {}; +const isAngularZonePresent$1 = () => { + return !!globalThis.Zone; +}; +function getUntaintedPrototype$1(key) { + if (untaintedBasePrototype$1[key]) + return untaintedBasePrototype$1[key]; + const defaultObj = globalThis[key]; + const defaultPrototype = defaultObj.prototype; + const accessorNames = key in testableAccessors$1 ? testableAccessors$1[key] : void 0; + const isUntaintedAccessors = Boolean( + accessorNames && // @ts-expect-error 2345 + accessorNames.every( + (accessor) => { + var _a2, _b; + return Boolean( + (_b = (_a2 = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a2.get) == null ? void 0 : _b.toString().includes("[native code]") + ); + } + ) + ); + const methodNames = key in testableMethods$1 ? testableMethods$1[key] : void 0; + const isUntaintedMethods = Boolean( + methodNames && methodNames.every( + // @ts-expect-error 2345 + (method) => { + var _a2; + return typeof defaultPrototype[method] === "function" && ((_a2 = defaultPrototype[method]) == null ? void 0 : _a2.toString().includes("[native code]")); + } + ) + ); + if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent$1()) { + untaintedBasePrototype$1[key] = defaultObj.prototype; + return defaultObj.prototype; + } + try { + const iframeEl = document.createElement("iframe"); + document.body.appendChild(iframeEl); + const win = iframeEl.contentWindow; + if (!win) return defaultObj.prototype; + const untaintedObject = win[key].prototype; + document.body.removeChild(iframeEl); + if (!untaintedObject) return defaultPrototype; + return untaintedBasePrototype$1[key] = untaintedObject; + } catch (e) { + return defaultPrototype; + } +} +const untaintedAccessorCache$1 = {}; +function getUntaintedAccessor$1(key, instance, accessor) { + var _a2; + const cacheKey = `${key}.${String(accessor)}`; + if (untaintedAccessorCache$1[cacheKey]) + return untaintedAccessorCache$1[cacheKey].call( + instance + ); + const untaintedPrototype = getUntaintedPrototype$1(key); + const untaintedAccessor = (_a2 = Object.getOwnPropertyDescriptor( + untaintedPrototype, + accessor + )) == null ? void 0 : _a2.get; + if (!untaintedAccessor) return instance[accessor]; + untaintedAccessorCache$1[cacheKey] = untaintedAccessor; + return untaintedAccessor.call(instance); +} +const untaintedMethodCache$1 = {}; +function getUntaintedMethod$1(key, instance, method) { + const cacheKey = `${key}.${String(method)}`; + if (untaintedMethodCache$1[cacheKey]) + return untaintedMethodCache$1[cacheKey].bind( + instance + ); + const untaintedPrototype = getUntaintedPrototype$1(key); + const untaintedMethod = untaintedPrototype[method]; + if (typeof untaintedMethod !== "function") return instance[method]; + untaintedMethodCache$1[cacheKey] = untaintedMethod; + return untaintedMethod.bind(instance); +} +function ownerDocument$1(n2) { + return getUntaintedAccessor$1("Node", n2, "ownerDocument"); +} +function childNodes$1(n2) { + return getUntaintedAccessor$1("Node", n2, "childNodes"); +} +function parentNode$1(n2) { + return getUntaintedAccessor$1("Node", n2, "parentNode"); +} +function parentElement$1(n2) { + return getUntaintedAccessor$1("Node", n2, "parentElement"); +} +function textContent$1(n2) { + return getUntaintedAccessor$1("Node", n2, "textContent"); +} +function contains$1(n2, other) { + return getUntaintedMethod$1("Node", n2, "contains")(other); +} +function getRootNode$1(n2) { + return getUntaintedMethod$1("Node", n2, "getRootNode")(); +} +function host$1(n2) { + if (!n2 || !("host" in n2)) return null; + return getUntaintedAccessor$1("ShadowRoot", n2, "host"); +} +function styleSheets$1(n2) { + return n2.styleSheets; +} +function shadowRoot$1(n2) { + if (!n2 || !("shadowRoot" in n2)) return null; + return getUntaintedAccessor$1("Element", n2, "shadowRoot"); +} +function querySelector$1(n2, selectors) { + return getUntaintedAccessor$1("Element", n2, "querySelector")(selectors); +} +function querySelectorAll$1(n2, selectors) { + return getUntaintedAccessor$1("Element", n2, "querySelectorAll")(selectors); +} +function mutationObserverCtor$1() { + return getUntaintedPrototype$1("MutationObserver").constructor; +} +function patch$1(source, name, replacement) { + try { + if (!(name in source)) { + return () => { + }; + } + const original = source[name]; + const wrapped = replacement(original); + if (typeof wrapped === "function") { + wrapped.prototype = wrapped.prototype || {}; + Object.defineProperties(wrapped, { + __rrweb_original__: { + enumerable: false, + value: original + } + }); + } + source[name] = wrapped; + return () => { + source[name] = original; + }; + } catch (e) { + return () => { + }; + } +} +const index$1 = { + ownerDocument: ownerDocument$1, + childNodes: childNodes$1, + parentNode: parentNode$1, + parentElement: parentElement$1, + textContent: textContent$1, + contains: contains$1, + getRootNode: getRootNode$1, + host: host$1, + styleSheets: styleSheets$1, + shadowRoot: shadowRoot$1, + querySelector: querySelector$1, + querySelectorAll: querySelectorAll$1, + mutationObserver: mutationObserverCtor$1, + patch: patch$1 +}; +function isElement(n2) { + return n2.nodeType === n2.ELEMENT_NODE; +} +function isShadowRoot(n2) { + const hostEl = ( + // anchor and textarea elements also have a `host` property + // but only shadow roots have a `mode` property + n2 && "host" in n2 && "mode" in n2 && index$1.host(n2) || null + ); + return Boolean( + hostEl && "shadowRoot" in hostEl && index$1.shadowRoot(hostEl) === n2 + ); +} +function isNativeShadowDom(shadowRoot2) { + return Object.prototype.toString.call(shadowRoot2) === "[object ShadowRoot]"; +} +function fixBrowserCompatibilityIssuesInCSS(cssText) { + if (cssText.includes(" background-clip: text;") && !cssText.includes(" -webkit-background-clip: text;")) { + cssText = cssText.replace( + /\sbackground-clip:\s*text;/g, + " -webkit-background-clip: text; background-clip: text;" + ); + } + return cssText; +} +function escapeImportStatement(rule2) { + const { cssText } = rule2; + if (cssText.split('"').length < 3) return cssText; + const statement = ["@import", `url(${JSON.stringify(rule2.href)})`]; + if (rule2.layerName === "") { + statement.push(`layer`); + } else if (rule2.layerName) { + statement.push(`layer(${rule2.layerName})`); + } + if (rule2.supportsText) { + statement.push(`supports(${rule2.supportsText})`); + } + if (rule2.media.length) { + statement.push(rule2.media.mediaText); + } + return statement.join(" ") + ";"; +} +function stringifyStylesheet(s2) { + try { + const rules2 = s2.rules || s2.cssRules; + if (!rules2) { + return null; + } + let sheetHref = s2.href; + if (!sheetHref && s2.ownerNode) { + sheetHref = s2.ownerNode.baseURI; + } + const stringifiedRules = Array.from( + rules2, + (rule2) => stringifyRule(rule2, sheetHref) + ).join(""); + return fixBrowserCompatibilityIssuesInCSS(stringifiedRules); + } catch (error) { + return null; + } +} +function stringifyRule(rule2, sheetHref) { + if (isCSSImportRule(rule2)) { + let importStringified; + try { + importStringified = // for same-origin stylesheets, + // we can access the imported stylesheet rules directly + stringifyStylesheet(rule2.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement + escapeImportStatement(rule2); + } catch (error) { + importStringified = rule2.cssText; + } + if (rule2.styleSheet.href) { + return absolutifyURLs(importStringified, rule2.styleSheet.href); + } + return importStringified; + } else { + let ruleStringified = rule2.cssText; + if (isCSSStyleRule(rule2) && rule2.selectorText.includes(":")) { + ruleStringified = fixSafariColons(ruleStringified); + } + if (sheetHref) { + return absolutifyURLs(ruleStringified, sheetHref); + } + return ruleStringified; + } +} +function fixSafariColons(cssStringified) { + const regex = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm; + return cssStringified.replace(regex, "$1\\$2"); +} +function isCSSImportRule(rule2) { + return "styleSheet" in rule2; +} +function isCSSStyleRule(rule2) { + return "selectorText" in rule2; +} +class Mirror { + constructor() { + __publicField$1(this, "idNodeMap", /* @__PURE__ */ new Map()); + __publicField$1(this, "nodeMetaMap", /* @__PURE__ */ new WeakMap()); + } + getId(n2) { + var _a2; + if (!n2) return -1; + const id = (_a2 = this.getMeta(n2)) == null ? void 0 : _a2.id; + return id != null ? id : -1; + } + getNode(id) { + return this.idNodeMap.get(id) || null; + } + getIds() { + return Array.from(this.idNodeMap.keys()); + } + getMeta(n2) { + return this.nodeMetaMap.get(n2) || null; + } + // removes the node from idNodeMap + // doesn't remove the node from nodeMetaMap + removeNodeFromMap(n2) { + const id = this.getId(n2); + this.idNodeMap.delete(id); + if (n2.childNodes) { + n2.childNodes.forEach( + (childNode) => this.removeNodeFromMap(childNode) + ); + } + } + has(id) { + return this.idNodeMap.has(id); + } + hasNode(node2) { + return this.nodeMetaMap.has(node2); + } + add(n2, meta) { + const id = meta.id; + this.idNodeMap.set(id, n2); + this.nodeMetaMap.set(n2, meta); + } + replace(id, n2) { + const oldNode = this.getNode(id); + if (oldNode) { + const meta = this.nodeMetaMap.get(oldNode); + if (meta) this.nodeMetaMap.set(n2, meta); + } + this.idNodeMap.set(id, n2); + } + reset() { + this.idNodeMap = /* @__PURE__ */ new Map(); + this.nodeMetaMap = /* @__PURE__ */ new WeakMap(); + } +} +function createMirror$2() { + return new Mirror(); +} +function maskInputValue({ + element, + maskInputOptions, + tagName, + type, + value, + maskInputFn +}) { + let text = value || ""; + const actualType = type && toLowerCase(type); + if (maskInputOptions[tagName.toLowerCase()] || actualType && maskInputOptions[actualType]) { + if (maskInputFn) { + text = maskInputFn(text, element); + } else { + text = "*".repeat(text.length); + } + } + return text; +} +function toLowerCase(str) { + return str.toLowerCase(); +} +const ORIGINAL_ATTRIBUTE_NAME = "__rrweb_original__"; +function is2DCanvasBlank(canvas) { + const ctx = canvas.getContext("2d"); + if (!ctx) return true; + const chunkSize = 50; + for (let x = 0; x < canvas.width; x += chunkSize) { + for (let y = 0; y < canvas.height; y += chunkSize) { + const getImageData = ctx.getImageData; + const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData; + const pixelBuffer = new Uint32Array( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access + originalGetImageData.call( + ctx, + x, + y, + Math.min(chunkSize, canvas.width - x), + Math.min(chunkSize, canvas.height - y) + ).data.buffer + ); + if (pixelBuffer.some((pixel) => pixel !== 0)) return false; + } + } + return true; +} +function getInputType(element) { + const type = element.type; + return element.hasAttribute("data-rr-is-password") ? "password" : type ? ( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + toLowerCase(type) + ) : null; +} +function extractFileExtension(path, baseURL) { + var _a2; + let url; + try { + url = new URL(path, baseURL != null ? baseURL : window.location.href); + } catch (err) { + return null; + } + const regex = /\.([0-9a-z]+)(?:$)/i; + const match = url.pathname.match(regex); + return (_a2 = match == null ? void 0 : match[1]) != null ? _a2 : null; +} +function extractOrigin(url) { + let origin = ""; + if (url.indexOf("//") > -1) { + origin = url.split("/").slice(0, 3).join("/"); + } else { + origin = url.split("/")[0]; + } + origin = origin.split("?")[0]; + return origin; +} +const URL_IN_CSS_REF = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm; +const URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\/\//i; +const URL_WWW_MATCH = /^www\..*/i; +const DATA_URI = /^(data:)([^,]*),(.*)/i; +function absolutifyURLs(cssText, href) { + return (cssText || "").replace( + URL_IN_CSS_REF, + (origin, quote1, path1, quote2, path2, path3) => { + const filePath = path1 || path2 || path3; + const maybeQuote = quote1 || quote2 || ""; + if (!filePath) { + return origin; + } + if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) { + return `url(${maybeQuote}${filePath}${maybeQuote})`; + } + if (DATA_URI.test(filePath)) { + return `url(${maybeQuote}${filePath}${maybeQuote})`; + } + if (filePath[0] === "/") { + return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`; + } + const stack = href.split("/"); + const parts = filePath.split("/"); + stack.pop(); + for (const part of parts) { + if (part === ".") { + continue; + } else if (part === "..") { + stack.pop(); + } else { + stack.push(part); + } + } + return `url(${maybeQuote}${stack.join("/")}${maybeQuote})`; + } + ); +} +function normalizeCssString(cssText, _testNoPxNorm = false) { + if (_testNoPxNorm) { + return cssText.replace(/(\/\*[^*]*\*\/)|[\s;]/g, ""); + } else { + return cssText.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "").replace(/0px/g, "0"); + } +} +function splitCssText(cssText, style, _testNoPxNorm = false) { + const childNodes2 = Array.from(style.childNodes); + const splits = []; + let iterCount = 0; + if (childNodes2.length > 1 && cssText && typeof cssText === "string") { + let cssTextNorm = normalizeCssString(cssText, _testNoPxNorm); + const normFactor = cssTextNorm.length / cssText.length; + for (let i2 = 1; i2 < childNodes2.length; i2++) { + if (childNodes2[i2].textContent && typeof childNodes2[i2].textContent === "string") { + const textContentNorm = normalizeCssString( + childNodes2[i2].textContent, + _testNoPxNorm + ); + const jLimit = 100; + let j = 3; + for (; j < textContentNorm.length; j++) { + if ( + // keep consuming css identifiers (to get a decent chunk more quickly) + textContentNorm[j].match(/[a-zA-Z0-9]/) || // substring needs to be unique to this section + textContentNorm.indexOf(textContentNorm.substring(0, j), 1) !== -1 + ) { + continue; + } + break; + } + for (; j < textContentNorm.length; j++) { + let startSubstring = textContentNorm.substring(0, j); + let cssNormSplits = cssTextNorm.split(startSubstring); + let splitNorm = -1; + if (cssNormSplits.length === 2) { + splitNorm = cssNormSplits[0].length; + } else if (cssNormSplits.length > 2 && cssNormSplits[0] === "" && childNodes2[i2 - 1].textContent !== "") { + splitNorm = cssTextNorm.indexOf(startSubstring, 1); + } else if (cssNormSplits.length === 1) { + startSubstring = startSubstring.substring( + 0, + startSubstring.length - 1 + ); + cssNormSplits = cssTextNorm.split(startSubstring); + if (cssNormSplits.length <= 1) { + splits.push(cssText); + return splits; + } + j = jLimit + 1; + } else if (j === textContentNorm.length - 1) { + splitNorm = cssTextNorm.indexOf(startSubstring); + } + if (cssNormSplits.length >= 2 && j > jLimit) { + const prevTextContent = childNodes2[i2 - 1].textContent; + if (prevTextContent && typeof prevTextContent === "string") { + const prevMinLength = normalizeCssString(prevTextContent).length; + splitNorm = cssTextNorm.indexOf(startSubstring, prevMinLength); + } + if (splitNorm === -1) { + splitNorm = cssNormSplits[0].length; + } + } + if (splitNorm !== -1) { + let k = Math.floor(splitNorm / normFactor); + for (; k > 0 && k < cssText.length; ) { + iterCount += 1; + if (iterCount > 50 * childNodes2.length) { + splits.push(cssText); + return splits; + } + const normPart = normalizeCssString( + cssText.substring(0, k), + _testNoPxNorm + ); + if (normPart.length === splitNorm) { + splits.push(cssText.substring(0, k)); + cssText = cssText.substring(k); + cssTextNorm = cssTextNorm.substring(splitNorm); + break; + } else if (normPart.length < splitNorm) { + k += Math.max( + 1, + Math.floor((splitNorm - normPart.length) / normFactor) + ); + } else { + k -= Math.max( + 1, + Math.floor((normPart.length - splitNorm) * normFactor) + ); + } + } + break; + } + } + } + } + } + splits.push(cssText); + return splits; +} +function markCssSplits(cssText, style) { + return splitCssText(cssText, style).join("/* rr_split */"); +} +let _id = 1; +const tagNameRegex = new RegExp("[^a-z0-9-_:]"); +const IGNORED_NODE = -2; +function genId() { + return _id++; +} +function getValidTagName$1(element) { + if (element instanceof HTMLFormElement) { + return "form"; + } + const processedTagName = toLowerCase(element.tagName); + if (tagNameRegex.test(processedTagName)) { + return "div"; + } + return processedTagName; +} +let canvasService; +let canvasCtx; +const SRCSET_NOT_SPACES = /^[^ \t\n\r\u000c]+/; +const SRCSET_COMMAS_OR_SPACES = /^[, \t\n\r\u000c]+/; +function getAbsoluteSrcsetString(doc, attributeValue) { + if (attributeValue.trim() === "") { + return attributeValue; + } + let pos = 0; + function collectCharacters(regEx) { + let chars2; + const match = regEx.exec(attributeValue.substring(pos)); + if (match) { + chars2 = match[0]; + pos += chars2.length; + return chars2; + } + return ""; + } + const output = []; + while (true) { + collectCharacters(SRCSET_COMMAS_OR_SPACES); + if (pos >= attributeValue.length) { + break; + } + let url = collectCharacters(SRCSET_NOT_SPACES); + if (url.slice(-1) === ",") { + url = absoluteToDoc(doc, url.substring(0, url.length - 1)); + output.push(url); + } else { + let descriptorsStr = ""; + url = absoluteToDoc(doc, url); + let inParens = false; + while (true) { + const c2 = attributeValue.charAt(pos); + if (c2 === "") { + output.push((url + descriptorsStr).trim()); + break; + } else if (!inParens) { + if (c2 === ",") { + pos += 1; + output.push((url + descriptorsStr).trim()); + break; + } else if (c2 === "(") { + inParens = true; + } + } else { + if (c2 === ")") { + inParens = false; + } + } + descriptorsStr += c2; + pos += 1; + } + } + } + return output.join(", "); +} +const cachedDocument = /* @__PURE__ */ new WeakMap(); +function absoluteToDoc(doc, attributeValue) { + if (!attributeValue || attributeValue.trim() === "") { + return attributeValue; + } + return getHref(doc, attributeValue); +} +function isSVGElement(el) { + return Boolean(el.tagName === "svg" || el.ownerSVGElement); +} +function getHref(doc, customHref) { + let a2 = cachedDocument.get(doc); + if (!a2) { + a2 = doc.createElement("a"); + cachedDocument.set(doc, a2); + } + if (!customHref) { + customHref = ""; + } else if (customHref.startsWith("blob:") || customHref.startsWith("data:")) { + return customHref; + } + a2.setAttribute("href", customHref); + return a2.href; +} +function transformAttribute(doc, tagName, name, value) { + if (!value) { + return value; + } + if (name === "src" || name === "href" && !(tagName === "use" && value[0] === "#")) { + return absoluteToDoc(doc, value); + } else if (name === "xlink:href" && value[0] !== "#") { + return absoluteToDoc(doc, value); + } else if (name === "background" && ["table", "td", "th"].includes(tagName)) { + return absoluteToDoc(doc, value); + } else if (name === "srcset") { + return getAbsoluteSrcsetString(doc, value); + } else if (name === "style") { + return absolutifyURLs(value, getHref(doc)); + } else if (tagName === "object" && name === "data") { + return absoluteToDoc(doc, value); + } + return value; +} +function ignoreAttribute(tagName, name, _value) { + return ["video", "audio"].includes(tagName) && name === "autoplay"; +} +function _isBlockedElement(element, blockClass, blockSelector) { + try { + if (typeof blockClass === "string") { + if (element.classList.contains(blockClass)) { + return true; + } + } else { + for (let eIndex = element.classList.length; eIndex--; ) { + const className = element.classList[eIndex]; + if (blockClass.test(className)) { + return true; + } + } + } + if (blockSelector) { + return element.matches(blockSelector); + } + } catch (e2) { + } + return false; +} +function classMatchesRegex(node2, regex, checkAncestors) { + if (!node2) return false; + if (node2.nodeType !== node2.ELEMENT_NODE) { + if (!checkAncestors) return false; + return classMatchesRegex(index$1.parentNode(node2), regex, checkAncestors); + } + for (let eIndex = node2.classList.length; eIndex--; ) { + const className = node2.classList[eIndex]; + if (regex.test(className)) { + return true; + } + } + if (!checkAncestors) return false; + return classMatchesRegex(index$1.parentNode(node2), regex, checkAncestors); +} +function needMaskingText(node2, maskTextClass, maskTextSelector, checkAncestors) { + let el; + if (isElement(node2)) { + el = node2; + if (!index$1.childNodes(el).length) { + return false; + } + } else if (index$1.parentElement(node2) === null) { + return false; + } else { + el = index$1.parentElement(node2); + } + try { + if (typeof maskTextClass === "string") { + if (checkAncestors) { + if (el.closest(`.${maskTextClass}`)) return true; + } else { + if (el.classList.contains(maskTextClass)) return true; + } + } else { + if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true; + } + if (maskTextSelector) { + if (checkAncestors) { + if (el.closest(maskTextSelector)) return true; + } else { + if (el.matches(maskTextSelector)) return true; + } + } + } catch (e2) { + } + return false; +} +function onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) { + const win = iframeEl.contentWindow; + if (!win) { + return; + } + let fired = false; + let readyState; + try { + readyState = win.document.readyState; + } catch (error) { + return; + } + if (readyState !== "complete") { + const timer = setTimeout(() => { + if (!fired) { + listener(); + fired = true; + } + }, iframeLoadTimeout); + iframeEl.addEventListener("load", () => { + clearTimeout(timer); + fired = true; + listener(); + }); + return; + } + const blankUrl = "about:blank"; + if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === "") { + setTimeout(listener, 0); + return iframeEl.addEventListener("load", listener); + } + iframeEl.addEventListener("load", listener); +} +function onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) { + let fired = false; + let styleSheetLoaded; + try { + styleSheetLoaded = link.sheet; + } catch (error) { + return; + } + if (styleSheetLoaded) return; + const timer = setTimeout(() => { + if (!fired) { + listener(); + fired = true; + } + }, styleSheetLoadTimeout); + link.addEventListener("load", () => { + clearTimeout(timer); + fired = true; + listener(); + }); +} +function serializeNode(n2, options) { + const { + doc, + mirror: mirror2, + blockClass, + blockSelector, + needsMask, + inlineStylesheet, + maskInputOptions = {}, + maskTextFn, + maskInputFn, + dataURLOptions = {}, + inlineImages, + recordCanvas, + keepIframeSrcFn, + newlyAddedElement = false, + cssCaptured = false + } = options; + const rootId = getRootId(doc, mirror2); + switch (n2.nodeType) { + case n2.DOCUMENT_NODE: + if (n2.compatMode !== "CSS1Compat") { + return { + type: NodeType$3.Document, + childNodes: [], + compatMode: n2.compatMode + // probably "BackCompat" + }; + } else { + return { + type: NodeType$3.Document, + childNodes: [] + }; + } + case n2.DOCUMENT_TYPE_NODE: + return { + type: NodeType$3.DocumentType, + name: n2.name, + publicId: n2.publicId, + systemId: n2.systemId, + rootId + }; + case n2.ELEMENT_NODE: + return serializeElementNode(n2, { + doc, + blockClass, + blockSelector, + inlineStylesheet, + maskInputOptions, + maskInputFn, + dataURLOptions, + inlineImages, + recordCanvas, + keepIframeSrcFn, + newlyAddedElement, + rootId + }); + case n2.TEXT_NODE: + return serializeTextNode(n2, { + doc, + needsMask, + maskTextFn, + rootId, + cssCaptured + }); + case n2.CDATA_SECTION_NODE: + return { + type: NodeType$3.CDATA, + textContent: "", + rootId + }; + case n2.COMMENT_NODE: + return { + type: NodeType$3.Comment, + textContent: index$1.textContent(n2) || "", + rootId + }; + default: + return false; + } +} +function getRootId(doc, mirror2) { + if (!mirror2.hasNode(doc)) return void 0; + const docId = mirror2.getId(doc); + return docId === 1 ? void 0 : docId; +} +function serializeTextNode(n2, options) { + const { needsMask, maskTextFn, rootId, cssCaptured } = options; + const parent = index$1.parentNode(n2); + const parentTagName = parent && parent.tagName; + let textContent2 = ""; + const isStyle = parentTagName === "STYLE" ? true : void 0; + const isScript = parentTagName === "SCRIPT" ? true : void 0; + if (isScript) { + textContent2 = "SCRIPT_PLACEHOLDER"; + } else if (!cssCaptured) { + textContent2 = index$1.textContent(n2); + if (isStyle && textContent2) { + textContent2 = absolutifyURLs(textContent2, getHref(options.doc)); + } + } + if (!isStyle && !isScript && textContent2 && needsMask) { + textContent2 = maskTextFn ? maskTextFn(textContent2, index$1.parentElement(n2)) : textContent2.replace(/[\S]/g, "*"); + } + return { + type: NodeType$3.Text, + textContent: textContent2 || "", + rootId + }; +} +function serializeElementNode(n2, options) { + const { + doc, + blockClass, + blockSelector, + inlineStylesheet, + maskInputOptions = {}, + maskInputFn, + dataURLOptions = {}, + inlineImages, + recordCanvas, + keepIframeSrcFn, + newlyAddedElement = false, + rootId + } = options; + const needBlock = _isBlockedElement(n2, blockClass, blockSelector); + const tagName = getValidTagName$1(n2); + let attributes = {}; + const len = n2.attributes.length; + for (let i2 = 0; i2 < len; i2++) { + const attr = n2.attributes[i2]; + if (!ignoreAttribute(tagName, attr.name, attr.value)) { + attributes[attr.name] = transformAttribute( + doc, + tagName, + toLowerCase(attr.name), + attr.value + ); + } + } + if (tagName === "link" && inlineStylesheet) { + const stylesheet = Array.from(doc.styleSheets).find((s2) => { + return s2.href === n2.href; + }); + let cssText = null; + if (stylesheet) { + cssText = stringifyStylesheet(stylesheet); + } + if (cssText) { + delete attributes.rel; + delete attributes.href; + attributes._cssText = cssText; + } + } + if (tagName === "style" && n2.sheet) { + let cssText = stringifyStylesheet( + n2.sheet + ); + if (cssText) { + if (n2.childNodes.length > 1) { + cssText = markCssSplits(cssText, n2); + } + attributes._cssText = cssText; + } + } + if (["input", "textarea", "select"].includes(tagName)) { + const value = n2.value; + const checked = n2.checked; + if (attributes.type !== "radio" && attributes.type !== "checkbox" && attributes.type !== "submit" && attributes.type !== "button" && value) { + attributes.value = maskInputValue({ + element: n2, + type: getInputType(n2), + tagName, + value, + maskInputOptions, + maskInputFn + }); + } else if (checked) { + attributes.checked = checked; + } + } + if (tagName === "option") { + if (n2.selected && !maskInputOptions["select"]) { + attributes.selected = true; + } else { + delete attributes.selected; + } + } + if (tagName === "dialog" && n2.open) { + attributes.rr_open_mode = n2.matches("dialog:modal") ? "modal" : "non-modal"; + } + if (tagName === "canvas" && recordCanvas) { + if (n2.__context === "2d") { + if (!is2DCanvasBlank(n2)) { + attributes.rr_dataURL = n2.toDataURL( + dataURLOptions.type, + dataURLOptions.quality + ); + } + } else if (!("__context" in n2)) { + const canvasDataURL = n2.toDataURL( + dataURLOptions.type, + dataURLOptions.quality + ); + const blankCanvas = doc.createElement("canvas"); + blankCanvas.width = n2.width; + blankCanvas.height = n2.height; + const blankCanvasDataURL = blankCanvas.toDataURL( + dataURLOptions.type, + dataURLOptions.quality + ); + if (canvasDataURL !== blankCanvasDataURL) { + attributes.rr_dataURL = canvasDataURL; + } + } + } + if (tagName === "img" && inlineImages) { + if (!canvasService) { + canvasService = doc.createElement("canvas"); + canvasCtx = canvasService.getContext("2d"); + } + const image = n2; + const imageSrc = image.currentSrc || image.getAttribute("src") || ""; + const priorCrossOrigin = image.crossOrigin; + const recordInlineImage = () => { + image.removeEventListener("load", recordInlineImage); + try { + canvasService.width = image.naturalWidth; + canvasService.height = image.naturalHeight; + canvasCtx.drawImage(image, 0, 0); + attributes.rr_dataURL = canvasService.toDataURL( + dataURLOptions.type, + dataURLOptions.quality + ); + } catch (err) { + if (image.crossOrigin !== "anonymous") { + image.crossOrigin = "anonymous"; + if (image.complete && image.naturalWidth !== 0) + recordInlineImage(); + else image.addEventListener("load", recordInlineImage); + return; + } else { + console.warn( + `Cannot inline img src=${imageSrc}! Error: ${err}` + ); + } + } + if (image.crossOrigin === "anonymous") { + priorCrossOrigin ? attributes.crossOrigin = priorCrossOrigin : image.removeAttribute("crossorigin"); + } + }; + if (image.complete && image.naturalWidth !== 0) recordInlineImage(); + else image.addEventListener("load", recordInlineImage); + } + if (["audio", "video"].includes(tagName)) { + const mediaAttributes = attributes; + mediaAttributes.rr_mediaState = n2.paused ? "paused" : "played"; + mediaAttributes.rr_mediaCurrentTime = n2.currentTime; + mediaAttributes.rr_mediaPlaybackRate = n2.playbackRate; + mediaAttributes.rr_mediaMuted = n2.muted; + mediaAttributes.rr_mediaLoop = n2.loop; + mediaAttributes.rr_mediaVolume = n2.volume; + } + if (!newlyAddedElement) { + if (n2.scrollLeft) { + attributes.rr_scrollLeft = n2.scrollLeft; + } + if (n2.scrollTop) { + attributes.rr_scrollTop = n2.scrollTop; + } + } + if (needBlock) { + const { width, height } = n2.getBoundingClientRect(); + attributes = { + class: attributes.class, + rr_width: `${width}px`, + rr_height: `${height}px` + }; + } + if (tagName === "iframe" && !keepIframeSrcFn(attributes.src)) { + if (!n2.contentDocument) { + attributes.rr_src = attributes.src; + } + delete attributes.src; + } + let isCustomElement; + try { + if (customElements.get(tagName)) isCustomElement = true; + } catch (e2) { + } + return { + type: NodeType$3.Element, + tagName, + attributes, + childNodes: [], + isSVG: isSVGElement(n2) || void 0, + needBlock, + rootId, + isCustom: isCustomElement + }; +} +function lowerIfExists(maybeAttr) { + if (maybeAttr === void 0 || maybeAttr === null) { + return ""; + } else { + return maybeAttr.toLowerCase(); + } +} +function slimDOMDefaults(_slimDOMOptions) { + if (_slimDOMOptions === true || _slimDOMOptions === "all") { + return { + script: true, + comment: true, + headFavicon: true, + headWhitespace: true, + headMetaSocial: true, + headMetaRobots: true, + headMetaHttpEquiv: true, + headMetaVerification: true, + // the following are off for slimDOMOptions === true, + // as they destroy some (hidden) info: + headMetaAuthorship: _slimDOMOptions === "all", + headMetaDescKeywords: _slimDOMOptions === "all", + headTitleMutations: _slimDOMOptions === "all" + }; + } else if (_slimDOMOptions) { + return _slimDOMOptions; + } + return {}; +} +function slimDOMExcluded(sn, slimDOMOptions) { + if (slimDOMOptions.comment && sn.type === NodeType$3.Comment) { + return true; + } else if (sn.type === NodeType$3.Element) { + if (slimDOMOptions.script && // script tag + (sn.tagName === "script" || // (module)preload link + sn.tagName === "link" && (sn.attributes.rel === "preload" && sn.attributes.as === "script" || sn.attributes.rel === "modulepreload") || // prefetch link + sn.tagName === "link" && sn.attributes.rel === "prefetch" && typeof sn.attributes.href === "string" && extractFileExtension(sn.attributes.href) === "js")) { + return true; + } else if (slimDOMOptions.headFavicon && (sn.tagName === "link" && sn.attributes.rel === "shortcut icon" || sn.tagName === "meta" && (lowerIfExists(sn.attributes.name).match( + /^msapplication-tile(image|color)$/ + ) || lowerIfExists(sn.attributes.name) === "application-name" || lowerIfExists(sn.attributes.rel) === "icon" || lowerIfExists(sn.attributes.rel) === "apple-touch-icon" || lowerIfExists(sn.attributes.rel) === "shortcut icon"))) { + return true; + } else if (sn.tagName === "meta") { + if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) { + return true; + } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook) + lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === "pinterest")) { + return true; + } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === "robots" || lowerIfExists(sn.attributes.name) === "googlebot" || lowerIfExists(sn.attributes.name) === "bingbot")) { + return true; + } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes["http-equiv"] !== void 0) { + return true; + } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === "author" || lowerIfExists(sn.attributes.name) === "generator" || lowerIfExists(sn.attributes.name) === "framework" || lowerIfExists(sn.attributes.name) === "publisher" || lowerIfExists(sn.attributes.name) === "progid" || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) { + return true; + } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === "google-site-verification" || lowerIfExists(sn.attributes.name) === "yandex-verification" || lowerIfExists(sn.attributes.name) === "csrf-token" || lowerIfExists(sn.attributes.name) === "p:domain_verify" || lowerIfExists(sn.attributes.name) === "verify-v1" || lowerIfExists(sn.attributes.name) === "verification" || lowerIfExists(sn.attributes.name) === "shopify-checkout-api-token")) { + return true; + } + } + } + return false; +} +function serializeNodeWithId(n2, options) { + const { + doc, + mirror: mirror2, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild = false, + inlineStylesheet = true, + maskInputOptions = {}, + maskTextFn, + maskInputFn, + slimDOMOptions, + dataURLOptions = {}, + inlineImages = false, + recordCanvas = false, + onSerialize, + onIframeLoad, + iframeLoadTimeout = 5e3, + onStylesheetLoad, + stylesheetLoadTimeout = 5e3, + keepIframeSrcFn = () => false, + newlyAddedElement = false, + cssCaptured = false + } = options; + let { needsMask } = options; + let { preserveWhiteSpace = true } = options; + if (!needsMask) { + const checkAncestors = needsMask === void 0; + needsMask = needMaskingText( + n2, + maskTextClass, + maskTextSelector, + checkAncestors + ); + } + const _serializedNode = serializeNode(n2, { + doc, + mirror: mirror2, + blockClass, + blockSelector, + needsMask, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + dataURLOptions, + inlineImages, + recordCanvas, + keepIframeSrcFn, + newlyAddedElement, + cssCaptured + }); + if (!_serializedNode) { + console.warn(n2, "not serialized"); + return null; + } + let id; + if (mirror2.hasNode(n2)) { + id = mirror2.getId(n2); + } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || !preserveWhiteSpace && _serializedNode.type === NodeType$3.Text && !_serializedNode.textContent.replace(/^\s+|\s+$/gm, "").length) { + id = IGNORED_NODE; + } else { + id = genId(); + } + const serializedNode = Object.assign(_serializedNode, { id }); + mirror2.add(n2, serializedNode); + if (id === IGNORED_NODE) { + return null; + } + if (onSerialize) { + onSerialize(n2); + } + let recordChild = !skipChild; + if (serializedNode.type === NodeType$3.Element) { + recordChild = recordChild && !serializedNode.needBlock; + delete serializedNode.needBlock; + const shadowRootEl = index$1.shadowRoot(n2); + if (shadowRootEl && isNativeShadowDom(shadowRootEl)) + serializedNode.isShadowHost = true; + } + if ((serializedNode.type === NodeType$3.Document || serializedNode.type === NodeType$3.Element) && recordChild) { + if (slimDOMOptions.headWhitespace && serializedNode.type === NodeType$3.Element && serializedNode.tagName === "head") { + preserveWhiteSpace = false; + } + const bypassOptions = { + doc, + mirror: mirror2, + blockClass, + blockSelector, + needsMask, + maskTextClass, + maskTextSelector, + skipChild, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + dataURLOptions, + inlineImages, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + onStylesheetLoad, + stylesheetLoadTimeout, + keepIframeSrcFn, + cssCaptured: false + }; + if (serializedNode.type === NodeType$3.Element && serializedNode.tagName === "textarea" && serializedNode.attributes.value !== void 0) ; + else { + if (serializedNode.type === NodeType$3.Element && serializedNode.attributes._cssText !== void 0 && typeof serializedNode.attributes._cssText === "string") { + bypassOptions.cssCaptured = true; + } + for (const childN of Array.from(index$1.childNodes(n2))) { + const serializedChildNode = serializeNodeWithId(childN, bypassOptions); + if (serializedChildNode) { + serializedNode.childNodes.push(serializedChildNode); + } + } + } + let shadowRootEl = null; + if (isElement(n2) && (shadowRootEl = index$1.shadowRoot(n2))) { + for (const childN of Array.from(index$1.childNodes(shadowRootEl))) { + const serializedChildNode = serializeNodeWithId(childN, bypassOptions); + if (serializedChildNode) { + isNativeShadowDom(shadowRootEl) && (serializedChildNode.isShadow = true); + serializedNode.childNodes.push(serializedChildNode); + } + } + } + } + const parent = index$1.parentNode(n2); + if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) { + serializedNode.isShadow = true; + } + if (serializedNode.type === NodeType$3.Element && serializedNode.tagName === "iframe") { + onceIframeLoaded( + n2, + () => { + const iframeDoc = n2.contentDocument; + if (iframeDoc && onIframeLoad) { + const serializedIframeNode = serializeNodeWithId(iframeDoc, { + doc: iframeDoc, + mirror: mirror2, + blockClass, + blockSelector, + needsMask, + maskTextClass, + maskTextSelector, + skipChild: false, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + dataURLOptions, + inlineImages, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + onStylesheetLoad, + stylesheetLoadTimeout, + keepIframeSrcFn + }); + if (serializedIframeNode) { + onIframeLoad( + n2, + serializedIframeNode + ); + } + } + }, + iframeLoadTimeout + ); + } + if (serializedNode.type === NodeType$3.Element && serializedNode.tagName === "link" && typeof serializedNode.attributes.rel === "string" && (serializedNode.attributes.rel === "stylesheet" || serializedNode.attributes.rel === "preload" && typeof serializedNode.attributes.href === "string" && extractFileExtension(serializedNode.attributes.href) === "css")) { + onceStylesheetLoaded( + n2, + () => { + if (onStylesheetLoad) { + const serializedLinkNode = serializeNodeWithId(n2, { + doc, + mirror: mirror2, + blockClass, + blockSelector, + needsMask, + maskTextClass, + maskTextSelector, + skipChild: false, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + dataURLOptions, + inlineImages, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + onStylesheetLoad, + stylesheetLoadTimeout, + keepIframeSrcFn + }); + if (serializedLinkNode) { + onStylesheetLoad( + n2, + serializedLinkNode + ); + } + } + }, + stylesheetLoadTimeout + ); + } + return serializedNode; +} +function snapshot(n2, options) { + const { + mirror: mirror2 = new Mirror(), + blockClass = "rr-block", + blockSelector = null, + maskTextClass = "rr-mask", + maskTextSelector = null, + inlineStylesheet = true, + inlineImages = false, + recordCanvas = false, + maskAllInputs = false, + maskTextFn, + maskInputFn, + slimDOM = false, + dataURLOptions, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + onStylesheetLoad, + stylesheetLoadTimeout, + keepIframeSrcFn = () => false + } = options; + const maskInputOptions = maskAllInputs === true ? { + color: true, + date: true, + "datetime-local": true, + email: true, + month: true, + number: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true, + textarea: true, + select: true, + password: true + } : maskAllInputs === false ? { + password: true + } : maskAllInputs; + const slimDOMOptions = slimDOMDefaults(slimDOM); + return serializeNodeWithId(n2, { + doc: n2, + mirror: mirror2, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + skipChild: false, + inlineStylesheet, + maskInputOptions, + maskTextFn, + maskInputFn, + slimDOMOptions, + dataURLOptions, + inlineImages, + recordCanvas, + preserveWhiteSpace, + onSerialize, + onIframeLoad, + iframeLoadTimeout, + onStylesheetLoad, + stylesheetLoadTimeout, + keepIframeSrcFn, + newlyAddedElement: false + }); +} +function getDefaultExportFromCjs$1(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +function getAugmentedNamespace$1(n2) { + if (n2.__esModule) return n2; + var f2 = n2.default; + if (typeof f2 == "function") { + var a2 = function a22() { + if (this instanceof a22) { + return Reflect.construct(f2, arguments, this.constructor); + } + return f2.apply(this, arguments); + }; + a2.prototype = f2.prototype; + } else a2 = {}; + Object.defineProperty(a2, "__esModule", { value: true }); + Object.keys(n2).forEach(function(k) { + var d = Object.getOwnPropertyDescriptor(n2, k); + Object.defineProperty(a2, k, d.get ? d : { + enumerable: true, + get: function() { + return n2[k]; + } + }); + }); + return a2; +} +var picocolors_browser$1 = { exports: {} }; +var hasRequiredPicocolors_browser$1; +function requirePicocolors_browser$1() { + if (hasRequiredPicocolors_browser$1) return picocolors_browser$1.exports; + hasRequiredPicocolors_browser$1 = 1; + var x = String; + var create = function() { + return { isColorSupported: false, reset: x, bold: x, dim: x, italic: x, underline: x, inverse: x, hidden: x, strikethrough: x, black: x, red: x, green: x, yellow: x, blue: x, magenta: x, cyan: x, white: x, gray: x, bgBlack: x, bgRed: x, bgGreen: x, bgYellow: x, bgBlue: x, bgMagenta: x, bgCyan: x, bgWhite: x }; + }; + picocolors_browser$1.exports = create(); + picocolors_browser$1.exports.createColors = create; + return picocolors_browser$1.exports; +} +const __viteBrowserExternal$2 = {}; +const __viteBrowserExternal$1$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + default: __viteBrowserExternal$2 +}, Symbol.toStringTag, { value: "Module" })); +const require$$2$1 = /* @__PURE__ */ getAugmentedNamespace$1(__viteBrowserExternal$1$1); +var cssSyntaxError$1; +var hasRequiredCssSyntaxError$1; +function requireCssSyntaxError$1() { + if (hasRequiredCssSyntaxError$1) return cssSyntaxError$1; + hasRequiredCssSyntaxError$1 = 1; + let pico = /* @__PURE__ */ requirePicocolors_browser$1(); + let terminalHighlight = require$$2$1; + class CssSyntaxError extends Error { + constructor(message, line, column, source, file, plugin) { + super(message); + this.name = "CssSyntaxError"; + this.reason = message; + if (file) { + this.file = file; + } + if (source) { + this.source = source; + } + if (plugin) { + this.plugin = plugin; + } + if (typeof line !== "undefined" && typeof column !== "undefined") { + if (typeof line === "number") { + this.line = line; + this.column = column; + } else { + this.line = line.line; + this.column = line.column; + this.endLine = column.line; + this.endColumn = column.column; + } + } + this.setMessage(); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, CssSyntaxError); + } + } + setMessage() { + this.message = this.plugin ? this.plugin + ": " : ""; + this.message += this.file ? this.file : ""; + if (typeof this.line !== "undefined") { + this.message += ":" + this.line + ":" + this.column; + } + this.message += ": " + this.reason; + } + showSourceCode(color) { + if (!this.source) return ""; + let css = this.source; + if (color == null) color = pico.isColorSupported; + if (terminalHighlight) { + if (color) css = terminalHighlight(css); + } + let lines = css.split(/\r?\n/); + let start = Math.max(this.line - 3, 0); + let end = Math.min(this.line + 2, lines.length); + let maxWidth = String(end).length; + let mark, aside; + if (color) { + let { bold, gray, red } = pico.createColors(true); + mark = (text) => bold(red(text)); + aside = (text) => gray(text); + } else { + mark = aside = (str) => str; + } + return lines.slice(start, end).map((line, index2) => { + let number = start + 1 + index2; + let gutter = " " + (" " + number).slice(-maxWidth) + " | "; + if (number === this.line) { + let spacing = aside(gutter.replace(/\d/g, " ")) + line.slice(0, this.column - 1).replace(/[^\t]/g, " "); + return mark(">") + aside(gutter) + line + "\n " + spacing + mark("^"); + } + return " " + aside(gutter) + line; + }).join("\n"); + } + toString() { + let code = this.showSourceCode(); + if (code) { + code = "\n\n" + code + "\n"; + } + return this.name + ": " + this.message + code; + } + } + cssSyntaxError$1 = CssSyntaxError; + CssSyntaxError.default = CssSyntaxError; + return cssSyntaxError$1; +} +var symbols$1 = {}; +var hasRequiredSymbols$1; +function requireSymbols$1() { + if (hasRequiredSymbols$1) return symbols$1; + hasRequiredSymbols$1 = 1; + symbols$1.isClean = Symbol("isClean"); + symbols$1.my = Symbol("my"); + return symbols$1; +} +var stringifier$1; +var hasRequiredStringifier$1; +function requireStringifier$1() { + if (hasRequiredStringifier$1) return stringifier$1; + hasRequiredStringifier$1 = 1; + const DEFAULT_RAW = { + after: "\n", + beforeClose: "\n", + beforeComment: "\n", + beforeDecl: "\n", + beforeOpen: " ", + beforeRule: "\n", + colon: ": ", + commentLeft: " ", + commentRight: " ", + emptyBody: "", + indent: " ", + semicolon: false + }; + function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); + } + class Stringifier { + constructor(builder) { + this.builder = builder; + } + atrule(node2, semicolon) { + let name = "@" + node2.name; + let params = node2.params ? this.rawValue(node2, "params") : ""; + if (typeof node2.raws.afterName !== "undefined") { + name += node2.raws.afterName; + } else if (params) { + name += " "; + } + if (node2.nodes) { + this.block(node2, name + params); + } else { + let end = (node2.raws.between || "") + (semicolon ? ";" : ""); + this.builder(name + params + end, node2); + } + } + beforeAfter(node2, detect) { + let value; + if (node2.type === "decl") { + value = this.raw(node2, null, "beforeDecl"); + } else if (node2.type === "comment") { + value = this.raw(node2, null, "beforeComment"); + } else if (detect === "before") { + value = this.raw(node2, null, "beforeRule"); + } else { + value = this.raw(node2, null, "beforeClose"); + } + let buf = node2.parent; + let depth = 0; + while (buf && buf.type !== "root") { + depth += 1; + buf = buf.parent; + } + if (value.includes("\n")) { + let indent = this.raw(node2, null, "indent"); + if (indent.length) { + for (let step = 0; step < depth; step++) value += indent; + } + } + return value; + } + block(node2, start) { + let between = this.raw(node2, "between", "beforeOpen"); + this.builder(start + between + "{", node2, "start"); + let after; + if (node2.nodes && node2.nodes.length) { + this.body(node2); + after = this.raw(node2, "after"); + } else { + after = this.raw(node2, "after", "emptyBody"); + } + if (after) this.builder(after); + this.builder("}", node2, "end"); + } + body(node2) { + let last = node2.nodes.length - 1; + while (last > 0) { + if (node2.nodes[last].type !== "comment") break; + last -= 1; + } + let semicolon = this.raw(node2, "semicolon"); + for (let i2 = 0; i2 < node2.nodes.length; i2++) { + let child = node2.nodes[i2]; + let before = this.raw(child, "before"); + if (before) this.builder(before); + this.stringify(child, last !== i2 || semicolon); + } + } + comment(node2) { + let left = this.raw(node2, "left", "commentLeft"); + let right = this.raw(node2, "right", "commentRight"); + this.builder("/*" + left + node2.text + right + "*/", node2); + } + decl(node2, semicolon) { + let between = this.raw(node2, "between", "colon"); + let string = node2.prop + between + this.rawValue(node2, "value"); + if (node2.important) { + string += node2.raws.important || " !important"; + } + if (semicolon) string += ";"; + this.builder(string, node2); + } + document(node2) { + this.body(node2); + } + raw(node2, own, detect) { + let value; + if (!detect) detect = own; + if (own) { + value = node2.raws[own]; + if (typeof value !== "undefined") return value; + } + let parent = node2.parent; + if (detect === "before") { + if (!parent || parent.type === "root" && parent.first === node2) { + return ""; + } + if (parent && parent.type === "document") { + return ""; + } + } + if (!parent) return DEFAULT_RAW[detect]; + let root2 = node2.root(); + if (!root2.rawCache) root2.rawCache = {}; + if (typeof root2.rawCache[detect] !== "undefined") { + return root2.rawCache[detect]; + } + if (detect === "before" || detect === "after") { + return this.beforeAfter(node2, detect); + } else { + let method = "raw" + capitalize(detect); + if (this[method]) { + value = this[method](root2, node2); + } else { + root2.walk((i2) => { + value = i2.raws[own]; + if (typeof value !== "undefined") return false; + }); + } + } + if (typeof value === "undefined") value = DEFAULT_RAW[detect]; + root2.rawCache[detect] = value; + return value; + } + rawBeforeClose(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length > 0) { + if (typeof i2.raws.after !== "undefined") { + value = i2.raws.after; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + } + }); + if (value) value = value.replace(/\S/g, ""); + return value; + } + rawBeforeComment(root2, node2) { + let value; + root2.walkComments((i2) => { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + }); + if (typeof value === "undefined") { + value = this.raw(node2, null, "beforeDecl"); + } else if (value) { + value = value.replace(/\S/g, ""); + } + return value; + } + rawBeforeDecl(root2, node2) { + let value; + root2.walkDecls((i2) => { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + }); + if (typeof value === "undefined") { + value = this.raw(node2, null, "beforeRule"); + } else if (value) { + value = value.replace(/\S/g, ""); + } + return value; + } + rawBeforeOpen(root2) { + let value; + root2.walk((i2) => { + if (i2.type !== "decl") { + value = i2.raws.between; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawBeforeRule(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && (i2.parent !== root2 || root2.first !== i2)) { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + } + }); + if (value) value = value.replace(/\S/g, ""); + return value; + } + rawColon(root2) { + let value; + root2.walkDecls((i2) => { + if (typeof i2.raws.between !== "undefined") { + value = i2.raws.between.replace(/[^\s:]/g, ""); + return false; + } + }); + return value; + } + rawEmptyBody(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length === 0) { + value = i2.raws.after; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawIndent(root2) { + if (root2.raws.indent) return root2.raws.indent; + let value; + root2.walk((i2) => { + let p = i2.parent; + if (p && p !== root2 && p.parent && p.parent === root2) { + if (typeof i2.raws.before !== "undefined") { + let parts = i2.raws.before.split("\n"); + value = parts[parts.length - 1]; + value = value.replace(/\S/g, ""); + return false; + } + } + }); + return value; + } + rawSemicolon(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length && i2.last.type === "decl") { + value = i2.raws.semicolon; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawValue(node2, prop) { + let value = node2[prop]; + let raw = node2.raws[prop]; + if (raw && raw.value === value) { + return raw.raw; + } + return value; + } + root(node2) { + this.body(node2); + if (node2.raws.after) this.builder(node2.raws.after); + } + rule(node2) { + this.block(node2, this.rawValue(node2, "selector")); + if (node2.raws.ownSemicolon) { + this.builder(node2.raws.ownSemicolon, node2, "end"); + } + } + stringify(node2, semicolon) { + if (!this[node2.type]) { + throw new Error( + "Unknown AST node type " + node2.type + ". Maybe you need to change PostCSS stringifier." + ); + } + this[node2.type](node2, semicolon); + } + } + stringifier$1 = Stringifier; + Stringifier.default = Stringifier; + return stringifier$1; +} +var stringify_1$1; +var hasRequiredStringify$1; +function requireStringify$1() { + if (hasRequiredStringify$1) return stringify_1$1; + hasRequiredStringify$1 = 1; + let Stringifier = requireStringifier$1(); + function stringify(node2, builder) { + let str = new Stringifier(builder); + str.stringify(node2); + } + stringify_1$1 = stringify; + stringify.default = stringify; + return stringify_1$1; +} +var node$1; +var hasRequiredNode$1; +function requireNode$1() { + if (hasRequiredNode$1) return node$1; + hasRequiredNode$1 = 1; + let { isClean, my } = requireSymbols$1(); + let CssSyntaxError = requireCssSyntaxError$1(); + let Stringifier = requireStringifier$1(); + let stringify = requireStringify$1(); + function cloneNode(obj, parent) { + let cloned = new obj.constructor(); + for (let i2 in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, i2)) { + continue; + } + if (i2 === "proxyCache") continue; + let value = obj[i2]; + let type = typeof value; + if (i2 === "parent" && type === "object") { + if (parent) cloned[i2] = parent; + } else if (i2 === "source") { + cloned[i2] = value; + } else if (Array.isArray(value)) { + cloned[i2] = value.map((j) => cloneNode(j, cloned)); + } else { + if (type === "object" && value !== null) value = cloneNode(value); + cloned[i2] = value; + } + } + return cloned; + } + class Node2 { + constructor(defaults = {}) { + this.raws = {}; + this[isClean] = false; + this[my] = true; + for (let name in defaults) { + if (name === "nodes") { + this.nodes = []; + for (let node2 of defaults[name]) { + if (typeof node2.clone === "function") { + this.append(node2.clone()); + } else { + this.append(node2); + } + } + } else { + this[name] = defaults[name]; + } + } + } + addToError(error) { + error.postcssNode = this; + if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) { + let s2 = this.source; + error.stack = error.stack.replace( + /\n\s{4}at /, + `$&${s2.input.from}:${s2.start.line}:${s2.start.column}$&` + ); + } + return error; + } + after(add) { + this.parent.insertAfter(this, add); + return this; + } + assign(overrides = {}) { + for (let name in overrides) { + this[name] = overrides[name]; + } + return this; + } + before(add) { + this.parent.insertBefore(this, add); + return this; + } + cleanRaws(keepBetween) { + delete this.raws.before; + delete this.raws.after; + if (!keepBetween) delete this.raws.between; + } + clone(overrides = {}) { + let cloned = cloneNode(this); + for (let name in overrides) { + cloned[name] = overrides[name]; + } + return cloned; + } + cloneAfter(overrides = {}) { + let cloned = this.clone(overrides); + this.parent.insertAfter(this, cloned); + return cloned; + } + cloneBefore(overrides = {}) { + let cloned = this.clone(overrides); + this.parent.insertBefore(this, cloned); + return cloned; + } + error(message, opts = {}) { + if (this.source) { + let { end, start } = this.rangeBy(opts); + return this.source.input.error( + message, + { column: start.column, line: start.line }, + { column: end.column, line: end.line }, + opts + ); + } + return new CssSyntaxError(message); + } + getProxyProcessor() { + return { + get(node2, prop) { + if (prop === "proxyOf") { + return node2; + } else if (prop === "root") { + return () => node2.root().toProxy(); + } else { + return node2[prop]; + } + }, + set(node2, prop, value) { + if (node2[prop] === value) return true; + node2[prop] = value; + if (prop === "prop" || prop === "value" || prop === "name" || prop === "params" || prop === "important" || /* c8 ignore next */ + prop === "text") { + node2.markDirty(); + } + return true; + } + }; + } + markDirty() { + if (this[isClean]) { + this[isClean] = false; + let next = this; + while (next = next.parent) { + next[isClean] = false; + } + } + } + next() { + if (!this.parent) return void 0; + let index2 = this.parent.index(this); + return this.parent.nodes[index2 + 1]; + } + positionBy(opts, stringRepresentation) { + let pos = this.source.start; + if (opts.index) { + pos = this.positionInside(opts.index, stringRepresentation); + } else if (opts.word) { + stringRepresentation = this.toString(); + let index2 = stringRepresentation.indexOf(opts.word); + if (index2 !== -1) pos = this.positionInside(index2, stringRepresentation); + } + return pos; + } + positionInside(index2, stringRepresentation) { + let string = stringRepresentation || this.toString(); + let column = this.source.start.column; + let line = this.source.start.line; + for (let i2 = 0; i2 < index2; i2++) { + if (string[i2] === "\n") { + column = 1; + line += 1; + } else { + column += 1; + } + } + return { column, line }; + } + prev() { + if (!this.parent) return void 0; + let index2 = this.parent.index(this); + return this.parent.nodes[index2 - 1]; + } + rangeBy(opts) { + let start = { + column: this.source.start.column, + line: this.source.start.line + }; + let end = this.source.end ? { + column: this.source.end.column + 1, + line: this.source.end.line + } : { + column: start.column + 1, + line: start.line + }; + if (opts.word) { + let stringRepresentation = this.toString(); + let index2 = stringRepresentation.indexOf(opts.word); + if (index2 !== -1) { + start = this.positionInside(index2, stringRepresentation); + end = this.positionInside(index2 + opts.word.length, stringRepresentation); + } + } else { + if (opts.start) { + start = { + column: opts.start.column, + line: opts.start.line + }; + } else if (opts.index) { + start = this.positionInside(opts.index); + } + if (opts.end) { + end = { + column: opts.end.column, + line: opts.end.line + }; + } else if (typeof opts.endIndex === "number") { + end = this.positionInside(opts.endIndex); + } else if (opts.index) { + end = this.positionInside(opts.index + 1); + } + } + if (end.line < start.line || end.line === start.line && end.column <= start.column) { + end = { column: start.column + 1, line: start.line }; + } + return { end, start }; + } + raw(prop, defaultType) { + let str = new Stringifier(); + return str.raw(this, prop, defaultType); + } + remove() { + if (this.parent) { + this.parent.removeChild(this); + } + this.parent = void 0; + return this; + } + replaceWith(...nodes) { + if (this.parent) { + let bookmark = this; + let foundSelf = false; + for (let node2 of nodes) { + if (node2 === this) { + foundSelf = true; + } else if (foundSelf) { + this.parent.insertAfter(bookmark, node2); + bookmark = node2; + } else { + this.parent.insertBefore(bookmark, node2); + } + } + if (!foundSelf) { + this.remove(); + } + } + return this; + } + root() { + let result2 = this; + while (result2.parent && result2.parent.type !== "document") { + result2 = result2.parent; + } + return result2; + } + toJSON(_, inputs) { + let fixed = {}; + let emitInputs = inputs == null; + inputs = inputs || /* @__PURE__ */ new Map(); + let inputsNextIndex = 0; + for (let name in this) { + if (!Object.prototype.hasOwnProperty.call(this, name)) { + continue; + } + if (name === "parent" || name === "proxyCache") continue; + let value = this[name]; + if (Array.isArray(value)) { + fixed[name] = value.map((i2) => { + if (typeof i2 === "object" && i2.toJSON) { + return i2.toJSON(null, inputs); + } else { + return i2; + } + }); + } else if (typeof value === "object" && value.toJSON) { + fixed[name] = value.toJSON(null, inputs); + } else if (name === "source") { + let inputId = inputs.get(value.input); + if (inputId == null) { + inputId = inputsNextIndex; + inputs.set(value.input, inputsNextIndex); + inputsNextIndex++; + } + fixed[name] = { + end: value.end, + inputId, + start: value.start + }; + } else { + fixed[name] = value; + } + } + if (emitInputs) { + fixed.inputs = [...inputs.keys()].map((input2) => input2.toJSON()); + } + return fixed; + } + toProxy() { + if (!this.proxyCache) { + this.proxyCache = new Proxy(this, this.getProxyProcessor()); + } + return this.proxyCache; + } + toString(stringifier2 = stringify) { + if (stringifier2.stringify) stringifier2 = stringifier2.stringify; + let result2 = ""; + stringifier2(this, (i2) => { + result2 += i2; + }); + return result2; + } + warn(result2, text, opts) { + let data = { node: this }; + for (let i2 in opts) data[i2] = opts[i2]; + return result2.warn(text, data); + } + get proxyOf() { + return this; + } + } + node$1 = Node2; + Node2.default = Node2; + return node$1; +} +var declaration$1; +var hasRequiredDeclaration$1; +function requireDeclaration$1() { + if (hasRequiredDeclaration$1) return declaration$1; + hasRequiredDeclaration$1 = 1; + let Node2 = requireNode$1(); + class Declaration extends Node2 { + constructor(defaults) { + if (defaults && typeof defaults.value !== "undefined" && typeof defaults.value !== "string") { + defaults = __spreadProps(__spreadValues({}, defaults), { value: String(defaults.value) }); + } + super(defaults); + this.type = "decl"; + } + get variable() { + return this.prop.startsWith("--") || this.prop[0] === "$"; + } + } + declaration$1 = Declaration; + Declaration.default = Declaration; + return declaration$1; +} +var nonSecure$1; +var hasRequiredNonSecure$1; +function requireNonSecure$1() { + if (hasRequiredNonSecure$1) return nonSecure$1; + hasRequiredNonSecure$1 = 1; + let urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; + let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = ""; + let i2 = size; + while (i2--) { + id += alphabet[Math.random() * alphabet.length | 0]; + } + return id; + }; + }; + let nanoid = (size = 21) => { + let id = ""; + let i2 = size; + while (i2--) { + id += urlAlphabet[Math.random() * 64 | 0]; + } + return id; + }; + nonSecure$1 = { nanoid, customAlphabet }; + return nonSecure$1; +} +var previousMap$1; +var hasRequiredPreviousMap$1; +function requirePreviousMap$1() { + if (hasRequiredPreviousMap$1) return previousMap$1; + hasRequiredPreviousMap$1 = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2$1; + let { existsSync, readFileSync } = require$$2$1; + let { dirname, join } = require$$2$1; + function fromBase64(str) { + if (Buffer) { + return Buffer.from(str, "base64").toString(); + } else { + return window.atob(str); + } + } + class PreviousMap { + constructor(css, opts) { + if (opts.map === false) return; + this.loadAnnotation(css); + this.inline = this.startWith(this.annotation, "data:"); + let prev = opts.map ? opts.map.prev : void 0; + let text = this.loadMap(opts.from, prev); + if (!this.mapFile && opts.from) { + this.mapFile = opts.from; + } + if (this.mapFile) this.root = dirname(this.mapFile); + if (text) this.text = text; + } + consumer() { + if (!this.consumerCache) { + this.consumerCache = new SourceMapConsumer(this.text); + } + return this.consumerCache; + } + decodeInline(text) { + let baseCharsetUri = /^data:application\/json;charset=utf-?8;base64,/; + let baseUri = /^data:application\/json;base64,/; + let charsetUri = /^data:application\/json;charset=utf-?8,/; + let uri = /^data:application\/json,/; + if (charsetUri.test(text) || uri.test(text)) { + return decodeURIComponent(text.substr(RegExp.lastMatch.length)); + } + if (baseCharsetUri.test(text) || baseUri.test(text)) { + return fromBase64(text.substr(RegExp.lastMatch.length)); + } + let encoding = text.match(/data:application\/json;([^,]+),/)[1]; + throw new Error("Unsupported source map encoding " + encoding); + } + getAnnotationURL(sourceMapString) { + return sourceMapString.replace(/^\/\*\s*# sourceMappingURL=/, "").trim(); + } + isMap(map) { + if (typeof map !== "object") return false; + return typeof map.mappings === "string" || typeof map._mappings === "string" || Array.isArray(map.sections); + } + loadAnnotation(css) { + let comments = css.match(/\/\*\s*# sourceMappingURL=/gm); + if (!comments) return; + let start = css.lastIndexOf(comments.pop()); + let end = css.indexOf("*/", start); + if (start > -1 && end > -1) { + this.annotation = this.getAnnotationURL(css.substring(start, end)); + } + } + loadFile(path) { + this.root = dirname(path); + if (existsSync(path)) { + this.mapFile = path; + return readFileSync(path, "utf-8").toString().trim(); + } + } + loadMap(file, prev) { + if (prev === false) return false; + if (prev) { + if (typeof prev === "string") { + return prev; + } else if (typeof prev === "function") { + let prevPath = prev(file); + if (prevPath) { + let map = this.loadFile(prevPath); + if (!map) { + throw new Error( + "Unable to load previous source map: " + prevPath.toString() + ); + } + return map; + } + } else if (prev instanceof SourceMapConsumer) { + return SourceMapGenerator.fromSourceMap(prev).toString(); + } else if (prev instanceof SourceMapGenerator) { + return prev.toString(); + } else if (this.isMap(prev)) { + return JSON.stringify(prev); + } else { + throw new Error( + "Unsupported previous source map format: " + prev.toString() + ); + } + } else if (this.inline) { + return this.decodeInline(this.annotation); + } else if (this.annotation) { + let map = this.annotation; + if (file) map = join(dirname(file), map); + return this.loadFile(map); + } + } + startWith(string, start) { + if (!string) return false; + return string.substr(0, start.length) === start; + } + withContent() { + return !!(this.consumer().sourcesContent && this.consumer().sourcesContent.length > 0); + } + } + previousMap$1 = PreviousMap; + PreviousMap.default = PreviousMap; + return previousMap$1; +} +var input$1; +var hasRequiredInput$1; +function requireInput$1() { + if (hasRequiredInput$1) return input$1; + hasRequiredInput$1 = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2$1; + let { fileURLToPath, pathToFileURL } = require$$2$1; + let { isAbsolute, resolve } = require$$2$1; + let { nanoid } = /* @__PURE__ */ requireNonSecure$1(); + let terminalHighlight = require$$2$1; + let CssSyntaxError = requireCssSyntaxError$1(); + let PreviousMap = requirePreviousMap$1(); + let fromOffsetCache = Symbol("fromOffsetCache"); + let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator); + let pathAvailable = Boolean(resolve && isAbsolute); + class Input { + constructor(css, opts = {}) { + if (css === null || typeof css === "undefined" || typeof css === "object" && !css.toString) { + throw new Error(`PostCSS received ${css} instead of CSS string`); + } + this.css = css.toString(); + if (this.css[0] === "\uFEFF" || this.css[0] === "\uFFFE") { + this.hasBOM = true; + this.css = this.css.slice(1); + } else { + this.hasBOM = false; + } + if (opts.from) { + if (!pathAvailable || /^\w+:\/\//.test(opts.from) || isAbsolute(opts.from)) { + this.file = opts.from; + } else { + this.file = resolve(opts.from); + } + } + if (pathAvailable && sourceMapAvailable) { + let map = new PreviousMap(this.css, opts); + if (map.text) { + this.map = map; + let file = map.consumer().file; + if (!this.file && file) this.file = this.mapResolve(file); + } + } + if (!this.file) { + this.id = ""; + } + if (this.map) this.map.file = this.from; + } + error(message, line, column, opts = {}) { + let result2, endLine, endColumn; + if (line && typeof line === "object") { + let start = line; + let end = column; + if (typeof start.offset === "number") { + let pos = this.fromOffset(start.offset); + line = pos.line; + column = pos.col; + } else { + line = start.line; + column = start.column; + } + if (typeof end.offset === "number") { + let pos = this.fromOffset(end.offset); + endLine = pos.line; + endColumn = pos.col; + } else { + endLine = end.line; + endColumn = end.column; + } + } else if (!column) { + let pos = this.fromOffset(line); + line = pos.line; + column = pos.col; + } + let origin = this.origin(line, column, endLine, endColumn); + if (origin) { + result2 = new CssSyntaxError( + message, + origin.endLine === void 0 ? origin.line : { column: origin.column, line: origin.line }, + origin.endLine === void 0 ? origin.column : { column: origin.endColumn, line: origin.endLine }, + origin.source, + origin.file, + opts.plugin + ); + } else { + result2 = new CssSyntaxError( + message, + endLine === void 0 ? line : { column, line }, + endLine === void 0 ? column : { column: endColumn, line: endLine }, + this.css, + this.file, + opts.plugin + ); + } + result2.input = { column, endColumn, endLine, line, source: this.css }; + if (this.file) { + if (pathToFileURL) { + result2.input.url = pathToFileURL(this.file).toString(); + } + result2.input.file = this.file; + } + return result2; + } + fromOffset(offset) { + let lastLine, lineToIndex; + if (!this[fromOffsetCache]) { + let lines = this.css.split("\n"); + lineToIndex = new Array(lines.length); + let prevIndex = 0; + for (let i2 = 0, l2 = lines.length; i2 < l2; i2++) { + lineToIndex[i2] = prevIndex; + prevIndex += lines[i2].length + 1; + } + this[fromOffsetCache] = lineToIndex; + } else { + lineToIndex = this[fromOffsetCache]; + } + lastLine = lineToIndex[lineToIndex.length - 1]; + let min = 0; + if (offset >= lastLine) { + min = lineToIndex.length - 1; + } else { + let max = lineToIndex.length - 2; + let mid; + while (min < max) { + mid = min + (max - min >> 1); + if (offset < lineToIndex[mid]) { + max = mid - 1; + } else if (offset >= lineToIndex[mid + 1]) { + min = mid + 1; + } else { + min = mid; + break; + } + } + } + return { + col: offset - lineToIndex[min] + 1, + line: min + 1 + }; + } + mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file; + } + return resolve(this.map.consumer().sourceRoot || this.map.root || ".", file); + } + origin(line, column, endLine, endColumn) { + if (!this.map) return false; + let consumer = this.map.consumer(); + let from = consumer.originalPositionFor({ column, line }); + if (!from.source) return false; + let to; + if (typeof endLine === "number") { + to = consumer.originalPositionFor({ column: endColumn, line: endLine }); + } + let fromUrl; + if (isAbsolute(from.source)) { + fromUrl = pathToFileURL(from.source); + } else { + fromUrl = new URL( + from.source, + this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile) + ); + } + let result2 = { + column: from.column, + endColumn: to && to.column, + endLine: to && to.line, + line: from.line, + url: fromUrl.toString() + }; + if (fromUrl.protocol === "file:") { + if (fileURLToPath) { + result2.file = fileURLToPath(fromUrl); + } else { + throw new Error(`file: protocol is not available in this PostCSS build`); + } + } + let source = consumer.sourceContentFor(from.source); + if (source) result2.source = source; + return result2; + } + toJSON() { + let json = {}; + for (let name of ["hasBOM", "css", "file", "id"]) { + if (this[name] != null) { + json[name] = this[name]; + } + } + if (this.map) { + json.map = __spreadValues({}, this.map); + if (json.map.consumerCache) { + json.map.consumerCache = void 0; + } + } + return json; + } + get from() { + return this.file || this.id; + } + } + input$1 = Input; + Input.default = Input; + if (terminalHighlight && terminalHighlight.registerInput) { + terminalHighlight.registerInput(Input); + } + return input$1; +} +var mapGenerator$1; +var hasRequiredMapGenerator$1; +function requireMapGenerator$1() { + if (hasRequiredMapGenerator$1) return mapGenerator$1; + hasRequiredMapGenerator$1 = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2$1; + let { dirname, relative, resolve, sep } = require$$2$1; + let { pathToFileURL } = require$$2$1; + let Input = requireInput$1(); + let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator); + let pathAvailable = Boolean(dirname && resolve && relative && sep); + class MapGenerator { + constructor(stringify, root2, opts, cssString) { + this.stringify = stringify; + this.mapOpts = opts.map || {}; + this.root = root2; + this.opts = opts; + this.css = cssString; + this.originalCSS = cssString; + this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute; + this.memoizedFileURLs = /* @__PURE__ */ new Map(); + this.memoizedPaths = /* @__PURE__ */ new Map(); + this.memoizedURLs = /* @__PURE__ */ new Map(); + } + addAnnotation() { + let content; + if (this.isInline()) { + content = "data:application/json;base64," + this.toBase64(this.map.toString()); + } else if (typeof this.mapOpts.annotation === "string") { + content = this.mapOpts.annotation; + } else if (typeof this.mapOpts.annotation === "function") { + content = this.mapOpts.annotation(this.opts.to, this.root); + } else { + content = this.outputFile() + ".map"; + } + let eol = "\n"; + if (this.css.includes("\r\n")) eol = "\r\n"; + this.css += eol + "/*# sourceMappingURL=" + content + " */"; + } + applyPrevMaps() { + for (let prev of this.previous()) { + let from = this.toUrl(this.path(prev.file)); + let root2 = prev.root || dirname(prev.file); + let map; + if (this.mapOpts.sourcesContent === false) { + map = new SourceMapConsumer(prev.text); + if (map.sourcesContent) { + map.sourcesContent = null; + } + } else { + map = prev.consumer(); + } + this.map.applySourceMap(map, from, this.toUrl(this.path(root2))); + } + } + clearAnnotation() { + if (this.mapOpts.annotation === false) return; + if (this.root) { + let node2; + for (let i2 = this.root.nodes.length - 1; i2 >= 0; i2--) { + node2 = this.root.nodes[i2]; + if (node2.type !== "comment") continue; + if (node2.text.indexOf("# sourceMappingURL=") === 0) { + this.root.removeChild(i2); + } + } + } else if (this.css) { + this.css = this.css.replace(/\n*?\/\*#[\S\s]*?\*\/$/gm, ""); + } + } + generate() { + this.clearAnnotation(); + if (pathAvailable && sourceMapAvailable && this.isMap()) { + return this.generateMap(); + } else { + let result2 = ""; + this.stringify(this.root, (i2) => { + result2 += i2; + }); + return [result2]; + } + } + generateMap() { + if (this.root) { + this.generateString(); + } else if (this.previous().length === 1) { + let prev = this.previous()[0].consumer(); + prev.file = this.outputFile(); + this.map = SourceMapGenerator.fromSourceMap(prev, { + ignoreInvalidMapping: true + }); + } else { + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }); + this.map.addMapping({ + generated: { column: 0, line: 1 }, + original: { column: 0, line: 1 }, + source: this.opts.from ? this.toUrl(this.path(this.opts.from)) : "" + }); + } + if (this.isSourcesContent()) this.setSourcesContent(); + if (this.root && this.previous().length > 0) this.applyPrevMaps(); + if (this.isAnnotation()) this.addAnnotation(); + if (this.isInline()) { + return [this.css]; + } else { + return [this.css, this.map]; + } + } + generateString() { + this.css = ""; + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }); + let line = 1; + let column = 1; + let noSource = ""; + let mapping = { + generated: { column: 0, line: 0 }, + original: { column: 0, line: 0 }, + source: "" + }; + let lines, last; + this.stringify(this.root, (str, node2, type) => { + this.css += str; + if (node2 && type !== "end") { + mapping.generated.line = line; + mapping.generated.column = column - 1; + if (node2.source && node2.source.start) { + mapping.source = this.sourcePath(node2); + mapping.original.line = node2.source.start.line; + mapping.original.column = node2.source.start.column - 1; + this.map.addMapping(mapping); + } else { + mapping.source = noSource; + mapping.original.line = 1; + mapping.original.column = 0; + this.map.addMapping(mapping); + } + } + lines = str.match(/\n/g); + if (lines) { + line += lines.length; + last = str.lastIndexOf("\n"); + column = str.length - last; + } else { + column += str.length; + } + if (node2 && type !== "start") { + let p = node2.parent || { raws: {} }; + let childless = node2.type === "decl" || node2.type === "atrule" && !node2.nodes; + if (!childless || node2 !== p.last || p.raws.semicolon) { + if (node2.source && node2.source.end) { + mapping.source = this.sourcePath(node2); + mapping.original.line = node2.source.end.line; + mapping.original.column = node2.source.end.column - 1; + mapping.generated.line = line; + mapping.generated.column = column - 2; + this.map.addMapping(mapping); + } else { + mapping.source = noSource; + mapping.original.line = 1; + mapping.original.column = 0; + mapping.generated.line = line; + mapping.generated.column = column - 1; + this.map.addMapping(mapping); + } + } + } + }); + } + isAnnotation() { + if (this.isInline()) { + return true; + } + if (typeof this.mapOpts.annotation !== "undefined") { + return this.mapOpts.annotation; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.annotation); + } + return true; + } + isInline() { + if (typeof this.mapOpts.inline !== "undefined") { + return this.mapOpts.inline; + } + let annotation = this.mapOpts.annotation; + if (typeof annotation !== "undefined" && annotation !== true) { + return false; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.inline); + } + return true; + } + isMap() { + if (typeof this.opts.map !== "undefined") { + return !!this.opts.map; + } + return this.previous().length > 0; + } + isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== "undefined") { + return this.mapOpts.sourcesContent; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.withContent()); + } + return true; + } + outputFile() { + if (this.opts.to) { + return this.path(this.opts.to); + } else if (this.opts.from) { + return this.path(this.opts.from); + } else { + return "to.css"; + } + } + path(file) { + if (this.mapOpts.absolute) return file; + if (file.charCodeAt(0) === 60) return file; + if (/^\w+:\/\//.test(file)) return file; + let cached = this.memoizedPaths.get(file); + if (cached) return cached; + let from = this.opts.to ? dirname(this.opts.to) : "."; + if (typeof this.mapOpts.annotation === "string") { + from = dirname(resolve(from, this.mapOpts.annotation)); + } + let path = relative(from, file); + this.memoizedPaths.set(file, path); + return path; + } + previous() { + if (!this.previousMaps) { + this.previousMaps = []; + if (this.root) { + this.root.walk((node2) => { + if (node2.source && node2.source.input.map) { + let map = node2.source.input.map; + if (!this.previousMaps.includes(map)) { + this.previousMaps.push(map); + } + } + }); + } else { + let input2 = new Input(this.originalCSS, this.opts); + if (input2.map) this.previousMaps.push(input2.map); + } + } + return this.previousMaps; + } + setSourcesContent() { + let already = {}; + if (this.root) { + this.root.walk((node2) => { + if (node2.source) { + let from = node2.source.input.from; + if (from && !already[from]) { + already[from] = true; + let fromUrl = this.usesFileUrls ? this.toFileUrl(from) : this.toUrl(this.path(from)); + this.map.setSourceContent(fromUrl, node2.source.input.css); + } + } + }); + } else if (this.css) { + let from = this.opts.from ? this.toUrl(this.path(this.opts.from)) : ""; + this.map.setSourceContent(from, this.css); + } + } + sourcePath(node2) { + if (this.mapOpts.from) { + return this.toUrl(this.mapOpts.from); + } else if (this.usesFileUrls) { + return this.toFileUrl(node2.source.input.from); + } else { + return this.toUrl(this.path(node2.source.input.from)); + } + } + toBase64(str) { + if (Buffer) { + return Buffer.from(str).toString("base64"); + } else { + return window.btoa(unescape(encodeURIComponent(str))); + } + } + toFileUrl(path) { + let cached = this.memoizedFileURLs.get(path); + if (cached) return cached; + if (pathToFileURL) { + let fileURL = pathToFileURL(path).toString(); + this.memoizedFileURLs.set(path, fileURL); + return fileURL; + } else { + throw new Error( + "`map.absolute` option is not available in this PostCSS build" + ); + } + } + toUrl(path) { + let cached = this.memoizedURLs.get(path); + if (cached) return cached; + if (sep === "\\") { + path = path.replace(/\\/g, "/"); + } + let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent); + this.memoizedURLs.set(path, url); + return url; + } + } + mapGenerator$1 = MapGenerator; + return mapGenerator$1; +} +var comment$1; +var hasRequiredComment$1; +function requireComment$1() { + if (hasRequiredComment$1) return comment$1; + hasRequiredComment$1 = 1; + let Node2 = requireNode$1(); + class Comment extends Node2 { + constructor(defaults) { + super(defaults); + this.type = "comment"; + } + } + comment$1 = Comment; + Comment.default = Comment; + return comment$1; +} +var container$1; +var hasRequiredContainer$1; +function requireContainer$1() { + if (hasRequiredContainer$1) return container$1; + hasRequiredContainer$1 = 1; + let { isClean, my } = requireSymbols$1(); + let Declaration = requireDeclaration$1(); + let Comment = requireComment$1(); + let Node2 = requireNode$1(); + let parse, Rule, AtRule, Root; + function cleanSource(nodes) { + return nodes.map((i2) => { + if (i2.nodes) i2.nodes = cleanSource(i2.nodes); + delete i2.source; + return i2; + }); + } + function markDirtyUp(node2) { + node2[isClean] = false; + if (node2.proxyOf.nodes) { + for (let i2 of node2.proxyOf.nodes) { + markDirtyUp(i2); + } + } + } + class Container extends Node2 { + append(...children) { + for (let child of children) { + let nodes = this.normalize(child, this.last); + for (let node2 of nodes) this.proxyOf.nodes.push(node2); + } + this.markDirty(); + return this; + } + cleanRaws(keepBetween) { + super.cleanRaws(keepBetween); + if (this.nodes) { + for (let node2 of this.nodes) node2.cleanRaws(keepBetween); + } + } + each(callback) { + if (!this.proxyOf.nodes) return void 0; + let iterator = this.getIterator(); + let index2, result2; + while (this.indexes[iterator] < this.proxyOf.nodes.length) { + index2 = this.indexes[iterator]; + result2 = callback(this.proxyOf.nodes[index2], index2); + if (result2 === false) break; + this.indexes[iterator] += 1; + } + delete this.indexes[iterator]; + return result2; + } + every(condition) { + return this.nodes.every(condition); + } + getIterator() { + if (!this.lastEach) this.lastEach = 0; + if (!this.indexes) this.indexes = {}; + this.lastEach += 1; + let iterator = this.lastEach; + this.indexes[iterator] = 0; + return iterator; + } + getProxyProcessor() { + return { + get(node2, prop) { + if (prop === "proxyOf") { + return node2; + } else if (!node2[prop]) { + return node2[prop]; + } else if (prop === "each" || typeof prop === "string" && prop.startsWith("walk")) { + return (...args) => { + return node2[prop]( + ...args.map((i2) => { + if (typeof i2 === "function") { + return (child, index2) => i2(child.toProxy(), index2); + } else { + return i2; + } + }) + ); + }; + } else if (prop === "every" || prop === "some") { + return (cb) => { + return node2[prop]( + (child, ...other) => cb(child.toProxy(), ...other) + ); + }; + } else if (prop === "root") { + return () => node2.root().toProxy(); + } else if (prop === "nodes") { + return node2.nodes.map((i2) => i2.toProxy()); + } else if (prop === "first" || prop === "last") { + return node2[prop].toProxy(); + } else { + return node2[prop]; + } + }, + set(node2, prop, value) { + if (node2[prop] === value) return true; + node2[prop] = value; + if (prop === "name" || prop === "params" || prop === "selector") { + node2.markDirty(); + } + return true; + } + }; + } + index(child) { + if (typeof child === "number") return child; + if (child.proxyOf) child = child.proxyOf; + return this.proxyOf.nodes.indexOf(child); + } + insertAfter(exist, add) { + let existIndex = this.index(exist); + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse(); + existIndex = this.index(exist); + for (let node2 of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node2); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (existIndex < index2) { + this.indexes[id] = index2 + nodes.length; + } + } + this.markDirty(); + return this; + } + insertBefore(exist, add) { + let existIndex = this.index(exist); + let type = existIndex === 0 ? "prepend" : false; + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex], type).reverse(); + existIndex = this.index(exist); + for (let node2 of nodes) this.proxyOf.nodes.splice(existIndex, 0, node2); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (existIndex <= index2) { + this.indexes[id] = index2 + nodes.length; + } + } + this.markDirty(); + return this; + } + normalize(nodes, sample) { + if (typeof nodes === "string") { + nodes = cleanSource(parse(nodes).nodes); + } else if (typeof nodes === "undefined") { + nodes = []; + } else if (Array.isArray(nodes)) { + nodes = nodes.slice(0); + for (let i2 of nodes) { + if (i2.parent) i2.parent.removeChild(i2, "ignore"); + } + } else if (nodes.type === "root" && this.type !== "document") { + nodes = nodes.nodes.slice(0); + for (let i2 of nodes) { + if (i2.parent) i2.parent.removeChild(i2, "ignore"); + } + } else if (nodes.type) { + nodes = [nodes]; + } else if (nodes.prop) { + if (typeof nodes.value === "undefined") { + throw new Error("Value field is missed in node creation"); + } else if (typeof nodes.value !== "string") { + nodes.value = String(nodes.value); + } + nodes = [new Declaration(nodes)]; + } else if (nodes.selector) { + nodes = [new Rule(nodes)]; + } else if (nodes.name) { + nodes = [new AtRule(nodes)]; + } else if (nodes.text) { + nodes = [new Comment(nodes)]; + } else { + throw new Error("Unknown node type in node creation"); + } + let processed = nodes.map((i2) => { + if (!i2[my]) Container.rebuild(i2); + i2 = i2.proxyOf; + if (i2.parent) i2.parent.removeChild(i2); + if (i2[isClean]) markDirtyUp(i2); + if (typeof i2.raws.before === "undefined") { + if (sample && typeof sample.raws.before !== "undefined") { + i2.raws.before = sample.raws.before.replace(/\S/g, ""); + } + } + i2.parent = this.proxyOf; + return i2; + }); + return processed; + } + prepend(...children) { + children = children.reverse(); + for (let child of children) { + let nodes = this.normalize(child, this.first, "prepend").reverse(); + for (let node2 of nodes) this.proxyOf.nodes.unshift(node2); + for (let id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length; + } + } + this.markDirty(); + return this; + } + push(child) { + child.parent = this; + this.proxyOf.nodes.push(child); + return this; + } + removeAll() { + for (let node2 of this.proxyOf.nodes) node2.parent = void 0; + this.proxyOf.nodes = []; + this.markDirty(); + return this; + } + removeChild(child) { + child = this.index(child); + this.proxyOf.nodes[child].parent = void 0; + this.proxyOf.nodes.splice(child, 1); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (index2 >= child) { + this.indexes[id] = index2 - 1; + } + } + this.markDirty(); + return this; + } + replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts; + opts = {}; + } + this.walkDecls((decl) => { + if (opts.props && !opts.props.includes(decl.prop)) return; + if (opts.fast && !decl.value.includes(opts.fast)) return; + decl.value = decl.value.replace(pattern, callback); + }); + this.markDirty(); + return this; + } + some(condition) { + return this.nodes.some(condition); + } + walk(callback) { + return this.each((child, i2) => { + let result2; + try { + result2 = callback(child, i2); + } catch (e2) { + throw child.addToError(e2); + } + if (result2 !== false && child.walk) { + result2 = child.walk(callback); + } + return result2; + }); + } + walkAtRules(name, callback) { + if (!callback) { + callback = name; + return this.walk((child, i2) => { + if (child.type === "atrule") { + return callback(child, i2); + } + }); + } + if (name instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "atrule" && name.test(child.name)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "atrule" && child.name === name) { + return callback(child, i2); + } + }); + } + walkComments(callback) { + return this.walk((child, i2) => { + if (child.type === "comment") { + return callback(child, i2); + } + }); + } + walkDecls(prop, callback) { + if (!callback) { + callback = prop; + return this.walk((child, i2) => { + if (child.type === "decl") { + return callback(child, i2); + } + }); + } + if (prop instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "decl" && prop.test(child.prop)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "decl" && child.prop === prop) { + return callback(child, i2); + } + }); + } + walkRules(selector, callback) { + if (!callback) { + callback = selector; + return this.walk((child, i2) => { + if (child.type === "rule") { + return callback(child, i2); + } + }); + } + if (selector instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "rule" && selector.test(child.selector)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "rule" && child.selector === selector) { + return callback(child, i2); + } + }); + } + get first() { + if (!this.proxyOf.nodes) return void 0; + return this.proxyOf.nodes[0]; + } + get last() { + if (!this.proxyOf.nodes) return void 0; + return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]; + } + } + Container.registerParse = (dependant) => { + parse = dependant; + }; + Container.registerRule = (dependant) => { + Rule = dependant; + }; + Container.registerAtRule = (dependant) => { + AtRule = dependant; + }; + Container.registerRoot = (dependant) => { + Root = dependant; + }; + container$1 = Container; + Container.default = Container; + Container.rebuild = (node2) => { + if (node2.type === "atrule") { + Object.setPrototypeOf(node2, AtRule.prototype); + } else if (node2.type === "rule") { + Object.setPrototypeOf(node2, Rule.prototype); + } else if (node2.type === "decl") { + Object.setPrototypeOf(node2, Declaration.prototype); + } else if (node2.type === "comment") { + Object.setPrototypeOf(node2, Comment.prototype); + } else if (node2.type === "root") { + Object.setPrototypeOf(node2, Root.prototype); + } + node2[my] = true; + if (node2.nodes) { + node2.nodes.forEach((child) => { + Container.rebuild(child); + }); + } + }; + return container$1; +} +var document$1$1; +var hasRequiredDocument$1; +function requireDocument$1() { + if (hasRequiredDocument$1) return document$1$1; + hasRequiredDocument$1 = 1; + let Container = requireContainer$1(); + let LazyResult, Processor; + class Document2 extends Container { + constructor(defaults) { + super(__spreadValues({ type: "document" }, defaults)); + if (!this.nodes) { + this.nodes = []; + } + } + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + } + } + Document2.registerLazyResult = (dependant) => { + LazyResult = dependant; + }; + Document2.registerProcessor = (dependant) => { + Processor = dependant; + }; + document$1$1 = Document2; + Document2.default = Document2; + return document$1$1; +} +var warnOnce$1; +var hasRequiredWarnOnce$1; +function requireWarnOnce$1() { + if (hasRequiredWarnOnce$1) return warnOnce$1; + hasRequiredWarnOnce$1 = 1; + let printed = {}; + warnOnce$1 = function warnOnce2(message) { + if (printed[message]) return; + printed[message] = true; + if (typeof console !== "undefined" && console.warn) { + console.warn(message); + } + }; + return warnOnce$1; +} +var warning$1; +var hasRequiredWarning$1; +function requireWarning$1() { + if (hasRequiredWarning$1) return warning$1; + hasRequiredWarning$1 = 1; + class Warning { + constructor(text, opts = {}) { + this.type = "warning"; + this.text = text; + if (opts.node && opts.node.source) { + let range = opts.node.rangeBy(opts); + this.line = range.start.line; + this.column = range.start.column; + this.endLine = range.end.line; + this.endColumn = range.end.column; + } + for (let opt in opts) this[opt] = opts[opt]; + } + toString() { + if (this.node) { + return this.node.error(this.text, { + index: this.index, + plugin: this.plugin, + word: this.word + }).message; + } + if (this.plugin) { + return this.plugin + ": " + this.text; + } + return this.text; + } + } + warning$1 = Warning; + Warning.default = Warning; + return warning$1; +} +var result$1; +var hasRequiredResult$1; +function requireResult$1() { + if (hasRequiredResult$1) return result$1; + hasRequiredResult$1 = 1; + let Warning = requireWarning$1(); + class Result { + constructor(processor2, root2, opts) { + this.processor = processor2; + this.messages = []; + this.root = root2; + this.opts = opts; + this.css = void 0; + this.map = void 0; + } + toString() { + return this.css; + } + warn(text, opts = {}) { + if (!opts.plugin) { + if (this.lastPlugin && this.lastPlugin.postcssPlugin) { + opts.plugin = this.lastPlugin.postcssPlugin; + } + } + let warning2 = new Warning(text, opts); + this.messages.push(warning2); + return warning2; + } + warnings() { + return this.messages.filter((i2) => i2.type === "warning"); + } + get content() { + return this.css; + } + } + result$1 = Result; + Result.default = Result; + return result$1; +} +var tokenize$1; +var hasRequiredTokenize$1; +function requireTokenize$1() { + if (hasRequiredTokenize$1) return tokenize$1; + hasRequiredTokenize$1 = 1; + const SINGLE_QUOTE = "'".charCodeAt(0); + const DOUBLE_QUOTE = '"'.charCodeAt(0); + const BACKSLASH = "\\".charCodeAt(0); + const SLASH = "/".charCodeAt(0); + const NEWLINE = "\n".charCodeAt(0); + const SPACE = " ".charCodeAt(0); + const FEED = "\f".charCodeAt(0); + const TAB = " ".charCodeAt(0); + const CR = "\r".charCodeAt(0); + const OPEN_SQUARE = "[".charCodeAt(0); + const CLOSE_SQUARE = "]".charCodeAt(0); + const OPEN_PARENTHESES = "(".charCodeAt(0); + const CLOSE_PARENTHESES = ")".charCodeAt(0); + const OPEN_CURLY = "{".charCodeAt(0); + const CLOSE_CURLY = "}".charCodeAt(0); + const SEMICOLON = ";".charCodeAt(0); + const ASTERISK = "*".charCodeAt(0); + const COLON = ":".charCodeAt(0); + const AT = "@".charCodeAt(0); + const RE_AT_END = /[\t\n\f\r "#'()/;[\\\]{}]/g; + const RE_WORD_END = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g; + const RE_BAD_BRACKET = /.[\r\n"'(/\\]/; + const RE_HEX_ESCAPE = /[\da-f]/i; + tokenize$1 = function tokenizer(input2, options = {}) { + let css = input2.css.valueOf(); + let ignore = options.ignoreErrors; + let code, next, quote, content, escape; + let escaped, escapePos, prev, n2, currentToken; + let length = css.length; + let pos = 0; + let buffer = []; + let returned = []; + function position() { + return pos; + } + function unclosed(what) { + throw input2.error("Unclosed " + what, pos); + } + function endOfFile() { + return returned.length === 0 && pos >= length; + } + function nextToken(opts) { + if (returned.length) return returned.pop(); + if (pos >= length) return; + let ignoreUnclosed = opts ? opts.ignoreUnclosed : false; + code = css.charCodeAt(pos); + switch (code) { + case NEWLINE: + case SPACE: + case TAB: + case CR: + case FEED: { + next = pos; + do { + next += 1; + code = css.charCodeAt(next); + } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED); + currentToken = ["space", css.slice(pos, next)]; + pos = next - 1; + break; + } + case OPEN_SQUARE: + case CLOSE_SQUARE: + case OPEN_CURLY: + case CLOSE_CURLY: + case COLON: + case SEMICOLON: + case CLOSE_PARENTHESES: { + let controlChar = String.fromCharCode(code); + currentToken = [controlChar, controlChar, pos]; + break; + } + case OPEN_PARENTHESES: { + prev = buffer.length ? buffer.pop()[1] : ""; + n2 = css.charCodeAt(pos + 1); + if (prev === "url" && n2 !== SINGLE_QUOTE && n2 !== DOUBLE_QUOTE && n2 !== SPACE && n2 !== NEWLINE && n2 !== TAB && n2 !== FEED && n2 !== CR) { + next = pos; + do { + escaped = false; + next = css.indexOf(")", next + 1); + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos; + break; + } else { + unclosed("bracket"); + } + } + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + currentToken = ["brackets", css.slice(pos, next + 1), pos, next]; + pos = next; + } else { + next = css.indexOf(")", pos + 1); + content = css.slice(pos, next + 1); + if (next === -1 || RE_BAD_BRACKET.test(content)) { + currentToken = ["(", "(", pos]; + } else { + currentToken = ["brackets", content, pos, next]; + pos = next; + } + } + break; + } + case SINGLE_QUOTE: + case DOUBLE_QUOTE: { + quote = code === SINGLE_QUOTE ? "'" : '"'; + next = pos; + do { + escaped = false; + next = css.indexOf(quote, next + 1); + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos + 1; + break; + } else { + unclosed("string"); + } + } + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + currentToken = ["string", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + case AT: { + RE_AT_END.lastIndex = pos + 1; + RE_AT_END.test(css); + if (RE_AT_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_AT_END.lastIndex - 2; + } + currentToken = ["at-word", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + case BACKSLASH: { + next = pos; + escape = true; + while (css.charCodeAt(next + 1) === BACKSLASH) { + next += 1; + escape = !escape; + } + code = css.charCodeAt(next + 1); + if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) { + next += 1; + if (RE_HEX_ESCAPE.test(css.charAt(next))) { + while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) { + next += 1; + } + if (css.charCodeAt(next + 1) === SPACE) { + next += 1; + } + } + } + currentToken = ["word", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + default: { + if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) { + next = css.indexOf("*/", pos + 2) + 1; + if (next === 0) { + if (ignore || ignoreUnclosed) { + next = css.length; + } else { + unclosed("comment"); + } + } + currentToken = ["comment", css.slice(pos, next + 1), pos, next]; + pos = next; + } else { + RE_WORD_END.lastIndex = pos + 1; + RE_WORD_END.test(css); + if (RE_WORD_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_WORD_END.lastIndex - 2; + } + currentToken = ["word", css.slice(pos, next + 1), pos, next]; + buffer.push(currentToken); + pos = next; + } + break; + } + } + pos++; + return currentToken; + } + function back(token) { + returned.push(token); + } + return { + back, + endOfFile, + nextToken, + position + }; + }; + return tokenize$1; +} +var atRule$1; +var hasRequiredAtRule$1; +function requireAtRule$1() { + if (hasRequiredAtRule$1) return atRule$1; + hasRequiredAtRule$1 = 1; + let Container = requireContainer$1(); + class AtRule extends Container { + constructor(defaults) { + super(defaults); + this.type = "atrule"; + } + append(...children) { + if (!this.proxyOf.nodes) this.nodes = []; + return super.append(...children); + } + prepend(...children) { + if (!this.proxyOf.nodes) this.nodes = []; + return super.prepend(...children); + } + } + atRule$1 = AtRule; + AtRule.default = AtRule; + Container.registerAtRule(AtRule); + return atRule$1; +} +var root$1; +var hasRequiredRoot$1; +function requireRoot$1() { + if (hasRequiredRoot$1) return root$1; + hasRequiredRoot$1 = 1; + let Container = requireContainer$1(); + let LazyResult, Processor; + class Root extends Container { + constructor(defaults) { + super(defaults); + this.type = "root"; + if (!this.nodes) this.nodes = []; + } + normalize(child, sample, type) { + let nodes = super.normalize(child); + if (sample) { + if (type === "prepend") { + if (this.nodes.length > 1) { + sample.raws.before = this.nodes[1].raws.before; + } else { + delete sample.raws.before; + } + } else if (this.first !== sample) { + for (let node2 of nodes) { + node2.raws.before = sample.raws.before; + } + } + } + return nodes; + } + removeChild(child, ignore) { + let index2 = this.index(child); + if (!ignore && index2 === 0 && this.nodes.length > 1) { + this.nodes[1].raws.before = this.nodes[index2].raws.before; + } + return super.removeChild(child); + } + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + } + } + Root.registerLazyResult = (dependant) => { + LazyResult = dependant; + }; + Root.registerProcessor = (dependant) => { + Processor = dependant; + }; + root$1 = Root; + Root.default = Root; + Container.registerRoot(Root); + return root$1; +} +var list_1$1; +var hasRequiredList$1; +function requireList$1() { + if (hasRequiredList$1) return list_1$1; + hasRequiredList$1 = 1; + let list = { + comma(string) { + return list.split(string, [","], true); + }, + space(string) { + let spaces = [" ", "\n", " "]; + return list.split(string, spaces); + }, + split(string, separators, last) { + let array = []; + let current = ""; + let split = false; + let func = 0; + let inQuote = false; + let prevQuote = ""; + let escape = false; + for (let letter of string) { + if (escape) { + escape = false; + } else if (letter === "\\") { + escape = true; + } else if (inQuote) { + if (letter === prevQuote) { + inQuote = false; + } + } else if (letter === '"' || letter === "'") { + inQuote = true; + prevQuote = letter; + } else if (letter === "(") { + func += 1; + } else if (letter === ")") { + if (func > 0) func -= 1; + } else if (func === 0) { + if (separators.includes(letter)) split = true; + } + if (split) { + if (current !== "") array.push(current.trim()); + current = ""; + split = false; + } else { + current += letter; + } + } + if (last || current !== "") array.push(current.trim()); + return array; + } + }; + list_1$1 = list; + list.default = list; + return list_1$1; +} +var rule$1; +var hasRequiredRule$1; +function requireRule$1() { + if (hasRequiredRule$1) return rule$1; + hasRequiredRule$1 = 1; + let Container = requireContainer$1(); + let list = requireList$1(); + class Rule extends Container { + constructor(defaults) { + super(defaults); + this.type = "rule"; + if (!this.nodes) this.nodes = []; + } + get selectors() { + return list.comma(this.selector); + } + set selectors(values) { + let match = this.selector ? this.selector.match(/,\s*/) : null; + let sep = match ? match[0] : "," + this.raw("between", "beforeOpen"); + this.selector = values.join(sep); + } + } + rule$1 = Rule; + Rule.default = Rule; + Container.registerRule(Rule); + return rule$1; +} +var parser$1; +var hasRequiredParser$1; +function requireParser$1() { + if (hasRequiredParser$1) return parser$1; + hasRequiredParser$1 = 1; + let Declaration = requireDeclaration$1(); + let tokenizer = requireTokenize$1(); + let Comment = requireComment$1(); + let AtRule = requireAtRule$1(); + let Root = requireRoot$1(); + let Rule = requireRule$1(); + const SAFE_COMMENT_NEIGHBOR = { + empty: true, + space: true + }; + function findLastWithPosition(tokens) { + for (let i2 = tokens.length - 1; i2 >= 0; i2--) { + let token = tokens[i2]; + let pos = token[3] || token[2]; + if (pos) return pos; + } + } + class Parser { + constructor(input2) { + this.input = input2; + this.root = new Root(); + this.current = this.root; + this.spaces = ""; + this.semicolon = false; + this.createTokenizer(); + this.root.source = { input: input2, start: { column: 1, line: 1, offset: 0 } }; + } + atrule(token) { + let node2 = new AtRule(); + node2.name = token[1].slice(1); + if (node2.name === "") { + this.unnamedAtrule(node2, token); + } + this.init(node2, token[2]); + let type; + let prev; + let shift; + let last = false; + let open = false; + let params = []; + let brackets = []; + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + type = token[0]; + if (type === "(" || type === "[") { + brackets.push(type === "(" ? ")" : "]"); + } else if (type === "{" && brackets.length > 0) { + brackets.push("}"); + } else if (type === brackets[brackets.length - 1]) { + brackets.pop(); + } + if (brackets.length === 0) { + if (type === ";") { + node2.source.end = this.getPosition(token[2]); + node2.source.end.offset++; + this.semicolon = true; + break; + } else if (type === "{") { + open = true; + break; + } else if (type === "}") { + if (params.length > 0) { + shift = params.length - 1; + prev = params[shift]; + while (prev && prev[0] === "space") { + prev = params[--shift]; + } + if (prev) { + node2.source.end = this.getPosition(prev[3] || prev[2]); + node2.source.end.offset++; + } + } + this.end(token); + break; + } else { + params.push(token); + } + } else { + params.push(token); + } + if (this.tokenizer.endOfFile()) { + last = true; + break; + } + } + node2.raws.between = this.spacesAndCommentsFromEnd(params); + if (params.length) { + node2.raws.afterName = this.spacesAndCommentsFromStart(params); + this.raw(node2, "params", params); + if (last) { + token = params[params.length - 1]; + node2.source.end = this.getPosition(token[3] || token[2]); + node2.source.end.offset++; + this.spaces = node2.raws.between; + node2.raws.between = ""; + } + } else { + node2.raws.afterName = ""; + node2.params = ""; + } + if (open) { + node2.nodes = []; + this.current = node2; + } + } + checkMissedSemicolon(tokens) { + let colon = this.colon(tokens); + if (colon === false) return; + let founded = 0; + let token; + for (let j = colon - 1; j >= 0; j--) { + token = tokens[j]; + if (token[0] !== "space") { + founded += 1; + if (founded === 2) break; + } + } + throw this.input.error( + "Missed semicolon", + token[0] === "word" ? token[3] + 1 : token[2] + ); + } + colon(tokens) { + let brackets = 0; + let token, type, prev; + for (let [i2, element] of tokens.entries()) { + token = element; + type = token[0]; + if (type === "(") { + brackets += 1; + } + if (type === ")") { + brackets -= 1; + } + if (brackets === 0 && type === ":") { + if (!prev) { + this.doubleColon(token); + } else if (prev[0] === "word" && prev[1] === "progid") { + continue; + } else { + return i2; + } + } + prev = token; + } + return false; + } + comment(token) { + let node2 = new Comment(); + this.init(node2, token[2]); + node2.source.end = this.getPosition(token[3] || token[2]); + node2.source.end.offset++; + let text = token[1].slice(2, -2); + if (/^\s*$/.test(text)) { + node2.text = ""; + node2.raws.left = text; + node2.raws.right = ""; + } else { + let match = text.match(/^(\s*)([^]*\S)(\s*)$/); + node2.text = match[2]; + node2.raws.left = match[1]; + node2.raws.right = match[3]; + } + } + createTokenizer() { + this.tokenizer = tokenizer(this.input); + } + decl(tokens, customProperty) { + let node2 = new Declaration(); + this.init(node2, tokens[0][2]); + let last = tokens[tokens.length - 1]; + if (last[0] === ";") { + this.semicolon = true; + tokens.pop(); + } + node2.source.end = this.getPosition( + last[3] || last[2] || findLastWithPosition(tokens) + ); + node2.source.end.offset++; + while (tokens[0][0] !== "word") { + if (tokens.length === 1) this.unknownWord(tokens); + node2.raws.before += tokens.shift()[1]; + } + node2.source.start = this.getPosition(tokens[0][2]); + node2.prop = ""; + while (tokens.length) { + let type = tokens[0][0]; + if (type === ":" || type === "space" || type === "comment") { + break; + } + node2.prop += tokens.shift()[1]; + } + node2.raws.between = ""; + let token; + while (tokens.length) { + token = tokens.shift(); + if (token[0] === ":") { + node2.raws.between += token[1]; + break; + } else { + if (token[0] === "word" && /\w/.test(token[1])) { + this.unknownWord([token]); + } + node2.raws.between += token[1]; + } + } + if (node2.prop[0] === "_" || node2.prop[0] === "*") { + node2.raws.before += node2.prop[0]; + node2.prop = node2.prop.slice(1); + } + let firstSpaces = []; + let next; + while (tokens.length) { + next = tokens[0][0]; + if (next !== "space" && next !== "comment") break; + firstSpaces.push(tokens.shift()); + } + this.precheckMissedSemicolon(tokens); + for (let i2 = tokens.length - 1; i2 >= 0; i2--) { + token = tokens[i2]; + if (token[1].toLowerCase() === "!important") { + node2.important = true; + let string = this.stringFrom(tokens, i2); + string = this.spacesFromEnd(tokens) + string; + if (string !== " !important") node2.raws.important = string; + break; + } else if (token[1].toLowerCase() === "important") { + let cache = tokens.slice(0); + let str = ""; + for (let j = i2; j > 0; j--) { + let type = cache[j][0]; + if (str.trim().indexOf("!") === 0 && type !== "space") { + break; + } + str = cache.pop()[1] + str; + } + if (str.trim().indexOf("!") === 0) { + node2.important = true; + node2.raws.important = str; + tokens = cache; + } + } + if (token[0] !== "space" && token[0] !== "comment") { + break; + } + } + let hasWord = tokens.some((i2) => i2[0] !== "space" && i2[0] !== "comment"); + if (hasWord) { + node2.raws.between += firstSpaces.map((i2) => i2[1]).join(""); + firstSpaces = []; + } + this.raw(node2, "value", firstSpaces.concat(tokens), customProperty); + if (node2.value.includes(":") && !customProperty) { + this.checkMissedSemicolon(tokens); + } + } + doubleColon(token) { + throw this.input.error( + "Double colon", + { offset: token[2] }, + { offset: token[2] + token[1].length } + ); + } + emptyRule(token) { + let node2 = new Rule(); + this.init(node2, token[2]); + node2.selector = ""; + node2.raws.between = ""; + this.current = node2; + } + end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.semicolon = false; + this.current.raws.after = (this.current.raws.after || "") + this.spaces; + this.spaces = ""; + if (this.current.parent) { + this.current.source.end = this.getPosition(token[2]); + this.current.source.end.offset++; + this.current = this.current.parent; + } else { + this.unexpectedClose(token); + } + } + endFile() { + if (this.current.parent) this.unclosedBlock(); + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.current.raws.after = (this.current.raws.after || "") + this.spaces; + this.root.source.end = this.getPosition(this.tokenizer.position()); + } + freeSemicolon(token) { + this.spaces += token[1]; + if (this.current.nodes) { + let prev = this.current.nodes[this.current.nodes.length - 1]; + if (prev && prev.type === "rule" && !prev.raws.ownSemicolon) { + prev.raws.ownSemicolon = this.spaces; + this.spaces = ""; + } + } + } + // Helpers + getPosition(offset) { + let pos = this.input.fromOffset(offset); + return { + column: pos.col, + line: pos.line, + offset + }; + } + init(node2, offset) { + this.current.push(node2); + node2.source = { + input: this.input, + start: this.getPosition(offset) + }; + node2.raws.before = this.spaces; + this.spaces = ""; + if (node2.type !== "comment") this.semicolon = false; + } + other(start) { + let end = false; + let type = null; + let colon = false; + let bracket = null; + let brackets = []; + let customProperty = start[1].startsWith("--"); + let tokens = []; + let token = start; + while (token) { + type = token[0]; + tokens.push(token); + if (type === "(" || type === "[") { + if (!bracket) bracket = token; + brackets.push(type === "(" ? ")" : "]"); + } else if (customProperty && colon && type === "{") { + if (!bracket) bracket = token; + brackets.push("}"); + } else if (brackets.length === 0) { + if (type === ";") { + if (colon) { + this.decl(tokens, customProperty); + return; + } else { + break; + } + } else if (type === "{") { + this.rule(tokens); + return; + } else if (type === "}") { + this.tokenizer.back(tokens.pop()); + end = true; + break; + } else if (type === ":") { + colon = true; + } + } else if (type === brackets[brackets.length - 1]) { + brackets.pop(); + if (brackets.length === 0) bracket = null; + } + token = this.tokenizer.nextToken(); + } + if (this.tokenizer.endOfFile()) end = true; + if (brackets.length > 0) this.unclosedBracket(bracket); + if (end && colon) { + if (!customProperty) { + while (tokens.length) { + token = tokens[tokens.length - 1][0]; + if (token !== "space" && token !== "comment") break; + this.tokenizer.back(tokens.pop()); + } + } + this.decl(tokens, customProperty); + } else { + this.unknownWord(tokens); + } + } + parse() { + let token; + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + switch (token[0]) { + case "space": + this.spaces += token[1]; + break; + case ";": + this.freeSemicolon(token); + break; + case "}": + this.end(token); + break; + case "comment": + this.comment(token); + break; + case "at-word": + this.atrule(token); + break; + case "{": + this.emptyRule(token); + break; + default: + this.other(token); + break; + } + } + this.endFile(); + } + precheckMissedSemicolon() { + } + raw(node2, prop, tokens, customProperty) { + let token, type; + let length = tokens.length; + let value = ""; + let clean = true; + let next, prev; + for (let i2 = 0; i2 < length; i2 += 1) { + token = tokens[i2]; + type = token[0]; + if (type === "space" && i2 === length - 1 && !customProperty) { + clean = false; + } else if (type === "comment") { + prev = tokens[i2 - 1] ? tokens[i2 - 1][0] : "empty"; + next = tokens[i2 + 1] ? tokens[i2 + 1][0] : "empty"; + if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) { + if (value.slice(-1) === ",") { + clean = false; + } else { + value += token[1]; + } + } else { + clean = false; + } + } else { + value += token[1]; + } + } + if (!clean) { + let raw = tokens.reduce((all, i2) => all + i2[1], ""); + node2.raws[prop] = { raw, value }; + } + node2[prop] = value; + } + rule(tokens) { + tokens.pop(); + let node2 = new Rule(); + this.init(node2, tokens[0][2]); + node2.raws.between = this.spacesAndCommentsFromEnd(tokens); + this.raw(node2, "selector", tokens); + this.current = node2; + } + spacesAndCommentsFromEnd(tokens) { + let lastTokenType; + let spaces = ""; + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== "space" && lastTokenType !== "comment") break; + spaces = tokens.pop()[1] + spaces; + } + return spaces; + } + // Errors + spacesAndCommentsFromStart(tokens) { + let next; + let spaces = ""; + while (tokens.length) { + next = tokens[0][0]; + if (next !== "space" && next !== "comment") break; + spaces += tokens.shift()[1]; + } + return spaces; + } + spacesFromEnd(tokens) { + let lastTokenType; + let spaces = ""; + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== "space") break; + spaces = tokens.pop()[1] + spaces; + } + return spaces; + } + stringFrom(tokens, from) { + let result2 = ""; + for (let i2 = from; i2 < tokens.length; i2++) { + result2 += tokens[i2][1]; + } + tokens.splice(from, tokens.length - from); + return result2; + } + unclosedBlock() { + let pos = this.current.source.start; + throw this.input.error("Unclosed block", pos.line, pos.column); + } + unclosedBracket(bracket) { + throw this.input.error( + "Unclosed bracket", + { offset: bracket[2] }, + { offset: bracket[2] + 1 } + ); + } + unexpectedClose(token) { + throw this.input.error( + "Unexpected }", + { offset: token[2] }, + { offset: token[2] + 1 } + ); + } + unknownWord(tokens) { + throw this.input.error( + "Unknown word", + { offset: tokens[0][2] }, + { offset: tokens[0][2] + tokens[0][1].length } + ); + } + unnamedAtrule(node2, token) { + throw this.input.error( + "At-rule without name", + { offset: token[2] }, + { offset: token[2] + token[1].length } + ); + } + } + parser$1 = Parser; + return parser$1; +} +var parse_1$1; +var hasRequiredParse$1; +function requireParse$1() { + if (hasRequiredParse$1) return parse_1$1; + hasRequiredParse$1 = 1; + let Container = requireContainer$1(); + let Parser = requireParser$1(); + let Input = requireInput$1(); + function parse(css, opts) { + let input2 = new Input(css, opts); + let parser2 = new Parser(input2); + try { + parser2.parse(); + } catch (e2) { + if (true) { + if (e2.name === "CssSyntaxError" && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e2.message += "\nYou tried to parse SCSS with the standard CSS parser; try again with the postcss-scss parser"; + } else if (/\.sass/i.test(opts.from)) { + e2.message += "\nYou tried to parse Sass with the standard CSS parser; try again with the postcss-sass parser"; + } else if (/\.less$/i.test(opts.from)) { + e2.message += "\nYou tried to parse Less with the standard CSS parser; try again with the postcss-less parser"; + } + } + } + throw e2; + } + return parser2.root; + } + parse_1$1 = parse; + parse.default = parse; + Container.registerParse(parse); + return parse_1$1; +} +var lazyResult$1; +var hasRequiredLazyResult$1; +function requireLazyResult$1() { + if (hasRequiredLazyResult$1) return lazyResult$1; + hasRequiredLazyResult$1 = 1; + let { isClean, my } = requireSymbols$1(); + let MapGenerator = requireMapGenerator$1(); + let stringify = requireStringify$1(); + let Container = requireContainer$1(); + let Document2 = requireDocument$1(); + let warnOnce2 = requireWarnOnce$1(); + let Result = requireResult$1(); + let parse = requireParse$1(); + let Root = requireRoot$1(); + const TYPE_TO_CLASS_NAME = { + atrule: "AtRule", + comment: "Comment", + decl: "Declaration", + document: "Document", + root: "Root", + rule: "Rule" + }; + const PLUGIN_PROPS = { + AtRule: true, + AtRuleExit: true, + Comment: true, + CommentExit: true, + Declaration: true, + DeclarationExit: true, + Document: true, + DocumentExit: true, + Once: true, + OnceExit: true, + postcssPlugin: true, + prepare: true, + Root: true, + RootExit: true, + Rule: true, + RuleExit: true + }; + const NOT_VISITORS = { + Once: true, + postcssPlugin: true, + prepare: true + }; + const CHILDREN = 0; + function isPromise(obj) { + return typeof obj === "object" && typeof obj.then === "function"; + } + function getEvents(node2) { + let key = false; + let type = TYPE_TO_CLASS_NAME[node2.type]; + if (node2.type === "decl") { + key = node2.prop.toLowerCase(); + } else if (node2.type === "atrule") { + key = node2.name.toLowerCase(); + } + if (key && node2.append) { + return [ + type, + type + "-" + key, + CHILDREN, + type + "Exit", + type + "Exit-" + key + ]; + } else if (key) { + return [type, type + "-" + key, type + "Exit", type + "Exit-" + key]; + } else if (node2.append) { + return [type, CHILDREN, type + "Exit"]; + } else { + return [type, type + "Exit"]; + } + } + function toStack(node2) { + let events; + if (node2.type === "document") { + events = ["Document", CHILDREN, "DocumentExit"]; + } else if (node2.type === "root") { + events = ["Root", CHILDREN, "RootExit"]; + } else { + events = getEvents(node2); + } + return { + eventIndex: 0, + events, + iterator: 0, + node: node2, + visitorIndex: 0, + visitors: [] + }; + } + function cleanMarks(node2) { + node2[isClean] = false; + if (node2.nodes) node2.nodes.forEach((i2) => cleanMarks(i2)); + return node2; + } + let postcss2 = {}; + class LazyResult { + constructor(processor2, css, opts) { + this.stringified = false; + this.processed = false; + let root2; + if (typeof css === "object" && css !== null && (css.type === "root" || css.type === "document")) { + root2 = cleanMarks(css); + } else if (css instanceof LazyResult || css instanceof Result) { + root2 = cleanMarks(css.root); + if (css.map) { + if (typeof opts.map === "undefined") opts.map = {}; + if (!opts.map.inline) opts.map.inline = false; + opts.map.prev = css.map; + } + } else { + let parser2 = parse; + if (opts.syntax) parser2 = opts.syntax.parse; + if (opts.parser) parser2 = opts.parser; + if (parser2.parse) parser2 = parser2.parse; + try { + root2 = parser2(css, opts); + } catch (error) { + this.processed = true; + this.error = error; + } + if (root2 && !root2[my]) { + Container.rebuild(root2); + } + } + this.result = new Result(processor2, root2, opts); + this.helpers = __spreadProps(__spreadValues({}, postcss2), { postcss: postcss2, result: this.result }); + this.plugins = this.processor.plugins.map((plugin) => { + if (typeof plugin === "object" && plugin.prepare) { + return __spreadValues(__spreadValues({}, plugin), plugin.prepare(this.result)); + } else { + return plugin; + } + }); + } + async() { + if (this.error) return Promise.reject(this.error); + if (this.processed) return Promise.resolve(this.result); + if (!this.processing) { + this.processing = this.runAsync(); + } + return this.processing; + } + catch(onRejected) { + return this.async().catch(onRejected); + } + finally(onFinally) { + return this.async().then(onFinally, onFinally); + } + getAsyncError() { + throw new Error("Use process(css).then(cb) to work with async plugins"); + } + handleError(error, node2) { + let plugin = this.result.lastPlugin; + try { + if (node2) node2.addToError(error); + this.error = error; + if (error.name === "CssSyntaxError" && !error.plugin) { + error.plugin = plugin.postcssPlugin; + error.setMessage(); + } else if (plugin.postcssVersion) { + if (true) { + let pluginName = plugin.postcssPlugin; + let pluginVer = plugin.postcssVersion; + let runtimeVer = this.result.processor.version; + let a2 = pluginVer.split("."); + let b = runtimeVer.split("."); + if (a2[0] !== b[0] || parseInt(a2[1]) > parseInt(b[1])) { + console.error( + "Unknown error from PostCSS plugin. Your current PostCSS version is " + runtimeVer + ", but " + pluginName + " uses " + pluginVer + ". Perhaps this is the source of the error below." + ); + } + } + } + } catch (err) { + if (console && console.error) console.error(err); + } + return error; + } + prepareVisitors() { + this.listeners = {}; + let add = (plugin, type, cb) => { + if (!this.listeners[type]) this.listeners[type] = []; + this.listeners[type].push([plugin, cb]); + }; + for (let plugin of this.plugins) { + if (typeof plugin === "object") { + for (let event in plugin) { + if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) { + throw new Error( + `Unknown event ${event} in ${plugin.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).` + ); + } + if (!NOT_VISITORS[event]) { + if (typeof plugin[event] === "object") { + for (let filter in plugin[event]) { + if (filter === "*") { + add(plugin, event, plugin[event][filter]); + } else { + add( + plugin, + event + "-" + filter.toLowerCase(), + plugin[event][filter] + ); + } + } + } else if (typeof plugin[event] === "function") { + add(plugin, event, plugin[event]); + } + } + } + } + } + this.hasListener = Object.keys(this.listeners).length > 0; + } + async runAsync() { + this.plugin = 0; + for (let i2 = 0; i2 < this.plugins.length; i2++) { + let plugin = this.plugins[i2]; + let promise = this.runOnRoot(plugin); + if (isPromise(promise)) { + try { + await promise; + } catch (error) { + throw this.handleError(error); + } + } + } + this.prepareVisitors(); + if (this.hasListener) { + let root2 = this.result.root; + while (!root2[isClean]) { + root2[isClean] = true; + let stack = [toStack(root2)]; + while (stack.length > 0) { + let promise = this.visitTick(stack); + if (isPromise(promise)) { + try { + await promise; + } catch (e2) { + let node2 = stack[stack.length - 1].node; + throw this.handleError(e2, node2); + } + } + } + } + if (this.listeners.OnceExit) { + for (let [plugin, visitor] of this.listeners.OnceExit) { + this.result.lastPlugin = plugin; + try { + if (root2.type === "document") { + let roots = root2.nodes.map( + (subRoot) => visitor(subRoot, this.helpers) + ); + await Promise.all(roots); + } else { + await visitor(root2, this.helpers); + } + } catch (e2) { + throw this.handleError(e2); + } + } + } + } + this.processed = true; + return this.stringify(); + } + runOnRoot(plugin) { + this.result.lastPlugin = plugin; + try { + if (typeof plugin === "object" && plugin.Once) { + if (this.result.root.type === "document") { + let roots = this.result.root.nodes.map( + (root2) => plugin.Once(root2, this.helpers) + ); + if (isPromise(roots[0])) { + return Promise.all(roots); + } + return roots; + } + return plugin.Once(this.result.root, this.helpers); + } else if (typeof plugin === "function") { + return plugin(this.result.root, this.result); + } + } catch (error) { + throw this.handleError(error); + } + } + stringify() { + if (this.error) throw this.error; + if (this.stringified) return this.result; + this.stringified = true; + this.sync(); + let opts = this.result.opts; + let str = stringify; + if (opts.syntax) str = opts.syntax.stringify; + if (opts.stringifier) str = opts.stringifier; + if (str.stringify) str = str.stringify; + let map = new MapGenerator(str, this.result.root, this.result.opts); + let data = map.generate(); + this.result.css = data[0]; + this.result.map = data[1]; + return this.result; + } + sync() { + if (this.error) throw this.error; + if (this.processed) return this.result; + this.processed = true; + if (this.processing) { + throw this.getAsyncError(); + } + for (let plugin of this.plugins) { + let promise = this.runOnRoot(plugin); + if (isPromise(promise)) { + throw this.getAsyncError(); + } + } + this.prepareVisitors(); + if (this.hasListener) { + let root2 = this.result.root; + while (!root2[isClean]) { + root2[isClean] = true; + this.walkSync(root2); + } + if (this.listeners.OnceExit) { + if (root2.type === "document") { + for (let subRoot of root2.nodes) { + this.visitSync(this.listeners.OnceExit, subRoot); + } + } else { + this.visitSync(this.listeners.OnceExit, root2); + } + } + } + return this.result; + } + then(onFulfilled, onRejected) { + if (true) { + if (!("from" in this.opts)) { + warnOnce2( + "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning." + ); + } + } + return this.async().then(onFulfilled, onRejected); + } + toString() { + return this.css; + } + visitSync(visitors, node2) { + for (let [plugin, visitor] of visitors) { + this.result.lastPlugin = plugin; + let promise; + try { + promise = visitor(node2, this.helpers); + } catch (e2) { + throw this.handleError(e2, node2.proxyOf); + } + if (node2.type !== "root" && node2.type !== "document" && !node2.parent) { + return true; + } + if (isPromise(promise)) { + throw this.getAsyncError(); + } + } + } + visitTick(stack) { + let visit2 = stack[stack.length - 1]; + let { node: node2, visitors } = visit2; + if (node2.type !== "root" && node2.type !== "document" && !node2.parent) { + stack.pop(); + return; + } + if (visitors.length > 0 && visit2.visitorIndex < visitors.length) { + let [plugin, visitor] = visitors[visit2.visitorIndex]; + visit2.visitorIndex += 1; + if (visit2.visitorIndex === visitors.length) { + visit2.visitors = []; + visit2.visitorIndex = 0; + } + this.result.lastPlugin = plugin; + try { + return visitor(node2.toProxy(), this.helpers); + } catch (e2) { + throw this.handleError(e2, node2); + } + } + if (visit2.iterator !== 0) { + let iterator = visit2.iterator; + let child; + while (child = node2.nodes[node2.indexes[iterator]]) { + node2.indexes[iterator] += 1; + if (!child[isClean]) { + child[isClean] = true; + stack.push(toStack(child)); + return; + } + } + visit2.iterator = 0; + delete node2.indexes[iterator]; + } + let events = visit2.events; + while (visit2.eventIndex < events.length) { + let event = events[visit2.eventIndex]; + visit2.eventIndex += 1; + if (event === CHILDREN) { + if (node2.nodes && node2.nodes.length) { + node2[isClean] = true; + visit2.iterator = node2.getIterator(); + } + return; + } else if (this.listeners[event]) { + visit2.visitors = this.listeners[event]; + return; + } + } + stack.pop(); + } + walkSync(node2) { + node2[isClean] = true; + let events = getEvents(node2); + for (let event of events) { + if (event === CHILDREN) { + if (node2.nodes) { + node2.each((child) => { + if (!child[isClean]) this.walkSync(child); + }); + } + } else { + let visitors = this.listeners[event]; + if (visitors) { + if (this.visitSync(visitors, node2.toProxy())) return; + } + } + } + } + warnings() { + return this.sync().warnings(); + } + get content() { + return this.stringify().content; + } + get css() { + return this.stringify().css; + } + get map() { + return this.stringify().map; + } + get messages() { + return this.sync().messages; + } + get opts() { + return this.result.opts; + } + get processor() { + return this.result.processor; + } + get root() { + return this.sync().root; + } + get [Symbol.toStringTag]() { + return "LazyResult"; + } + } + LazyResult.registerPostcss = (dependant) => { + postcss2 = dependant; + }; + lazyResult$1 = LazyResult; + LazyResult.default = LazyResult; + Root.registerLazyResult(LazyResult); + Document2.registerLazyResult(LazyResult); + return lazyResult$1; +} +var noWorkResult$1; +var hasRequiredNoWorkResult$1; +function requireNoWorkResult$1() { + if (hasRequiredNoWorkResult$1) return noWorkResult$1; + hasRequiredNoWorkResult$1 = 1; + let MapGenerator = requireMapGenerator$1(); + let stringify = requireStringify$1(); + let warnOnce2 = requireWarnOnce$1(); + let parse = requireParse$1(); + const Result = requireResult$1(); + class NoWorkResult { + constructor(processor2, css, opts) { + css = css.toString(); + this.stringified = false; + this._processor = processor2; + this._css = css; + this._opts = opts; + this._map = void 0; + let root2; + let str = stringify; + this.result = new Result(this._processor, root2, this._opts); + this.result.css = css; + let self2 = this; + Object.defineProperty(this.result, "root", { + get() { + return self2.root; + } + }); + let map = new MapGenerator(str, root2, this._opts, css); + if (map.isMap()) { + let [generatedCSS, generatedMap] = map.generate(); + if (generatedCSS) { + this.result.css = generatedCSS; + } + if (generatedMap) { + this.result.map = generatedMap; + } + } else { + map.clearAnnotation(); + this.result.css = map.css; + } + } + async() { + if (this.error) return Promise.reject(this.error); + return Promise.resolve(this.result); + } + catch(onRejected) { + return this.async().catch(onRejected); + } + finally(onFinally) { + return this.async().then(onFinally, onFinally); + } + sync() { + if (this.error) throw this.error; + return this.result; + } + then(onFulfilled, onRejected) { + if (true) { + if (!("from" in this._opts)) { + warnOnce2( + "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning." + ); + } + } + return this.async().then(onFulfilled, onRejected); + } + toString() { + return this._css; + } + warnings() { + return []; + } + get content() { + return this.result.css; + } + get css() { + return this.result.css; + } + get map() { + return this.result.map; + } + get messages() { + return []; + } + get opts() { + return this.result.opts; + } + get processor() { + return this.result.processor; + } + get root() { + if (this._root) { + return this._root; + } + let root2; + let parser2 = parse; + try { + root2 = parser2(this._css, this._opts); + } catch (error) { + this.error = error; + } + if (this.error) { + throw this.error; + } else { + this._root = root2; + return root2; + } + } + get [Symbol.toStringTag]() { + return "NoWorkResult"; + } + } + noWorkResult$1 = NoWorkResult; + NoWorkResult.default = NoWorkResult; + return noWorkResult$1; +} +var processor$1; +var hasRequiredProcessor$1; +function requireProcessor$1() { + if (hasRequiredProcessor$1) return processor$1; + hasRequiredProcessor$1 = 1; + let NoWorkResult = requireNoWorkResult$1(); + let LazyResult = requireLazyResult$1(); + let Document2 = requireDocument$1(); + let Root = requireRoot$1(); + class Processor { + constructor(plugins = []) { + this.version = "8.4.38"; + this.plugins = this.normalize(plugins); + } + normalize(plugins) { + let normalized = []; + for (let i2 of plugins) { + if (i2.postcss === true) { + i2 = i2(); + } else if (i2.postcss) { + i2 = i2.postcss; + } + if (typeof i2 === "object" && Array.isArray(i2.plugins)) { + normalized = normalized.concat(i2.plugins); + } else if (typeof i2 === "object" && i2.postcssPlugin) { + normalized.push(i2); + } else if (typeof i2 === "function") { + normalized.push(i2); + } else if (typeof i2 === "object" && (i2.parse || i2.stringify)) { + if (true) { + throw new Error( + "PostCSS syntaxes cannot be used as plugins. Instead, please use one of the syntax/parser/stringifier options as outlined in your PostCSS runner documentation." + ); + } + } else { + throw new Error(i2 + " is not a PostCSS plugin"); + } + } + return normalized; + } + process(css, opts = {}) { + if (!this.plugins.length && !opts.parser && !opts.stringifier && !opts.syntax) { + return new NoWorkResult(this, css, opts); + } else { + return new LazyResult(this, css, opts); + } + } + use(plugin) { + this.plugins = this.plugins.concat(this.normalize([plugin])); + return this; + } + } + processor$1 = Processor; + Processor.default = Processor; + Root.registerProcessor(Processor); + Document2.registerProcessor(Processor); + return processor$1; +} +var fromJSON_1$1; +var hasRequiredFromJSON$1; +function requireFromJSON$1() { + if (hasRequiredFromJSON$1) return fromJSON_1$1; + hasRequiredFromJSON$1 = 1; + let Declaration = requireDeclaration$1(); + let PreviousMap = requirePreviousMap$1(); + let Comment = requireComment$1(); + let AtRule = requireAtRule$1(); + let Input = requireInput$1(); + let Root = requireRoot$1(); + let Rule = requireRule$1(); + function fromJSON(json, inputs) { + if (Array.isArray(json)) return json.map((n2) => fromJSON(n2)); + let _a2 = json, { inputs: ownInputs } = _a2, defaults = __objRest(_a2, ["inputs"]); + if (ownInputs) { + inputs = []; + for (let input2 of ownInputs) { + let inputHydrated = __spreadProps(__spreadValues({}, input2), { __proto__: Input.prototype }); + if (inputHydrated.map) { + inputHydrated.map = __spreadProps(__spreadValues({}, inputHydrated.map), { + __proto__: PreviousMap.prototype + }); + } + inputs.push(inputHydrated); + } + } + if (defaults.nodes) { + defaults.nodes = json.nodes.map((n2) => fromJSON(n2, inputs)); + } + if (defaults.source) { + let _b = defaults.source, { inputId } = _b, source = __objRest(_b, ["inputId"]); + defaults.source = source; + if (inputId != null) { + defaults.source.input = inputs[inputId]; + } + } + if (defaults.type === "root") { + return new Root(defaults); + } else if (defaults.type === "decl") { + return new Declaration(defaults); + } else if (defaults.type === "rule") { + return new Rule(defaults); + } else if (defaults.type === "comment") { + return new Comment(defaults); + } else if (defaults.type === "atrule") { + return new AtRule(defaults); + } else { + throw new Error("Unknown node type: " + json.type); + } + } + fromJSON_1$1 = fromJSON; + fromJSON.default = fromJSON; + return fromJSON_1$1; +} +var postcss_1$1; +var hasRequiredPostcss$1; +function requirePostcss$1() { + if (hasRequiredPostcss$1) return postcss_1$1; + hasRequiredPostcss$1 = 1; + let CssSyntaxError = requireCssSyntaxError$1(); + let Declaration = requireDeclaration$1(); + let LazyResult = requireLazyResult$1(); + let Container = requireContainer$1(); + let Processor = requireProcessor$1(); + let stringify = requireStringify$1(); + let fromJSON = requireFromJSON$1(); + let Document2 = requireDocument$1(); + let Warning = requireWarning$1(); + let Comment = requireComment$1(); + let AtRule = requireAtRule$1(); + let Result = requireResult$1(); + let Input = requireInput$1(); + let parse = requireParse$1(); + let list = requireList$1(); + let Rule = requireRule$1(); + let Root = requireRoot$1(); + let Node2 = requireNode$1(); + function postcss2(...plugins) { + if (plugins.length === 1 && Array.isArray(plugins[0])) { + plugins = plugins[0]; + } + return new Processor(plugins); + } + postcss2.plugin = function plugin(name, initializer) { + let warningPrinted = false; + function creator(...args) { + if (console && console.warn && !warningPrinted) { + warningPrinted = true; + console.warn( + name + ": postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration" + ); + if (process.env.LANG && process.env.LANG.startsWith("cn")) { + console.warn( + name + ": \u91CC\u9762 postcss.plugin \u88AB\u5F03\u7528. \u8FC1\u79FB\u6307\u5357:\nhttps://www.w3ctech.com/topic/2226" + ); + } + } + let transformer = initializer(...args); + transformer.postcssPlugin = name; + transformer.postcssVersion = new Processor().version; + return transformer; + } + let cache; + Object.defineProperty(creator, "postcss", { + get() { + if (!cache) cache = creator(); + return cache; + } + }); + creator.process = function(css, processOpts, pluginOpts) { + return postcss2([creator(pluginOpts)]).process(css, processOpts); + }; + return creator; + }; + postcss2.stringify = stringify; + postcss2.parse = parse; + postcss2.fromJSON = fromJSON; + postcss2.list = list; + postcss2.comment = (defaults) => new Comment(defaults); + postcss2.atRule = (defaults) => new AtRule(defaults); + postcss2.decl = (defaults) => new Declaration(defaults); + postcss2.rule = (defaults) => new Rule(defaults); + postcss2.root = (defaults) => new Root(defaults); + postcss2.document = (defaults) => new Document2(defaults); + postcss2.CssSyntaxError = CssSyntaxError; + postcss2.Declaration = Declaration; + postcss2.Container = Container; + postcss2.Processor = Processor; + postcss2.Document = Document2; + postcss2.Comment = Comment; + postcss2.Warning = Warning; + postcss2.AtRule = AtRule; + postcss2.Result = Result; + postcss2.Input = Input; + postcss2.Rule = Rule; + postcss2.Root = Root; + postcss2.Node = Node2; + LazyResult.registerPostcss(postcss2); + postcss_1$1 = postcss2; + postcss2.default = postcss2; + return postcss_1$1; +} +var postcssExports$1 = requirePostcss$1(); +const postcss$1 = /* @__PURE__ */ getDefaultExportFromCjs$1(postcssExports$1); +postcss$1.stringify; +postcss$1.fromJSON; +postcss$1.plugin; +postcss$1.parse; +postcss$1.list; +postcss$1.document; +postcss$1.comment; +postcss$1.atRule; +postcss$1.rule; +postcss$1.decl; +postcss$1.root; +postcss$1.CssSyntaxError; +postcss$1.Declaration; +postcss$1.Container; +postcss$1.Processor; +postcss$1.Document; +postcss$1.Comment; +postcss$1.Warning; +postcss$1.AtRule; +postcss$1.Result; +postcss$1.Input; +postcss$1.Rule; +postcss$1.Root; +postcss$1.Node; +var __defProp22 = Object.defineProperty; +var __defNormalProp22 = (obj, key, value) => key in obj ? __defProp22(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField2 = (obj, key, value) => __defNormalProp22(obj, typeof key !== "symbol" ? key + "" : key, value); +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +function getAugmentedNamespace(n2) { + if (n2.__esModule) return n2; + var f2 = n2.default; + if (typeof f2 == "function") { + var a2 = function a22() { + if (this instanceof a22) { + return Reflect.construct(f2, arguments, this.constructor); + } + return f2.apply(this, arguments); + }; + a2.prototype = f2.prototype; + } else a2 = {}; + Object.defineProperty(a2, "__esModule", { value: true }); + Object.keys(n2).forEach(function(k) { + var d = Object.getOwnPropertyDescriptor(n2, k); + Object.defineProperty(a2, k, d.get ? d : { + enumerable: true, + get: function() { + return n2[k]; + } + }); + }); + return a2; +} +var picocolors_browser = { exports: {} }; +var hasRequiredPicocolors_browser; +function requirePicocolors_browser() { + if (hasRequiredPicocolors_browser) return picocolors_browser.exports; + hasRequiredPicocolors_browser = 1; + var x = String; + var create = function() { + return { isColorSupported: false, reset: x, bold: x, dim: x, italic: x, underline: x, inverse: x, hidden: x, strikethrough: x, black: x, red: x, green: x, yellow: x, blue: x, magenta: x, cyan: x, white: x, gray: x, bgBlack: x, bgRed: x, bgGreen: x, bgYellow: x, bgBlue: x, bgMagenta: x, bgCyan: x, bgWhite: x }; + }; + picocolors_browser.exports = create(); + picocolors_browser.exports.createColors = create; + return picocolors_browser.exports; +} +const __viteBrowserExternal = {}; +const __viteBrowserExternal$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + default: __viteBrowserExternal +}, Symbol.toStringTag, { value: "Module" })); +const require$$2 = /* @__PURE__ */ getAugmentedNamespace(__viteBrowserExternal$1); +var cssSyntaxError; +var hasRequiredCssSyntaxError; +function requireCssSyntaxError() { + if (hasRequiredCssSyntaxError) return cssSyntaxError; + hasRequiredCssSyntaxError = 1; + let pico = /* @__PURE__ */ requirePicocolors_browser(); + let terminalHighlight = require$$2; + class CssSyntaxError extends Error { + constructor(message, line, column, source, file, plugin) { + super(message); + this.name = "CssSyntaxError"; + this.reason = message; + if (file) { + this.file = file; + } + if (source) { + this.source = source; + } + if (plugin) { + this.plugin = plugin; + } + if (typeof line !== "undefined" && typeof column !== "undefined") { + if (typeof line === "number") { + this.line = line; + this.column = column; + } else { + this.line = line.line; + this.column = line.column; + this.endLine = column.line; + this.endColumn = column.column; + } + } + this.setMessage(); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, CssSyntaxError); + } + } + setMessage() { + this.message = this.plugin ? this.plugin + ": " : ""; + this.message += this.file ? this.file : ""; + if (typeof this.line !== "undefined") { + this.message += ":" + this.line + ":" + this.column; + } + this.message += ": " + this.reason; + } + showSourceCode(color) { + if (!this.source) return ""; + let css = this.source; + if (color == null) color = pico.isColorSupported; + if (terminalHighlight) { + if (color) css = terminalHighlight(css); + } + let lines = css.split(/\r?\n/); + let start = Math.max(this.line - 3, 0); + let end = Math.min(this.line + 2, lines.length); + let maxWidth = String(end).length; + let mark, aside; + if (color) { + let { bold, gray, red } = pico.createColors(true); + mark = (text) => bold(red(text)); + aside = (text) => gray(text); + } else { + mark = aside = (str) => str; + } + return lines.slice(start, end).map((line, index2) => { + let number = start + 1 + index2; + let gutter = " " + (" " + number).slice(-maxWidth) + " | "; + if (number === this.line) { + let spacing = aside(gutter.replace(/\d/g, " ")) + line.slice(0, this.column - 1).replace(/[^\t]/g, " "); + return mark(">") + aside(gutter) + line + "\n " + spacing + mark("^"); + } + return " " + aside(gutter) + line; + }).join("\n"); + } + toString() { + let code = this.showSourceCode(); + if (code) { + code = "\n\n" + code + "\n"; + } + return this.name + ": " + this.message + code; + } + } + cssSyntaxError = CssSyntaxError; + CssSyntaxError.default = CssSyntaxError; + return cssSyntaxError; +} +var symbols = {}; +var hasRequiredSymbols; +function requireSymbols() { + if (hasRequiredSymbols) return symbols; + hasRequiredSymbols = 1; + symbols.isClean = Symbol("isClean"); + symbols.my = Symbol("my"); + return symbols; +} +var stringifier; +var hasRequiredStringifier; +function requireStringifier() { + if (hasRequiredStringifier) return stringifier; + hasRequiredStringifier = 1; + const DEFAULT_RAW = { + after: "\n", + beforeClose: "\n", + beforeComment: "\n", + beforeDecl: "\n", + beforeOpen: " ", + beforeRule: "\n", + colon: ": ", + commentLeft: " ", + commentRight: " ", + emptyBody: "", + indent: " ", + semicolon: false + }; + function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); + } + class Stringifier { + constructor(builder) { + this.builder = builder; + } + atrule(node2, semicolon) { + let name = "@" + node2.name; + let params = node2.params ? this.rawValue(node2, "params") : ""; + if (typeof node2.raws.afterName !== "undefined") { + name += node2.raws.afterName; + } else if (params) { + name += " "; + } + if (node2.nodes) { + this.block(node2, name + params); + } else { + let end = (node2.raws.between || "") + (semicolon ? ";" : ""); + this.builder(name + params + end, node2); + } + } + beforeAfter(node2, detect) { + let value; + if (node2.type === "decl") { + value = this.raw(node2, null, "beforeDecl"); + } else if (node2.type === "comment") { + value = this.raw(node2, null, "beforeComment"); + } else if (detect === "before") { + value = this.raw(node2, null, "beforeRule"); + } else { + value = this.raw(node2, null, "beforeClose"); + } + let buf = node2.parent; + let depth = 0; + while (buf && buf.type !== "root") { + depth += 1; + buf = buf.parent; + } + if (value.includes("\n")) { + let indent = this.raw(node2, null, "indent"); + if (indent.length) { + for (let step = 0; step < depth; step++) value += indent; + } + } + return value; + } + block(node2, start) { + let between = this.raw(node2, "between", "beforeOpen"); + this.builder(start + between + "{", node2, "start"); + let after; + if (node2.nodes && node2.nodes.length) { + this.body(node2); + after = this.raw(node2, "after"); + } else { + after = this.raw(node2, "after", "emptyBody"); + } + if (after) this.builder(after); + this.builder("}", node2, "end"); + } + body(node2) { + let last = node2.nodes.length - 1; + while (last > 0) { + if (node2.nodes[last].type !== "comment") break; + last -= 1; + } + let semicolon = this.raw(node2, "semicolon"); + for (let i2 = 0; i2 < node2.nodes.length; i2++) { + let child = node2.nodes[i2]; + let before = this.raw(child, "before"); + if (before) this.builder(before); + this.stringify(child, last !== i2 || semicolon); + } + } + comment(node2) { + let left = this.raw(node2, "left", "commentLeft"); + let right = this.raw(node2, "right", "commentRight"); + this.builder("/*" + left + node2.text + right + "*/", node2); + } + decl(node2, semicolon) { + let between = this.raw(node2, "between", "colon"); + let string = node2.prop + between + this.rawValue(node2, "value"); + if (node2.important) { + string += node2.raws.important || " !important"; + } + if (semicolon) string += ";"; + this.builder(string, node2); + } + document(node2) { + this.body(node2); + } + raw(node2, own, detect) { + let value; + if (!detect) detect = own; + if (own) { + value = node2.raws[own]; + if (typeof value !== "undefined") return value; + } + let parent = node2.parent; + if (detect === "before") { + if (!parent || parent.type === "root" && parent.first === node2) { + return ""; + } + if (parent && parent.type === "document") { + return ""; + } + } + if (!parent) return DEFAULT_RAW[detect]; + let root2 = node2.root(); + if (!root2.rawCache) root2.rawCache = {}; + if (typeof root2.rawCache[detect] !== "undefined") { + return root2.rawCache[detect]; + } + if (detect === "before" || detect === "after") { + return this.beforeAfter(node2, detect); + } else { + let method = "raw" + capitalize(detect); + if (this[method]) { + value = this[method](root2, node2); + } else { + root2.walk((i2) => { + value = i2.raws[own]; + if (typeof value !== "undefined") return false; + }); + } + } + if (typeof value === "undefined") value = DEFAULT_RAW[detect]; + root2.rawCache[detect] = value; + return value; + } + rawBeforeClose(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length > 0) { + if (typeof i2.raws.after !== "undefined") { + value = i2.raws.after; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + } + }); + if (value) value = value.replace(/\S/g, ""); + return value; + } + rawBeforeComment(root2, node2) { + let value; + root2.walkComments((i2) => { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + }); + if (typeof value === "undefined") { + value = this.raw(node2, null, "beforeDecl"); + } else if (value) { + value = value.replace(/\S/g, ""); + } + return value; + } + rawBeforeDecl(root2, node2) { + let value; + root2.walkDecls((i2) => { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + }); + if (typeof value === "undefined") { + value = this.raw(node2, null, "beforeRule"); + } else if (value) { + value = value.replace(/\S/g, ""); + } + return value; + } + rawBeforeOpen(root2) { + let value; + root2.walk((i2) => { + if (i2.type !== "decl") { + value = i2.raws.between; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawBeforeRule(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && (i2.parent !== root2 || root2.first !== i2)) { + if (typeof i2.raws.before !== "undefined") { + value = i2.raws.before; + if (value.includes("\n")) { + value = value.replace(/[^\n]+$/, ""); + } + return false; + } + } + }); + if (value) value = value.replace(/\S/g, ""); + return value; + } + rawColon(root2) { + let value; + root2.walkDecls((i2) => { + if (typeof i2.raws.between !== "undefined") { + value = i2.raws.between.replace(/[^\s:]/g, ""); + return false; + } + }); + return value; + } + rawEmptyBody(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length === 0) { + value = i2.raws.after; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawIndent(root2) { + if (root2.raws.indent) return root2.raws.indent; + let value; + root2.walk((i2) => { + let p = i2.parent; + if (p && p !== root2 && p.parent && p.parent === root2) { + if (typeof i2.raws.before !== "undefined") { + let parts = i2.raws.before.split("\n"); + value = parts[parts.length - 1]; + value = value.replace(/\S/g, ""); + return false; + } + } + }); + return value; + } + rawSemicolon(root2) { + let value; + root2.walk((i2) => { + if (i2.nodes && i2.nodes.length && i2.last.type === "decl") { + value = i2.raws.semicolon; + if (typeof value !== "undefined") return false; + } + }); + return value; + } + rawValue(node2, prop) { + let value = node2[prop]; + let raw = node2.raws[prop]; + if (raw && raw.value === value) { + return raw.raw; + } + return value; + } + root(node2) { + this.body(node2); + if (node2.raws.after) this.builder(node2.raws.after); + } + rule(node2) { + this.block(node2, this.rawValue(node2, "selector")); + if (node2.raws.ownSemicolon) { + this.builder(node2.raws.ownSemicolon, node2, "end"); + } + } + stringify(node2, semicolon) { + if (!this[node2.type]) { + throw new Error( + "Unknown AST node type " + node2.type + ". Maybe you need to change PostCSS stringifier." + ); + } + this[node2.type](node2, semicolon); + } + } + stringifier = Stringifier; + Stringifier.default = Stringifier; + return stringifier; +} +var stringify_1; +var hasRequiredStringify; +function requireStringify() { + if (hasRequiredStringify) return stringify_1; + hasRequiredStringify = 1; + let Stringifier = requireStringifier(); + function stringify(node2, builder) { + let str = new Stringifier(builder); + str.stringify(node2); + } + stringify_1 = stringify; + stringify.default = stringify; + return stringify_1; +} +var node; +var hasRequiredNode; +function requireNode() { + if (hasRequiredNode) return node; + hasRequiredNode = 1; + let { isClean, my } = requireSymbols(); + let CssSyntaxError = requireCssSyntaxError(); + let Stringifier = requireStringifier(); + let stringify = requireStringify(); + function cloneNode(obj, parent) { + let cloned = new obj.constructor(); + for (let i2 in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, i2)) { + continue; + } + if (i2 === "proxyCache") continue; + let value = obj[i2]; + let type = typeof value; + if (i2 === "parent" && type === "object") { + if (parent) cloned[i2] = parent; + } else if (i2 === "source") { + cloned[i2] = value; + } else if (Array.isArray(value)) { + cloned[i2] = value.map((j) => cloneNode(j, cloned)); + } else { + if (type === "object" && value !== null) value = cloneNode(value); + cloned[i2] = value; + } + } + return cloned; + } + class Node2 { + constructor(defaults = {}) { + this.raws = {}; + this[isClean] = false; + this[my] = true; + for (let name in defaults) { + if (name === "nodes") { + this.nodes = []; + for (let node2 of defaults[name]) { + if (typeof node2.clone === "function") { + this.append(node2.clone()); + } else { + this.append(node2); + } + } + } else { + this[name] = defaults[name]; + } + } + } + addToError(error) { + error.postcssNode = this; + if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) { + let s2 = this.source; + error.stack = error.stack.replace( + /\n\s{4}at /, + `$&${s2.input.from}:${s2.start.line}:${s2.start.column}$&` + ); + } + return error; + } + after(add) { + this.parent.insertAfter(this, add); + return this; + } + assign(overrides = {}) { + for (let name in overrides) { + this[name] = overrides[name]; + } + return this; + } + before(add) { + this.parent.insertBefore(this, add); + return this; + } + cleanRaws(keepBetween) { + delete this.raws.before; + delete this.raws.after; + if (!keepBetween) delete this.raws.between; + } + clone(overrides = {}) { + let cloned = cloneNode(this); + for (let name in overrides) { + cloned[name] = overrides[name]; + } + return cloned; + } + cloneAfter(overrides = {}) { + let cloned = this.clone(overrides); + this.parent.insertAfter(this, cloned); + return cloned; + } + cloneBefore(overrides = {}) { + let cloned = this.clone(overrides); + this.parent.insertBefore(this, cloned); + return cloned; + } + error(message, opts = {}) { + if (this.source) { + let { end, start } = this.rangeBy(opts); + return this.source.input.error( + message, + { column: start.column, line: start.line }, + { column: end.column, line: end.line }, + opts + ); + } + return new CssSyntaxError(message); + } + getProxyProcessor() { + return { + get(node2, prop) { + if (prop === "proxyOf") { + return node2; + } else if (prop === "root") { + return () => node2.root().toProxy(); + } else { + return node2[prop]; + } + }, + set(node2, prop, value) { + if (node2[prop] === value) return true; + node2[prop] = value; + if (prop === "prop" || prop === "value" || prop === "name" || prop === "params" || prop === "important" || /* c8 ignore next */ + prop === "text") { + node2.markDirty(); + } + return true; + } + }; + } + markDirty() { + if (this[isClean]) { + this[isClean] = false; + let next = this; + while (next = next.parent) { + next[isClean] = false; + } + } + } + next() { + if (!this.parent) return void 0; + let index2 = this.parent.index(this); + return this.parent.nodes[index2 + 1]; + } + positionBy(opts, stringRepresentation) { + let pos = this.source.start; + if (opts.index) { + pos = this.positionInside(opts.index, stringRepresentation); + } else if (opts.word) { + stringRepresentation = this.toString(); + let index2 = stringRepresentation.indexOf(opts.word); + if (index2 !== -1) pos = this.positionInside(index2, stringRepresentation); + } + return pos; + } + positionInside(index2, stringRepresentation) { + let string = stringRepresentation || this.toString(); + let column = this.source.start.column; + let line = this.source.start.line; + for (let i2 = 0; i2 < index2; i2++) { + if (string[i2] === "\n") { + column = 1; + line += 1; + } else { + column += 1; + } + } + return { column, line }; + } + prev() { + if (!this.parent) return void 0; + let index2 = this.parent.index(this); + return this.parent.nodes[index2 - 1]; + } + rangeBy(opts) { + let start = { + column: this.source.start.column, + line: this.source.start.line + }; + let end = this.source.end ? { + column: this.source.end.column + 1, + line: this.source.end.line + } : { + column: start.column + 1, + line: start.line + }; + if (opts.word) { + let stringRepresentation = this.toString(); + let index2 = stringRepresentation.indexOf(opts.word); + if (index2 !== -1) { + start = this.positionInside(index2, stringRepresentation); + end = this.positionInside(index2 + opts.word.length, stringRepresentation); + } + } else { + if (opts.start) { + start = { + column: opts.start.column, + line: opts.start.line + }; + } else if (opts.index) { + start = this.positionInside(opts.index); + } + if (opts.end) { + end = { + column: opts.end.column, + line: opts.end.line + }; + } else if (typeof opts.endIndex === "number") { + end = this.positionInside(opts.endIndex); + } else if (opts.index) { + end = this.positionInside(opts.index + 1); + } + } + if (end.line < start.line || end.line === start.line && end.column <= start.column) { + end = { column: start.column + 1, line: start.line }; + } + return { end, start }; + } + raw(prop, defaultType) { + let str = new Stringifier(); + return str.raw(this, prop, defaultType); + } + remove() { + if (this.parent) { + this.parent.removeChild(this); + } + this.parent = void 0; + return this; + } + replaceWith(...nodes) { + if (this.parent) { + let bookmark = this; + let foundSelf = false; + for (let node2 of nodes) { + if (node2 === this) { + foundSelf = true; + } else if (foundSelf) { + this.parent.insertAfter(bookmark, node2); + bookmark = node2; + } else { + this.parent.insertBefore(bookmark, node2); + } + } + if (!foundSelf) { + this.remove(); + } + } + return this; + } + root() { + let result2 = this; + while (result2.parent && result2.parent.type !== "document") { + result2 = result2.parent; + } + return result2; + } + toJSON(_, inputs) { + let fixed = {}; + let emitInputs = inputs == null; + inputs = inputs || /* @__PURE__ */ new Map(); + let inputsNextIndex = 0; + for (let name in this) { + if (!Object.prototype.hasOwnProperty.call(this, name)) { + continue; + } + if (name === "parent" || name === "proxyCache") continue; + let value = this[name]; + if (Array.isArray(value)) { + fixed[name] = value.map((i2) => { + if (typeof i2 === "object" && i2.toJSON) { + return i2.toJSON(null, inputs); + } else { + return i2; + } + }); + } else if (typeof value === "object" && value.toJSON) { + fixed[name] = value.toJSON(null, inputs); + } else if (name === "source") { + let inputId = inputs.get(value.input); + if (inputId == null) { + inputId = inputsNextIndex; + inputs.set(value.input, inputsNextIndex); + inputsNextIndex++; + } + fixed[name] = { + end: value.end, + inputId, + start: value.start + }; + } else { + fixed[name] = value; + } + } + if (emitInputs) { + fixed.inputs = [...inputs.keys()].map((input2) => input2.toJSON()); + } + return fixed; + } + toProxy() { + if (!this.proxyCache) { + this.proxyCache = new Proxy(this, this.getProxyProcessor()); + } + return this.proxyCache; + } + toString(stringifier2 = stringify) { + if (stringifier2.stringify) stringifier2 = stringifier2.stringify; + let result2 = ""; + stringifier2(this, (i2) => { + result2 += i2; + }); + return result2; + } + warn(result2, text, opts) { + let data = { node: this }; + for (let i2 in opts) data[i2] = opts[i2]; + return result2.warn(text, data); + } + get proxyOf() { + return this; + } + } + node = Node2; + Node2.default = Node2; + return node; +} +var declaration; +var hasRequiredDeclaration; +function requireDeclaration() { + if (hasRequiredDeclaration) return declaration; + hasRequiredDeclaration = 1; + let Node2 = requireNode(); + class Declaration extends Node2 { + constructor(defaults) { + if (defaults && typeof defaults.value !== "undefined" && typeof defaults.value !== "string") { + defaults = __spreadProps(__spreadValues({}, defaults), { value: String(defaults.value) }); + } + super(defaults); + this.type = "decl"; + } + get variable() { + return this.prop.startsWith("--") || this.prop[0] === "$"; + } + } + declaration = Declaration; + Declaration.default = Declaration; + return declaration; +} +var nonSecure; +var hasRequiredNonSecure; +function requireNonSecure() { + if (hasRequiredNonSecure) return nonSecure; + hasRequiredNonSecure = 1; + let urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; + let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = ""; + let i2 = size; + while (i2--) { + id += alphabet[Math.random() * alphabet.length | 0]; + } + return id; + }; + }; + let nanoid = (size = 21) => { + let id = ""; + let i2 = size; + while (i2--) { + id += urlAlphabet[Math.random() * 64 | 0]; + } + return id; + }; + nonSecure = { nanoid, customAlphabet }; + return nonSecure; +} +var previousMap; +var hasRequiredPreviousMap; +function requirePreviousMap() { + if (hasRequiredPreviousMap) return previousMap; + hasRequiredPreviousMap = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2; + let { existsSync, readFileSync } = require$$2; + let { dirname, join } = require$$2; + function fromBase64(str) { + if (Buffer) { + return Buffer.from(str, "base64").toString(); + } else { + return window.atob(str); + } + } + class PreviousMap { + constructor(css, opts) { + if (opts.map === false) return; + this.loadAnnotation(css); + this.inline = this.startWith(this.annotation, "data:"); + let prev = opts.map ? opts.map.prev : void 0; + let text = this.loadMap(opts.from, prev); + if (!this.mapFile && opts.from) { + this.mapFile = opts.from; + } + if (this.mapFile) this.root = dirname(this.mapFile); + if (text) this.text = text; + } + consumer() { + if (!this.consumerCache) { + this.consumerCache = new SourceMapConsumer(this.text); + } + return this.consumerCache; + } + decodeInline(text) { + let baseCharsetUri = /^data:application\/json;charset=utf-?8;base64,/; + let baseUri = /^data:application\/json;base64,/; + let charsetUri = /^data:application\/json;charset=utf-?8,/; + let uri = /^data:application\/json,/; + if (charsetUri.test(text) || uri.test(text)) { + return decodeURIComponent(text.substr(RegExp.lastMatch.length)); + } + if (baseCharsetUri.test(text) || baseUri.test(text)) { + return fromBase64(text.substr(RegExp.lastMatch.length)); + } + let encoding = text.match(/data:application\/json;([^,]+),/)[1]; + throw new Error("Unsupported source map encoding " + encoding); + } + getAnnotationURL(sourceMapString) { + return sourceMapString.replace(/^\/\*\s*# sourceMappingURL=/, "").trim(); + } + isMap(map) { + if (typeof map !== "object") return false; + return typeof map.mappings === "string" || typeof map._mappings === "string" || Array.isArray(map.sections); + } + loadAnnotation(css) { + let comments = css.match(/\/\*\s*# sourceMappingURL=/gm); + if (!comments) return; + let start = css.lastIndexOf(comments.pop()); + let end = css.indexOf("*/", start); + if (start > -1 && end > -1) { + this.annotation = this.getAnnotationURL(css.substring(start, end)); + } + } + loadFile(path) { + this.root = dirname(path); + if (existsSync(path)) { + this.mapFile = path; + return readFileSync(path, "utf-8").toString().trim(); + } + } + loadMap(file, prev) { + if (prev === false) return false; + if (prev) { + if (typeof prev === "string") { + return prev; + } else if (typeof prev === "function") { + let prevPath = prev(file); + if (prevPath) { + let map = this.loadFile(prevPath); + if (!map) { + throw new Error( + "Unable to load previous source map: " + prevPath.toString() + ); + } + return map; + } + } else if (prev instanceof SourceMapConsumer) { + return SourceMapGenerator.fromSourceMap(prev).toString(); + } else if (prev instanceof SourceMapGenerator) { + return prev.toString(); + } else if (this.isMap(prev)) { + return JSON.stringify(prev); + } else { + throw new Error( + "Unsupported previous source map format: " + prev.toString() + ); + } + } else if (this.inline) { + return this.decodeInline(this.annotation); + } else if (this.annotation) { + let map = this.annotation; + if (file) map = join(dirname(file), map); + return this.loadFile(map); + } + } + startWith(string, start) { + if (!string) return false; + return string.substr(0, start.length) === start; + } + withContent() { + return !!(this.consumer().sourcesContent && this.consumer().sourcesContent.length > 0); + } + } + previousMap = PreviousMap; + PreviousMap.default = PreviousMap; + return previousMap; +} +var input; +var hasRequiredInput; +function requireInput() { + if (hasRequiredInput) return input; + hasRequiredInput = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2; + let { fileURLToPath, pathToFileURL } = require$$2; + let { isAbsolute, resolve } = require$$2; + let { nanoid } = /* @__PURE__ */ requireNonSecure(); + let terminalHighlight = require$$2; + let CssSyntaxError = requireCssSyntaxError(); + let PreviousMap = requirePreviousMap(); + let fromOffsetCache = Symbol("fromOffsetCache"); + let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator); + let pathAvailable = Boolean(resolve && isAbsolute); + class Input { + constructor(css, opts = {}) { + if (css === null || typeof css === "undefined" || typeof css === "object" && !css.toString) { + throw new Error(`PostCSS received ${css} instead of CSS string`); + } + this.css = css.toString(); + if (this.css[0] === "\uFEFF" || this.css[0] === "\uFFFE") { + this.hasBOM = true; + this.css = this.css.slice(1); + } else { + this.hasBOM = false; + } + if (opts.from) { + if (!pathAvailable || /^\w+:\/\//.test(opts.from) || isAbsolute(opts.from)) { + this.file = opts.from; + } else { + this.file = resolve(opts.from); + } + } + if (pathAvailable && sourceMapAvailable) { + let map = new PreviousMap(this.css, opts); + if (map.text) { + this.map = map; + let file = map.consumer().file; + if (!this.file && file) this.file = this.mapResolve(file); + } + } + if (!this.file) { + this.id = ""; + } + if (this.map) this.map.file = this.from; + } + error(message, line, column, opts = {}) { + let result2, endLine, endColumn; + if (line && typeof line === "object") { + let start = line; + let end = column; + if (typeof start.offset === "number") { + let pos = this.fromOffset(start.offset); + line = pos.line; + column = pos.col; + } else { + line = start.line; + column = start.column; + } + if (typeof end.offset === "number") { + let pos = this.fromOffset(end.offset); + endLine = pos.line; + endColumn = pos.col; + } else { + endLine = end.line; + endColumn = end.column; + } + } else if (!column) { + let pos = this.fromOffset(line); + line = pos.line; + column = pos.col; + } + let origin = this.origin(line, column, endLine, endColumn); + if (origin) { + result2 = new CssSyntaxError( + message, + origin.endLine === void 0 ? origin.line : { column: origin.column, line: origin.line }, + origin.endLine === void 0 ? origin.column : { column: origin.endColumn, line: origin.endLine }, + origin.source, + origin.file, + opts.plugin + ); + } else { + result2 = new CssSyntaxError( + message, + endLine === void 0 ? line : { column, line }, + endLine === void 0 ? column : { column: endColumn, line: endLine }, + this.css, + this.file, + opts.plugin + ); + } + result2.input = { column, endColumn, endLine, line, source: this.css }; + if (this.file) { + if (pathToFileURL) { + result2.input.url = pathToFileURL(this.file).toString(); + } + result2.input.file = this.file; + } + return result2; + } + fromOffset(offset) { + let lastLine, lineToIndex; + if (!this[fromOffsetCache]) { + let lines = this.css.split("\n"); + lineToIndex = new Array(lines.length); + let prevIndex = 0; + for (let i2 = 0, l2 = lines.length; i2 < l2; i2++) { + lineToIndex[i2] = prevIndex; + prevIndex += lines[i2].length + 1; + } + this[fromOffsetCache] = lineToIndex; + } else { + lineToIndex = this[fromOffsetCache]; + } + lastLine = lineToIndex[lineToIndex.length - 1]; + let min = 0; + if (offset >= lastLine) { + min = lineToIndex.length - 1; + } else { + let max = lineToIndex.length - 2; + let mid; + while (min < max) { + mid = min + (max - min >> 1); + if (offset < lineToIndex[mid]) { + max = mid - 1; + } else if (offset >= lineToIndex[mid + 1]) { + min = mid + 1; + } else { + min = mid; + break; + } + } + } + return { + col: offset - lineToIndex[min] + 1, + line: min + 1 + }; + } + mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file; + } + return resolve(this.map.consumer().sourceRoot || this.map.root || ".", file); + } + origin(line, column, endLine, endColumn) { + if (!this.map) return false; + let consumer = this.map.consumer(); + let from = consumer.originalPositionFor({ column, line }); + if (!from.source) return false; + let to; + if (typeof endLine === "number") { + to = consumer.originalPositionFor({ column: endColumn, line: endLine }); + } + let fromUrl; + if (isAbsolute(from.source)) { + fromUrl = pathToFileURL(from.source); + } else { + fromUrl = new URL( + from.source, + this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile) + ); + } + let result2 = { + column: from.column, + endColumn: to && to.column, + endLine: to && to.line, + line: from.line, + url: fromUrl.toString() + }; + if (fromUrl.protocol === "file:") { + if (fileURLToPath) { + result2.file = fileURLToPath(fromUrl); + } else { + throw new Error(`file: protocol is not available in this PostCSS build`); + } + } + let source = consumer.sourceContentFor(from.source); + if (source) result2.source = source; + return result2; + } + toJSON() { + let json = {}; + for (let name of ["hasBOM", "css", "file", "id"]) { + if (this[name] != null) { + json[name] = this[name]; + } + } + if (this.map) { + json.map = __spreadValues({}, this.map); + if (json.map.consumerCache) { + json.map.consumerCache = void 0; + } + } + return json; + } + get from() { + return this.file || this.id; + } + } + input = Input; + Input.default = Input; + if (terminalHighlight && terminalHighlight.registerInput) { + terminalHighlight.registerInput(Input); + } + return input; +} +var mapGenerator; +var hasRequiredMapGenerator; +function requireMapGenerator() { + if (hasRequiredMapGenerator) return mapGenerator; + hasRequiredMapGenerator = 1; + let { SourceMapConsumer, SourceMapGenerator } = require$$2; + let { dirname, relative, resolve, sep } = require$$2; + let { pathToFileURL } = require$$2; + let Input = requireInput(); + let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator); + let pathAvailable = Boolean(dirname && resolve && relative && sep); + class MapGenerator { + constructor(stringify, root2, opts, cssString) { + this.stringify = stringify; + this.mapOpts = opts.map || {}; + this.root = root2; + this.opts = opts; + this.css = cssString; + this.originalCSS = cssString; + this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute; + this.memoizedFileURLs = /* @__PURE__ */ new Map(); + this.memoizedPaths = /* @__PURE__ */ new Map(); + this.memoizedURLs = /* @__PURE__ */ new Map(); + } + addAnnotation() { + let content; + if (this.isInline()) { + content = "data:application/json;base64," + this.toBase64(this.map.toString()); + } else if (typeof this.mapOpts.annotation === "string") { + content = this.mapOpts.annotation; + } else if (typeof this.mapOpts.annotation === "function") { + content = this.mapOpts.annotation(this.opts.to, this.root); + } else { + content = this.outputFile() + ".map"; + } + let eol = "\n"; + if (this.css.includes("\r\n")) eol = "\r\n"; + this.css += eol + "/*# sourceMappingURL=" + content + " */"; + } + applyPrevMaps() { + for (let prev of this.previous()) { + let from = this.toUrl(this.path(prev.file)); + let root2 = prev.root || dirname(prev.file); + let map; + if (this.mapOpts.sourcesContent === false) { + map = new SourceMapConsumer(prev.text); + if (map.sourcesContent) { + map.sourcesContent = null; + } + } else { + map = prev.consumer(); + } + this.map.applySourceMap(map, from, this.toUrl(this.path(root2))); + } + } + clearAnnotation() { + if (this.mapOpts.annotation === false) return; + if (this.root) { + let node2; + for (let i2 = this.root.nodes.length - 1; i2 >= 0; i2--) { + node2 = this.root.nodes[i2]; + if (node2.type !== "comment") continue; + if (node2.text.indexOf("# sourceMappingURL=") === 0) { + this.root.removeChild(i2); + } + } + } else if (this.css) { + this.css = this.css.replace(/\n*?\/\*#[\S\s]*?\*\/$/gm, ""); + } + } + generate() { + this.clearAnnotation(); + if (pathAvailable && sourceMapAvailable && this.isMap()) { + return this.generateMap(); + } else { + let result2 = ""; + this.stringify(this.root, (i2) => { + result2 += i2; + }); + return [result2]; + } + } + generateMap() { + if (this.root) { + this.generateString(); + } else if (this.previous().length === 1) { + let prev = this.previous()[0].consumer(); + prev.file = this.outputFile(); + this.map = SourceMapGenerator.fromSourceMap(prev, { + ignoreInvalidMapping: true + }); + } else { + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }); + this.map.addMapping({ + generated: { column: 0, line: 1 }, + original: { column: 0, line: 1 }, + source: this.opts.from ? this.toUrl(this.path(this.opts.from)) : "" + }); + } + if (this.isSourcesContent()) this.setSourcesContent(); + if (this.root && this.previous().length > 0) this.applyPrevMaps(); + if (this.isAnnotation()) this.addAnnotation(); + if (this.isInline()) { + return [this.css]; + } else { + return [this.css, this.map]; + } + } + generateString() { + this.css = ""; + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }); + let line = 1; + let column = 1; + let noSource = ""; + let mapping = { + generated: { column: 0, line: 0 }, + original: { column: 0, line: 0 }, + source: "" + }; + let lines, last; + this.stringify(this.root, (str, node2, type) => { + this.css += str; + if (node2 && type !== "end") { + mapping.generated.line = line; + mapping.generated.column = column - 1; + if (node2.source && node2.source.start) { + mapping.source = this.sourcePath(node2); + mapping.original.line = node2.source.start.line; + mapping.original.column = node2.source.start.column - 1; + this.map.addMapping(mapping); + } else { + mapping.source = noSource; + mapping.original.line = 1; + mapping.original.column = 0; + this.map.addMapping(mapping); + } + } + lines = str.match(/\n/g); + if (lines) { + line += lines.length; + last = str.lastIndexOf("\n"); + column = str.length - last; + } else { + column += str.length; + } + if (node2 && type !== "start") { + let p = node2.parent || { raws: {} }; + let childless = node2.type === "decl" || node2.type === "atrule" && !node2.nodes; + if (!childless || node2 !== p.last || p.raws.semicolon) { + if (node2.source && node2.source.end) { + mapping.source = this.sourcePath(node2); + mapping.original.line = node2.source.end.line; + mapping.original.column = node2.source.end.column - 1; + mapping.generated.line = line; + mapping.generated.column = column - 2; + this.map.addMapping(mapping); + } else { + mapping.source = noSource; + mapping.original.line = 1; + mapping.original.column = 0; + mapping.generated.line = line; + mapping.generated.column = column - 1; + this.map.addMapping(mapping); + } + } + } + }); + } + isAnnotation() { + if (this.isInline()) { + return true; + } + if (typeof this.mapOpts.annotation !== "undefined") { + return this.mapOpts.annotation; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.annotation); + } + return true; + } + isInline() { + if (typeof this.mapOpts.inline !== "undefined") { + return this.mapOpts.inline; + } + let annotation = this.mapOpts.annotation; + if (typeof annotation !== "undefined" && annotation !== true) { + return false; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.inline); + } + return true; + } + isMap() { + if (typeof this.opts.map !== "undefined") { + return !!this.opts.map; + } + return this.previous().length > 0; + } + isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== "undefined") { + return this.mapOpts.sourcesContent; + } + if (this.previous().length) { + return this.previous().some((i2) => i2.withContent()); + } + return true; + } + outputFile() { + if (this.opts.to) { + return this.path(this.opts.to); + } else if (this.opts.from) { + return this.path(this.opts.from); + } else { + return "to.css"; + } + } + path(file) { + if (this.mapOpts.absolute) return file; + if (file.charCodeAt(0) === 60) return file; + if (/^\w+:\/\//.test(file)) return file; + let cached = this.memoizedPaths.get(file); + if (cached) return cached; + let from = this.opts.to ? dirname(this.opts.to) : "."; + if (typeof this.mapOpts.annotation === "string") { + from = dirname(resolve(from, this.mapOpts.annotation)); + } + let path = relative(from, file); + this.memoizedPaths.set(file, path); + return path; + } + previous() { + if (!this.previousMaps) { + this.previousMaps = []; + if (this.root) { + this.root.walk((node2) => { + if (node2.source && node2.source.input.map) { + let map = node2.source.input.map; + if (!this.previousMaps.includes(map)) { + this.previousMaps.push(map); + } + } + }); + } else { + let input2 = new Input(this.originalCSS, this.opts); + if (input2.map) this.previousMaps.push(input2.map); + } + } + return this.previousMaps; + } + setSourcesContent() { + let already = {}; + if (this.root) { + this.root.walk((node2) => { + if (node2.source) { + let from = node2.source.input.from; + if (from && !already[from]) { + already[from] = true; + let fromUrl = this.usesFileUrls ? this.toFileUrl(from) : this.toUrl(this.path(from)); + this.map.setSourceContent(fromUrl, node2.source.input.css); + } + } + }); + } else if (this.css) { + let from = this.opts.from ? this.toUrl(this.path(this.opts.from)) : ""; + this.map.setSourceContent(from, this.css); + } + } + sourcePath(node2) { + if (this.mapOpts.from) { + return this.toUrl(this.mapOpts.from); + } else if (this.usesFileUrls) { + return this.toFileUrl(node2.source.input.from); + } else { + return this.toUrl(this.path(node2.source.input.from)); + } + } + toBase64(str) { + if (Buffer) { + return Buffer.from(str).toString("base64"); + } else { + return window.btoa(unescape(encodeURIComponent(str))); + } + } + toFileUrl(path) { + let cached = this.memoizedFileURLs.get(path); + if (cached) return cached; + if (pathToFileURL) { + let fileURL = pathToFileURL(path).toString(); + this.memoizedFileURLs.set(path, fileURL); + return fileURL; + } else { + throw new Error( + "`map.absolute` option is not available in this PostCSS build" + ); + } + } + toUrl(path) { + let cached = this.memoizedURLs.get(path); + if (cached) return cached; + if (sep === "\\") { + path = path.replace(/\\/g, "/"); + } + let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent); + this.memoizedURLs.set(path, url); + return url; + } + } + mapGenerator = MapGenerator; + return mapGenerator; +} +var comment; +var hasRequiredComment; +function requireComment() { + if (hasRequiredComment) return comment; + hasRequiredComment = 1; + let Node2 = requireNode(); + class Comment extends Node2 { + constructor(defaults) { + super(defaults); + this.type = "comment"; + } + } + comment = Comment; + Comment.default = Comment; + return comment; +} +var container; +var hasRequiredContainer; +function requireContainer() { + if (hasRequiredContainer) return container; + hasRequiredContainer = 1; + let { isClean, my } = requireSymbols(); + let Declaration = requireDeclaration(); + let Comment = requireComment(); + let Node2 = requireNode(); + let parse, Rule, AtRule, Root; + function cleanSource(nodes) { + return nodes.map((i2) => { + if (i2.nodes) i2.nodes = cleanSource(i2.nodes); + delete i2.source; + return i2; + }); + } + function markDirtyUp(node2) { + node2[isClean] = false; + if (node2.proxyOf.nodes) { + for (let i2 of node2.proxyOf.nodes) { + markDirtyUp(i2); + } + } + } + class Container extends Node2 { + append(...children) { + for (let child of children) { + let nodes = this.normalize(child, this.last); + for (let node2 of nodes) this.proxyOf.nodes.push(node2); + } + this.markDirty(); + return this; + } + cleanRaws(keepBetween) { + super.cleanRaws(keepBetween); + if (this.nodes) { + for (let node2 of this.nodes) node2.cleanRaws(keepBetween); + } + } + each(callback) { + if (!this.proxyOf.nodes) return void 0; + let iterator = this.getIterator(); + let index2, result2; + while (this.indexes[iterator] < this.proxyOf.nodes.length) { + index2 = this.indexes[iterator]; + result2 = callback(this.proxyOf.nodes[index2], index2); + if (result2 === false) break; + this.indexes[iterator] += 1; + } + delete this.indexes[iterator]; + return result2; + } + every(condition) { + return this.nodes.every(condition); + } + getIterator() { + if (!this.lastEach) this.lastEach = 0; + if (!this.indexes) this.indexes = {}; + this.lastEach += 1; + let iterator = this.lastEach; + this.indexes[iterator] = 0; + return iterator; + } + getProxyProcessor() { + return { + get(node2, prop) { + if (prop === "proxyOf") { + return node2; + } else if (!node2[prop]) { + return node2[prop]; + } else if (prop === "each" || typeof prop === "string" && prop.startsWith("walk")) { + return (...args) => { + return node2[prop]( + ...args.map((i2) => { + if (typeof i2 === "function") { + return (child, index2) => i2(child.toProxy(), index2); + } else { + return i2; + } + }) + ); + }; + } else if (prop === "every" || prop === "some") { + return (cb) => { + return node2[prop]( + (child, ...other) => cb(child.toProxy(), ...other) + ); + }; + } else if (prop === "root") { + return () => node2.root().toProxy(); + } else if (prop === "nodes") { + return node2.nodes.map((i2) => i2.toProxy()); + } else if (prop === "first" || prop === "last") { + return node2[prop].toProxy(); + } else { + return node2[prop]; + } + }, + set(node2, prop, value) { + if (node2[prop] === value) return true; + node2[prop] = value; + if (prop === "name" || prop === "params" || prop === "selector") { + node2.markDirty(); + } + return true; + } + }; + } + index(child) { + if (typeof child === "number") return child; + if (child.proxyOf) child = child.proxyOf; + return this.proxyOf.nodes.indexOf(child); + } + insertAfter(exist, add) { + let existIndex = this.index(exist); + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse(); + existIndex = this.index(exist); + for (let node2 of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node2); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (existIndex < index2) { + this.indexes[id] = index2 + nodes.length; + } + } + this.markDirty(); + return this; + } + insertBefore(exist, add) { + let existIndex = this.index(exist); + let type = existIndex === 0 ? "prepend" : false; + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex], type).reverse(); + existIndex = this.index(exist); + for (let node2 of nodes) this.proxyOf.nodes.splice(existIndex, 0, node2); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (existIndex <= index2) { + this.indexes[id] = index2 + nodes.length; + } + } + this.markDirty(); + return this; + } + normalize(nodes, sample) { + if (typeof nodes === "string") { + nodes = cleanSource(parse(nodes).nodes); + } else if (typeof nodes === "undefined") { + nodes = []; + } else if (Array.isArray(nodes)) { + nodes = nodes.slice(0); + for (let i2 of nodes) { + if (i2.parent) i2.parent.removeChild(i2, "ignore"); + } + } else if (nodes.type === "root" && this.type !== "document") { + nodes = nodes.nodes.slice(0); + for (let i2 of nodes) { + if (i2.parent) i2.parent.removeChild(i2, "ignore"); + } + } else if (nodes.type) { + nodes = [nodes]; + } else if (nodes.prop) { + if (typeof nodes.value === "undefined") { + throw new Error("Value field is missed in node creation"); + } else if (typeof nodes.value !== "string") { + nodes.value = String(nodes.value); + } + nodes = [new Declaration(nodes)]; + } else if (nodes.selector) { + nodes = [new Rule(nodes)]; + } else if (nodes.name) { + nodes = [new AtRule(nodes)]; + } else if (nodes.text) { + nodes = [new Comment(nodes)]; + } else { + throw new Error("Unknown node type in node creation"); + } + let processed = nodes.map((i2) => { + if (!i2[my]) Container.rebuild(i2); + i2 = i2.proxyOf; + if (i2.parent) i2.parent.removeChild(i2); + if (i2[isClean]) markDirtyUp(i2); + if (typeof i2.raws.before === "undefined") { + if (sample && typeof sample.raws.before !== "undefined") { + i2.raws.before = sample.raws.before.replace(/\S/g, ""); + } + } + i2.parent = this.proxyOf; + return i2; + }); + return processed; + } + prepend(...children) { + children = children.reverse(); + for (let child of children) { + let nodes = this.normalize(child, this.first, "prepend").reverse(); + for (let node2 of nodes) this.proxyOf.nodes.unshift(node2); + for (let id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length; + } + } + this.markDirty(); + return this; + } + push(child) { + child.parent = this; + this.proxyOf.nodes.push(child); + return this; + } + removeAll() { + for (let node2 of this.proxyOf.nodes) node2.parent = void 0; + this.proxyOf.nodes = []; + this.markDirty(); + return this; + } + removeChild(child) { + child = this.index(child); + this.proxyOf.nodes[child].parent = void 0; + this.proxyOf.nodes.splice(child, 1); + let index2; + for (let id in this.indexes) { + index2 = this.indexes[id]; + if (index2 >= child) { + this.indexes[id] = index2 - 1; + } + } + this.markDirty(); + return this; + } + replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts; + opts = {}; + } + this.walkDecls((decl) => { + if (opts.props && !opts.props.includes(decl.prop)) return; + if (opts.fast && !decl.value.includes(opts.fast)) return; + decl.value = decl.value.replace(pattern, callback); + }); + this.markDirty(); + return this; + } + some(condition) { + return this.nodes.some(condition); + } + walk(callback) { + return this.each((child, i2) => { + let result2; + try { + result2 = callback(child, i2); + } catch (e2) { + throw child.addToError(e2); + } + if (result2 !== false && child.walk) { + result2 = child.walk(callback); + } + return result2; + }); + } + walkAtRules(name, callback) { + if (!callback) { + callback = name; + return this.walk((child, i2) => { + if (child.type === "atrule") { + return callback(child, i2); + } + }); + } + if (name instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "atrule" && name.test(child.name)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "atrule" && child.name === name) { + return callback(child, i2); + } + }); + } + walkComments(callback) { + return this.walk((child, i2) => { + if (child.type === "comment") { + return callback(child, i2); + } + }); + } + walkDecls(prop, callback) { + if (!callback) { + callback = prop; + return this.walk((child, i2) => { + if (child.type === "decl") { + return callback(child, i2); + } + }); + } + if (prop instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "decl" && prop.test(child.prop)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "decl" && child.prop === prop) { + return callback(child, i2); + } + }); + } + walkRules(selector, callback) { + if (!callback) { + callback = selector; + return this.walk((child, i2) => { + if (child.type === "rule") { + return callback(child, i2); + } + }); + } + if (selector instanceof RegExp) { + return this.walk((child, i2) => { + if (child.type === "rule" && selector.test(child.selector)) { + return callback(child, i2); + } + }); + } + return this.walk((child, i2) => { + if (child.type === "rule" && child.selector === selector) { + return callback(child, i2); + } + }); + } + get first() { + if (!this.proxyOf.nodes) return void 0; + return this.proxyOf.nodes[0]; + } + get last() { + if (!this.proxyOf.nodes) return void 0; + return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]; + } + } + Container.registerParse = (dependant) => { + parse = dependant; + }; + Container.registerRule = (dependant) => { + Rule = dependant; + }; + Container.registerAtRule = (dependant) => { + AtRule = dependant; + }; + Container.registerRoot = (dependant) => { + Root = dependant; + }; + container = Container; + Container.default = Container; + Container.rebuild = (node2) => { + if (node2.type === "atrule") { + Object.setPrototypeOf(node2, AtRule.prototype); + } else if (node2.type === "rule") { + Object.setPrototypeOf(node2, Rule.prototype); + } else if (node2.type === "decl") { + Object.setPrototypeOf(node2, Declaration.prototype); + } else if (node2.type === "comment") { + Object.setPrototypeOf(node2, Comment.prototype); + } else if (node2.type === "root") { + Object.setPrototypeOf(node2, Root.prototype); + } + node2[my] = true; + if (node2.nodes) { + node2.nodes.forEach((child) => { + Container.rebuild(child); + }); + } + }; + return container; +} +var document$1; +var hasRequiredDocument; +function requireDocument() { + if (hasRequiredDocument) return document$1; + hasRequiredDocument = 1; + let Container = requireContainer(); + let LazyResult, Processor; + class Document2 extends Container { + constructor(defaults) { + super(__spreadValues({ type: "document" }, defaults)); + if (!this.nodes) { + this.nodes = []; + } + } + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + } + } + Document2.registerLazyResult = (dependant) => { + LazyResult = dependant; + }; + Document2.registerProcessor = (dependant) => { + Processor = dependant; + }; + document$1 = Document2; + Document2.default = Document2; + return document$1; +} +var warnOnce; +var hasRequiredWarnOnce; +function requireWarnOnce() { + if (hasRequiredWarnOnce) return warnOnce; + hasRequiredWarnOnce = 1; + let printed = {}; + warnOnce = function warnOnce2(message) { + if (printed[message]) return; + printed[message] = true; + if (typeof console !== "undefined" && console.warn) { + console.warn(message); + } + }; + return warnOnce; +} +var warning; +var hasRequiredWarning; +function requireWarning() { + if (hasRequiredWarning) return warning; + hasRequiredWarning = 1; + class Warning { + constructor(text, opts = {}) { + this.type = "warning"; + this.text = text; + if (opts.node && opts.node.source) { + let range = opts.node.rangeBy(opts); + this.line = range.start.line; + this.column = range.start.column; + this.endLine = range.end.line; + this.endColumn = range.end.column; + } + for (let opt in opts) this[opt] = opts[opt]; + } + toString() { + if (this.node) { + return this.node.error(this.text, { + index: this.index, + plugin: this.plugin, + word: this.word + }).message; + } + if (this.plugin) { + return this.plugin + ": " + this.text; + } + return this.text; + } + } + warning = Warning; + Warning.default = Warning; + return warning; +} +var result; +var hasRequiredResult; +function requireResult() { + if (hasRequiredResult) return result; + hasRequiredResult = 1; + let Warning = requireWarning(); + class Result { + constructor(processor2, root2, opts) { + this.processor = processor2; + this.messages = []; + this.root = root2; + this.opts = opts; + this.css = void 0; + this.map = void 0; + } + toString() { + return this.css; + } + warn(text, opts = {}) { + if (!opts.plugin) { + if (this.lastPlugin && this.lastPlugin.postcssPlugin) { + opts.plugin = this.lastPlugin.postcssPlugin; + } + } + let warning2 = new Warning(text, opts); + this.messages.push(warning2); + return warning2; + } + warnings() { + return this.messages.filter((i2) => i2.type === "warning"); + } + get content() { + return this.css; + } + } + result = Result; + Result.default = Result; + return result; +} +var tokenize; +var hasRequiredTokenize; +function requireTokenize() { + if (hasRequiredTokenize) return tokenize; + hasRequiredTokenize = 1; + const SINGLE_QUOTE = "'".charCodeAt(0); + const DOUBLE_QUOTE = '"'.charCodeAt(0); + const BACKSLASH = "\\".charCodeAt(0); + const SLASH = "/".charCodeAt(0); + const NEWLINE = "\n".charCodeAt(0); + const SPACE = " ".charCodeAt(0); + const FEED = "\f".charCodeAt(0); + const TAB = " ".charCodeAt(0); + const CR = "\r".charCodeAt(0); + const OPEN_SQUARE = "[".charCodeAt(0); + const CLOSE_SQUARE = "]".charCodeAt(0); + const OPEN_PARENTHESES = "(".charCodeAt(0); + const CLOSE_PARENTHESES = ")".charCodeAt(0); + const OPEN_CURLY = "{".charCodeAt(0); + const CLOSE_CURLY = "}".charCodeAt(0); + const SEMICOLON = ";".charCodeAt(0); + const ASTERISK = "*".charCodeAt(0); + const COLON = ":".charCodeAt(0); + const AT = "@".charCodeAt(0); + const RE_AT_END = /[\t\n\f\r "#'()/;[\\\]{}]/g; + const RE_WORD_END = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g; + const RE_BAD_BRACKET = /.[\r\n"'(/\\]/; + const RE_HEX_ESCAPE = /[\da-f]/i; + tokenize = function tokenizer(input2, options = {}) { + let css = input2.css.valueOf(); + let ignore = options.ignoreErrors; + let code, next, quote, content, escape; + let escaped, escapePos, prev, n2, currentToken; + let length = css.length; + let pos = 0; + let buffer = []; + let returned = []; + function position() { + return pos; + } + function unclosed(what) { + throw input2.error("Unclosed " + what, pos); + } + function endOfFile() { + return returned.length === 0 && pos >= length; + } + function nextToken(opts) { + if (returned.length) return returned.pop(); + if (pos >= length) return; + let ignoreUnclosed = opts ? opts.ignoreUnclosed : false; + code = css.charCodeAt(pos); + switch (code) { + case NEWLINE: + case SPACE: + case TAB: + case CR: + case FEED: { + next = pos; + do { + next += 1; + code = css.charCodeAt(next); + } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED); + currentToken = ["space", css.slice(pos, next)]; + pos = next - 1; + break; + } + case OPEN_SQUARE: + case CLOSE_SQUARE: + case OPEN_CURLY: + case CLOSE_CURLY: + case COLON: + case SEMICOLON: + case CLOSE_PARENTHESES: { + let controlChar = String.fromCharCode(code); + currentToken = [controlChar, controlChar, pos]; + break; + } + case OPEN_PARENTHESES: { + prev = buffer.length ? buffer.pop()[1] : ""; + n2 = css.charCodeAt(pos + 1); + if (prev === "url" && n2 !== SINGLE_QUOTE && n2 !== DOUBLE_QUOTE && n2 !== SPACE && n2 !== NEWLINE && n2 !== TAB && n2 !== FEED && n2 !== CR) { + next = pos; + do { + escaped = false; + next = css.indexOf(")", next + 1); + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos; + break; + } else { + unclosed("bracket"); + } + } + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + currentToken = ["brackets", css.slice(pos, next + 1), pos, next]; + pos = next; + } else { + next = css.indexOf(")", pos + 1); + content = css.slice(pos, next + 1); + if (next === -1 || RE_BAD_BRACKET.test(content)) { + currentToken = ["(", "(", pos]; + } else { + currentToken = ["brackets", content, pos, next]; + pos = next; + } + } + break; + } + case SINGLE_QUOTE: + case DOUBLE_QUOTE: { + quote = code === SINGLE_QUOTE ? "'" : '"'; + next = pos; + do { + escaped = false; + next = css.indexOf(quote, next + 1); + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos + 1; + break; + } else { + unclosed("string"); + } + } + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + currentToken = ["string", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + case AT: { + RE_AT_END.lastIndex = pos + 1; + RE_AT_END.test(css); + if (RE_AT_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_AT_END.lastIndex - 2; + } + currentToken = ["at-word", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + case BACKSLASH: { + next = pos; + escape = true; + while (css.charCodeAt(next + 1) === BACKSLASH) { + next += 1; + escape = !escape; + } + code = css.charCodeAt(next + 1); + if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) { + next += 1; + if (RE_HEX_ESCAPE.test(css.charAt(next))) { + while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) { + next += 1; + } + if (css.charCodeAt(next + 1) === SPACE) { + next += 1; + } + } + } + currentToken = ["word", css.slice(pos, next + 1), pos, next]; + pos = next; + break; + } + default: { + if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) { + next = css.indexOf("*/", pos + 2) + 1; + if (next === 0) { + if (ignore || ignoreUnclosed) { + next = css.length; + } else { + unclosed("comment"); + } + } + currentToken = ["comment", css.slice(pos, next + 1), pos, next]; + pos = next; + } else { + RE_WORD_END.lastIndex = pos + 1; + RE_WORD_END.test(css); + if (RE_WORD_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_WORD_END.lastIndex - 2; + } + currentToken = ["word", css.slice(pos, next + 1), pos, next]; + buffer.push(currentToken); + pos = next; + } + break; + } + } + pos++; + return currentToken; + } + function back(token) { + returned.push(token); + } + return { + back, + endOfFile, + nextToken, + position + }; + }; + return tokenize; +} +var atRule; +var hasRequiredAtRule; +function requireAtRule() { + if (hasRequiredAtRule) return atRule; + hasRequiredAtRule = 1; + let Container = requireContainer(); + class AtRule extends Container { + constructor(defaults) { + super(defaults); + this.type = "atrule"; + } + append(...children) { + if (!this.proxyOf.nodes) this.nodes = []; + return super.append(...children); + } + prepend(...children) { + if (!this.proxyOf.nodes) this.nodes = []; + return super.prepend(...children); + } + } + atRule = AtRule; + AtRule.default = AtRule; + Container.registerAtRule(AtRule); + return atRule; +} +var root; +var hasRequiredRoot; +function requireRoot() { + if (hasRequiredRoot) return root; + hasRequiredRoot = 1; + let Container = requireContainer(); + let LazyResult, Processor; + class Root extends Container { + constructor(defaults) { + super(defaults); + this.type = "root"; + if (!this.nodes) this.nodes = []; + } + normalize(child, sample, type) { + let nodes = super.normalize(child); + if (sample) { + if (type === "prepend") { + if (this.nodes.length > 1) { + sample.raws.before = this.nodes[1].raws.before; + } else { + delete sample.raws.before; + } + } else if (this.first !== sample) { + for (let node2 of nodes) { + node2.raws.before = sample.raws.before; + } + } + } + return nodes; + } + removeChild(child, ignore) { + let index2 = this.index(child); + if (!ignore && index2 === 0 && this.nodes.length > 1) { + this.nodes[1].raws.before = this.nodes[index2].raws.before; + } + return super.removeChild(child); + } + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + } + } + Root.registerLazyResult = (dependant) => { + LazyResult = dependant; + }; + Root.registerProcessor = (dependant) => { + Processor = dependant; + }; + root = Root; + Root.default = Root; + Container.registerRoot(Root); + return root; +} +var list_1; +var hasRequiredList; +function requireList() { + if (hasRequiredList) return list_1; + hasRequiredList = 1; + let list = { + comma(string) { + return list.split(string, [","], true); + }, + space(string) { + let spaces = [" ", "\n", " "]; + return list.split(string, spaces); + }, + split(string, separators, last) { + let array = []; + let current = ""; + let split = false; + let func = 0; + let inQuote = false; + let prevQuote = ""; + let escape = false; + for (let letter of string) { + if (escape) { + escape = false; + } else if (letter === "\\") { + escape = true; + } else if (inQuote) { + if (letter === prevQuote) { + inQuote = false; + } + } else if (letter === '"' || letter === "'") { + inQuote = true; + prevQuote = letter; + } else if (letter === "(") { + func += 1; + } else if (letter === ")") { + if (func > 0) func -= 1; + } else if (func === 0) { + if (separators.includes(letter)) split = true; + } + if (split) { + if (current !== "") array.push(current.trim()); + current = ""; + split = false; + } else { + current += letter; + } + } + if (last || current !== "") array.push(current.trim()); + return array; + } + }; + list_1 = list; + list.default = list; + return list_1; +} +var rule; +var hasRequiredRule; +function requireRule() { + if (hasRequiredRule) return rule; + hasRequiredRule = 1; + let Container = requireContainer(); + let list = requireList(); + class Rule extends Container { + constructor(defaults) { + super(defaults); + this.type = "rule"; + if (!this.nodes) this.nodes = []; + } + get selectors() { + return list.comma(this.selector); + } + set selectors(values) { + let match = this.selector ? this.selector.match(/,\s*/) : null; + let sep = match ? match[0] : "," + this.raw("between", "beforeOpen"); + this.selector = values.join(sep); + } + } + rule = Rule; + Rule.default = Rule; + Container.registerRule(Rule); + return rule; +} +var parser; +var hasRequiredParser; +function requireParser() { + if (hasRequiredParser) return parser; + hasRequiredParser = 1; + let Declaration = requireDeclaration(); + let tokenizer = requireTokenize(); + let Comment = requireComment(); + let AtRule = requireAtRule(); + let Root = requireRoot(); + let Rule = requireRule(); + const SAFE_COMMENT_NEIGHBOR = { + empty: true, + space: true + }; + function findLastWithPosition(tokens) { + for (let i2 = tokens.length - 1; i2 >= 0; i2--) { + let token = tokens[i2]; + let pos = token[3] || token[2]; + if (pos) return pos; + } + } + class Parser { + constructor(input2) { + this.input = input2; + this.root = new Root(); + this.current = this.root; + this.spaces = ""; + this.semicolon = false; + this.createTokenizer(); + this.root.source = { input: input2, start: { column: 1, line: 1, offset: 0 } }; + } + atrule(token) { + let node2 = new AtRule(); + node2.name = token[1].slice(1); + if (node2.name === "") { + this.unnamedAtrule(node2, token); + } + this.init(node2, token[2]); + let type; + let prev; + let shift; + let last = false; + let open = false; + let params = []; + let brackets = []; + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + type = token[0]; + if (type === "(" || type === "[") { + brackets.push(type === "(" ? ")" : "]"); + } else if (type === "{" && brackets.length > 0) { + brackets.push("}"); + } else if (type === brackets[brackets.length - 1]) { + brackets.pop(); + } + if (brackets.length === 0) { + if (type === ";") { + node2.source.end = this.getPosition(token[2]); + node2.source.end.offset++; + this.semicolon = true; + break; + } else if (type === "{") { + open = true; + break; + } else if (type === "}") { + if (params.length > 0) { + shift = params.length - 1; + prev = params[shift]; + while (prev && prev[0] === "space") { + prev = params[--shift]; + } + if (prev) { + node2.source.end = this.getPosition(prev[3] || prev[2]); + node2.source.end.offset++; + } + } + this.end(token); + break; + } else { + params.push(token); + } + } else { + params.push(token); + } + if (this.tokenizer.endOfFile()) { + last = true; + break; + } + } + node2.raws.between = this.spacesAndCommentsFromEnd(params); + if (params.length) { + node2.raws.afterName = this.spacesAndCommentsFromStart(params); + this.raw(node2, "params", params); + if (last) { + token = params[params.length - 1]; + node2.source.end = this.getPosition(token[3] || token[2]); + node2.source.end.offset++; + this.spaces = node2.raws.between; + node2.raws.between = ""; + } + } else { + node2.raws.afterName = ""; + node2.params = ""; + } + if (open) { + node2.nodes = []; + this.current = node2; + } + } + checkMissedSemicolon(tokens) { + let colon = this.colon(tokens); + if (colon === false) return; + let founded = 0; + let token; + for (let j = colon - 1; j >= 0; j--) { + token = tokens[j]; + if (token[0] !== "space") { + founded += 1; + if (founded === 2) break; + } + } + throw this.input.error( + "Missed semicolon", + token[0] === "word" ? token[3] + 1 : token[2] + ); + } + colon(tokens) { + let brackets = 0; + let token, type, prev; + for (let [i2, element] of tokens.entries()) { + token = element; + type = token[0]; + if (type === "(") { + brackets += 1; + } + if (type === ")") { + brackets -= 1; + } + if (brackets === 0 && type === ":") { + if (!prev) { + this.doubleColon(token); + } else if (prev[0] === "word" && prev[1] === "progid") { + continue; + } else { + return i2; + } + } + prev = token; + } + return false; + } + comment(token) { + let node2 = new Comment(); + this.init(node2, token[2]); + node2.source.end = this.getPosition(token[3] || token[2]); + node2.source.end.offset++; + let text = token[1].slice(2, -2); + if (/^\s*$/.test(text)) { + node2.text = ""; + node2.raws.left = text; + node2.raws.right = ""; + } else { + let match = text.match(/^(\s*)([^]*\S)(\s*)$/); + node2.text = match[2]; + node2.raws.left = match[1]; + node2.raws.right = match[3]; + } + } + createTokenizer() { + this.tokenizer = tokenizer(this.input); + } + decl(tokens, customProperty) { + let node2 = new Declaration(); + this.init(node2, tokens[0][2]); + let last = tokens[tokens.length - 1]; + if (last[0] === ";") { + this.semicolon = true; + tokens.pop(); + } + node2.source.end = this.getPosition( + last[3] || last[2] || findLastWithPosition(tokens) + ); + node2.source.end.offset++; + while (tokens[0][0] !== "word") { + if (tokens.length === 1) this.unknownWord(tokens); + node2.raws.before += tokens.shift()[1]; + } + node2.source.start = this.getPosition(tokens[0][2]); + node2.prop = ""; + while (tokens.length) { + let type = tokens[0][0]; + if (type === ":" || type === "space" || type === "comment") { + break; + } + node2.prop += tokens.shift()[1]; + } + node2.raws.between = ""; + let token; + while (tokens.length) { + token = tokens.shift(); + if (token[0] === ":") { + node2.raws.between += token[1]; + break; + } else { + if (token[0] === "word" && /\w/.test(token[1])) { + this.unknownWord([token]); + } + node2.raws.between += token[1]; + } + } + if (node2.prop[0] === "_" || node2.prop[0] === "*") { + node2.raws.before += node2.prop[0]; + node2.prop = node2.prop.slice(1); + } + let firstSpaces = []; + let next; + while (tokens.length) { + next = tokens[0][0]; + if (next !== "space" && next !== "comment") break; + firstSpaces.push(tokens.shift()); + } + this.precheckMissedSemicolon(tokens); + for (let i2 = tokens.length - 1; i2 >= 0; i2--) { + token = tokens[i2]; + if (token[1].toLowerCase() === "!important") { + node2.important = true; + let string = this.stringFrom(tokens, i2); + string = this.spacesFromEnd(tokens) + string; + if (string !== " !important") node2.raws.important = string; + break; + } else if (token[1].toLowerCase() === "important") { + let cache = tokens.slice(0); + let str = ""; + for (let j = i2; j > 0; j--) { + let type = cache[j][0]; + if (str.trim().indexOf("!") === 0 && type !== "space") { + break; + } + str = cache.pop()[1] + str; + } + if (str.trim().indexOf("!") === 0) { + node2.important = true; + node2.raws.important = str; + tokens = cache; + } + } + if (token[0] !== "space" && token[0] !== "comment") { + break; + } + } + let hasWord = tokens.some((i2) => i2[0] !== "space" && i2[0] !== "comment"); + if (hasWord) { + node2.raws.between += firstSpaces.map((i2) => i2[1]).join(""); + firstSpaces = []; + } + this.raw(node2, "value", firstSpaces.concat(tokens), customProperty); + if (node2.value.includes(":") && !customProperty) { + this.checkMissedSemicolon(tokens); + } + } + doubleColon(token) { + throw this.input.error( + "Double colon", + { offset: token[2] }, + { offset: token[2] + token[1].length } + ); + } + emptyRule(token) { + let node2 = new Rule(); + this.init(node2, token[2]); + node2.selector = ""; + node2.raws.between = ""; + this.current = node2; + } + end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.semicolon = false; + this.current.raws.after = (this.current.raws.after || "") + this.spaces; + this.spaces = ""; + if (this.current.parent) { + this.current.source.end = this.getPosition(token[2]); + this.current.source.end.offset++; + this.current = this.current.parent; + } else { + this.unexpectedClose(token); + } + } + endFile() { + if (this.current.parent) this.unclosedBlock(); + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.current.raws.after = (this.current.raws.after || "") + this.spaces; + this.root.source.end = this.getPosition(this.tokenizer.position()); + } + freeSemicolon(token) { + this.spaces += token[1]; + if (this.current.nodes) { + let prev = this.current.nodes[this.current.nodes.length - 1]; + if (prev && prev.type === "rule" && !prev.raws.ownSemicolon) { + prev.raws.ownSemicolon = this.spaces; + this.spaces = ""; + } + } + } + // Helpers + getPosition(offset) { + let pos = this.input.fromOffset(offset); + return { + column: pos.col, + line: pos.line, + offset + }; + } + init(node2, offset) { + this.current.push(node2); + node2.source = { + input: this.input, + start: this.getPosition(offset) + }; + node2.raws.before = this.spaces; + this.spaces = ""; + if (node2.type !== "comment") this.semicolon = false; + } + other(start) { + let end = false; + let type = null; + let colon = false; + let bracket = null; + let brackets = []; + let customProperty = start[1].startsWith("--"); + let tokens = []; + let token = start; + while (token) { + type = token[0]; + tokens.push(token); + if (type === "(" || type === "[") { + if (!bracket) bracket = token; + brackets.push(type === "(" ? ")" : "]"); + } else if (customProperty && colon && type === "{") { + if (!bracket) bracket = token; + brackets.push("}"); + } else if (brackets.length === 0) { + if (type === ";") { + if (colon) { + this.decl(tokens, customProperty); + return; + } else { + break; + } + } else if (type === "{") { + this.rule(tokens); + return; + } else if (type === "}") { + this.tokenizer.back(tokens.pop()); + end = true; + break; + } else if (type === ":") { + colon = true; + } + } else if (type === brackets[brackets.length - 1]) { + brackets.pop(); + if (brackets.length === 0) bracket = null; + } + token = this.tokenizer.nextToken(); + } + if (this.tokenizer.endOfFile()) end = true; + if (brackets.length > 0) this.unclosedBracket(bracket); + if (end && colon) { + if (!customProperty) { + while (tokens.length) { + token = tokens[tokens.length - 1][0]; + if (token !== "space" && token !== "comment") break; + this.tokenizer.back(tokens.pop()); + } + } + this.decl(tokens, customProperty); + } else { + this.unknownWord(tokens); + } + } + parse() { + let token; + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + switch (token[0]) { + case "space": + this.spaces += token[1]; + break; + case ";": + this.freeSemicolon(token); + break; + case "}": + this.end(token); + break; + case "comment": + this.comment(token); + break; + case "at-word": + this.atrule(token); + break; + case "{": + this.emptyRule(token); + break; + default: + this.other(token); + break; + } + } + this.endFile(); + } + precheckMissedSemicolon() { + } + raw(node2, prop, tokens, customProperty) { + let token, type; + let length = tokens.length; + let value = ""; + let clean = true; + let next, prev; + for (let i2 = 0; i2 < length; i2 += 1) { + token = tokens[i2]; + type = token[0]; + if (type === "space" && i2 === length - 1 && !customProperty) { + clean = false; + } else if (type === "comment") { + prev = tokens[i2 - 1] ? tokens[i2 - 1][0] : "empty"; + next = tokens[i2 + 1] ? tokens[i2 + 1][0] : "empty"; + if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) { + if (value.slice(-1) === ",") { + clean = false; + } else { + value += token[1]; + } + } else { + clean = false; + } + } else { + value += token[1]; + } + } + if (!clean) { + let raw = tokens.reduce((all, i2) => all + i2[1], ""); + node2.raws[prop] = { raw, value }; + } + node2[prop] = value; + } + rule(tokens) { + tokens.pop(); + let node2 = new Rule(); + this.init(node2, tokens[0][2]); + node2.raws.between = this.spacesAndCommentsFromEnd(tokens); + this.raw(node2, "selector", tokens); + this.current = node2; + } + spacesAndCommentsFromEnd(tokens) { + let lastTokenType; + let spaces = ""; + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== "space" && lastTokenType !== "comment") break; + spaces = tokens.pop()[1] + spaces; + } + return spaces; + } + // Errors + spacesAndCommentsFromStart(tokens) { + let next; + let spaces = ""; + while (tokens.length) { + next = tokens[0][0]; + if (next !== "space" && next !== "comment") break; + spaces += tokens.shift()[1]; + } + return spaces; + } + spacesFromEnd(tokens) { + let lastTokenType; + let spaces = ""; + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== "space") break; + spaces = tokens.pop()[1] + spaces; + } + return spaces; + } + stringFrom(tokens, from) { + let result2 = ""; + for (let i2 = from; i2 < tokens.length; i2++) { + result2 += tokens[i2][1]; + } + tokens.splice(from, tokens.length - from); + return result2; + } + unclosedBlock() { + let pos = this.current.source.start; + throw this.input.error("Unclosed block", pos.line, pos.column); + } + unclosedBracket(bracket) { + throw this.input.error( + "Unclosed bracket", + { offset: bracket[2] }, + { offset: bracket[2] + 1 } + ); + } + unexpectedClose(token) { + throw this.input.error( + "Unexpected }", + { offset: token[2] }, + { offset: token[2] + 1 } + ); + } + unknownWord(tokens) { + throw this.input.error( + "Unknown word", + { offset: tokens[0][2] }, + { offset: tokens[0][2] + tokens[0][1].length } + ); + } + unnamedAtrule(node2, token) { + throw this.input.error( + "At-rule without name", + { offset: token[2] }, + { offset: token[2] + token[1].length } + ); + } + } + parser = Parser; + return parser; +} +var parse_1; +var hasRequiredParse; +function requireParse() { + if (hasRequiredParse) return parse_1; + hasRequiredParse = 1; + let Container = requireContainer(); + let Parser = requireParser(); + let Input = requireInput(); + function parse(css, opts) { + let input2 = new Input(css, opts); + let parser2 = new Parser(input2); + try { + parser2.parse(); + } catch (e2) { + if (true) { + if (e2.name === "CssSyntaxError" && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e2.message += "\nYou tried to parse SCSS with the standard CSS parser; try again with the postcss-scss parser"; + } else if (/\.sass/i.test(opts.from)) { + e2.message += "\nYou tried to parse Sass with the standard CSS parser; try again with the postcss-sass parser"; + } else if (/\.less$/i.test(opts.from)) { + e2.message += "\nYou tried to parse Less with the standard CSS parser; try again with the postcss-less parser"; + } + } + } + throw e2; + } + return parser2.root; + } + parse_1 = parse; + parse.default = parse; + Container.registerParse(parse); + return parse_1; +} +var lazyResult; +var hasRequiredLazyResult; +function requireLazyResult() { + if (hasRequiredLazyResult) return lazyResult; + hasRequiredLazyResult = 1; + let { isClean, my } = requireSymbols(); + let MapGenerator = requireMapGenerator(); + let stringify = requireStringify(); + let Container = requireContainer(); + let Document2 = requireDocument(); + let warnOnce2 = requireWarnOnce(); + let Result = requireResult(); + let parse = requireParse(); + let Root = requireRoot(); + const TYPE_TO_CLASS_NAME = { + atrule: "AtRule", + comment: "Comment", + decl: "Declaration", + document: "Document", + root: "Root", + rule: "Rule" + }; + const PLUGIN_PROPS = { + AtRule: true, + AtRuleExit: true, + Comment: true, + CommentExit: true, + Declaration: true, + DeclarationExit: true, + Document: true, + DocumentExit: true, + Once: true, + OnceExit: true, + postcssPlugin: true, + prepare: true, + Root: true, + RootExit: true, + Rule: true, + RuleExit: true + }; + const NOT_VISITORS = { + Once: true, + postcssPlugin: true, + prepare: true + }; + const CHILDREN = 0; + function isPromise(obj) { + return typeof obj === "object" && typeof obj.then === "function"; + } + function getEvents(node2) { + let key = false; + let type = TYPE_TO_CLASS_NAME[node2.type]; + if (node2.type === "decl") { + key = node2.prop.toLowerCase(); + } else if (node2.type === "atrule") { + key = node2.name.toLowerCase(); + } + if (key && node2.append) { + return [ + type, + type + "-" + key, + CHILDREN, + type + "Exit", + type + "Exit-" + key + ]; + } else if (key) { + return [type, type + "-" + key, type + "Exit", type + "Exit-" + key]; + } else if (node2.append) { + return [type, CHILDREN, type + "Exit"]; + } else { + return [type, type + "Exit"]; + } + } + function toStack(node2) { + let events; + if (node2.type === "document") { + events = ["Document", CHILDREN, "DocumentExit"]; + } else if (node2.type === "root") { + events = ["Root", CHILDREN, "RootExit"]; + } else { + events = getEvents(node2); + } + return { + eventIndex: 0, + events, + iterator: 0, + node: node2, + visitorIndex: 0, + visitors: [] + }; + } + function cleanMarks(node2) { + node2[isClean] = false; + if (node2.nodes) node2.nodes.forEach((i2) => cleanMarks(i2)); + return node2; + } + let postcss2 = {}; + class LazyResult { + constructor(processor2, css, opts) { + this.stringified = false; + this.processed = false; + let root2; + if (typeof css === "object" && css !== null && (css.type === "root" || css.type === "document")) { + root2 = cleanMarks(css); + } else if (css instanceof LazyResult || css instanceof Result) { + root2 = cleanMarks(css.root); + if (css.map) { + if (typeof opts.map === "undefined") opts.map = {}; + if (!opts.map.inline) opts.map.inline = false; + opts.map.prev = css.map; + } + } else { + let parser2 = parse; + if (opts.syntax) parser2 = opts.syntax.parse; + if (opts.parser) parser2 = opts.parser; + if (parser2.parse) parser2 = parser2.parse; + try { + root2 = parser2(css, opts); + } catch (error) { + this.processed = true; + this.error = error; + } + if (root2 && !root2[my]) { + Container.rebuild(root2); + } + } + this.result = new Result(processor2, root2, opts); + this.helpers = __spreadProps(__spreadValues({}, postcss2), { postcss: postcss2, result: this.result }); + this.plugins = this.processor.plugins.map((plugin) => { + if (typeof plugin === "object" && plugin.prepare) { + return __spreadValues(__spreadValues({}, plugin), plugin.prepare(this.result)); + } else { + return plugin; + } + }); + } + async() { + if (this.error) return Promise.reject(this.error); + if (this.processed) return Promise.resolve(this.result); + if (!this.processing) { + this.processing = this.runAsync(); + } + return this.processing; + } + catch(onRejected) { + return this.async().catch(onRejected); + } + finally(onFinally) { + return this.async().then(onFinally, onFinally); + } + getAsyncError() { + throw new Error("Use process(css).then(cb) to work with async plugins"); + } + handleError(error, node2) { + let plugin = this.result.lastPlugin; + try { + if (node2) node2.addToError(error); + this.error = error; + if (error.name === "CssSyntaxError" && !error.plugin) { + error.plugin = plugin.postcssPlugin; + error.setMessage(); + } else if (plugin.postcssVersion) { + if (true) { + let pluginName = plugin.postcssPlugin; + let pluginVer = plugin.postcssVersion; + let runtimeVer = this.result.processor.version; + let a2 = pluginVer.split("."); + let b = runtimeVer.split("."); + if (a2[0] !== b[0] || parseInt(a2[1]) > parseInt(b[1])) { + console.error( + "Unknown error from PostCSS plugin. Your current PostCSS version is " + runtimeVer + ", but " + pluginName + " uses " + pluginVer + ". Perhaps this is the source of the error below." + ); + } + } + } + } catch (err) { + if (console && console.error) console.error(err); + } + return error; + } + prepareVisitors() { + this.listeners = {}; + let add = (plugin, type, cb) => { + if (!this.listeners[type]) this.listeners[type] = []; + this.listeners[type].push([plugin, cb]); + }; + for (let plugin of this.plugins) { + if (typeof plugin === "object") { + for (let event in plugin) { + if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) { + throw new Error( + `Unknown event ${event} in ${plugin.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).` + ); + } + if (!NOT_VISITORS[event]) { + if (typeof plugin[event] === "object") { + for (let filter in plugin[event]) { + if (filter === "*") { + add(plugin, event, plugin[event][filter]); + } else { + add( + plugin, + event + "-" + filter.toLowerCase(), + plugin[event][filter] + ); + } + } + } else if (typeof plugin[event] === "function") { + add(plugin, event, plugin[event]); + } + } + } + } + } + this.hasListener = Object.keys(this.listeners).length > 0; + } + async runAsync() { + this.plugin = 0; + for (let i2 = 0; i2 < this.plugins.length; i2++) { + let plugin = this.plugins[i2]; + let promise = this.runOnRoot(plugin); + if (isPromise(promise)) { + try { + await promise; + } catch (error) { + throw this.handleError(error); + } + } + } + this.prepareVisitors(); + if (this.hasListener) { + let root2 = this.result.root; + while (!root2[isClean]) { + root2[isClean] = true; + let stack = [toStack(root2)]; + while (stack.length > 0) { + let promise = this.visitTick(stack); + if (isPromise(promise)) { + try { + await promise; + } catch (e2) { + let node2 = stack[stack.length - 1].node; + throw this.handleError(e2, node2); + } + } + } + } + if (this.listeners.OnceExit) { + for (let [plugin, visitor] of this.listeners.OnceExit) { + this.result.lastPlugin = plugin; + try { + if (root2.type === "document") { + let roots = root2.nodes.map( + (subRoot) => visitor(subRoot, this.helpers) + ); + await Promise.all(roots); + } else { + await visitor(root2, this.helpers); + } + } catch (e2) { + throw this.handleError(e2); + } + } + } + } + this.processed = true; + return this.stringify(); + } + runOnRoot(plugin) { + this.result.lastPlugin = plugin; + try { + if (typeof plugin === "object" && plugin.Once) { + if (this.result.root.type === "document") { + let roots = this.result.root.nodes.map( + (root2) => plugin.Once(root2, this.helpers) + ); + if (isPromise(roots[0])) { + return Promise.all(roots); + } + return roots; + } + return plugin.Once(this.result.root, this.helpers); + } else if (typeof plugin === "function") { + return plugin(this.result.root, this.result); + } + } catch (error) { + throw this.handleError(error); + } + } + stringify() { + if (this.error) throw this.error; + if (this.stringified) return this.result; + this.stringified = true; + this.sync(); + let opts = this.result.opts; + let str = stringify; + if (opts.syntax) str = opts.syntax.stringify; + if (opts.stringifier) str = opts.stringifier; + if (str.stringify) str = str.stringify; + let map = new MapGenerator(str, this.result.root, this.result.opts); + let data = map.generate(); + this.result.css = data[0]; + this.result.map = data[1]; + return this.result; + } + sync() { + if (this.error) throw this.error; + if (this.processed) return this.result; + this.processed = true; + if (this.processing) { + throw this.getAsyncError(); + } + for (let plugin of this.plugins) { + let promise = this.runOnRoot(plugin); + if (isPromise(promise)) { + throw this.getAsyncError(); + } + } + this.prepareVisitors(); + if (this.hasListener) { + let root2 = this.result.root; + while (!root2[isClean]) { + root2[isClean] = true; + this.walkSync(root2); + } + if (this.listeners.OnceExit) { + if (root2.type === "document") { + for (let subRoot of root2.nodes) { + this.visitSync(this.listeners.OnceExit, subRoot); + } + } else { + this.visitSync(this.listeners.OnceExit, root2); + } + } + } + return this.result; + } + then(onFulfilled, onRejected) { + if (true) { + if (!("from" in this.opts)) { + warnOnce2( + "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning." + ); + } + } + return this.async().then(onFulfilled, onRejected); + } + toString() { + return this.css; + } + visitSync(visitors, node2) { + for (let [plugin, visitor] of visitors) { + this.result.lastPlugin = plugin; + let promise; + try { + promise = visitor(node2, this.helpers); + } catch (e2) { + throw this.handleError(e2, node2.proxyOf); + } + if (node2.type !== "root" && node2.type !== "document" && !node2.parent) { + return true; + } + if (isPromise(promise)) { + throw this.getAsyncError(); + } + } + } + visitTick(stack) { + let visit2 = stack[stack.length - 1]; + let { node: node2, visitors } = visit2; + if (node2.type !== "root" && node2.type !== "document" && !node2.parent) { + stack.pop(); + return; + } + if (visitors.length > 0 && visit2.visitorIndex < visitors.length) { + let [plugin, visitor] = visitors[visit2.visitorIndex]; + visit2.visitorIndex += 1; + if (visit2.visitorIndex === visitors.length) { + visit2.visitors = []; + visit2.visitorIndex = 0; + } + this.result.lastPlugin = plugin; + try { + return visitor(node2.toProxy(), this.helpers); + } catch (e2) { + throw this.handleError(e2, node2); + } + } + if (visit2.iterator !== 0) { + let iterator = visit2.iterator; + let child; + while (child = node2.nodes[node2.indexes[iterator]]) { + node2.indexes[iterator] += 1; + if (!child[isClean]) { + child[isClean] = true; + stack.push(toStack(child)); + return; + } + } + visit2.iterator = 0; + delete node2.indexes[iterator]; + } + let events = visit2.events; + while (visit2.eventIndex < events.length) { + let event = events[visit2.eventIndex]; + visit2.eventIndex += 1; + if (event === CHILDREN) { + if (node2.nodes && node2.nodes.length) { + node2[isClean] = true; + visit2.iterator = node2.getIterator(); + } + return; + } else if (this.listeners[event]) { + visit2.visitors = this.listeners[event]; + return; + } + } + stack.pop(); + } + walkSync(node2) { + node2[isClean] = true; + let events = getEvents(node2); + for (let event of events) { + if (event === CHILDREN) { + if (node2.nodes) { + node2.each((child) => { + if (!child[isClean]) this.walkSync(child); + }); + } + } else { + let visitors = this.listeners[event]; + if (visitors) { + if (this.visitSync(visitors, node2.toProxy())) return; + } + } + } + } + warnings() { + return this.sync().warnings(); + } + get content() { + return this.stringify().content; + } + get css() { + return this.stringify().css; + } + get map() { + return this.stringify().map; + } + get messages() { + return this.sync().messages; + } + get opts() { + return this.result.opts; + } + get processor() { + return this.result.processor; + } + get root() { + return this.sync().root; + } + get [Symbol.toStringTag]() { + return "LazyResult"; + } + } + LazyResult.registerPostcss = (dependant) => { + postcss2 = dependant; + }; + lazyResult = LazyResult; + LazyResult.default = LazyResult; + Root.registerLazyResult(LazyResult); + Document2.registerLazyResult(LazyResult); + return lazyResult; +} +var noWorkResult; +var hasRequiredNoWorkResult; +function requireNoWorkResult() { + if (hasRequiredNoWorkResult) return noWorkResult; + hasRequiredNoWorkResult = 1; + let MapGenerator = requireMapGenerator(); + let stringify = requireStringify(); + let warnOnce2 = requireWarnOnce(); + let parse = requireParse(); + const Result = requireResult(); + class NoWorkResult { + constructor(processor2, css, opts) { + css = css.toString(); + this.stringified = false; + this._processor = processor2; + this._css = css; + this._opts = opts; + this._map = void 0; + let root2; + let str = stringify; + this.result = new Result(this._processor, root2, this._opts); + this.result.css = css; + let self2 = this; + Object.defineProperty(this.result, "root", { + get() { + return self2.root; + } + }); + let map = new MapGenerator(str, root2, this._opts, css); + if (map.isMap()) { + let [generatedCSS, generatedMap] = map.generate(); + if (generatedCSS) { + this.result.css = generatedCSS; + } + if (generatedMap) { + this.result.map = generatedMap; + } + } else { + map.clearAnnotation(); + this.result.css = map.css; + } + } + async() { + if (this.error) return Promise.reject(this.error); + return Promise.resolve(this.result); + } + catch(onRejected) { + return this.async().catch(onRejected); + } + finally(onFinally) { + return this.async().then(onFinally, onFinally); + } + sync() { + if (this.error) throw this.error; + return this.result; + } + then(onFulfilled, onRejected) { + if (true) { + if (!("from" in this._opts)) { + warnOnce2( + "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning." + ); + } + } + return this.async().then(onFulfilled, onRejected); + } + toString() { + return this._css; + } + warnings() { + return []; + } + get content() { + return this.result.css; + } + get css() { + return this.result.css; + } + get map() { + return this.result.map; + } + get messages() { + return []; + } + get opts() { + return this.result.opts; + } + get processor() { + return this.result.processor; + } + get root() { + if (this._root) { + return this._root; + } + let root2; + let parser2 = parse; + try { + root2 = parser2(this._css, this._opts); + } catch (error) { + this.error = error; + } + if (this.error) { + throw this.error; + } else { + this._root = root2; + return root2; + } + } + get [Symbol.toStringTag]() { + return "NoWorkResult"; + } + } + noWorkResult = NoWorkResult; + NoWorkResult.default = NoWorkResult; + return noWorkResult; +} +var processor; +var hasRequiredProcessor; +function requireProcessor() { + if (hasRequiredProcessor) return processor; + hasRequiredProcessor = 1; + let NoWorkResult = requireNoWorkResult(); + let LazyResult = requireLazyResult(); + let Document2 = requireDocument(); + let Root = requireRoot(); + class Processor { + constructor(plugins = []) { + this.version = "8.4.38"; + this.plugins = this.normalize(plugins); + } + normalize(plugins) { + let normalized = []; + for (let i2 of plugins) { + if (i2.postcss === true) { + i2 = i2(); + } else if (i2.postcss) { + i2 = i2.postcss; + } + if (typeof i2 === "object" && Array.isArray(i2.plugins)) { + normalized = normalized.concat(i2.plugins); + } else if (typeof i2 === "object" && i2.postcssPlugin) { + normalized.push(i2); + } else if (typeof i2 === "function") { + normalized.push(i2); + } else if (typeof i2 === "object" && (i2.parse || i2.stringify)) { + if (true) { + throw new Error( + "PostCSS syntaxes cannot be used as plugins. Instead, please use one of the syntax/parser/stringifier options as outlined in your PostCSS runner documentation." + ); + } + } else { + throw new Error(i2 + " is not a PostCSS plugin"); + } + } + return normalized; + } + process(css, opts = {}) { + if (!this.plugins.length && !opts.parser && !opts.stringifier && !opts.syntax) { + return new NoWorkResult(this, css, opts); + } else { + return new LazyResult(this, css, opts); + } + } + use(plugin) { + this.plugins = this.plugins.concat(this.normalize([plugin])); + return this; + } + } + processor = Processor; + Processor.default = Processor; + Root.registerProcessor(Processor); + Document2.registerProcessor(Processor); + return processor; +} +var fromJSON_1; +var hasRequiredFromJSON; +function requireFromJSON() { + if (hasRequiredFromJSON) return fromJSON_1; + hasRequiredFromJSON = 1; + let Declaration = requireDeclaration(); + let PreviousMap = requirePreviousMap(); + let Comment = requireComment(); + let AtRule = requireAtRule(); + let Input = requireInput(); + let Root = requireRoot(); + let Rule = requireRule(); + function fromJSON(json, inputs) { + if (Array.isArray(json)) return json.map((n2) => fromJSON(n2)); + let _a2 = json, { inputs: ownInputs } = _a2, defaults = __objRest(_a2, ["inputs"]); + if (ownInputs) { + inputs = []; + for (let input2 of ownInputs) { + let inputHydrated = __spreadProps(__spreadValues({}, input2), { __proto__: Input.prototype }); + if (inputHydrated.map) { + inputHydrated.map = __spreadProps(__spreadValues({}, inputHydrated.map), { + __proto__: PreviousMap.prototype + }); + } + inputs.push(inputHydrated); + } + } + if (defaults.nodes) { + defaults.nodes = json.nodes.map((n2) => fromJSON(n2, inputs)); + } + if (defaults.source) { + let _b = defaults.source, { inputId } = _b, source = __objRest(_b, ["inputId"]); + defaults.source = source; + if (inputId != null) { + defaults.source.input = inputs[inputId]; + } + } + if (defaults.type === "root") { + return new Root(defaults); + } else if (defaults.type === "decl") { + return new Declaration(defaults); + } else if (defaults.type === "rule") { + return new Rule(defaults); + } else if (defaults.type === "comment") { + return new Comment(defaults); + } else if (defaults.type === "atrule") { + return new AtRule(defaults); + } else { + throw new Error("Unknown node type: " + json.type); + } + } + fromJSON_1 = fromJSON; + fromJSON.default = fromJSON; + return fromJSON_1; +} +var postcss_1; +var hasRequiredPostcss; +function requirePostcss() { + if (hasRequiredPostcss) return postcss_1; + hasRequiredPostcss = 1; + let CssSyntaxError = requireCssSyntaxError(); + let Declaration = requireDeclaration(); + let LazyResult = requireLazyResult(); + let Container = requireContainer(); + let Processor = requireProcessor(); + let stringify = requireStringify(); + let fromJSON = requireFromJSON(); + let Document2 = requireDocument(); + let Warning = requireWarning(); + let Comment = requireComment(); + let AtRule = requireAtRule(); + let Result = requireResult(); + let Input = requireInput(); + let parse = requireParse(); + let list = requireList(); + let Rule = requireRule(); + let Root = requireRoot(); + let Node2 = requireNode(); + function postcss2(...plugins) { + if (plugins.length === 1 && Array.isArray(plugins[0])) { + plugins = plugins[0]; + } + return new Processor(plugins); + } + postcss2.plugin = function plugin(name, initializer) { + let warningPrinted = false; + function creator(...args) { + if (console && console.warn && !warningPrinted) { + warningPrinted = true; + console.warn( + name + ": postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration" + ); + if (process.env.LANG && process.env.LANG.startsWith("cn")) { + console.warn( + name + ": \u91CC\u9762 postcss.plugin \u88AB\u5F03\u7528. \u8FC1\u79FB\u6307\u5357:\nhttps://www.w3ctech.com/topic/2226" + ); + } + } + let transformer = initializer(...args); + transformer.postcssPlugin = name; + transformer.postcssVersion = new Processor().version; + return transformer; + } + let cache; + Object.defineProperty(creator, "postcss", { + get() { + if (!cache) cache = creator(); + return cache; + } + }); + creator.process = function(css, processOpts, pluginOpts) { + return postcss2([creator(pluginOpts)]).process(css, processOpts); + }; + return creator; + }; + postcss2.stringify = stringify; + postcss2.parse = parse; + postcss2.fromJSON = fromJSON; + postcss2.list = list; + postcss2.comment = (defaults) => new Comment(defaults); + postcss2.atRule = (defaults) => new AtRule(defaults); + postcss2.decl = (defaults) => new Declaration(defaults); + postcss2.rule = (defaults) => new Rule(defaults); + postcss2.root = (defaults) => new Root(defaults); + postcss2.document = (defaults) => new Document2(defaults); + postcss2.CssSyntaxError = CssSyntaxError; + postcss2.Declaration = Declaration; + postcss2.Container = Container; + postcss2.Processor = Processor; + postcss2.Document = Document2; + postcss2.Comment = Comment; + postcss2.Warning = Warning; + postcss2.AtRule = AtRule; + postcss2.Result = Result; + postcss2.Input = Input; + postcss2.Rule = Rule; + postcss2.Root = Root; + postcss2.Node = Node2; + LazyResult.registerPostcss(postcss2); + postcss_1 = postcss2; + postcss2.default = postcss2; + return postcss_1; +} +var postcssExports = requirePostcss(); +const postcss = /* @__PURE__ */ getDefaultExportFromCjs(postcssExports); +postcss.stringify; +postcss.fromJSON; +postcss.plugin; +postcss.parse; +postcss.list; +postcss.document; +postcss.comment; +postcss.atRule; +postcss.rule; +postcss.decl; +postcss.root; +postcss.CssSyntaxError; +postcss.Declaration; +postcss.Container; +postcss.Processor; +postcss.Document; +postcss.Comment; +postcss.Warning; +postcss.AtRule; +postcss.Result; +postcss.Input; +postcss.Rule; +postcss.Root; +postcss.Node; +class BaseRRNode { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any + constructor(..._args) { + __publicField2(this, "parentElement", null); + __publicField2(this, "parentNode", null); + __publicField2(this, "ownerDocument"); + __publicField2(this, "firstChild", null); + __publicField2(this, "lastChild", null); + __publicField2(this, "previousSibling", null); + __publicField2(this, "nextSibling", null); + __publicField2(this, "ELEMENT_NODE", 1); + __publicField2(this, "TEXT_NODE", 3); + __publicField2(this, "nodeType"); + __publicField2(this, "nodeName"); + __publicField2(this, "RRNodeType"); + } + get childNodes() { + const childNodes2 = []; + let childIterator = this.firstChild; + while (childIterator) { + childNodes2.push(childIterator); + childIterator = childIterator.nextSibling; + } + return childNodes2; + } + contains(node2) { + if (!(node2 instanceof BaseRRNode)) return false; + else if (node2.ownerDocument !== this.ownerDocument) return false; + else if (node2 === this) return true; + while (node2.parentNode) { + if (node2.parentNode === this) return true; + node2 = node2.parentNode; + } + return false; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + appendChild(_newChild) { + throw new Error( + `RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.` + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + insertBefore(_newChild, _refChild) { + throw new Error( + `RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.` + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + removeChild(_node) { + throw new Error( + `RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.` + ); + } + toString() { + return "RRNode"; + } +} +const testableAccessors = { + Node: [ + "childNodes", + "parentNode", + "parentElement", + "textContent", + "ownerDocument" + ], + ShadowRoot: ["host", "styleSheets"], + Element: ["shadowRoot", "querySelector", "querySelectorAll"], + MutationObserver: [] +}; +const testableMethods = { + Node: ["contains", "getRootNode"], + ShadowRoot: ["getSelection"], + Element: [], + MutationObserver: ["constructor"] +}; +const untaintedBasePrototype = {}; +const isAngularZonePresent = () => { + return !!globalThis.Zone; +}; +function getUntaintedPrototype(key) { + if (untaintedBasePrototype[key]) + return untaintedBasePrototype[key]; + const defaultObj = globalThis[key]; + const defaultPrototype = defaultObj.prototype; + const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0; + const isUntaintedAccessors = Boolean( + accessorNames && // @ts-expect-error 2345 + accessorNames.every( + (accessor) => { + var _a2, _b; + return Boolean( + (_b = (_a2 = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a2.get) == null ? void 0 : _b.toString().includes("[native code]") + ); + } + ) + ); + const methodNames = key in testableMethods ? testableMethods[key] : void 0; + const isUntaintedMethods = Boolean( + methodNames && methodNames.every( + // @ts-expect-error 2345 + (method) => { + var _a2; + return typeof defaultPrototype[method] === "function" && ((_a2 = defaultPrototype[method]) == null ? void 0 : _a2.toString().includes("[native code]")); + } + ) + ); + if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) { + untaintedBasePrototype[key] = defaultObj.prototype; + return defaultObj.prototype; + } + try { + const iframeEl = document.createElement("iframe"); + document.body.appendChild(iframeEl); + const win = iframeEl.contentWindow; + if (!win) return defaultObj.prototype; + const untaintedObject = win[key].prototype; + document.body.removeChild(iframeEl); + if (!untaintedObject) return defaultPrototype; + return untaintedBasePrototype[key] = untaintedObject; + } catch (e) { + return defaultPrototype; + } +} +const untaintedAccessorCache = {}; +function getUntaintedAccessor(key, instance, accessor) { + var _a2; + const cacheKey = `${key}.${String(accessor)}`; + if (untaintedAccessorCache[cacheKey]) + return untaintedAccessorCache[cacheKey].call( + instance + ); + const untaintedPrototype = getUntaintedPrototype(key); + const untaintedAccessor = (_a2 = Object.getOwnPropertyDescriptor( + untaintedPrototype, + accessor + )) == null ? void 0 : _a2.get; + if (!untaintedAccessor) return instance[accessor]; + untaintedAccessorCache[cacheKey] = untaintedAccessor; + return untaintedAccessor.call(instance); +} +const untaintedMethodCache = {}; +function getUntaintedMethod(key, instance, method) { + const cacheKey = `${key}.${String(method)}`; + if (untaintedMethodCache[cacheKey]) + return untaintedMethodCache[cacheKey].bind( + instance + ); + const untaintedPrototype = getUntaintedPrototype(key); + const untaintedMethod = untaintedPrototype[method]; + if (typeof untaintedMethod !== "function") return instance[method]; + untaintedMethodCache[cacheKey] = untaintedMethod; + return untaintedMethod.bind(instance); +} +function ownerDocument(n2) { + return getUntaintedAccessor("Node", n2, "ownerDocument"); +} +function childNodes(n2) { + return getUntaintedAccessor("Node", n2, "childNodes"); +} +function parentNode(n2) { + return getUntaintedAccessor("Node", n2, "parentNode"); +} +function parentElement(n2) { + return getUntaintedAccessor("Node", n2, "parentElement"); +} +function textContent(n2) { + return getUntaintedAccessor("Node", n2, "textContent"); +} +function contains(n2, other) { + return getUntaintedMethod("Node", n2, "contains")(other); +} +function getRootNode(n2) { + return getUntaintedMethod("Node", n2, "getRootNode")(); +} +function host(n2) { + if (!n2 || !("host" in n2)) return null; + return getUntaintedAccessor("ShadowRoot", n2, "host"); +} +function styleSheets(n2) { + return n2.styleSheets; +} +function shadowRoot(n2) { + if (!n2 || !("shadowRoot" in n2)) return null; + return getUntaintedAccessor("Element", n2, "shadowRoot"); +} +function querySelector(n2, selectors) { + return getUntaintedAccessor("Element", n2, "querySelector")(selectors); +} +function querySelectorAll(n2, selectors) { + return getUntaintedAccessor("Element", n2, "querySelectorAll")(selectors); +} +function mutationObserverCtor() { + return getUntaintedPrototype("MutationObserver").constructor; +} +function patch(source, name, replacement) { + try { + if (!(name in source)) { + return () => { + }; + } + const original = source[name]; + const wrapped = replacement(original); + if (typeof wrapped === "function") { + wrapped.prototype = wrapped.prototype || {}; + Object.defineProperties(wrapped, { + __rrweb_original__: { + enumerable: false, + value: original + } + }); + } + source[name] = wrapped; + return () => { + source[name] = original; + }; + } catch (e) { + return () => { + }; + } +} +const index = { + ownerDocument, + childNodes, + parentNode, + parentElement, + textContent, + contains, + getRootNode, + host, + styleSheets, + shadowRoot, + querySelector, + querySelectorAll, + mutationObserver: mutationObserverCtor, + patch +}; +function on(type, fn, target = document) { + const options = { capture: true, passive: true }; + target.addEventListener(type, fn, options); + return () => target.removeEventListener(type, fn, options); +} +const DEPARTED_MIRROR_ACCESS_WARNING = "Please stop import mirror directly. Instead of that,\r\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\r\nor you can use record.mirror to access the mirror instance during recording."; +let _mirror = { + map: {}, + getId() { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + return -1; + }, + getNode() { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + return null; + }, + removeNodeFromMap() { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + }, + has() { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + return false; + }, + reset() { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + } +}; +if (typeof window !== "undefined" && window.Proxy && window.Reflect) { + _mirror = new Proxy(_mirror, { + get(target, prop, receiver) { + if (prop === "map") { + console.error(DEPARTED_MIRROR_ACCESS_WARNING); + } + return Reflect.get(target, prop, receiver); + } + }); +} +function throttle(func, wait, options = {}) { + let timeout = null; + let previous = 0; + return function(...args) { + const now = Date.now(); + if (!previous && options.leading === false) { + previous = now; + } + const remaining = wait - (now - previous); + const context = this; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + func.apply(context, args); + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(() => { + previous = options.leading === false ? 0 : Date.now(); + timeout = null; + func.apply(context, args); + }, remaining); + } + }; +} +function hookSetter(target, key, d, isRevoked, win = window) { + const original = win.Object.getOwnPropertyDescriptor(target, key); + win.Object.defineProperty( + target, + key, + isRevoked ? d : { + set(value) { + setTimeout(() => { + d.set.call(this, value); + }, 0); + if (original && original.set) { + original.set.call(this, value); + } + } + } + ); + return () => hookSetter(target, key, original || {}, true); +} +let nowTimestamp = Date.now; +if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) { + nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime(); +} +function getWindowScroll(win) { + var _a2, _b, _c, _d; + const doc = win.document; + return { + left: doc.scrollingElement ? doc.scrollingElement.scrollLeft : win.pageXOffset !== void 0 ? win.pageXOffset : doc.documentElement.scrollLeft || (doc == null ? void 0 : doc.body) && ((_a2 = index.parentElement(doc.body)) == null ? void 0 : _a2.scrollLeft) || ((_b = doc == null ? void 0 : doc.body) == null ? void 0 : _b.scrollLeft) || 0, + top: doc.scrollingElement ? doc.scrollingElement.scrollTop : win.pageYOffset !== void 0 ? win.pageYOffset : (doc == null ? void 0 : doc.documentElement.scrollTop) || (doc == null ? void 0 : doc.body) && ((_c = index.parentElement(doc.body)) == null ? void 0 : _c.scrollTop) || ((_d = doc == null ? void 0 : doc.body) == null ? void 0 : _d.scrollTop) || 0 + }; +} +function getWindowHeight() { + return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body && document.body.clientHeight; +} +function getWindowWidth() { + return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body && document.body.clientWidth; +} +function closestElementOfNode(node2) { + if (!node2) { + return null; + } + const el = node2.nodeType === node2.ELEMENT_NODE ? node2 : index.parentElement(node2); + return el; +} +function isBlocked(node2, blockClass, blockSelector, checkAncestors) { + if (!node2) { + return false; + } + const el = closestElementOfNode(node2); + if (!el) { + return false; + } + try { + if (typeof blockClass === "string") { + if (el.classList.contains(blockClass)) return true; + if (checkAncestors && el.closest("." + blockClass) !== null) return true; + } else { + if (classMatchesRegex(el, blockClass, checkAncestors)) return true; + } + } catch (e2) { + } + if (blockSelector) { + if (el.matches(blockSelector)) return true; + if (checkAncestors && el.closest(blockSelector) !== null) return true; + } + return false; +} +function isSerialized(n2, mirror2) { + return mirror2.getId(n2) !== -1; +} +function isIgnored(n2, mirror2, slimDOMOptions) { + if (n2.tagName === "TITLE" && slimDOMOptions.headTitleMutations) { + return true; + } + return mirror2.getId(n2) === IGNORED_NODE; +} +function isAncestorRemoved(target, mirror2) { + if (isShadowRoot(target)) { + return false; + } + const id = mirror2.getId(target); + if (!mirror2.has(id)) { + return true; + } + const parent = index.parentNode(target); + if (parent && parent.nodeType === target.DOCUMENT_NODE) { + return false; + } + if (!parent) { + return true; + } + return isAncestorRemoved(parent, mirror2); +} +function legacy_isTouchEvent(event) { + return Boolean(event.changedTouches); +} +function polyfill$1(win = window) { + if ("NodeList" in win && !win.NodeList.prototype.forEach) { + win.NodeList.prototype.forEach = Array.prototype.forEach; + } + if ("DOMTokenList" in win && !win.DOMTokenList.prototype.forEach) { + win.DOMTokenList.prototype.forEach = Array.prototype.forEach; + } +} +function isSerializedIframe(n2, mirror2) { + return Boolean(n2.nodeName === "IFRAME" && mirror2.getMeta(n2)); +} +function isSerializedStylesheet(n2, mirror2) { + return Boolean( + n2.nodeName === "LINK" && n2.nodeType === n2.ELEMENT_NODE && n2.getAttribute && n2.getAttribute("rel") === "stylesheet" && mirror2.getMeta(n2) + ); +} +function hasShadowRoot(n2) { + if (!n2) return false; + if (n2 instanceof BaseRRNode && "shadowRoot" in n2) { + return Boolean(n2.shadowRoot); + } + return Boolean(index.shadowRoot(n2)); +} +class StyleSheetMirror { + constructor() { + __publicField(this, "id", 1); + __publicField(this, "styleIDMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "idStyleMap", /* @__PURE__ */ new Map()); + } + getId(stylesheet) { + var _a2; + return (_a2 = this.styleIDMap.get(stylesheet)) != null ? _a2 : -1; + } + has(stylesheet) { + return this.styleIDMap.has(stylesheet); + } + /** + * @returns If the stylesheet is in the mirror, returns the id of the stylesheet. If not, return the new assigned id. + */ + add(stylesheet, id) { + if (this.has(stylesheet)) return this.getId(stylesheet); + let newId; + if (id === void 0) { + newId = this.id++; + } else newId = id; + this.styleIDMap.set(stylesheet, newId); + this.idStyleMap.set(newId, stylesheet); + return newId; + } + getStyle(id) { + return this.idStyleMap.get(id) || null; + } + reset() { + this.styleIDMap = /* @__PURE__ */ new WeakMap(); + this.idStyleMap = /* @__PURE__ */ new Map(); + this.id = 1; + } + generateId() { + return this.id++; + } +} +function getShadowHost(n2) { + var _a2; + let shadowHost = null; + if ("getRootNode" in n2 && ((_a2 = index.getRootNode(n2)) == null ? void 0 : _a2.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && index.host(index.getRootNode(n2))) + shadowHost = index.host(index.getRootNode(n2)); + return shadowHost; +} +function getRootShadowHost(n2) { + let rootShadowHost = n2; + let shadowHost; + while (shadowHost = getShadowHost(rootShadowHost)) + rootShadowHost = shadowHost; + return rootShadowHost; +} +function shadowHostInDom(n2) { + const doc = index.ownerDocument(n2); + if (!doc) return false; + const shadowHost = getRootShadowHost(n2); + return index.contains(doc, shadowHost); +} +function inDom(n2) { + const doc = index.ownerDocument(n2); + if (!doc) return false; + return index.contains(doc, n2) || shadowHostInDom(n2); +} +var EventType = /* @__PURE__ */ ((EventType2) => { + EventType2[EventType2["DomContentLoaded"] = 0] = "DomContentLoaded"; + EventType2[EventType2["Load"] = 1] = "Load"; + EventType2[EventType2["FullSnapshot"] = 2] = "FullSnapshot"; + EventType2[EventType2["IncrementalSnapshot"] = 3] = "IncrementalSnapshot"; + EventType2[EventType2["Meta"] = 4] = "Meta"; + EventType2[EventType2["Custom"] = 5] = "Custom"; + EventType2[EventType2["Plugin"] = 6] = "Plugin"; + return EventType2; +})(EventType || {}); +var IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => { + IncrementalSource2[IncrementalSource2["Mutation"] = 0] = "Mutation"; + IncrementalSource2[IncrementalSource2["MouseMove"] = 1] = "MouseMove"; + IncrementalSource2[IncrementalSource2["MouseInteraction"] = 2] = "MouseInteraction"; + IncrementalSource2[IncrementalSource2["Scroll"] = 3] = "Scroll"; + IncrementalSource2[IncrementalSource2["ViewportResize"] = 4] = "ViewportResize"; + IncrementalSource2[IncrementalSource2["Input"] = 5] = "Input"; + IncrementalSource2[IncrementalSource2["TouchMove"] = 6] = "TouchMove"; + IncrementalSource2[IncrementalSource2["MediaInteraction"] = 7] = "MediaInteraction"; + IncrementalSource2[IncrementalSource2["StyleSheetRule"] = 8] = "StyleSheetRule"; + IncrementalSource2[IncrementalSource2["CanvasMutation"] = 9] = "CanvasMutation"; + IncrementalSource2[IncrementalSource2["Font"] = 10] = "Font"; + IncrementalSource2[IncrementalSource2["Log"] = 11] = "Log"; + IncrementalSource2[IncrementalSource2["Drag"] = 12] = "Drag"; + IncrementalSource2[IncrementalSource2["StyleDeclaration"] = 13] = "StyleDeclaration"; + IncrementalSource2[IncrementalSource2["Selection"] = 14] = "Selection"; + IncrementalSource2[IncrementalSource2["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet"; + IncrementalSource2[IncrementalSource2["CustomElement"] = 16] = "CustomElement"; + return IncrementalSource2; +})(IncrementalSource || {}); +var MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => { + MouseInteractions2[MouseInteractions2["MouseUp"] = 0] = "MouseUp"; + MouseInteractions2[MouseInteractions2["MouseDown"] = 1] = "MouseDown"; + MouseInteractions2[MouseInteractions2["Click"] = 2] = "Click"; + MouseInteractions2[MouseInteractions2["ContextMenu"] = 3] = "ContextMenu"; + MouseInteractions2[MouseInteractions2["DblClick"] = 4] = "DblClick"; + MouseInteractions2[MouseInteractions2["Focus"] = 5] = "Focus"; + MouseInteractions2[MouseInteractions2["Blur"] = 6] = "Blur"; + MouseInteractions2[MouseInteractions2["TouchStart"] = 7] = "TouchStart"; + MouseInteractions2[MouseInteractions2["TouchMove_Departed"] = 8] = "TouchMove_Departed"; + MouseInteractions2[MouseInteractions2["TouchEnd"] = 9] = "TouchEnd"; + MouseInteractions2[MouseInteractions2["TouchCancel"] = 10] = "TouchCancel"; + return MouseInteractions2; +})(MouseInteractions || {}); +var PointerTypes = /* @__PURE__ */ ((PointerTypes2) => { + PointerTypes2[PointerTypes2["Mouse"] = 0] = "Mouse"; + PointerTypes2[PointerTypes2["Pen"] = 1] = "Pen"; + PointerTypes2[PointerTypes2["Touch"] = 2] = "Touch"; + return PointerTypes2; +})(PointerTypes || {}); +var CanvasContext = /* @__PURE__ */ ((CanvasContext2) => { + CanvasContext2[CanvasContext2["2D"] = 0] = "2D"; + CanvasContext2[CanvasContext2["WebGL"] = 1] = "WebGL"; + CanvasContext2[CanvasContext2["WebGL2"] = 2] = "WebGL2"; + return CanvasContext2; +})(CanvasContext || {}); +var MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => { + MediaInteractions2[MediaInteractions2["Play"] = 0] = "Play"; + MediaInteractions2[MediaInteractions2["Pause"] = 1] = "Pause"; + MediaInteractions2[MediaInteractions2["Seeked"] = 2] = "Seeked"; + MediaInteractions2[MediaInteractions2["VolumeChange"] = 3] = "VolumeChange"; + MediaInteractions2[MediaInteractions2["RateChange"] = 4] = "RateChange"; + return MediaInteractions2; +})(MediaInteractions || {}); +var NodeType = /* @__PURE__ */ ((NodeType2) => { + NodeType2[NodeType2["Document"] = 0] = "Document"; + NodeType2[NodeType2["DocumentType"] = 1] = "DocumentType"; + NodeType2[NodeType2["Element"] = 2] = "Element"; + NodeType2[NodeType2["Text"] = 3] = "Text"; + NodeType2[NodeType2["CDATA"] = 4] = "CDATA"; + NodeType2[NodeType2["Comment"] = 5] = "Comment"; + return NodeType2; +})(NodeType || {}); +function isNodeInLinkedList(n2) { + return "__ln" in n2; +} +class DoubleLinkedList { + constructor() { + __publicField(this, "length", 0); + __publicField(this, "head", null); + __publicField(this, "tail", null); + } + get(position) { + if (position >= this.length) { + throw new Error("Position outside of list range"); + } + let current = this.head; + for (let index2 = 0; index2 < position; index2++) { + current = (current == null ? void 0 : current.next) || null; + } + return current; + } + addNode(n2) { + const node2 = { + value: n2, + previous: null, + next: null + }; + n2.__ln = node2; + if (n2.previousSibling && isNodeInLinkedList(n2.previousSibling)) { + const current = n2.previousSibling.__ln.next; + node2.next = current; + node2.previous = n2.previousSibling.__ln; + n2.previousSibling.__ln.next = node2; + if (current) { + current.previous = node2; + } + } else if (n2.nextSibling && isNodeInLinkedList(n2.nextSibling) && n2.nextSibling.__ln.previous) { + const current = n2.nextSibling.__ln.previous; + node2.previous = current; + node2.next = n2.nextSibling.__ln; + n2.nextSibling.__ln.previous = node2; + if (current) { + current.next = node2; + } + } else { + if (this.head) { + this.head.previous = node2; + } + node2.next = this.head; + this.head = node2; + } + if (node2.next === null) { + this.tail = node2; + } + this.length++; + } + removeNode(n2) { + const current = n2.__ln; + if (!this.head) { + return; + } + if (!current.previous) { + this.head = current.next; + if (this.head) { + this.head.previous = null; + } else { + this.tail = null; + } + } else { + current.previous.next = current.next; + if (current.next) { + current.next.previous = current.previous; + } else { + this.tail = current.previous; + } + } + if (n2.__ln) { + delete n2.__ln; + } + this.length--; + } +} +const moveKey = (id, parentId) => `${id}@${parentId}`; +class MutationBuffer { + constructor() { + __publicField(this, "frozen", false); + __publicField(this, "locked", false); + __publicField(this, "texts", []); + __publicField(this, "attributes", []); + __publicField(this, "attributeMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "removes", []); + __publicField(this, "mapRemoves", []); + __publicField(this, "movedMap", {}); + __publicField(this, "addedSet", /* @__PURE__ */ new Set()); + __publicField(this, "movedSet", /* @__PURE__ */ new Set()); + __publicField(this, "droppedSet", /* @__PURE__ */ new Set()); + __publicField(this, "removesSubTreeCache", /* @__PURE__ */ new Set()); + __publicField(this, "mutationCb"); + __publicField(this, "blockClass"); + __publicField(this, "blockSelector"); + __publicField(this, "maskTextClass"); + __publicField(this, "maskTextSelector"); + __publicField(this, "inlineStylesheet"); + __publicField(this, "maskInputOptions"); + __publicField(this, "maskTextFn"); + __publicField(this, "maskInputFn"); + __publicField(this, "keepIframeSrcFn"); + __publicField(this, "recordCanvas"); + __publicField(this, "inlineImages"); + __publicField(this, "slimDOMOptions"); + __publicField(this, "dataURLOptions"); + __publicField(this, "doc"); + __publicField(this, "mirror"); + __publicField(this, "iframeManager"); + __publicField(this, "stylesheetManager"); + __publicField(this, "shadowDomManager"); + __publicField(this, "canvasManager"); + __publicField(this, "processedNodeManager"); + __publicField(this, "unattachedDoc"); + __publicField(this, "processMutations", (mutations) => { + mutations.forEach(this.processMutation); + this.emit(); + }); + __publicField(this, "emit", () => { + if (this.frozen || this.locked) { + return; + } + const adds = []; + const addedIds = /* @__PURE__ */ new Set(); + const addList = new DoubleLinkedList(); + const getNextId = (n2) => { + let ns = n2; + let nextId = IGNORED_NODE; + while (nextId === IGNORED_NODE) { + ns = ns && ns.nextSibling; + nextId = ns && this.mirror.getId(ns); + } + return nextId; + }; + const pushAdd = (n2) => { + const parent = index.parentNode(n2); + if (!parent || !inDom(n2)) { + return; + } + let cssCaptured = false; + if (n2.nodeType === Node.TEXT_NODE) { + const parentTag = parent.tagName; + if (parentTag === "TEXTAREA") { + return; + } else if (parentTag === "STYLE" && this.addedSet.has(parent)) { + cssCaptured = true; + } + } + const parentId = isShadowRoot(parent) ? this.mirror.getId(getShadowHost(n2)) : this.mirror.getId(parent); + const nextId = getNextId(n2); + if (parentId === -1 || nextId === -1) { + return addList.addNode(n2); + } + const sn = serializeNodeWithId(n2, { + doc: this.doc, + mirror: this.mirror, + blockClass: this.blockClass, + blockSelector: this.blockSelector, + maskTextClass: this.maskTextClass, + maskTextSelector: this.maskTextSelector, + skipChild: true, + newlyAddedElement: true, + inlineStylesheet: this.inlineStylesheet, + maskInputOptions: this.maskInputOptions, + maskTextFn: this.maskTextFn, + maskInputFn: this.maskInputFn, + slimDOMOptions: this.slimDOMOptions, + dataURLOptions: this.dataURLOptions, + recordCanvas: this.recordCanvas, + inlineImages: this.inlineImages, + onSerialize: (currentN) => { + if (isSerializedIframe(currentN, this.mirror)) { + this.iframeManager.addIframe(currentN); + } + if (isSerializedStylesheet(currentN, this.mirror)) { + this.stylesheetManager.trackLinkElement( + currentN + ); + } + if (hasShadowRoot(n2)) { + this.shadowDomManager.addShadowRoot(index.shadowRoot(n2), this.doc); + } + }, + onIframeLoad: (iframe, childSn) => { + this.iframeManager.attachIframe(iframe, childSn); + this.shadowDomManager.observeAttachShadow(iframe); + }, + onStylesheetLoad: (link, childSn) => { + this.stylesheetManager.attachLinkElement(link, childSn); + }, + cssCaptured + }); + if (sn) { + adds.push({ + parentId, + nextId, + node: sn + }); + addedIds.add(sn.id); + } + }; + while (this.mapRemoves.length) { + this.mirror.removeNodeFromMap(this.mapRemoves.shift()); + } + for (const n2 of this.movedSet) { + if (isParentRemoved(this.removesSubTreeCache, n2, this.mirror) && !this.movedSet.has(index.parentNode(n2))) { + continue; + } + pushAdd(n2); + } + for (const n2 of this.addedSet) { + if (!isAncestorInSet(this.droppedSet, n2) && !isParentRemoved(this.removesSubTreeCache, n2, this.mirror)) { + pushAdd(n2); + } else if (isAncestorInSet(this.movedSet, n2)) { + pushAdd(n2); + } else { + this.droppedSet.add(n2); + } + } + let candidate = null; + while (addList.length) { + let node2 = null; + if (candidate) { + const parentId = this.mirror.getId(index.parentNode(candidate.value)); + const nextId = getNextId(candidate.value); + if (parentId !== -1 && nextId !== -1) { + node2 = candidate; + } + } + if (!node2) { + let tailNode = addList.tail; + while (tailNode) { + const _node = tailNode; + tailNode = tailNode.previous; + if (_node) { + const parentId = this.mirror.getId(index.parentNode(_node.value)); + const nextId = getNextId(_node.value); + if (nextId === -1) continue; + else if (parentId !== -1) { + node2 = _node; + break; + } else { + const unhandledNode = _node.value; + const parent = index.parentNode(unhandledNode); + if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + const shadowHost = index.host(parent); + const parentId2 = this.mirror.getId(shadowHost); + if (parentId2 !== -1) { + node2 = _node; + break; + } + } + } + } + } + } + if (!node2) { + while (addList.head) { + addList.removeNode(addList.head.value); + } + break; + } + candidate = node2.previous; + addList.removeNode(node2.value); + pushAdd(node2.value); + } + const payload = { + texts: this.texts.map((text) => { + const n2 = text.node; + const parent = index.parentNode(n2); + if (parent && parent.tagName === "TEXTAREA") { + this.genTextAreaValueMutation(parent); + } + return { + id: this.mirror.getId(n2), + value: text.value + }; + }).filter((text) => !addedIds.has(text.id)).filter((text) => this.mirror.has(text.id)), + attributes: this.attributes.map((attribute) => { + const { attributes } = attribute; + if (typeof attributes.style === "string") { + const diffAsStr = JSON.stringify(attribute.styleDiff); + const unchangedAsStr = JSON.stringify(attribute._unchangedStyles); + if (diffAsStr.length < attributes.style.length) { + if ((diffAsStr + unchangedAsStr).split("var(").length === attributes.style.split("var(").length) { + attributes.style = attribute.styleDiff; + } + } + } + return { + id: this.mirror.getId(attribute.node), + attributes + }; + }).filter((attribute) => !addedIds.has(attribute.id)).filter((attribute) => this.mirror.has(attribute.id)), + removes: this.removes, + adds + }; + if (!payload.texts.length && !payload.attributes.length && !payload.removes.length && !payload.adds.length) { + return; + } + this.texts = []; + this.attributes = []; + this.attributeMap = /* @__PURE__ */ new WeakMap(); + this.removes = []; + this.addedSet = /* @__PURE__ */ new Set(); + this.movedSet = /* @__PURE__ */ new Set(); + this.droppedSet = /* @__PURE__ */ new Set(); + this.removesSubTreeCache = /* @__PURE__ */ new Set(); + this.movedMap = {}; + this.mutationCb(payload); + }); + __publicField(this, "genTextAreaValueMutation", (textarea) => { + let item = this.attributeMap.get(textarea); + if (!item) { + item = { + node: textarea, + attributes: {}, + styleDiff: {}, + _unchangedStyles: {} + }; + this.attributes.push(item); + this.attributeMap.set(textarea, item); + } + const value = Array.from( + index.childNodes(textarea), + (cn) => index.textContent(cn) || "" + ).join(""); + item.attributes.value = maskInputValue({ + element: textarea, + maskInputOptions: this.maskInputOptions, + tagName: textarea.tagName, + type: getInputType(textarea), + value, + maskInputFn: this.maskInputFn + }); + }); + __publicField(this, "processMutation", (m) => { + if (isIgnored(m.target, this.mirror, this.slimDOMOptions)) { + return; + } + switch (m.type) { + case "characterData": { + const value = index.textContent(m.target); + if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) && value !== m.oldValue) { + this.texts.push({ + value: needMaskingText( + m.target, + this.maskTextClass, + this.maskTextSelector, + true + // checkAncestors + ) && value ? this.maskTextFn ? this.maskTextFn(value, closestElementOfNode(m.target)) : value.replace(/[\S]/g, "*") : value, + node: m.target + }); + } + break; + } + case "attributes": { + const target = m.target; + let attributeName = m.attributeName; + let value = m.target.getAttribute(attributeName); + if (attributeName === "value") { + const type = getInputType(target); + value = maskInputValue({ + element: target, + maskInputOptions: this.maskInputOptions, + tagName: target.tagName, + type, + value, + maskInputFn: this.maskInputFn + }); + } + if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || value === m.oldValue) { + return; + } + let item = this.attributeMap.get(m.target); + if (target.tagName === "IFRAME" && attributeName === "src" && !this.keepIframeSrcFn(value)) { + if (!target.contentDocument) { + attributeName = "rr_src"; + } else { + return; + } + } + if (!item) { + item = { + node: m.target, + attributes: {}, + styleDiff: {}, + _unchangedStyles: {} + }; + this.attributes.push(item); + this.attributeMap.set(m.target, item); + } + if (attributeName === "type" && target.tagName === "INPUT" && (m.oldValue || "").toLowerCase() === "password") { + target.setAttribute("data-rr-is-password", "true"); + } + if (!ignoreAttribute(target.tagName, attributeName)) { + item.attributes[attributeName] = transformAttribute( + this.doc, + toLowerCase(target.tagName), + toLowerCase(attributeName), + value + ); + if (attributeName === "style") { + if (!this.unattachedDoc) { + try { + this.unattachedDoc = document.implementation.createHTMLDocument(); + } catch (e2) { + this.unattachedDoc = this.doc; + } + } + const old = this.unattachedDoc.createElement("span"); + if (m.oldValue) { + old.setAttribute("style", m.oldValue); + } + for (const pname of Array.from(target.style)) { + const newValue = target.style.getPropertyValue(pname); + const newPriority = target.style.getPropertyPriority(pname); + if (newValue !== old.style.getPropertyValue(pname) || newPriority !== old.style.getPropertyPriority(pname)) { + if (newPriority === "") { + item.styleDiff[pname] = newValue; + } else { + item.styleDiff[pname] = [newValue, newPriority]; + } + } else { + item._unchangedStyles[pname] = [newValue, newPriority]; + } + } + for (const pname of Array.from(old.style)) { + if (target.style.getPropertyValue(pname) === "") { + item.styleDiff[pname] = false; + } + } + } else if (attributeName === "open" && target.tagName === "DIALOG") { + if (target.matches("dialog:modal")) { + item.attributes["rr_open_mode"] = "modal"; + } else { + item.attributes["rr_open_mode"] = "non-modal"; + } + } + } + break; + } + case "childList": { + if (isBlocked(m.target, this.blockClass, this.blockSelector, true)) + return; + if (m.target.tagName === "TEXTAREA") { + this.genTextAreaValueMutation(m.target); + return; + } + m.addedNodes.forEach((n2) => this.genAdds(n2, m.target)); + m.removedNodes.forEach((n2) => { + const nodeId = this.mirror.getId(n2); + const parentId = isShadowRoot(m.target) ? this.mirror.getId(index.host(m.target)) : this.mirror.getId(m.target); + if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || isIgnored(n2, this.mirror, this.slimDOMOptions) || !isSerialized(n2, this.mirror)) { + return; + } + if (this.addedSet.has(n2)) { + deepDelete(this.addedSet, n2); + this.droppedSet.add(n2); + } else if (this.addedSet.has(m.target) && nodeId === -1) ; + else if (isAncestorRemoved(m.target, this.mirror)) ; + else if (this.movedSet.has(n2) && this.movedMap[moveKey(nodeId, parentId)]) { + deepDelete(this.movedSet, n2); + } else { + this.removes.push({ + parentId, + id: nodeId, + isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target) ? true : void 0 + }); + processRemoves(n2, this.removesSubTreeCache); + } + this.mapRemoves.push(n2); + }); + break; + } + } + }); + __publicField(this, "genAdds", (n2, target) => { + if (this.processedNodeManager.inOtherBuffer(n2, this)) return; + if (this.addedSet.has(n2) || this.movedSet.has(n2)) return; + if (this.mirror.hasNode(n2)) { + if (isIgnored(n2, this.mirror, this.slimDOMOptions)) { + return; + } + this.movedSet.add(n2); + let targetId = null; + if (target && this.mirror.hasNode(target)) { + targetId = this.mirror.getId(target); + } + if (targetId && targetId !== -1) { + this.movedMap[moveKey(this.mirror.getId(n2), targetId)] = true; + } + } else { + this.addedSet.add(n2); + this.droppedSet.delete(n2); + } + if (!isBlocked(n2, this.blockClass, this.blockSelector, false)) { + index.childNodes(n2).forEach((childN) => this.genAdds(childN)); + if (hasShadowRoot(n2)) { + index.childNodes(index.shadowRoot(n2)).forEach((childN) => { + this.processedNodeManager.add(childN, this); + this.genAdds(childN, n2); + }); + } + } + }); + } + init(options) { + [ + "mutationCb", + "blockClass", + "blockSelector", + "maskTextClass", + "maskTextSelector", + "inlineStylesheet", + "maskInputOptions", + "maskTextFn", + "maskInputFn", + "keepIframeSrcFn", + "recordCanvas", + "inlineImages", + "slimDOMOptions", + "dataURLOptions", + "doc", + "mirror", + "iframeManager", + "stylesheetManager", + "shadowDomManager", + "canvasManager", + "processedNodeManager" + ].forEach((key) => { + this[key] = options[key]; + }); + } + freeze() { + this.frozen = true; + this.canvasManager.freeze(); + } + unfreeze() { + this.frozen = false; + this.canvasManager.unfreeze(); + this.emit(); + } + isFrozen() { + return this.frozen; + } + lock() { + this.locked = true; + this.canvasManager.lock(); + } + unlock() { + this.locked = false; + this.canvasManager.unlock(); + this.emit(); + } + reset() { + this.shadowDomManager.reset(); + this.canvasManager.reset(); + } +} +function deepDelete(addsSet, n2) { + addsSet.delete(n2); + index.childNodes(n2).forEach((childN) => deepDelete(addsSet, childN)); +} +function processRemoves(n2, cache) { + const queue = [n2]; + while (queue.length) { + const next = queue.pop(); + if (cache.has(next)) continue; + cache.add(next); + index.childNodes(next).forEach((n22) => queue.push(n22)); + } + return; +} +function isParentRemoved(removes, n2, mirror2) { + if (removes.size === 0) return false; + return _isParentRemoved(removes, n2); +} +function _isParentRemoved(removes, n2, _mirror2) { + const node2 = index.parentNode(n2); + if (!node2) return false; + return removes.has(node2); +} +function isAncestorInSet(set, n2) { + if (set.size === 0) return false; + return _isAncestorInSet(set, n2); +} +function _isAncestorInSet(set, n2) { + const parent = index.parentNode(n2); + if (!parent) { + return false; + } + if (set.has(parent)) { + return true; + } + return _isAncestorInSet(set, parent); +} +let errorHandler; +function registerErrorHandler(handler) { + errorHandler = handler; +} +function unregisterErrorHandler() { + errorHandler = void 0; +} +const callbackWrapper = (cb) => { + if (!errorHandler) { + return cb; + } + const rrwebWrapped = (...rest) => { + try { + return cb(...rest); + } catch (error) { + if (errorHandler && errorHandler(error) === true) { + return; + } + throw error; + } + }; + return rrwebWrapped; +}; +const mutationBuffers = []; +function getEventTarget(event) { + try { + if ("composedPath" in event) { + const path = event.composedPath(); + if (path.length) { + return path[0]; + } + } else if ("path" in event && event.path.length) { + return event.path[0]; + } + } catch (e) { + } + return event && event.target; +} +function initMutationObserver(options, rootEl) { + const mutationBuffer = new MutationBuffer(); + mutationBuffers.push(mutationBuffer); + mutationBuffer.init(options); + const observer = new (mutationObserverCtor())( + callbackWrapper(mutationBuffer.processMutations.bind(mutationBuffer)) + ); + observer.observe(rootEl, { + attributes: true, + attributeOldValue: true, + characterData: true, + characterDataOldValue: true, + childList: true, + subtree: true + }); + return observer; +} +function initMoveObserver({ + mousemoveCb, + sampling, + doc, + mirror: mirror2 +}) { + if (sampling.mousemove === false) { + return () => { + }; + } + const threshold = typeof sampling.mousemove === "number" ? sampling.mousemove : 50; + const callbackThreshold = typeof sampling.mousemoveCallback === "number" ? sampling.mousemoveCallback : 500; + let positions = []; + let timeBaseline; + const wrappedCb = throttle( + callbackWrapper( + (source) => { + const totalOffset = Date.now() - timeBaseline; + mousemoveCb( + positions.map((p) => { + p.timeOffset -= totalOffset; + return p; + }), + source + ); + positions = []; + timeBaseline = null; + } + ), + callbackThreshold + ); + const updatePosition = callbackWrapper( + throttle( + callbackWrapper((evt) => { + const target = getEventTarget(evt); + const { clientX, clientY } = legacy_isTouchEvent(evt) ? evt.changedTouches[0] : evt; + if (!timeBaseline) { + timeBaseline = nowTimestamp(); + } + positions.push({ + x: clientX, + y: clientY, + id: mirror2.getId(target), + timeOffset: nowTimestamp() - timeBaseline + }); + wrappedCb( + typeof DragEvent !== "undefined" && evt instanceof DragEvent ? IncrementalSource.Drag : evt instanceof MouseEvent ? IncrementalSource.MouseMove : IncrementalSource.TouchMove + ); + }), + threshold, + { + trailing: false + } + ) + ); + const handlers = [ + on("mousemove", updatePosition, doc), + on("touchmove", updatePosition, doc), + on("drag", updatePosition, doc) + ]; + return callbackWrapper(() => { + handlers.forEach((h) => h()); + }); +} +function initMouseInteractionObserver({ + mouseInteractionCb, + doc, + mirror: mirror2, + blockClass, + blockSelector, + sampling +}) { + if (sampling.mouseInteraction === false) { + return () => { + }; + } + const disableMap = sampling.mouseInteraction === true || sampling.mouseInteraction === void 0 ? {} : sampling.mouseInteraction; + const handlers = []; + let currentPointerType = null; + const getHandler = (eventKey) => { + return (event) => { + const target = getEventTarget(event); + if (isBlocked(target, blockClass, blockSelector, true)) { + return; + } + let pointerType = null; + let thisEventKey = eventKey; + if ("pointerType" in event) { + switch (event.pointerType) { + case "mouse": + pointerType = PointerTypes.Mouse; + break; + case "touch": + pointerType = PointerTypes.Touch; + break; + case "pen": + pointerType = PointerTypes.Pen; + break; + } + if (pointerType === PointerTypes.Touch) { + if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) { + thisEventKey = "TouchStart"; + } else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) { + thisEventKey = "TouchEnd"; + } + } else if (pointerType === PointerTypes.Pen) ; + } else if (legacy_isTouchEvent(event)) { + pointerType = PointerTypes.Touch; + } + if (pointerType !== null) { + currentPointerType = pointerType; + if (thisEventKey.startsWith("Touch") && pointerType === PointerTypes.Touch || thisEventKey.startsWith("Mouse") && pointerType === PointerTypes.Mouse) { + pointerType = null; + } + } else if (MouseInteractions[eventKey] === MouseInteractions.Click) { + pointerType = currentPointerType; + currentPointerType = null; + } + const e2 = legacy_isTouchEvent(event) ? event.changedTouches[0] : event; + if (!e2) { + return; + } + const id = mirror2.getId(target); + const { clientX, clientY } = e2; + callbackWrapper(mouseInteractionCb)(__spreadValues({ + type: MouseInteractions[thisEventKey], + id, + x: clientX, + y: clientY + }, pointerType !== null && { pointerType })); + }; + }; + Object.keys(MouseInteractions).filter( + (key) => Number.isNaN(Number(key)) && !key.endsWith("_Departed") && disableMap[key] !== false + ).forEach((eventKey) => { + let eventName = toLowerCase(eventKey); + const handler = getHandler(eventKey); + if (window.PointerEvent) { + switch (MouseInteractions[eventKey]) { + case MouseInteractions.MouseDown: + case MouseInteractions.MouseUp: + eventName = eventName.replace( + "mouse", + "pointer" + ); + break; + case MouseInteractions.TouchStart: + case MouseInteractions.TouchEnd: + return; + } + } + handlers.push(on(eventName, handler, doc)); + }); + return callbackWrapper(() => { + handlers.forEach((h) => h()); + }); +} +function initScrollObserver({ + scrollCb, + doc, + mirror: mirror2, + blockClass, + blockSelector, + sampling +}) { + const updatePosition = callbackWrapper( + throttle( + callbackWrapper((evt) => { + const target = getEventTarget(evt); + if (!target || isBlocked(target, blockClass, blockSelector, true)) { + return; + } + const id = mirror2.getId(target); + if (target === doc && doc.defaultView) { + const scrollLeftTop = getWindowScroll(doc.defaultView); + scrollCb({ + id, + x: scrollLeftTop.left, + y: scrollLeftTop.top + }); + } else { + scrollCb({ + id, + x: target.scrollLeft, + y: target.scrollTop + }); + } + }), + sampling.scroll || 100 + ) + ); + return on("scroll", updatePosition, doc); +} +function initViewportResizeObserver({ viewportResizeCb }, { win }) { + let lastH = -1; + let lastW = -1; + const updateDimension = callbackWrapper( + throttle( + callbackWrapper(() => { + const height = getWindowHeight(); + const width = getWindowWidth(); + if (lastH !== height || lastW !== width) { + viewportResizeCb({ + width: Number(width), + height: Number(height) + }); + lastH = height; + lastW = width; + } + }), + 200 + ) + ); + return on("resize", updateDimension, win); +} +const INPUT_TAGS = ["INPUT", "TEXTAREA", "SELECT"]; +const lastInputValueMap = /* @__PURE__ */ new WeakMap(); +function initInputObserver({ + inputCb, + doc, + mirror: mirror2, + blockClass, + blockSelector, + ignoreClass, + ignoreSelector, + maskInputOptions, + maskInputFn, + sampling, + userTriggeredOnInput +}) { + function eventHandler(event) { + let target = getEventTarget(event); + const userTriggered = event.isTrusted; + const tagName = target && target.tagName; + if (target && tagName === "OPTION") { + target = index.parentElement(target); + } + if (!target || !tagName || INPUT_TAGS.indexOf(tagName) < 0 || isBlocked(target, blockClass, blockSelector, true)) { + return; + } + if (target.classList.contains(ignoreClass) || ignoreSelector && target.matches(ignoreSelector)) { + return; + } + let text = target.value; + let isChecked = false; + const type = getInputType(target) || ""; + if (type === "radio" || type === "checkbox") { + isChecked = target.checked; + } else if (maskInputOptions[tagName.toLowerCase()] || maskInputOptions[type]) { + text = maskInputValue({ + element: target, + maskInputOptions, + tagName, + type, + value: text, + maskInputFn + }); + } + cbWithDedup( + target, + userTriggeredOnInput ? { text, isChecked, userTriggered } : { text, isChecked } + ); + const name = target.name; + if (type === "radio" && name && isChecked) { + doc.querySelectorAll(`input[type="radio"][name="${name}"]`).forEach((el) => { + if (el !== target) { + const text2 = el.value; + cbWithDedup( + el, + userTriggeredOnInput ? { text: text2, isChecked: !isChecked, userTriggered: false } : { text: text2, isChecked: !isChecked } + ); + } + }); + } + } + function cbWithDedup(target, v2) { + const lastInputValue = lastInputValueMap.get(target); + if (!lastInputValue || lastInputValue.text !== v2.text || lastInputValue.isChecked !== v2.isChecked) { + lastInputValueMap.set(target, v2); + const id = mirror2.getId(target); + callbackWrapper(inputCb)(__spreadProps(__spreadValues({}, v2), { + id + })); + } + } + const events = sampling.input === "last" ? ["change"] : ["input", "change"]; + const handlers = events.map( + (eventName) => on(eventName, callbackWrapper(eventHandler), doc) + ); + const currentWindow = doc.defaultView; + if (!currentWindow) { + return () => { + handlers.forEach((h) => h()); + }; + } + const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor( + currentWindow.HTMLInputElement.prototype, + "value" + ); + const hookProperties = [ + [currentWindow.HTMLInputElement.prototype, "value"], + [currentWindow.HTMLInputElement.prototype, "checked"], + [currentWindow.HTMLSelectElement.prototype, "value"], + [currentWindow.HTMLTextAreaElement.prototype, "value"], + // Some UI library use selectedIndex to set select value + [currentWindow.HTMLSelectElement.prototype, "selectedIndex"], + [currentWindow.HTMLOptionElement.prototype, "selected"] + ]; + if (propertyDescriptor && propertyDescriptor.set) { + handlers.push( + ...hookProperties.map( + (p) => hookSetter( + p[0], + p[1], + { + set() { + callbackWrapper(eventHandler)({ + target: this, + isTrusted: false + // userTriggered to false as this could well be programmatic + }); + } + }, + false, + currentWindow + ) + ) + ); + } + return callbackWrapper(() => { + handlers.forEach((h) => h()); + }); +} +function getNestedCSSRulePositions(rule2) { + const positions = []; + function recurse(childRule, pos) { + if (hasNestedCSSRule("CSSGroupingRule") && childRule.parentRule instanceof CSSGroupingRule || hasNestedCSSRule("CSSMediaRule") && childRule.parentRule instanceof CSSMediaRule || hasNestedCSSRule("CSSSupportsRule") && childRule.parentRule instanceof CSSSupportsRule || hasNestedCSSRule("CSSConditionRule") && childRule.parentRule instanceof CSSConditionRule) { + const rules2 = Array.from( + childRule.parentRule.cssRules + ); + const index2 = rules2.indexOf(childRule); + pos.unshift(index2); + return recurse(childRule.parentRule, pos); + } else if (childRule.parentStyleSheet) { + const rules2 = Array.from(childRule.parentStyleSheet.cssRules); + const index2 = rules2.indexOf(childRule); + pos.unshift(index2); + } + return pos; + } + return recurse(rule2, positions); +} +function getIdAndStyleId(sheet, mirror2, styleMirror) { + let id, styleId; + if (!sheet) return {}; + if (sheet.ownerNode) id = mirror2.getId(sheet.ownerNode); + else styleId = styleMirror.getId(sheet); + return { + styleId, + id + }; +} +function initStyleSheetObserver({ styleSheetRuleCb, mirror: mirror2, stylesheetManager }, { win }) { + if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) { + return () => { + }; + } + const insertRule = win.CSSStyleSheet.prototype.insertRule; + win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [rule2, index2] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + adds: [{ rule: rule2, index: index2 }] + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + win.CSSStyleSheet.prototype.addRule = function(selector, styleBlock, index2 = this.cssRules.length) { + const rule2 = `${selector} { ${styleBlock} }`; + return win.CSSStyleSheet.prototype.insertRule.apply(this, [rule2, index2]); + }; + const deleteRule = win.CSSStyleSheet.prototype.deleteRule; + win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [index2] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + removes: [{ index: index2 }] + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + win.CSSStyleSheet.prototype.removeRule = function(index2) { + return win.CSSStyleSheet.prototype.deleteRule.apply(this, [index2]); + }; + let replace; + if (win.CSSStyleSheet.prototype.replace) { + replace = win.CSSStyleSheet.prototype.replace; + win.CSSStyleSheet.prototype.replace = new Proxy(replace, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [text] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + replace: text + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + } + let replaceSync; + if (win.CSSStyleSheet.prototype.replaceSync) { + replaceSync = win.CSSStyleSheet.prototype.replaceSync; + win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [text] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + replaceSync: text + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + } + const supportedNestedCSSRuleTypes = {}; + if (canMonkeyPatchNestedCSSRule("CSSGroupingRule")) { + supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule; + } else { + if (canMonkeyPatchNestedCSSRule("CSSMediaRule")) { + supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule; + } + if (canMonkeyPatchNestedCSSRule("CSSConditionRule")) { + supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule; + } + if (canMonkeyPatchNestedCSSRule("CSSSupportsRule")) { + supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule; + } + } + const unmodifiedFunctions = {}; + Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => { + unmodifiedFunctions[typeKey] = { + // eslint-disable-next-line @typescript-eslint/unbound-method + insertRule: type.prototype.insertRule, + // eslint-disable-next-line @typescript-eslint/unbound-method + deleteRule: type.prototype.deleteRule + }; + type.prototype.insertRule = new Proxy( + unmodifiedFunctions[typeKey].insertRule, + { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [rule2, index2] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg.parentStyleSheet, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + adds: [ + { + rule: rule2, + index: [ + ...getNestedCSSRulePositions(thisArg), + index2 || 0 + // defaults to 0 + ] + } + ] + }); + } + return target.apply(thisArg, argumentsList); + } + ) + } + ); + type.prototype.deleteRule = new Proxy( + unmodifiedFunctions[typeKey].deleteRule, + { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + const [index2] = argumentsList; + const { id, styleId } = getIdAndStyleId( + thisArg.parentStyleSheet, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleSheetRuleCb({ + id, + styleId, + removes: [ + { index: [...getNestedCSSRulePositions(thisArg), index2] } + ] + }); + } + return target.apply(thisArg, argumentsList); + } + ) + } + ); + }); + return callbackWrapper(() => { + win.CSSStyleSheet.prototype.insertRule = insertRule; + win.CSSStyleSheet.prototype.deleteRule = deleteRule; + replace && (win.CSSStyleSheet.prototype.replace = replace); + replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync); + Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => { + type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule; + type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule; + }); + }); +} +function initAdoptedStyleSheetObserver({ + mirror: mirror2, + stylesheetManager +}, host2) { + var _a2, _b, _c; + let hostId = null; + if (host2.nodeName === "#document") hostId = mirror2.getId(host2); + else hostId = mirror2.getId(index.host(host2)); + const patchTarget = host2.nodeName === "#document" ? (_a2 = host2.defaultView) == null ? void 0 : _a2.Document : (_c = (_b = host2.ownerDocument) == null ? void 0 : _b.defaultView) == null ? void 0 : _c.ShadowRoot; + const originalPropertyDescriptor = (patchTarget == null ? void 0 : patchTarget.prototype) ? Object.getOwnPropertyDescriptor( + patchTarget == null ? void 0 : patchTarget.prototype, + "adoptedStyleSheets" + ) : void 0; + if (hostId === null || hostId === -1 || !patchTarget || !originalPropertyDescriptor) + return () => { + }; + Object.defineProperty(host2, "adoptedStyleSheets", { + configurable: originalPropertyDescriptor.configurable, + enumerable: originalPropertyDescriptor.enumerable, + get() { + var _a3; + return (_a3 = originalPropertyDescriptor.get) == null ? void 0 : _a3.call(this); + }, + set(sheets) { + var _a3; + const result2 = (_a3 = originalPropertyDescriptor.set) == null ? void 0 : _a3.call(this, sheets); + if (hostId !== null && hostId !== -1) { + try { + stylesheetManager.adoptStyleSheets(sheets, hostId); + } catch (e2) { + } + } + return result2; + } + }); + return callbackWrapper(() => { + Object.defineProperty(host2, "adoptedStyleSheets", { + configurable: originalPropertyDescriptor.configurable, + enumerable: originalPropertyDescriptor.enumerable, + // eslint-disable-next-line @typescript-eslint/unbound-method + get: originalPropertyDescriptor.get, + // eslint-disable-next-line @typescript-eslint/unbound-method + set: originalPropertyDescriptor.set + }); + }); +} +function initStyleDeclarationObserver({ + styleDeclarationCb, + mirror: mirror2, + ignoreCSSAttributes, + stylesheetManager +}, { win }) { + const setProperty = win.CSSStyleDeclaration.prototype.setProperty; + win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + var _a2; + const [property, value, priority] = argumentsList; + if (ignoreCSSAttributes.has(property)) { + return setProperty.apply(thisArg, [property, value, priority]); + } + const { id, styleId } = getIdAndStyleId( + (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleDeclarationCb({ + id, + styleId, + set: { + property, + value, + priority + }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + index: getNestedCSSRulePositions(thisArg.parentRule) + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty; + win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, { + apply: callbackWrapper( + (target, thisArg, argumentsList) => { + var _a2; + const [property] = argumentsList; + if (ignoreCSSAttributes.has(property)) { + return removeProperty.apply(thisArg, [property]); + } + const { id, styleId } = getIdAndStyleId( + (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet, + mirror2, + stylesheetManager.styleMirror + ); + if (id && id !== -1 || styleId && styleId !== -1) { + styleDeclarationCb({ + id, + styleId, + remove: { + property + }, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + index: getNestedCSSRulePositions(thisArg.parentRule) + }); + } + return target.apply(thisArg, argumentsList); + } + ) + }); + return callbackWrapper(() => { + win.CSSStyleDeclaration.prototype.setProperty = setProperty; + win.CSSStyleDeclaration.prototype.removeProperty = removeProperty; + }); +} +function initMediaInteractionObserver({ + mediaInteractionCb, + blockClass, + blockSelector, + mirror: mirror2, + sampling, + doc +}) { + const handler = callbackWrapper( + (type) => throttle( + callbackWrapper((event) => { + const target = getEventTarget(event); + if (!target || isBlocked(target, blockClass, blockSelector, true)) { + return; + } + const { currentTime, volume, muted, playbackRate, loop } = target; + mediaInteractionCb({ + type, + id: mirror2.getId(target), + currentTime, + volume, + muted, + playbackRate, + loop + }); + }), + sampling.media || 500 + ) + ); + const handlers = [ + on("play", handler(MediaInteractions.Play), doc), + on("pause", handler(MediaInteractions.Pause), doc), + on("seeked", handler(MediaInteractions.Seeked), doc), + on("volumechange", handler(MediaInteractions.VolumeChange), doc), + on("ratechange", handler(MediaInteractions.RateChange), doc) + ]; + return callbackWrapper(() => { + handlers.forEach((h) => h()); + }); +} +function initFontObserver({ fontCb, doc }) { + const win = doc.defaultView; + if (!win) { + return () => { + }; + } + const handlers = []; + const fontMap = /* @__PURE__ */ new WeakMap(); + const originalFontFace = win.FontFace; + win.FontFace = function FontFace2(family, source, descriptors) { + const fontFace = new originalFontFace(family, source, descriptors); + fontMap.set(fontFace, { + family, + buffer: typeof source !== "string", + descriptors, + fontSource: typeof source === "string" ? source : JSON.stringify(Array.from(new Uint8Array(source))) + }); + return fontFace; + }; + const restoreHandler = patch( + doc.fonts, + "add", + function(original) { + return function(fontFace) { + setTimeout( + callbackWrapper(() => { + const p = fontMap.get(fontFace); + if (p) { + fontCb(p); + fontMap.delete(fontFace); + } + }), + 0 + ); + return original.apply(this, [fontFace]); + }; + } + ); + handlers.push(() => { + win.FontFace = originalFontFace; + }); + handlers.push(restoreHandler); + return callbackWrapper(() => { + handlers.forEach((h) => h()); + }); +} +function initSelectionObserver(param) { + const { doc, mirror: mirror2, blockClass, blockSelector, selectionCb } = param; + let collapsed = true; + const updateSelection = callbackWrapper(() => { + const selection = doc.getSelection(); + if (!selection || collapsed && (selection == null ? void 0 : selection.isCollapsed)) return; + collapsed = selection.isCollapsed || false; + const ranges = []; + const count = selection.rangeCount || 0; + for (let i2 = 0; i2 < count; i2++) { + const range = selection.getRangeAt(i2); + const { startContainer, startOffset, endContainer, endOffset } = range; + const blocked = isBlocked(startContainer, blockClass, blockSelector, true) || isBlocked(endContainer, blockClass, blockSelector, true); + if (blocked) continue; + ranges.push({ + start: mirror2.getId(startContainer), + startOffset, + end: mirror2.getId(endContainer), + endOffset + }); + } + selectionCb({ ranges }); + }); + updateSelection(); + return on("selectionchange", updateSelection); +} +function initCustomElementObserver({ + doc, + customElementCb +}) { + const win = doc.defaultView; + if (!win || !win.customElements) return () => { + }; + const restoreHandler = patch( + win.customElements, + "define", + function(original) { + return function(name, constructor, options) { + try { + customElementCb({ + define: { + name + } + }); + } catch (e2) { + console.warn(`Custom element callback failed for ${name}`); + } + return original.apply(this, [name, constructor, options]); + }; + } + ); + return restoreHandler; +} +function mergeHooks(o2, hooks) { + const { + mutationCb, + mousemoveCb, + mouseInteractionCb, + scrollCb, + viewportResizeCb, + inputCb, + mediaInteractionCb, + styleSheetRuleCb, + styleDeclarationCb, + canvasMutationCb, + fontCb, + selectionCb, + customElementCb + } = o2; + o2.mutationCb = (...p) => { + if (hooks.mutation) { + hooks.mutation(...p); + } + mutationCb(...p); + }; + o2.mousemoveCb = (...p) => { + if (hooks.mousemove) { + hooks.mousemove(...p); + } + mousemoveCb(...p); + }; + o2.mouseInteractionCb = (...p) => { + if (hooks.mouseInteraction) { + hooks.mouseInteraction(...p); + } + mouseInteractionCb(...p); + }; + o2.scrollCb = (...p) => { + if (hooks.scroll) { + hooks.scroll(...p); + } + scrollCb(...p); + }; + o2.viewportResizeCb = (...p) => { + if (hooks.viewportResize) { + hooks.viewportResize(...p); + } + viewportResizeCb(...p); + }; + o2.inputCb = (...p) => { + if (hooks.input) { + hooks.input(...p); + } + inputCb(...p); + }; + o2.mediaInteractionCb = (...p) => { + if (hooks.mediaInteaction) { + hooks.mediaInteaction(...p); + } + mediaInteractionCb(...p); + }; + o2.styleSheetRuleCb = (...p) => { + if (hooks.styleSheetRule) { + hooks.styleSheetRule(...p); + } + styleSheetRuleCb(...p); + }; + o2.styleDeclarationCb = (...p) => { + if (hooks.styleDeclaration) { + hooks.styleDeclaration(...p); + } + styleDeclarationCb(...p); + }; + o2.canvasMutationCb = (...p) => { + if (hooks.canvasMutation) { + hooks.canvasMutation(...p); + } + canvasMutationCb(...p); + }; + o2.fontCb = (...p) => { + if (hooks.font) { + hooks.font(...p); + } + fontCb(...p); + }; + o2.selectionCb = (...p) => { + if (hooks.selection) { + hooks.selection(...p); + } + selectionCb(...p); + }; + o2.customElementCb = (...c2) => { + if (hooks.customElement) { + hooks.customElement(...c2); + } + customElementCb(...c2); + }; +} +function initObservers(o2, hooks = {}) { + const currentWindow = o2.doc.defaultView; + if (!currentWindow) { + return () => { + }; + } + mergeHooks(o2, hooks); + let mutationObserver; + if (o2.recordDOM) { + mutationObserver = initMutationObserver(o2, o2.doc); + } + const mousemoveHandler = initMoveObserver(o2); + const mouseInteractionHandler = initMouseInteractionObserver(o2); + const scrollHandler = initScrollObserver(o2); + const viewportResizeHandler = initViewportResizeObserver(o2, { + win: currentWindow + }); + const inputHandler = initInputObserver(o2); + const mediaInteractionHandler = initMediaInteractionObserver(o2); + let styleSheetObserver = () => { + }; + let adoptedStyleSheetObserver = () => { + }; + let styleDeclarationObserver = () => { + }; + let fontObserver = () => { + }; + if (o2.recordDOM) { + styleSheetObserver = initStyleSheetObserver(o2, { win: currentWindow }); + adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o2, o2.doc); + styleDeclarationObserver = initStyleDeclarationObserver(o2, { + win: currentWindow + }); + if (o2.collectFonts) { + fontObserver = initFontObserver(o2); + } + } + const selectionObserver = initSelectionObserver(o2); + const customElementObserver = initCustomElementObserver(o2); + const pluginHandlers = []; + for (const plugin of o2.plugins) { + pluginHandlers.push( + plugin.observer(plugin.callback, currentWindow, plugin.options) + ); + } + return callbackWrapper(() => { + mutationBuffers.forEach((b) => b.reset()); + mutationObserver == null ? void 0 : mutationObserver.disconnect(); + mousemoveHandler(); + mouseInteractionHandler(); + scrollHandler(); + viewportResizeHandler(); + inputHandler(); + mediaInteractionHandler(); + styleSheetObserver(); + adoptedStyleSheetObserver(); + styleDeclarationObserver(); + fontObserver(); + selectionObserver(); + customElementObserver(); + pluginHandlers.forEach((h) => h()); + }); +} +function hasNestedCSSRule(prop) { + return typeof window[prop] !== "undefined"; +} +function canMonkeyPatchNestedCSSRule(prop) { + return Boolean( + typeof window[prop] !== "undefined" && // Note: Generally, this check _shouldn't_ be necessary + // However, in some scenarios (e.g. jsdom) this can sometimes fail, so we check for it here + window[prop].prototype && "insertRule" in window[prop].prototype && "deleteRule" in window[prop].prototype + ); +} +class CrossOriginIframeMirror { + constructor(generateIdFn) { + __publicField(this, "iframeIdToRemoteIdMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "iframeRemoteIdToIdMap", /* @__PURE__ */ new WeakMap()); + this.generateIdFn = generateIdFn; + } + getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) { + const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe); + const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe); + let id = idToRemoteIdMap.get(remoteId); + if (!id) { + id = this.generateIdFn(); + idToRemoteIdMap.set(remoteId, id); + remoteIdToIdMap.set(id, remoteId); + } + return id; + } + getIds(iframe, remoteId) { + const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe); + const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe); + return remoteId.map( + (id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap) + ); + } + getRemoteId(iframe, id, map) { + const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe); + if (typeof id !== "number") return id; + const remoteId = remoteIdToIdMap.get(id); + if (!remoteId) return -1; + return remoteId; + } + getRemoteIds(iframe, ids) { + const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe); + return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap)); + } + reset(iframe) { + if (!iframe) { + this.iframeIdToRemoteIdMap = /* @__PURE__ */ new WeakMap(); + this.iframeRemoteIdToIdMap = /* @__PURE__ */ new WeakMap(); + return; + } + this.iframeIdToRemoteIdMap.delete(iframe); + this.iframeRemoteIdToIdMap.delete(iframe); + } + getIdToRemoteIdMap(iframe) { + let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe); + if (!idToRemoteIdMap) { + idToRemoteIdMap = /* @__PURE__ */ new Map(); + this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap); + } + return idToRemoteIdMap; + } + getRemoteIdToIdMap(iframe) { + let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe); + if (!remoteIdToIdMap) { + remoteIdToIdMap = /* @__PURE__ */ new Map(); + this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap); + } + return remoteIdToIdMap; + } +} +class IframeManager { + constructor(options) { + __publicField(this, "iframes", /* @__PURE__ */ new WeakMap()); + __publicField(this, "crossOriginIframeMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "crossOriginIframeMirror", new CrossOriginIframeMirror(genId)); + __publicField(this, "crossOriginIframeStyleMirror"); + __publicField(this, "crossOriginIframeRootIdMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "mirror"); + __publicField(this, "mutationCb"); + __publicField(this, "wrappedEmit"); + __publicField(this, "loadListener"); + __publicField(this, "stylesheetManager"); + __publicField(this, "recordCrossOriginIframes"); + this.mutationCb = options.mutationCb; + this.wrappedEmit = options.wrappedEmit; + this.stylesheetManager = options.stylesheetManager; + this.recordCrossOriginIframes = options.recordCrossOriginIframes; + this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror( + this.stylesheetManager.styleMirror.generateId.bind( + this.stylesheetManager.styleMirror + ) + ); + this.mirror = options.mirror; + if (this.recordCrossOriginIframes) { + window.addEventListener("message", this.handleMessage.bind(this)); + } + } + addIframe(iframeEl) { + this.iframes.set(iframeEl, true); + if (iframeEl.contentWindow) + this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl); + } + addLoadListener(cb) { + this.loadListener = cb; + } + attachIframe(iframeEl, childSn) { + var _a2, _b; + this.mutationCb({ + adds: [ + { + parentId: this.mirror.getId(iframeEl), + nextId: null, + node: childSn + } + ], + removes: [], + texts: [], + attributes: [], + isAttachIframe: true + }); + if (this.recordCrossOriginIframes) + (_a2 = iframeEl.contentWindow) == null ? void 0 : _a2.addEventListener( + "message", + this.handleMessage.bind(this) + ); + (_b = this.loadListener) == null ? void 0 : _b.call(this, iframeEl); + if (iframeEl.contentDocument && iframeEl.contentDocument.adoptedStyleSheets && iframeEl.contentDocument.adoptedStyleSheets.length > 0) + this.stylesheetManager.adoptStyleSheets( + iframeEl.contentDocument.adoptedStyleSheets, + this.mirror.getId(iframeEl.contentDocument) + ); + } + handleMessage(message) { + const crossOriginMessageEvent = message; + if (crossOriginMessageEvent.data.type !== "rrweb" || // To filter out the rrweb messages which are forwarded by some sites. + crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin) + return; + const iframeSourceWindow = message.source; + if (!iframeSourceWindow) return; + const iframeEl = this.crossOriginIframeMap.get(message.source); + if (!iframeEl) return; + const transformedEvent = this.transformCrossOriginEvent( + iframeEl, + crossOriginMessageEvent.data.event + ); + if (transformedEvent) + this.wrappedEmit( + transformedEvent, + crossOriginMessageEvent.data.isCheckout + ); + } + transformCrossOriginEvent(iframeEl, e2) { + var _a2; + switch (e2.type) { + case EventType.FullSnapshot: { + this.crossOriginIframeMirror.reset(iframeEl); + this.crossOriginIframeStyleMirror.reset(iframeEl); + this.replaceIdOnNode(e2.data.node, iframeEl); + const rootId = e2.data.node.id; + this.crossOriginIframeRootIdMap.set(iframeEl, rootId); + this.patchRootIdOnNode(e2.data.node, rootId); + return { + timestamp: e2.timestamp, + type: EventType.IncrementalSnapshot, + data: { + source: IncrementalSource.Mutation, + adds: [ + { + parentId: this.mirror.getId(iframeEl), + nextId: null, + node: e2.data.node + } + ], + removes: [], + texts: [], + attributes: [], + isAttachIframe: true + } + }; + } + case EventType.Meta: + case EventType.Load: + case EventType.DomContentLoaded: { + return false; + } + case EventType.Plugin: { + return e2; + } + case EventType.Custom: { + this.replaceIds( + e2.data.payload, + iframeEl, + ["id", "parentId", "previousId", "nextId"] + ); + return e2; + } + case EventType.IncrementalSnapshot: { + switch (e2.data.source) { + case IncrementalSource.Mutation: { + e2.data.adds.forEach((n2) => { + this.replaceIds(n2, iframeEl, [ + "parentId", + "nextId", + "previousId" + ]); + this.replaceIdOnNode(n2.node, iframeEl); + const rootId = this.crossOriginIframeRootIdMap.get(iframeEl); + rootId && this.patchRootIdOnNode(n2.node, rootId); + }); + e2.data.removes.forEach((n2) => { + this.replaceIds(n2, iframeEl, ["parentId", "id"]); + }); + e2.data.attributes.forEach((n2) => { + this.replaceIds(n2, iframeEl, ["id"]); + }); + e2.data.texts.forEach((n2) => { + this.replaceIds(n2, iframeEl, ["id"]); + }); + return e2; + } + case IncrementalSource.Drag: + case IncrementalSource.TouchMove: + case IncrementalSource.MouseMove: { + e2.data.positions.forEach((p) => { + this.replaceIds(p, iframeEl, ["id"]); + }); + return e2; + } + case IncrementalSource.ViewportResize: { + return false; + } + case IncrementalSource.MediaInteraction: + case IncrementalSource.MouseInteraction: + case IncrementalSource.Scroll: + case IncrementalSource.CanvasMutation: + case IncrementalSource.Input: { + this.replaceIds(e2.data, iframeEl, ["id"]); + return e2; + } + case IncrementalSource.StyleSheetRule: + case IncrementalSource.StyleDeclaration: { + this.replaceIds(e2.data, iframeEl, ["id"]); + this.replaceStyleIds(e2.data, iframeEl, ["styleId"]); + return e2; + } + case IncrementalSource.Font: { + return e2; + } + case IncrementalSource.Selection: { + e2.data.ranges.forEach((range) => { + this.replaceIds(range, iframeEl, ["start", "end"]); + }); + return e2; + } + case IncrementalSource.AdoptedStyleSheet: { + this.replaceIds(e2.data, iframeEl, ["id"]); + this.replaceStyleIds(e2.data, iframeEl, ["styleIds"]); + (_a2 = e2.data.styles) == null ? void 0 : _a2.forEach((style) => { + this.replaceStyleIds(style, iframeEl, ["styleId"]); + }); + return e2; + } + } + } + } + return false; + } + replace(iframeMirror, obj, iframeEl, keys) { + for (const key of keys) { + if (!Array.isArray(obj[key]) && typeof obj[key] !== "number") continue; + if (Array.isArray(obj[key])) { + obj[key] = iframeMirror.getIds( + iframeEl, + obj[key] + ); + } else { + obj[key] = iframeMirror.getId(iframeEl, obj[key]); + } + } + return obj; + } + replaceIds(obj, iframeEl, keys) { + return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys); + } + replaceStyleIds(obj, iframeEl, keys) { + return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys); + } + replaceIdOnNode(node2, iframeEl) { + this.replaceIds(node2, iframeEl, ["id", "rootId"]); + if ("childNodes" in node2) { + node2.childNodes.forEach((child) => { + this.replaceIdOnNode(child, iframeEl); + }); + } + } + patchRootIdOnNode(node2, rootId) { + if (node2.type !== NodeType.Document && !node2.rootId) node2.rootId = rootId; + if ("childNodes" in node2) { + node2.childNodes.forEach((child) => { + this.patchRootIdOnNode(child, rootId); + }); + } + } +} +class ShadowDomManager { + constructor(options) { + __publicField(this, "shadowDoms", /* @__PURE__ */ new WeakSet()); + __publicField(this, "mutationCb"); + __publicField(this, "scrollCb"); + __publicField(this, "bypassOptions"); + __publicField(this, "mirror"); + __publicField(this, "restoreHandlers", []); + this.mutationCb = options.mutationCb; + this.scrollCb = options.scrollCb; + this.bypassOptions = options.bypassOptions; + this.mirror = options.mirror; + this.init(); + } + init() { + this.reset(); + this.patchAttachShadow(Element, document); + } + addShadowRoot(shadowRoot2, doc) { + if (!isNativeShadowDom(shadowRoot2)) return; + if (this.shadowDoms.has(shadowRoot2)) return; + this.shadowDoms.add(shadowRoot2); + const observer = initMutationObserver( + __spreadProps(__spreadValues({}, this.bypassOptions), { + doc, + mutationCb: this.mutationCb, + mirror: this.mirror, + shadowDomManager: this + }), + shadowRoot2 + ); + this.restoreHandlers.push(() => observer.disconnect()); + this.restoreHandlers.push( + initScrollObserver(__spreadProps(__spreadValues({}, this.bypassOptions), { + scrollCb: this.scrollCb, + // https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813 + // scroll is not allowed to pass the boundary, so we need to listen the shadow document + doc: shadowRoot2, + mirror: this.mirror + })) + ); + setTimeout(() => { + if (shadowRoot2.adoptedStyleSheets && shadowRoot2.adoptedStyleSheets.length > 0) + this.bypassOptions.stylesheetManager.adoptStyleSheets( + shadowRoot2.adoptedStyleSheets, + this.mirror.getId(index.host(shadowRoot2)) + ); + this.restoreHandlers.push( + initAdoptedStyleSheetObserver( + { + mirror: this.mirror, + stylesheetManager: this.bypassOptions.stylesheetManager + }, + shadowRoot2 + ) + ); + }, 0); + } + /** + * Monkey patch 'attachShadow' of an IFrameElement to observe newly added shadow doms. + */ + observeAttachShadow(iframeElement) { + if (!iframeElement.contentWindow || !iframeElement.contentDocument) return; + this.patchAttachShadow( + iframeElement.contentWindow.Element, + iframeElement.contentDocument + ); + } + /** + * Patch 'attachShadow' to observe newly added shadow doms. + */ + patchAttachShadow(element, doc) { + const manager = this; + this.restoreHandlers.push( + patch( + element.prototype, + "attachShadow", + function(original) { + return function(option) { + const sRoot = original.call(this, option); + const shadowRootEl = index.shadowRoot(this); + if (shadowRootEl && inDom(this)) + manager.addShadowRoot(shadowRootEl, doc); + return sRoot; + }; + } + ) + ); + } + reset() { + this.restoreHandlers.forEach((handler) => { + try { + handler(); + } catch (e2) { + } + }); + this.restoreHandlers = []; + this.shadowDoms = /* @__PURE__ */ new WeakSet(); + } +} +var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); +for (var i$1 = 0; i$1 < chars.length; i$1++) { + lookup[chars.charCodeAt(i$1)] = i$1; +} +var encode = function(arraybuffer) { + var bytes = new Uint8Array(arraybuffer), i2, len = bytes.length, base64 = ""; + for (i2 = 0; i2 < len; i2 += 3) { + base64 += chars[bytes[i2] >> 2]; + base64 += chars[(bytes[i2] & 3) << 4 | bytes[i2 + 1] >> 4]; + base64 += chars[(bytes[i2 + 1] & 15) << 2 | bytes[i2 + 2] >> 6]; + base64 += chars[bytes[i2 + 2] & 63]; + } + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + "="; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + "=="; + } + return base64; +}; +const canvasVarMap = /* @__PURE__ */ new Map(); +function variableListFor$1(ctx, ctor) { + let contextMap = canvasVarMap.get(ctx); + if (!contextMap) { + contextMap = /* @__PURE__ */ new Map(); + canvasVarMap.set(ctx, contextMap); + } + if (!contextMap.has(ctor)) { + contextMap.set(ctor, []); + } + return contextMap.get(ctor); +} +const saveWebGLVar = (value, win, ctx) => { + if (!value || !(isInstanceOfWebGLObject(value, win) || typeof value === "object")) + return; + const name = value.constructor.name; + const list = variableListFor$1(ctx, name); + let index2 = list.indexOf(value); + if (index2 === -1) { + index2 = list.length; + list.push(value); + } + return index2; +}; +function serializeArg(value, win, ctx) { + if (value instanceof Array) { + return value.map((arg) => serializeArg(arg, win, ctx)); + } else if (value === null) { + return value; + } else if (value instanceof Float32Array || value instanceof Float64Array || value instanceof Int32Array || value instanceof Uint32Array || value instanceof Uint8Array || value instanceof Uint16Array || value instanceof Int16Array || value instanceof Int8Array || value instanceof Uint8ClampedArray) { + const name = value.constructor.name; + return { + rr_type: name, + args: [Object.values(value)] + }; + } else if ( + // SharedArrayBuffer disabled on most browsers due to spectre. + // More info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/SharedArrayBuffer + // value instanceof SharedArrayBuffer || + value instanceof ArrayBuffer + ) { + const name = value.constructor.name; + const base64 = encode(value); + return { + rr_type: name, + base64 + }; + } else if (value instanceof DataView) { + const name = value.constructor.name; + return { + rr_type: name, + args: [ + serializeArg(value.buffer, win, ctx), + value.byteOffset, + value.byteLength + ] + }; + } else if (value instanceof HTMLImageElement) { + const name = value.constructor.name; + const { src } = value; + return { + rr_type: name, + src + }; + } else if (value instanceof HTMLCanvasElement) { + const name = "HTMLImageElement"; + const src = value.toDataURL(); + return { + rr_type: name, + src + }; + } else if (value instanceof ImageData) { + const name = value.constructor.name; + return { + rr_type: name, + args: [serializeArg(value.data, win, ctx), value.width, value.height] + }; + } else if (isInstanceOfWebGLObject(value, win) || typeof value === "object") { + const name = value.constructor.name; + const index2 = saveWebGLVar(value, win, ctx); + return { + rr_type: name, + index: index2 + }; + } + return value; +} +const serializeArgs = (args, win, ctx) => { + return args.map((arg) => serializeArg(arg, win, ctx)); +}; +const isInstanceOfWebGLObject = (value, win) => { + const webGLConstructorNames = [ + "WebGLActiveInfo", + "WebGLBuffer", + "WebGLFramebuffer", + "WebGLProgram", + "WebGLRenderbuffer", + "WebGLShader", + "WebGLShaderPrecisionFormat", + "WebGLTexture", + "WebGLUniformLocation", + "WebGLVertexArrayObject", + // In old Chrome versions, value won't be an instanceof WebGLVertexArrayObject. + "WebGLVertexArrayObjectOES" + ]; + const supportedWebGLConstructorNames = webGLConstructorNames.filter( + (name) => typeof win[name] === "function" + ); + return Boolean( + supportedWebGLConstructorNames.find( + (name) => value instanceof win[name] + ) + ); +}; +function initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) { + const handlers = []; + const props2D = Object.getOwnPropertyNames( + win.CanvasRenderingContext2D.prototype + ); + for (const prop of props2D) { + try { + if (typeof win.CanvasRenderingContext2D.prototype[prop] !== "function") { + continue; + } + const restoreHandler = patch( + win.CanvasRenderingContext2D.prototype, + prop, + function(original) { + return function(...args) { + if (!isBlocked(this.canvas, blockClass, blockSelector, true)) { + setTimeout(() => { + const recordArgs = serializeArgs(args, win, this); + cb(this.canvas, { + type: CanvasContext["2D"], + property: prop, + args: recordArgs + }); + }, 0); + } + return original.apply(this, args); + }; + } + ); + handlers.push(restoreHandler); + } catch (e) { + const hookHandler = hookSetter( + win.CanvasRenderingContext2D.prototype, + prop, + { + set(v2) { + cb(this.canvas, { + type: CanvasContext["2D"], + property: prop, + args: [v2], + setter: true + }); + } + } + ); + handlers.push(hookHandler); + } + } + return () => { + handlers.forEach((h) => h()); + }; +} +function getNormalizedContextName(contextType) { + return contextType === "experimental-webgl" ? "webgl" : contextType; +} +function initCanvasContextObserver(win, blockClass, blockSelector, setPreserveDrawingBufferToTrue) { + const handlers = []; + try { + const restoreHandler = patch( + win.HTMLCanvasElement.prototype, + "getContext", + function(original) { + return function(contextType, ...args) { + if (!isBlocked(this, blockClass, blockSelector, true)) { + const ctxName = getNormalizedContextName(contextType); + if (!("__context" in this)) this.__context = ctxName; + if (setPreserveDrawingBufferToTrue && ["webgl", "webgl2"].includes(ctxName)) { + if (args[0] && typeof args[0] === "object") { + const contextAttributes = args[0]; + if (!contextAttributes.preserveDrawingBuffer) { + contextAttributes.preserveDrawingBuffer = true; + } + } else { + args.splice(0, 1, { + preserveDrawingBuffer: true + }); + } + } + } + return original.apply(this, [contextType, ...args]); + }; + } + ); + handlers.push(restoreHandler); + } catch (e) { + console.error("failed to patch HTMLCanvasElement.prototype.getContext"); + } + return () => { + handlers.forEach((h) => h()); + }; +} +function patchGLPrototype(prototype, type, cb, blockClass, blockSelector, win) { + const handlers = []; + const props = Object.getOwnPropertyNames(prototype); + for (const prop of props) { + if ( + //prop.startsWith('get') || // e.g. getProgramParameter, but too risky + [ + "isContextLost", + "canvas", + "drawingBufferWidth", + "drawingBufferHeight" + ].includes(prop) + ) { + continue; + } + try { + if (typeof prototype[prop] !== "function") { + continue; + } + const restoreHandler = patch( + prototype, + prop, + function(original) { + return function(...args) { + const result2 = original.apply(this, args); + saveWebGLVar(result2, win, this); + if ("tagName" in this.canvas && !isBlocked(this.canvas, blockClass, blockSelector, true)) { + const recordArgs = serializeArgs(args, win, this); + const mutation = { + type, + property: prop, + args: recordArgs + }; + cb(this.canvas, mutation); + } + return result2; + }; + } + ); + handlers.push(restoreHandler); + } catch (e) { + const hookHandler = hookSetter(prototype, prop, { + set(v2) { + cb(this.canvas, { + type, + property: prop, + args: [v2], + setter: true + }); + } + }); + handlers.push(hookHandler); + } + } + return handlers; +} +function initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector) { + const handlers = []; + if (typeof win.WebGLRenderingContext !== "undefined") { + handlers.push( + ...patchGLPrototype( + win.WebGLRenderingContext.prototype, + CanvasContext.WebGL, + cb, + blockClass, + blockSelector, + win + ) + ); + } + if (typeof win.WebGL2RenderingContext !== "undefined") { + handlers.push( + ...patchGLPrototype( + win.WebGL2RenderingContext.prototype, + CanvasContext.WebGL2, + cb, + blockClass, + blockSelector, + win + ) + ); + } + return () => { + handlers.forEach((h) => h()); + }; +} +const jsContent = '(function() {\n "use strict";\n var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\n var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256);\n for (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n }\n var encode = function(arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i2, len = bytes.length, base64 = "";\n for (i2 = 0; i2 < len; i2 += 3) {\n base64 += chars[bytes[i2] >> 2];\n base64 += chars[(bytes[i2] & 3) << 4 | bytes[i2 + 1] >> 4];\n base64 += chars[(bytes[i2 + 1] & 15) << 2 | bytes[i2 + 2] >> 6];\n base64 += chars[bytes[i2 + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + "=";\n } else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + "==";\n }\n return base64;\n };\n const lastBlobMap = /* @__PURE__ */ new Map();\n const transparentBlobMap = /* @__PURE__ */ new Map();\n async function getTransparentBlobFor(width, height, dataURLOptions) {\n const id = `${width}-${height}`;\n if ("OffscreenCanvas" in globalThis) {\n if (transparentBlobMap.has(id)) return transparentBlobMap.get(id);\n const offscreen = new OffscreenCanvas(width, height);\n offscreen.getContext("2d");\n const blob = await offscreen.convertToBlob(dataURLOptions);\n const arrayBuffer = await blob.arrayBuffer();\n const base64 = encode(arrayBuffer);\n transparentBlobMap.set(id, base64);\n return base64;\n } else {\n return "";\n }\n }\n const worker = self;\n worker.onmessage = async function(e) {\n if ("OffscreenCanvas" in globalThis) {\n const { id, bitmap, width, height, dataURLOptions } = e.data;\n const transparentBase64 = getTransparentBlobFor(\n width,\n height,\n dataURLOptions\n );\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext("2d");\n ctx.drawImage(bitmap, 0, 0);\n bitmap.close();\n const blob = await offscreen.convertToBlob(dataURLOptions);\n const type = blob.type;\n const arrayBuffer = await blob.arrayBuffer();\n const base64 = encode(arrayBuffer);\n if (!lastBlobMap.has(id) && await transparentBase64 === base64) {\n lastBlobMap.set(id, base64);\n return worker.postMessage({ id });\n }\n if (lastBlobMap.get(id) === base64) return worker.postMessage({ id });\n worker.postMessage({\n id,\n type,\n base64,\n width,\n height\n });\n lastBlobMap.set(id, base64);\n } else {\n return worker.postMessage({ id: e.data.id });\n }\n };\n})();\n//# sourceMappingURL=image-bitmap-data-url-worker-IJpC7g_b.js.map\n'; +const blob = typeof self !== "undefined" && self.Blob && new Blob([jsContent], { type: "text/javascript;charset=utf-8" }); +function WorkerWrapper(options) { + let objURL; + try { + objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob); + if (!objURL) throw ""; + const worker = new Worker(objURL, { + name: options == null ? void 0 : options.name + }); + worker.addEventListener("error", () => { + (self.URL || self.webkitURL).revokeObjectURL(objURL); + }); + return worker; + } catch (e2) { + return new Worker( + "data:text/javascript;charset=utf-8," + encodeURIComponent(jsContent), + { + name: options == null ? void 0 : options.name + } + ); + } finally { + objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL); + } +} +class CanvasManager { + constructor(options) { + __publicField(this, "pendingCanvasMutations", /* @__PURE__ */ new Map()); + __publicField(this, "rafStamps", { latestId: 0, invokeId: null }); + __publicField(this, "mirror"); + __publicField(this, "mutationCb"); + __publicField(this, "resetObservers"); + __publicField(this, "frozen", false); + __publicField(this, "locked", false); + __publicField(this, "processMutation", (target, mutation) => { + const newFrame = this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId; + if (newFrame || !this.rafStamps.invokeId) + this.rafStamps.invokeId = this.rafStamps.latestId; + if (!this.pendingCanvasMutations.has(target)) { + this.pendingCanvasMutations.set(target, []); + } + this.pendingCanvasMutations.get(target).push(mutation); + }); + const { + sampling = "all", + win, + blockClass, + blockSelector, + recordCanvas, + dataURLOptions + } = options; + this.mutationCb = options.mutationCb; + this.mirror = options.mirror; + if (recordCanvas && sampling === "all") + this.initCanvasMutationObserver(win, blockClass, blockSelector); + if (recordCanvas && typeof sampling === "number") + this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, { + dataURLOptions + }); + } + reset() { + this.pendingCanvasMutations.clear(); + this.resetObservers && this.resetObservers(); + } + freeze() { + this.frozen = true; + } + unfreeze() { + this.frozen = false; + } + lock() { + this.locked = true; + } + unlock() { + this.locked = false; + } + initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) { + const canvasContextReset = initCanvasContextObserver( + win, + blockClass, + blockSelector, + true + ); + const snapshotInProgressMap = /* @__PURE__ */ new Map(); + const worker = new WorkerWrapper(); + worker.onmessage = (e2) => { + const { id } = e2.data; + snapshotInProgressMap.set(id, false); + if (!("base64" in e2.data)) return; + const { base64, type, width, height } = e2.data; + this.mutationCb({ + id, + type: CanvasContext["2D"], + commands: [ + { + property: "clearRect", + // wipe canvas + args: [0, 0, width, height] + }, + { + property: "drawImage", + // draws (semi-transparent) image + args: [ + { + rr_type: "ImageBitmap", + args: [ + { + rr_type: "Blob", + data: [{ rr_type: "ArrayBuffer", base64 }], + type + } + ] + }, + 0, + 0 + ] + } + ] + }); + }; + const timeBetweenSnapshots = 1e3 / fps; + let lastSnapshotTime = 0; + let rafId; + const getCanvas = () => { + const matchedCanvas = []; + win.document.querySelectorAll("canvas").forEach((canvas) => { + if (!isBlocked(canvas, blockClass, blockSelector, true)) { + matchedCanvas.push(canvas); + } + }); + return matchedCanvas; + }; + const takeCanvasSnapshots = (timestamp) => { + if (lastSnapshotTime && timestamp - lastSnapshotTime < timeBetweenSnapshots) { + rafId = requestAnimationFrame(takeCanvasSnapshots); + return; + } + lastSnapshotTime = timestamp; + getCanvas().forEach(async (canvas) => { + var _a2; + const id = this.mirror.getId(canvas); + if (snapshotInProgressMap.get(id)) return; + if (canvas.width === 0 || canvas.height === 0) return; + snapshotInProgressMap.set(id, true); + if (["webgl", "webgl2"].includes(canvas.__context)) { + const context = canvas.getContext(canvas.__context); + if (((_a2 = context == null ? void 0 : context.getContextAttributes()) == null ? void 0 : _a2.preserveDrawingBuffer) === false) { + context.clear(context.COLOR_BUFFER_BIT); + } + } + const bitmap = await createImageBitmap(canvas); + worker.postMessage( + { + id, + bitmap, + width: canvas.width, + height: canvas.height, + dataURLOptions: options.dataURLOptions + }, + [bitmap] + ); + }); + rafId = requestAnimationFrame(takeCanvasSnapshots); + }; + rafId = requestAnimationFrame(takeCanvasSnapshots); + this.resetObservers = () => { + canvasContextReset(); + cancelAnimationFrame(rafId); + }; + } + initCanvasMutationObserver(win, blockClass, blockSelector) { + this.startRAFTimestamping(); + this.startPendingCanvasMutationFlusher(); + const canvasContextReset = initCanvasContextObserver( + win, + blockClass, + blockSelector, + false + ); + const canvas2DReset = initCanvas2DMutationObserver( + this.processMutation.bind(this), + win, + blockClass, + blockSelector + ); + const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver( + this.processMutation.bind(this), + win, + blockClass, + blockSelector + ); + this.resetObservers = () => { + canvasContextReset(); + canvas2DReset(); + canvasWebGL1and2Reset(); + }; + } + startPendingCanvasMutationFlusher() { + requestAnimationFrame(() => this.flushPendingCanvasMutations()); + } + startRAFTimestamping() { + const setLatestRAFTimestamp = (timestamp) => { + this.rafStamps.latestId = timestamp; + requestAnimationFrame(setLatestRAFTimestamp); + }; + requestAnimationFrame(setLatestRAFTimestamp); + } + flushPendingCanvasMutations() { + this.pendingCanvasMutations.forEach( + (_values, canvas) => { + const id = this.mirror.getId(canvas); + this.flushPendingCanvasMutationFor(canvas, id); + } + ); + requestAnimationFrame(() => this.flushPendingCanvasMutations()); + } + flushPendingCanvasMutationFor(canvas, id) { + if (this.frozen || this.locked) { + return; + } + const valuesWithType = this.pendingCanvasMutations.get(canvas); + if (!valuesWithType || id === -1) return; + const values = valuesWithType.map((value) => { + const _a2 = value, { type: type2 } = _a2, rest = __objRest(_a2, ["type"]); + return rest; + }); + const { type } = valuesWithType[0]; + this.mutationCb({ id, type, commands: values }); + this.pendingCanvasMutations.delete(canvas); + } +} +class StylesheetManager { + constructor(options) { + __publicField(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()); + __publicField(this, "mutationCb"); + __publicField(this, "adoptedStyleSheetCb"); + __publicField(this, "styleMirror", new StyleSheetMirror()); + this.mutationCb = options.mutationCb; + this.adoptedStyleSheetCb = options.adoptedStyleSheetCb; + } + attachLinkElement(linkEl, childSn) { + if ("_cssText" in childSn.attributes) + this.mutationCb({ + adds: [], + removes: [], + texts: [], + attributes: [ + { + id: childSn.id, + attributes: childSn.attributes + } + ] + }); + this.trackLinkElement(linkEl); + } + trackLinkElement(linkEl) { + if (this.trackedLinkElements.has(linkEl)) return; + this.trackedLinkElements.add(linkEl); + this.trackStylesheetInLinkElement(linkEl); + } + adoptStyleSheets(sheets, hostId) { + if (sheets.length === 0) return; + const adoptedStyleSheetData = { + id: hostId, + styleIds: [] + }; + const styles = []; + for (const sheet of sheets) { + let styleId; + if (!this.styleMirror.has(sheet)) { + styleId = this.styleMirror.add(sheet); + styles.push({ + styleId, + rules: Array.from(sheet.rules || CSSRule, (r2, index2) => ({ + rule: stringifyRule(r2, sheet.href), + index: index2 + })) + }); + } else styleId = this.styleMirror.getId(sheet); + adoptedStyleSheetData.styleIds.push(styleId); + } + if (styles.length > 0) adoptedStyleSheetData.styles = styles; + this.adoptedStyleSheetCb(adoptedStyleSheetData); + } + reset() { + this.styleMirror.reset(); + this.trackedLinkElements = /* @__PURE__ */ new WeakSet(); + } + // TODO: take snapshot on stylesheet reload by applying event listener + trackStylesheetInLinkElement(_linkEl) { + } +} +class ProcessedNodeManager { + constructor() { + __publicField(this, "nodeMap", /* @__PURE__ */ new WeakMap()); + __publicField(this, "active", false); + } + inOtherBuffer(node2, thisBuffer) { + const buffers = this.nodeMap.get(node2); + return buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer); + } + add(node2, buffer) { + if (!this.active) { + this.active = true; + requestAnimationFrame(() => { + this.nodeMap = /* @__PURE__ */ new WeakMap(); + this.active = false; + }); + } + this.nodeMap.set(node2, (this.nodeMap.get(node2) || /* @__PURE__ */ new Set()).add(buffer)); + } + destroy() { + } +} +let wrappedEmit; +let takeFullSnapshot$1; +let canvasManager; +let recording = false; +try { + if (Array.from([1], (x) => x * 2)[0] !== 2) { + const cleanFrame = document.createElement("iframe"); + document.body.appendChild(cleanFrame); + Array.from = ((_a = cleanFrame.contentWindow) == null ? void 0 : _a.Array.from) || Array.from; + document.body.removeChild(cleanFrame); + } +} catch (err) { + console.debug("Unable to override Array.from", err); +} +const mirror = createMirror$2(); +function record(options = {}) { + const { + emit, + checkoutEveryNms, + checkoutEveryNth, + blockClass = "rr-block", + blockSelector = null, + ignoreClass = "rr-ignore", + ignoreSelector = null, + maskTextClass = "rr-mask", + maskTextSelector = null, + inlineStylesheet = true, + maskAllInputs, + maskInputOptions: _maskInputOptions, + slimDOMOptions: _slimDOMOptions, + maskInputFn, + maskTextFn, + hooks, + packFn, + sampling = {}, + dataURLOptions = {}, + mousemoveWait, + recordDOM = true, + recordCanvas = false, + recordCrossOriginIframes = false, + recordAfter = options.recordAfter === "DOMContentLoaded" ? options.recordAfter : "load", + userTriggeredOnInput = false, + collectFonts = false, + inlineImages = false, + plugins, + keepIframeSrcFn = () => false, + ignoreCSSAttributes = /* @__PURE__ */ new Set([]), + errorHandler: errorHandler2 + } = options; + registerErrorHandler(errorHandler2); + const inEmittingFrame = recordCrossOriginIframes ? window.parent === window : true; + let passEmitsToParent = false; + if (!inEmittingFrame) { + try { + if (window.parent.document) { + passEmitsToParent = false; + } + } catch (e2) { + passEmitsToParent = true; + } + } + if (inEmittingFrame && !emit) { + throw new Error("emit function is required"); + } + if (!inEmittingFrame && !passEmitsToParent) { + return () => { + }; + } + if (mousemoveWait !== void 0 && sampling.mousemove === void 0) { + sampling.mousemove = mousemoveWait; + } + mirror.reset(); + const maskInputOptions = maskAllInputs === true ? { + color: true, + date: true, + "datetime-local": true, + email: true, + month: true, + number: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true, + textarea: true, + select: true, + password: true + } : _maskInputOptions !== void 0 ? _maskInputOptions : { password: true }; + const slimDOMOptions = slimDOMDefaults(_slimDOMOptions); + polyfill$1(); + let lastFullSnapshotEvent; + let incrementalSnapshotCount = 0; + const eventProcessor = (e2) => { + for (const plugin of plugins || []) { + if (plugin.eventProcessor) { + e2 = plugin.eventProcessor(e2); + } + } + if (packFn && // Disable packing events which will be emitted to parent frames. + !passEmitsToParent) { + e2 = packFn(e2); + } + return e2; + }; + wrappedEmit = (r2, isCheckout) => { + var _a2; + const e2 = r2; + e2.timestamp = nowTimestamp(); + if (((_a2 = mutationBuffers[0]) == null ? void 0 : _a2.isFrozen()) && e2.type !== EventType.FullSnapshot && !(e2.type === EventType.IncrementalSnapshot && e2.data.source === IncrementalSource.Mutation)) { + mutationBuffers.forEach((buf) => buf.unfreeze()); + } + if (inEmittingFrame) { + emit == null ? void 0 : emit(eventProcessor(e2), isCheckout); + } else if (passEmitsToParent) { + const message = { + type: "rrweb", + event: eventProcessor(e2), + origin: window.location.origin, + isCheckout + }; + window.parent.postMessage(message, "*"); + } + if (e2.type === EventType.FullSnapshot) { + lastFullSnapshotEvent = e2; + incrementalSnapshotCount = 0; + } else if (e2.type === EventType.IncrementalSnapshot) { + if (e2.data.source === IncrementalSource.Mutation && e2.data.isAttachIframe) { + return; + } + incrementalSnapshotCount++; + const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth; + const exceedTime = checkoutEveryNms && e2.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms; + if (exceedCount || exceedTime) { + takeFullSnapshot$1(true); + } + } + }; + const wrappedMutationEmit = (m) => { + wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.Mutation + }, m) + }); + }; + const wrappedScrollEmit = (p) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.Scroll + }, p) + }); + const wrappedCanvasMutationEmit = (p) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.CanvasMutation + }, p) + }); + const wrappedAdoptedStyleSheetEmit = (a2) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.AdoptedStyleSheet + }, a2) + }); + const stylesheetManager = new StylesheetManager({ + mutationCb: wrappedMutationEmit, + adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit + }); + const iframeManager = new IframeManager({ + mirror, + mutationCb: wrappedMutationEmit, + stylesheetManager, + recordCrossOriginIframes, + wrappedEmit + }); + for (const plugin of plugins || []) { + if (plugin.getMirror) + plugin.getMirror({ + nodeMirror: mirror, + crossOriginIframeMirror: iframeManager.crossOriginIframeMirror, + crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror + }); + } + const processedNodeManager = new ProcessedNodeManager(); + canvasManager = new CanvasManager({ + recordCanvas, + mutationCb: wrappedCanvasMutationEmit, + win: window, + blockClass, + blockSelector, + mirror, + sampling: sampling.canvas, + dataURLOptions + }); + const shadowDomManager = new ShadowDomManager({ + mutationCb: wrappedMutationEmit, + scrollCb: wrappedScrollEmit, + bypassOptions: { + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + inlineStylesheet, + maskInputOptions, + dataURLOptions, + maskTextFn, + maskInputFn, + recordCanvas, + inlineImages, + sampling, + slimDOMOptions, + iframeManager, + stylesheetManager, + canvasManager, + keepIframeSrcFn, + processedNodeManager + }, + mirror + }); + takeFullSnapshot$1 = (isCheckout = false) => { + if (!recordDOM) { + return; + } + wrappedEmit( + { + type: EventType.Meta, + data: { + href: window.location.href, + width: getWindowWidth(), + height: getWindowHeight() + } + }, + isCheckout + ); + stylesheetManager.reset(); + shadowDomManager.init(); + mutationBuffers.forEach((buf) => buf.lock()); + const node2 = snapshot(document, { + mirror, + blockClass, + blockSelector, + maskTextClass, + maskTextSelector, + inlineStylesheet, + maskAllInputs: maskInputOptions, + maskTextFn, + maskInputFn, + slimDOM: slimDOMOptions, + dataURLOptions, + recordCanvas, + inlineImages, + onSerialize: (n2) => { + if (isSerializedIframe(n2, mirror)) { + iframeManager.addIframe(n2); + } + if (isSerializedStylesheet(n2, mirror)) { + stylesheetManager.trackLinkElement(n2); + } + if (hasShadowRoot(n2)) { + shadowDomManager.addShadowRoot(index.shadowRoot(n2), document); + } + }, + onIframeLoad: (iframe, childSn) => { + iframeManager.attachIframe(iframe, childSn); + shadowDomManager.observeAttachShadow(iframe); + }, + onStylesheetLoad: (linkEl, childSn) => { + stylesheetManager.attachLinkElement(linkEl, childSn); + }, + keepIframeSrcFn + }); + if (!node2) { + return console.warn("Failed to snapshot the document"); + } + wrappedEmit( + { + type: EventType.FullSnapshot, + data: { + node: node2, + initialOffset: getWindowScroll(window) + } + }, + isCheckout + ); + mutationBuffers.forEach((buf) => buf.unlock()); + if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0) + stylesheetManager.adoptStyleSheets( + document.adoptedStyleSheets, + mirror.getId(document) + ); + }; + try { + const handlers = []; + const observe = (doc) => { + var _a2; + return callbackWrapper(initObservers)( + { + mutationCb: wrappedMutationEmit, + mousemoveCb: (positions, source) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: { + source, + positions + } + }), + mouseInteractionCb: (d) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.MouseInteraction + }, d) + }), + scrollCb: wrappedScrollEmit, + viewportResizeCb: (d) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.ViewportResize + }, d) + }), + inputCb: (v2) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.Input + }, v2) + }), + mediaInteractionCb: (p) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.MediaInteraction + }, p) + }), + styleSheetRuleCb: (r2) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.StyleSheetRule + }, r2) + }), + styleDeclarationCb: (r2) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.StyleDeclaration + }, r2) + }), + canvasMutationCb: wrappedCanvasMutationEmit, + fontCb: (p) => wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.Font + }, p) + }), + selectionCb: (p) => { + wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.Selection + }, p) + }); + }, + customElementCb: (c2) => { + wrappedEmit({ + type: EventType.IncrementalSnapshot, + data: __spreadValues({ + source: IncrementalSource.CustomElement + }, c2) + }); + }, + blockClass, + ignoreClass, + ignoreSelector, + maskTextClass, + maskTextSelector, + maskInputOptions, + inlineStylesheet, + sampling, + recordDOM, + recordCanvas, + inlineImages, + userTriggeredOnInput, + collectFonts, + doc, + maskInputFn, + maskTextFn, + keepIframeSrcFn, + blockSelector, + slimDOMOptions, + dataURLOptions, + mirror, + iframeManager, + stylesheetManager, + shadowDomManager, + processedNodeManager, + canvasManager, + ignoreCSSAttributes, + plugins: ((_a2 = plugins == null ? void 0 : plugins.filter((p) => p.observer)) == null ? void 0 : _a2.map((p) => ({ + observer: p.observer, + options: p.options, + callback: (payload) => wrappedEmit({ + type: EventType.Plugin, + data: { + plugin: p.name, + payload + } + }) + }))) || [] + }, + hooks + ); + }; + iframeManager.addLoadListener((iframeEl) => { + try { + handlers.push(observe(iframeEl.contentDocument)); + } catch (error) { + console.warn(error); + } + }); + const init = () => { + takeFullSnapshot$1(); + handlers.push(observe(document)); + recording = true; + }; + if (["interactive", "complete"].includes(document.readyState)) { + init(); + } else { + handlers.push( + on("DOMContentLoaded", () => { + wrappedEmit({ + type: EventType.DomContentLoaded, + data: {} + }); + if (recordAfter === "DOMContentLoaded") init(); + }) + ); + handlers.push( + on( + "load", + () => { + wrappedEmit({ + type: EventType.Load, + data: {} + }); + if (recordAfter === "load") init(); + }, + window + ) + ); + } + return () => { + handlers.forEach((handler) => { + try { + handler(); + } catch (error) { + const msg = String(error).toLowerCase(); + if (!msg.includes("cross-origin")) { + console.warn(error); + } + } + }); + processedNodeManager.destroy(); + recording = false; + unregisterErrorHandler(); + }; + } catch (error) { + console.warn(error); + } +} +record.addCustomEvent = (tag, payload) => { + if (!recording) { + throw new Error("please add custom event after start recording"); + } + wrappedEmit({ + type: EventType.Custom, + data: { + tag, + payload + } + }); +}; +record.freezePage = () => { + mutationBuffers.forEach((buf) => buf.freeze()); +}; +record.takeFullSnapshot = (isCheckout) => { + if (!recording) { + throw new Error("please take full snapshot after start recording"); + } + takeFullSnapshot$1(isCheckout); +}; +record.mirror = mirror; +var n; +!function(t2) { + t2[t2.NotStarted = 0] = "NotStarted", t2[t2.Running = 1] = "Running", t2[t2.Stopped = 2] = "Stopped"; +}(n || (n = {})); +exports.record = record; +if (typeof module.exports == "object" && typeof exports == "object") { + var __cp = (to, from, except, desc) => { + if ((from && typeof from === "object") || typeof from === "function") { + for (let key of Object.getOwnPropertyNames(from)) { + if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except) + Object.defineProperty(to, key, { + get: () => from[key], + enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable, + }); + } + } + return to; + }; + module.exports = __cp(module.exports, exports); +} +return module.exports; +})) +//# sourceMappingURL=record.umd.cjs.map