@betterbugs/utils 2.0.0-alpha.20 → 2.0.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -10,6 +10,7 @@ export declare function childNodes(n: Node): NodeListOf<Node>;
10
10
  export declare function contains(n: Node, other: Node): boolean;
11
11
 
12
12
  declare const _default: {
13
+ ownerDocument: typeof ownerDocument;
13
14
  childNodes: typeof childNodes;
14
15
  parentNode: typeof parentNode;
15
16
  parentElement: typeof parentElement;
@@ -40,6 +41,8 @@ export declare const isAngularZonePresent: () => boolean;
40
41
 
41
42
  export declare function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'];
42
43
 
44
+ export declare function ownerDocument(n: Node): Document | null;
45
+
43
46
  export declare function parentElement(n: Node): HTMLElement | null;
44
47
 
45
48
  export declare function parentNode(n: Node): ParentNode | null;
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export declare function childNodes(n: Node): NodeListOf<Node>;
10
10
  export declare function contains(n: Node, other: Node): boolean;
11
11
 
12
12
  declare const _default: {
13
+ ownerDocument: typeof ownerDocument;
13
14
  childNodes: typeof childNodes;
14
15
  parentNode: typeof parentNode;
15
16
  parentElement: typeof parentElement;
@@ -40,6 +41,8 @@ export declare const isAngularZonePresent: () => boolean;
40
41
 
41
42
  export declare function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'];
42
43
 
44
+ export declare function ownerDocument(n: Node): Document | null;
45
+
43
46
  export declare function parentElement(n: Node): HTMLElement | null;
44
47
 
45
48
  export declare function parentNode(n: Node): ParentNode | null;
package/dist/utils.cjs CHANGED
@@ -1,7 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const testableAccessors = {
4
- Node: ["childNodes", "parentNode", "parentElement", "textContent"],
4
+ Node: [
5
+ "childNodes",
6
+ "parentNode",
7
+ "parentElement",
8
+ "textContent",
9
+ "ownerDocument"
10
+ ],
5
11
  ShadowRoot: ["host", "styleSheets"],
6
12
  Element: ["shadowRoot", "querySelector", "querySelectorAll"],
7
13
  MutationObserver: []
@@ -90,6 +96,9 @@ function getUntaintedMethod(key, instance, method) {
90
96
  untaintedMethodCache[cacheKey] = untaintedMethod;
91
97
  return untaintedMethod.bind(instance);
92
98
  }
99
+ function ownerDocument(n) {
100
+ return getUntaintedAccessor("Node", n, "ownerDocument");
101
+ }
93
102
  function childNodes(n) {
94
103
  return getUntaintedAccessor("Node", n, "childNodes");
95
104
  }
@@ -155,6 +164,7 @@ function patch(source, name, replacement) {
155
164
  }
156
165
  }
157
166
  const index = {
167
+ ownerDocument,
158
168
  childNodes,
159
169
  parentNode,
160
170
  parentElement,
@@ -179,6 +189,7 @@ exports.getUntaintedPrototype = getUntaintedPrototype;
179
189
  exports.host = host;
180
190
  exports.isAngularZonePresent = isAngularZonePresent;
181
191
  exports.mutationObserverCtor = mutationObserverCtor;
192
+ exports.ownerDocument = ownerDocument;
182
193
  exports.parentElement = parentElement;
183
194
  exports.parentNode = parentNode;
184
195
  exports.patch = patch;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../src/index.ts"],"sourcesContent":["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: ['childNodes', 'parentNode', 'parentElement', 'textContent'] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../src/index.ts"],"sourcesContent":["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: [\n 'childNodes',\n 'parentNode',\n 'parentElement',\n 'textContent',\n 'ownerDocument',\n ] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function ownerDocument(n: Node): Document | null {\n return getUntaintedAccessor('Node', n, 'ownerDocument');\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,5 +1,11 @@
1
1
  const testableAccessors = {
2
- Node: ["childNodes", "parentNode", "parentElement", "textContent"],
2
+ Node: [
3
+ "childNodes",
4
+ "parentNode",
5
+ "parentElement",
6
+ "textContent",
7
+ "ownerDocument"
8
+ ],
3
9
  ShadowRoot: ["host", "styleSheets"],
4
10
  Element: ["shadowRoot", "querySelector", "querySelectorAll"],
5
11
  MutationObserver: []
@@ -88,6 +94,9 @@ function getUntaintedMethod(key, instance, method) {
88
94
  untaintedMethodCache[cacheKey] = untaintedMethod;
89
95
  return untaintedMethod.bind(instance);
90
96
  }
97
+ function ownerDocument(n) {
98
+ return getUntaintedAccessor("Node", n, "ownerDocument");
99
+ }
91
100
  function childNodes(n) {
92
101
  return getUntaintedAccessor("Node", n, "childNodes");
93
102
  }
@@ -153,6 +162,7 @@ function patch(source, name, replacement) {
153
162
  }
154
163
  }
155
164
  const index = {
165
+ ownerDocument,
156
166
  childNodes,
157
167
  parentNode,
158
168
  parentElement,
@@ -178,6 +188,7 @@ export {
178
188
  host,
179
189
  isAngularZonePresent,
180
190
  mutationObserverCtor,
191
+ ownerDocument,
181
192
  parentElement,
182
193
  parentNode,
183
194
  patch,
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/index.ts"],"sourcesContent":["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: ['childNodes', 'parentNode', 'parentElement', 'textContent'] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../src/index.ts"],"sourcesContent":["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: [\n 'childNodes',\n 'parentNode',\n 'parentElement',\n 'textContent',\n 'ownerDocument',\n ] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function ownerDocument(n: Node): Document | null {\n return getUntaintedAccessor('Node', n, 'ownerDocument');\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,13 @@ var module = { exports };
14
14
  "use strict";
15
15
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
16
16
  const testableAccessors = {
17
- Node: ["childNodes", "parentNode", "parentElement", "textContent"],
17
+ Node: [
18
+ "childNodes",
19
+ "parentNode",
20
+ "parentElement",
21
+ "textContent",
22
+ "ownerDocument"
23
+ ],
18
24
  ShadowRoot: ["host", "styleSheets"],
19
25
  Element: ["shadowRoot", "querySelector", "querySelectorAll"],
20
26
  MutationObserver: []
@@ -103,6 +109,9 @@ function getUntaintedMethod(key, instance, method) {
103
109
  untaintedMethodCache[cacheKey] = untaintedMethod;
104
110
  return untaintedMethod.bind(instance);
105
111
  }
112
+ function ownerDocument(n) {
113
+ return getUntaintedAccessor("Node", n, "ownerDocument");
114
+ }
106
115
  function childNodes(n) {
107
116
  return getUntaintedAccessor("Node", n, "childNodes");
108
117
  }
@@ -168,6 +177,7 @@ function patch(source, name, replacement) {
168
177
  }
169
178
  }
170
179
  const index = {
180
+ ownerDocument,
171
181
  childNodes,
172
182
  parentNode,
173
183
  parentElement,
@@ -192,6 +202,7 @@ exports.getUntaintedPrototype = getUntaintedPrototype;
192
202
  exports.host = host;
193
203
  exports.isAngularZonePresent = isAngularZonePresent;
194
204
  exports.mutationObserverCtor = mutationObserverCtor;
205
+ exports.ownerDocument = ownerDocument;
195
206
  exports.parentElement = parentElement;
196
207
  exports.parentNode = parentNode;
197
208
  exports.patch = patch;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: ['childNodes', 'parentNode', 'parentElement', 'textContent'] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: [\n 'childNodes',\n 'parentNode',\n 'parentElement',\n 'textContent',\n 'ownerDocument',\n ] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function ownerDocument(n: Node): Document | null {\n return getUntaintedAccessor('Node', n, 'ownerDocument');\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -11,7 +11,7 @@
11
11
  }(this, () => {
12
12
  var exports = {};
13
13
  var module = { exports };
14
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g={Node:["childNodes","parentNode","parentElement","textContent"],ShadowRoot:["host","styleSheets"],Element:["shadowRoot","querySelector","querySelectorAll"],MutationObserver:[]},b={Node:["contains","getRootNode"],ShadowRoot:["getSelection"],Element:[],MutationObserver:["constructor"]},l={},v=()=>!!globalThis.Zone;function p(t){if(l[t])return l[t];const e=globalThis[t],o=e.prototype,n=t in g?g[t]:void 0,r=!!(n&&n.every(i=>{var s,a;return!!((a=(s=Object.getOwnPropertyDescriptor(o,i))==null?void 0:s.get)!=null&&a.toString().includes("[native code]"))})),u=t in b?b[t]:void 0,d=!!(u&&u.every(i=>{var s;return typeof o[i]=="function"&&((s=o[i])==null?void 0:s.toString().includes("[native code]"))}));if(r&&d&&!v())return l[t]=e.prototype,e.prototype;try{const i=document.createElement("iframe");document.body.appendChild(i);const s=i.contentWindow;if(!s)return e.prototype;const a=s[t].prototype;return document.body.removeChild(i),a?l[t]=a:o}catch(i){return o}}const f={};function c(t,e,o){var n;const r=`${t}.${String(o)}`;if(f[r])return f[r].call(e);const u=p(t),d=(n=Object.getOwnPropertyDescriptor(u,o))==null?void 0:n.get;return d?(f[r]=d,d.call(e)):e[o]}const h={};function y(t,e,o){const n=`${t}.${String(o)}`;if(h[n])return h[n].bind(e);const u=p(t)[o];return typeof u!="function"?e[o]:(h[n]=u,u.bind(e))}function N(t){return c("Node",t,"childNodes")}function S(t){return c("Node",t,"parentNode")}function m(t){return c("Node",t,"parentElement")}function w(t){return c("Node",t,"textContent")}function O(t,e){return y("Node",t,"contains")(e)}function P(t){return y("Node",t,"getRootNode")()}function A(t){return!t||!("host"in t)?null:c("ShadowRoot",t,"host")}function R(t){return t.styleSheets}function E(t){return!t||!("shadowRoot"in t)?null:c("Element",t,"shadowRoot")}function M(t,e){return c("Element",t,"querySelector")(e)}function _(t,e){return c("Element",t,"querySelectorAll")(e)}function C(){return p("MutationObserver").constructor}function q(t,e,o){try{if(!(e in t))return()=>{};const n=t[e],r=o(n);return typeof r=="function"&&(r.prototype=r.prototype||{},Object.defineProperties(r,{__rrweb_original__:{enumerable:!1,value:n}})),t[e]=r,()=>{t[e]=n}}catch(n){return()=>{}}}const U={childNodes:N,parentNode:S,parentElement:m,textContent:w,contains:O,getRootNode:P,host:A,styleSheets:R,shadowRoot:E,querySelector:M,querySelectorAll:_,mutationObserver:C,patch:q};exports.childNodes=N;exports.contains=O;exports.default=U;exports.getRootNode=P;exports.getUntaintedAccessor=c;exports.getUntaintedMethod=y;exports.getUntaintedPrototype=p;exports.host=A;exports.isAngularZonePresent=v;exports.mutationObserverCtor=C;exports.parentElement=m;exports.parentNode=S;exports.patch=q;exports.querySelector=M;exports.querySelectorAll=_;exports.shadowRoot=E;exports.styleSheets=R;exports.textContent=w;
14
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g={Node:["childNodes","parentNode","parentElement","textContent","ownerDocument"],ShadowRoot:["host","styleSheets"],Element:["shadowRoot","querySelector","querySelectorAll"],MutationObserver:[]},b={Node:["contains","getRootNode"],ShadowRoot:["getSelection"],Element:[],MutationObserver:["constructor"]},l={},v=()=>!!globalThis.Zone;function p(t){if(l[t])return l[t];const e=globalThis[t],o=e.prototype,n=t in g?g[t]:void 0,r=!!(n&&n.every(c=>{var s,a;return!!((a=(s=Object.getOwnPropertyDescriptor(o,c))==null?void 0:s.get)!=null&&a.toString().includes("[native code]"))})),u=t in b?b[t]:void 0,d=!!(u&&u.every(c=>{var s;return typeof o[c]=="function"&&((s=o[c])==null?void 0:s.toString().includes("[native code]"))}));if(r&&d&&!v())return l[t]=e.prototype,e.prototype;try{const c=document.createElement("iframe");document.body.appendChild(c);const s=c.contentWindow;if(!s)return e.prototype;const a=s[t].prototype;return document.body.removeChild(c),a?l[t]=a:o}catch(c){return o}}const f={};function i(t,e,o){var n;const r=`${t}.${String(o)}`;if(f[r])return f[r].call(e);const u=p(t),d=(n=Object.getOwnPropertyDescriptor(u,o))==null?void 0:n.get;return d?(f[r]=d,d.call(e)):e[o]}const h={};function y(t,e,o){const n=`${t}.${String(o)}`;if(h[n])return h[n].bind(e);const u=p(t)[o];return typeof u!="function"?e[o]:(h[n]=u,u.bind(e))}function N(t){return i("Node",t,"ownerDocument")}function m(t){return i("Node",t,"childNodes")}function S(t){return i("Node",t,"parentNode")}function w(t){return i("Node",t,"parentElement")}function O(t){return i("Node",t,"textContent")}function P(t,e){return y("Node",t,"contains")(e)}function A(t){return y("Node",t,"getRootNode")()}function R(t){return!t||!("host"in t)?null:i("ShadowRoot",t,"host")}function E(t){return t.styleSheets}function M(t){return!t||!("shadowRoot"in t)?null:i("Element",t,"shadowRoot")}function _(t,e){return i("Element",t,"querySelector")(e)}function C(t,e){return i("Element",t,"querySelectorAll")(e)}function q(){return p("MutationObserver").constructor}function U(t,e,o){try{if(!(e in t))return()=>{};const n=t[e],r=o(n);return typeof r=="function"&&(r.prototype=r.prototype||{},Object.defineProperties(r,{__rrweb_original__:{enumerable:!1,value:n}})),t[e]=r,()=>{t[e]=n}}catch(n){return()=>{}}}const j={ownerDocument:N,childNodes:m,parentNode:S,parentElement:w,textContent:O,contains:P,getRootNode:A,host:R,styleSheets:E,shadowRoot:M,querySelector:_,querySelectorAll:C,mutationObserver:q,patch:U};exports.childNodes=m;exports.contains=P;exports.default=j;exports.getRootNode=A;exports.getUntaintedAccessor=i;exports.getUntaintedMethod=y;exports.getUntaintedPrototype=p;exports.host=R;exports.isAngularZonePresent=v;exports.mutationObserverCtor=q;exports.ownerDocument=N;exports.parentElement=w;exports.parentNode=S;exports.patch=U;exports.querySelector=_;exports.querySelectorAll=C;exports.shadowRoot=M;exports.styleSheets=E;exports.textContent=O;
15
15
  if (typeof module.exports == "object" && typeof exports == "object") {
16
16
  var __cp = (to, from, except, desc) => {
17
17
  if ((from && typeof from === "object") || typeof from === "function") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: ['childNodes', 'parentNode', 'parentElement', 'textContent'] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],
5
- "mappings": "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",
6
- "names": ["testableAccessors", "testableMethods", "untaintedBasePrototype", "isAngularZonePresent", "getUntaintedPrototype", "key", "defaultObj", "defaultPrototype", "accessorNames", "isUntaintedAccessors", "accessor", "_b", "_a", "methodNames", "isUntaintedMethods", "method", "iframeEl", "win", "untaintedObject", "e", "untaintedAccessorCache", "getUntaintedAccessor", "instance", "cacheKey", "untaintedPrototype", "untaintedAccessor", "untaintedMethodCache", "getUntaintedMethod", "untaintedMethod", "childNodes", "n", "parentNode", "parentElement", "textContent", "contains", "other", "getRootNode", "host", "styleSheets", "shadowRoot", "querySelector", "selectors", "querySelectorAll", "mutationObserverCtor", "patch", "source", "name", "replacement", "original", "wrapped", "index"]
4
+ "sourcesContent": ["type PrototypeOwner = Node | ShadowRoot | MutationObserver | Element;\ntype TypeofPrototypeOwner =\n | typeof Node\n | typeof ShadowRoot\n | typeof MutationObserver\n | typeof Element;\n\ntype BasePrototypeCache = {\n Node: typeof Node.prototype;\n ShadowRoot: typeof ShadowRoot.prototype;\n MutationObserver: typeof MutationObserver.prototype;\n Element: typeof Element.prototype;\n};\n\nconst testableAccessors = {\n Node: [\n 'childNodes',\n 'parentNode',\n 'parentElement',\n 'textContent',\n 'ownerDocument',\n ] as const,\n ShadowRoot: ['host', 'styleSheets'] as const,\n Element: ['shadowRoot', 'querySelector', 'querySelectorAll'] as const,\n MutationObserver: [] as const,\n} as const;\n\nconst testableMethods = {\n Node: ['contains', 'getRootNode'] as const,\n ShadowRoot: ['getSelection'],\n Element: [],\n MutationObserver: ['constructor'],\n} as const;\n\nconst untaintedBasePrototype: Partial<BasePrototypeCache> = {};\n\n/*\n When angular patches things - particularly the MutationObserver -\n they pass the `isNativeFunction` check\n That then causes performance issues\n because Angular's change detection\n doesn't like sharing a mutation observer\n Checking for the presence of the Zone object\n on global is a good-enough proxy for Angular\n to cover most cases\n (you can configure zone.js to have a different name\n on the global object and should then manually run rrweb\n outside the Zone)\n */\nexport const isAngularZonePresent = (): boolean => {\n return !!(globalThis as { Zone?: unknown }).Zone;\n};\n\nexport function getUntaintedPrototype<T extends keyof BasePrototypeCache>(\n key: T,\n): BasePrototypeCache[T] {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key] as BasePrototypeCache[T];\n\n const defaultObj = globalThis[key] as TypeofPrototypeOwner;\n const defaultPrototype = defaultObj.prototype as BasePrototypeCache[T];\n\n // use list of testable accessors to check if the prototype is tainted\n const accessorNames =\n key in testableAccessors ? testableAccessors[key] : undefined;\n const isUntaintedAccessors = Boolean(\n accessorNames &&\n // @ts-expect-error 2345\n accessorNames.every((accessor: keyof typeof defaultPrototype) =>\n Boolean(\n Object.getOwnPropertyDescriptor(defaultPrototype, accessor)\n ?.get?.toString()\n .includes('[native code]'),\n ),\n ),\n );\n\n const methodNames = key in testableMethods ? testableMethods[key] : undefined;\n const isUntaintedMethods = Boolean(\n methodNames &&\n methodNames.every(\n // @ts-expect-error 2345\n (method: keyof typeof defaultPrototype) =>\n typeof defaultPrototype[method] === 'function' &&\n defaultPrototype[method]?.toString().includes('[native code]'),\n ),\n );\n\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype as BasePrototypeCache[T];\n return defaultObj.prototype as BasePrototypeCache[T];\n }\n\n try {\n const iframeEl = document.createElement('iframe');\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype as BasePrototypeCache[T];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const untaintedObject = (win as any)[key]\n .prototype as BasePrototypeCache[T];\n // cleanup\n document.body.removeChild(iframeEl);\n\n if (!untaintedObject) return defaultPrototype;\n\n return (untaintedBasePrototype[key] = untaintedObject);\n } catch {\n return defaultPrototype;\n }\n}\n\nconst untaintedAccessorCache: Record<\n string,\n (this: PrototypeOwner, ...args: unknown[]) => unknown\n> = {};\n\nexport function getUntaintedAccessor<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n accessor: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const untaintedAccessor = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor,\n )?.get;\n\n if (!untaintedAccessor) return instance[accessor];\n\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n\n return untaintedAccessor.call(instance) as BasePrototypeCache[K][T];\n}\n\ntype BaseMethod<K extends keyof BasePrototypeCache> = (\n this: BasePrototypeCache[K],\n ...args: unknown[]\n) => unknown;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst untaintedMethodCache: Record<string, BaseMethod<any>> = {};\nexport function getUntaintedMethod<\n K extends keyof BasePrototypeCache,\n T extends keyof BasePrototypeCache[K],\n>(\n key: K,\n instance: BasePrototypeCache[K],\n method: T,\n): BasePrototypeCache[K][T] {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance,\n ) as BasePrototypeCache[K][T];\n\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n\n if (typeof untaintedMethod !== 'function') return instance[method];\n\n untaintedMethodCache[cacheKey] = untaintedMethod as BaseMethod<K>;\n\n return untaintedMethod.bind(instance) as BasePrototypeCache[K][T];\n}\n\nexport function ownerDocument(n: Node): Document | null {\n return getUntaintedAccessor('Node', n, 'ownerDocument');\n}\n\nexport function childNodes(n: Node): NodeListOf<Node> {\n return getUntaintedAccessor('Node', n, 'childNodes');\n}\n\nexport function parentNode(n: Node): ParentNode | null {\n return getUntaintedAccessor('Node', n, 'parentNode');\n}\n\nexport function parentElement(n: Node): HTMLElement | null {\n return getUntaintedAccessor('Node', n, 'parentElement');\n}\n\nexport function textContent(n: Node): string | null {\n return getUntaintedAccessor('Node', n, 'textContent');\n}\n\nexport function contains(n: Node, other: Node): boolean {\n return getUntaintedMethod('Node', n, 'contains')(other);\n}\n\nexport function getRootNode(n: Node): Node {\n return getUntaintedMethod('Node', n, 'getRootNode')();\n}\n\nexport function host(n: ShadowRoot): Element | null {\n if (!n || !('host' in n)) return null;\n return getUntaintedAccessor('ShadowRoot', n, 'host');\n}\n\nexport function styleSheets(n: ShadowRoot): StyleSheetList {\n return n.styleSheets;\n}\n\nexport function shadowRoot(n: Node): ShadowRoot | null {\n if (!n || !('shadowRoot' in n)) return null;\n return getUntaintedAccessor('Element', n as Element, 'shadowRoot');\n}\n\nexport function querySelector(n: Element, selectors: string): Element | null {\n return getUntaintedAccessor('Element', n, 'querySelector')(selectors);\n}\n\nexport function querySelectorAll(\n n: Element,\n selectors: string,\n): NodeListOf<Element> {\n return getUntaintedAccessor('Element', n, 'querySelectorAll')(selectors);\n}\n\nexport function mutationObserverCtor(): (typeof MutationObserver)['prototype']['constructor'] {\n return getUntaintedPrototype('MutationObserver').constructor;\n}\n\n// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown,\n): () => void {\n try {\n if (!(name in source)) {\n return () => {\n //\n };\n }\n\n const original = source[name] as () => unknown;\n const wrapped = replacement(original);\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n\n source[name] = wrapped;\n\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n //\n };\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n}\n\nexport default {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["testableAccessors", "testableMethods", "untaintedBasePrototype", "isAngularZonePresent", "getUntaintedPrototype", "key", "defaultObj", "defaultPrototype", "accessorNames", "isUntaintedAccessors", "accessor", "_b", "_a", "methodNames", "isUntaintedMethods", "method", "iframeEl", "win", "untaintedObject", "e", "untaintedAccessorCache", "getUntaintedAccessor", "instance", "cacheKey", "untaintedPrototype", "untaintedAccessor", "untaintedMethodCache", "getUntaintedMethod", "untaintedMethod", "ownerDocument", "n", "childNodes", "parentNode", "parentElement", "textContent", "contains", "other", "getRootNode", "host", "styleSheets", "shadowRoot", "querySelector", "selectors", "querySelectorAll", "mutationObserverCtor", "patch", "source", "name", "replacement", "original", "wrapped", "index"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betterbugs/utils",
3
- "version": "2.0.0-alpha.20",
3
+ "version": "2.0.0-alpha.22",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -43,11 +43,12 @@
43
43
  }
44
44
  },
45
45
  "files": [
46
+ "umd",
46
47
  "dist",
47
48
  "package.json"
48
49
  ],
49
50
  "devDependencies": {
50
- "vite": "^5.2.8",
51
+ "vite": "^6.0.1",
51
52
  "vite-plugin-dts": "^3.8.1"
52
53
  },
53
54
  "dependencies": {}
package/umd/utils.js ADDED
@@ -0,0 +1,231 @@
1
+ (function (g, f) {
2
+ if ("object" == typeof exports && "object" == typeof module) {
3
+ module.exports = f();
4
+ } else if ("function" == typeof define && define.amd) {
5
+ define("rrwebUtils", [], f);
6
+ } else if ("object" == typeof exports) {
7
+ exports["rrwebUtils"] = f();
8
+ } else {
9
+ g["rrwebUtils"] = f();
10
+ }
11
+ }(this, () => {
12
+ var exports = {};
13
+ var module = { exports };
14
+ "use strict";
15
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
16
+ const testableAccessors = {
17
+ Node: [
18
+ "childNodes",
19
+ "parentNode",
20
+ "parentElement",
21
+ "textContent",
22
+ "ownerDocument"
23
+ ],
24
+ ShadowRoot: ["host", "styleSheets"],
25
+ Element: ["shadowRoot", "querySelector", "querySelectorAll"],
26
+ MutationObserver: []
27
+ };
28
+ const testableMethods = {
29
+ Node: ["contains", "getRootNode"],
30
+ ShadowRoot: ["getSelection"],
31
+ Element: [],
32
+ MutationObserver: ["constructor"]
33
+ };
34
+ const untaintedBasePrototype = {};
35
+ const isAngularZonePresent = () => {
36
+ return !!globalThis.Zone;
37
+ };
38
+ function getUntaintedPrototype(key) {
39
+ if (untaintedBasePrototype[key])
40
+ return untaintedBasePrototype[key];
41
+ const defaultObj = globalThis[key];
42
+ const defaultPrototype = defaultObj.prototype;
43
+ const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;
44
+ const isUntaintedAccessors = Boolean(
45
+ accessorNames && // @ts-expect-error 2345
46
+ accessorNames.every(
47
+ (accessor) => {
48
+ var _a, _b;
49
+ return Boolean(
50
+ (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes("[native code]")
51
+ );
52
+ }
53
+ )
54
+ );
55
+ const methodNames = key in testableMethods ? testableMethods[key] : void 0;
56
+ const isUntaintedMethods = Boolean(
57
+ methodNames && methodNames.every(
58
+ // @ts-expect-error 2345
59
+ (method) => {
60
+ var _a;
61
+ return typeof defaultPrototype[method] === "function" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes("[native code]"));
62
+ }
63
+ )
64
+ );
65
+ if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {
66
+ untaintedBasePrototype[key] = defaultObj.prototype;
67
+ return defaultObj.prototype;
68
+ }
69
+ try {
70
+ const iframeEl = document.createElement("iframe");
71
+ document.body.appendChild(iframeEl);
72
+ const win = iframeEl.contentWindow;
73
+ if (!win) return defaultObj.prototype;
74
+ const untaintedObject = win[key].prototype;
75
+ document.body.removeChild(iframeEl);
76
+ if (!untaintedObject) return defaultPrototype;
77
+ return untaintedBasePrototype[key] = untaintedObject;
78
+ } catch (e) {
79
+ return defaultPrototype;
80
+ }
81
+ }
82
+ const untaintedAccessorCache = {};
83
+ function getUntaintedAccessor(key, instance, accessor) {
84
+ var _a;
85
+ const cacheKey = `${key}.${String(accessor)}`;
86
+ if (untaintedAccessorCache[cacheKey])
87
+ return untaintedAccessorCache[cacheKey].call(
88
+ instance
89
+ );
90
+ const untaintedPrototype = getUntaintedPrototype(key);
91
+ const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(
92
+ untaintedPrototype,
93
+ accessor
94
+ )) == null ? void 0 : _a.get;
95
+ if (!untaintedAccessor) return instance[accessor];
96
+ untaintedAccessorCache[cacheKey] = untaintedAccessor;
97
+ return untaintedAccessor.call(instance);
98
+ }
99
+ const untaintedMethodCache = {};
100
+ function getUntaintedMethod(key, instance, method) {
101
+ const cacheKey = `${key}.${String(method)}`;
102
+ if (untaintedMethodCache[cacheKey])
103
+ return untaintedMethodCache[cacheKey].bind(
104
+ instance
105
+ );
106
+ const untaintedPrototype = getUntaintedPrototype(key);
107
+ const untaintedMethod = untaintedPrototype[method];
108
+ if (typeof untaintedMethod !== "function") return instance[method];
109
+ untaintedMethodCache[cacheKey] = untaintedMethod;
110
+ return untaintedMethod.bind(instance);
111
+ }
112
+ function ownerDocument(n) {
113
+ return getUntaintedAccessor("Node", n, "ownerDocument");
114
+ }
115
+ function childNodes(n) {
116
+ return getUntaintedAccessor("Node", n, "childNodes");
117
+ }
118
+ function parentNode(n) {
119
+ return getUntaintedAccessor("Node", n, "parentNode");
120
+ }
121
+ function parentElement(n) {
122
+ return getUntaintedAccessor("Node", n, "parentElement");
123
+ }
124
+ function textContent(n) {
125
+ return getUntaintedAccessor("Node", n, "textContent");
126
+ }
127
+ function contains(n, other) {
128
+ return getUntaintedMethod("Node", n, "contains")(other);
129
+ }
130
+ function getRootNode(n) {
131
+ return getUntaintedMethod("Node", n, "getRootNode")();
132
+ }
133
+ function host(n) {
134
+ if (!n || !("host" in n)) return null;
135
+ return getUntaintedAccessor("ShadowRoot", n, "host");
136
+ }
137
+ function styleSheets(n) {
138
+ return n.styleSheets;
139
+ }
140
+ function shadowRoot(n) {
141
+ if (!n || !("shadowRoot" in n)) return null;
142
+ return getUntaintedAccessor("Element", n, "shadowRoot");
143
+ }
144
+ function querySelector(n, selectors) {
145
+ return getUntaintedAccessor("Element", n, "querySelector")(selectors);
146
+ }
147
+ function querySelectorAll(n, selectors) {
148
+ return getUntaintedAccessor("Element", n, "querySelectorAll")(selectors);
149
+ }
150
+ function mutationObserverCtor() {
151
+ return getUntaintedPrototype("MutationObserver").constructor;
152
+ }
153
+ function patch(source, name, replacement) {
154
+ try {
155
+ if (!(name in source)) {
156
+ return () => {
157
+ };
158
+ }
159
+ const original = source[name];
160
+ const wrapped = replacement(original);
161
+ if (typeof wrapped === "function") {
162
+ wrapped.prototype = wrapped.prototype || {};
163
+ Object.defineProperties(wrapped, {
164
+ __rrweb_original__: {
165
+ enumerable: false,
166
+ value: original
167
+ }
168
+ });
169
+ }
170
+ source[name] = wrapped;
171
+ return () => {
172
+ source[name] = original;
173
+ };
174
+ } catch (e) {
175
+ return () => {
176
+ };
177
+ }
178
+ }
179
+ const index = {
180
+ ownerDocument,
181
+ childNodes,
182
+ parentNode,
183
+ parentElement,
184
+ textContent,
185
+ contains,
186
+ getRootNode,
187
+ host,
188
+ styleSheets,
189
+ shadowRoot,
190
+ querySelector,
191
+ querySelectorAll,
192
+ mutationObserver: mutationObserverCtor,
193
+ patch
194
+ };
195
+ exports.childNodes = childNodes;
196
+ exports.contains = contains;
197
+ exports.default = index;
198
+ exports.getRootNode = getRootNode;
199
+ exports.getUntaintedAccessor = getUntaintedAccessor;
200
+ exports.getUntaintedMethod = getUntaintedMethod;
201
+ exports.getUntaintedPrototype = getUntaintedPrototype;
202
+ exports.host = host;
203
+ exports.isAngularZonePresent = isAngularZonePresent;
204
+ exports.mutationObserverCtor = mutationObserverCtor;
205
+ exports.ownerDocument = ownerDocument;
206
+ exports.parentElement = parentElement;
207
+ exports.parentNode = parentNode;
208
+ exports.patch = patch;
209
+ exports.querySelector = querySelector;
210
+ exports.querySelectorAll = querySelectorAll;
211
+ exports.shadowRoot = shadowRoot;
212
+ exports.styleSheets = styleSheets;
213
+ exports.textContent = textContent;
214
+ if (typeof module.exports == "object" && typeof exports == "object") {
215
+ var __cp = (to, from, except, desc) => {
216
+ if ((from && typeof from === "object") || typeof from === "function") {
217
+ for (let key of Object.getOwnPropertyNames(from)) {
218
+ if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)
219
+ Object.defineProperty(to, key, {
220
+ get: () => from[key],
221
+ enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,
222
+ });
223
+ }
224
+ }
225
+ return to;
226
+ };
227
+ module.exports = __cp(module.exports, exports);
228
+ }
229
+ return module.exports;
230
+ }))
231
+ //# sourceMappingURL=utils.umd.cjs.map
@@ -0,0 +1,32 @@
1
+ (function (g, f) {
2
+ if ("object" == typeof exports && "object" == typeof module) {
3
+ module.exports = f();
4
+ } else if ("function" == typeof define && define.amd) {
5
+ define("rrwebUtils", [], f);
6
+ } else if ("object" == typeof exports) {
7
+ exports["rrwebUtils"] = f();
8
+ } else {
9
+ g["rrwebUtils"] = f();
10
+ }
11
+ }(this, () => {
12
+ var exports = {};
13
+ var module = { exports };
14
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g={Node:["childNodes","parentNode","parentElement","textContent","ownerDocument"],ShadowRoot:["host","styleSheets"],Element:["shadowRoot","querySelector","querySelectorAll"],MutationObserver:[]},b={Node:["contains","getRootNode"],ShadowRoot:["getSelection"],Element:[],MutationObserver:["constructor"]},l={},v=()=>!!globalThis.Zone;function p(t){if(l[t])return l[t];const e=globalThis[t],o=e.prototype,n=t in g?g[t]:void 0,r=!!(n&&n.every(c=>{var s,a;return!!((a=(s=Object.getOwnPropertyDescriptor(o,c))==null?void 0:s.get)!=null&&a.toString().includes("[native code]"))})),u=t in b?b[t]:void 0,d=!!(u&&u.every(c=>{var s;return typeof o[c]=="function"&&((s=o[c])==null?void 0:s.toString().includes("[native code]"))}));if(r&&d&&!v())return l[t]=e.prototype,e.prototype;try{const c=document.createElement("iframe");document.body.appendChild(c);const s=c.contentWindow;if(!s)return e.prototype;const a=s[t].prototype;return document.body.removeChild(c),a?l[t]=a:o}catch(c){return o}}const f={};function i(t,e,o){var n;const r=`${t}.${String(o)}`;if(f[r])return f[r].call(e);const u=p(t),d=(n=Object.getOwnPropertyDescriptor(u,o))==null?void 0:n.get;return d?(f[r]=d,d.call(e)):e[o]}const h={};function y(t,e,o){const n=`${t}.${String(o)}`;if(h[n])return h[n].bind(e);const u=p(t)[o];return typeof u!="function"?e[o]:(h[n]=u,u.bind(e))}function N(t){return i("Node",t,"ownerDocument")}function m(t){return i("Node",t,"childNodes")}function S(t){return i("Node",t,"parentNode")}function w(t){return i("Node",t,"parentElement")}function O(t){return i("Node",t,"textContent")}function P(t,e){return y("Node",t,"contains")(e)}function A(t){return y("Node",t,"getRootNode")()}function R(t){return!t||!("host"in t)?null:i("ShadowRoot",t,"host")}function E(t){return t.styleSheets}function M(t){return!t||!("shadowRoot"in t)?null:i("Element",t,"shadowRoot")}function _(t,e){return i("Element",t,"querySelector")(e)}function C(t,e){return i("Element",t,"querySelectorAll")(e)}function q(){return p("MutationObserver").constructor}function U(t,e,o){try{if(!(e in t))return()=>{};const n=t[e],r=o(n);return typeof r=="function"&&(r.prototype=r.prototype||{},Object.defineProperties(r,{__rrweb_original__:{enumerable:!1,value:n}})),t[e]=r,()=>{t[e]=n}}catch(n){return()=>{}}}const j={ownerDocument:N,childNodes:m,parentNode:S,parentElement:w,textContent:O,contains:P,getRootNode:A,host:R,styleSheets:E,shadowRoot:M,querySelector:_,querySelectorAll:C,mutationObserver:q,patch:U};exports.childNodes=m;exports.contains=P;exports.default=j;exports.getRootNode=A;exports.getUntaintedAccessor=i;exports.getUntaintedMethod=y;exports.getUntaintedPrototype=p;exports.host=R;exports.isAngularZonePresent=v;exports.mutationObserverCtor=q;exports.ownerDocument=N;exports.parentElement=w;exports.parentNode=S;exports.patch=U;exports.querySelector=_;exports.querySelectorAll=C;exports.shadowRoot=M;exports.styleSheets=E;exports.textContent=O;
15
+ if (typeof module.exports == "object" && typeof exports == "object") {
16
+ var __cp = (to, from, except, desc) => {
17
+ if ((from && typeof from === "object") || typeof from === "function") {
18
+ for (let key of Object.getOwnPropertyNames(from)) {
19
+ if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)
20
+ Object.defineProperty(to, key, {
21
+ get: () => from[key],
22
+ enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,
23
+ });
24
+ }
25
+ }
26
+ return to;
27
+ };
28
+ module.exports = __cp(module.exports, exports);
29
+ }
30
+ return module.exports;
31
+ }))
32
+ //# sourceMappingURL=utils.umd.min.cjs.map