fix: move patch function into utils to improve bundling (#1631)

* fix: move patch function into utils to improve bundling

---------

Co-authored-by: pauldambra <pauldambra@users.noreply.github.com>
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
This commit is contained in:
Paul D'Ambra
2025-02-06 15:10:50 +00:00
committed by GitHub
parent 3e9e42fdfd
commit 88ea2d05c1
13 changed files with 71 additions and 54 deletions

View File

@@ -0,0 +1,8 @@
---
"@rrweb/rrweb-plugin-console-record": patch
"@rrweb/record": patch
"rrweb": patch
"@rrweb/utils": patch
---
Move patch function into @rrweb/utils to improve bundling

View File

@@ -53,6 +53,7 @@
"puppeteer": "^20.9.0"
},
"peerDependencies": {
"rrweb": "^2.0.0-alpha.18"
"rrweb": "^2.0.0-alpha.18",
"@rrweb/utils": "^2.0.0-alpha.18"
}
}

View File

@@ -1,5 +1,5 @@
import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';
import { utils } from 'rrweb';
import { patch } from '@rrweb/utils';
import { ErrorStackParser, StackFrame } from './error-stack-parser';
import { stringify } from './stringify';
@@ -183,7 +183,7 @@ function initLogObserver(
};
}
// replace the logger.{level}. return a restore function
return utils.patch(
return patch(
_logger,
level,
(original: (...args: Array<unknown>) => void) => {

View File

@@ -56,7 +56,8 @@
},
"dependencies": {
"@rrweb/types": "^2.0.0-alpha.18",
"rrweb": "^2.0.0-alpha.18"
"rrweb": "^2.0.0-alpha.18",
"@rrweb/utils": "^2.0.0-alpha.18"
},
"browserslist": [
"supports es6-class"

View File

@@ -11,6 +11,9 @@
},
{
"path": "../rrweb"
},
{
"path": "../utils"
}
]
}

View File

@@ -15,10 +15,10 @@ import {
getWindowWidth,
isBlocked,
legacy_isTouchEvent,
patch,
StyleSheetMirror,
nowTimestamp,
} from '../utils';
import { patch } from '@rrweb/utils';
import type { observerParam, MutationBufferParam } from '../types';
import {
IncrementalSource,

View File

@@ -5,7 +5,8 @@ import {
type IWindow,
type listenerHandler,
} from '@rrweb/types';
import { hookSetter, isBlocked, patch } from '../../../utils';
import { hookSetter, isBlocked } from '../../../utils';
import { patch } from '@rrweb/utils';
import { serializeArgs } from './serialize-args';
export default function initCanvas2DMutationObserver(

View File

@@ -1,6 +1,7 @@
import type { ICanvas } from 'rrweb-snapshot';
import type { blockClass, IWindow, listenerHandler } from '@rrweb/types';
import { isBlocked, patch } from '../../../utils';
import { isBlocked } from '../../../utils';
import { patch } from '@rrweb/utils';
function getNormalizedContextName(contextType: string) {
return contextType === 'experimental-webgl' ? 'webgl' : contextType;

View File

@@ -6,7 +6,8 @@ import {
type IWindow,
type listenerHandler,
} from '@rrweb/types';
import { hookSetter, isBlocked, patch } from '../../../utils';
import { hookSetter, isBlocked } from '../../../utils';
import { patch } from '@rrweb/utils';
import { saveWebGLVar, serializeArgs } from './serialize-args';
function patchGLPrototype(

View File

@@ -9,10 +9,10 @@ import {
initScrollObserver,
initAdoptedStyleSheetObserver,
} from './observer';
import { patch, inDom } from '../utils';
import { inDom } from '../utils';
import type { Mirror } from 'rrweb-snapshot';
import { isNativeShadowDom } from 'rrweb-snapshot';
import dom from '@rrweb/utils';
import dom, { patch } from '@rrweb/utils';
type BypassOptions = Omit<
MutationBufferParam,

View File

@@ -127,49 +127,6 @@ export function hookSetter<T>(
return () => hookSetter(target, key, original || {}, true);
}
// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts
export function patch(
source: { [key: string]: any },
name: string,
replacement: (...args: unknown[]) => unknown,
): () => void {
try {
if (!(name in source)) {
return () => {
//
};
}
const original = source[name] as () => unknown;
const wrapped = replacement(original);
// Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
// otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
if (typeof wrapped === 'function') {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
wrapped.prototype = wrapped.prototype || {};
Object.defineProperties(wrapped, {
__rrweb_original__: {
enumerable: false,
value: original,
},
});
}
source[name] = wrapped;
return () => {
source[name] = original;
};
} catch {
return () => {
//
};
// This can throw if multiple fill happens on a global object like XMLHttpRequest
// Fixes https://github.com/getsentry/sentry-javascript/issues/2043
}
}
// guard against old third party libraries which redefine Date.now
let nowTimestamp = Date.now;

View File

@@ -222,6 +222,49 @@ export function mutationObserverCtor(): (typeof MutationObserver)['prototype']['
return getUntaintedPrototype('MutationObserver').constructor;
}
// copy from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts
export function patch(
source: { [key: string]: any },
name: string,
replacement: (...args: unknown[]) => unknown,
): () => void {
try {
if (!(name in source)) {
return () => {
//
};
}
const original = source[name] as () => unknown;
const wrapped = replacement(original);
// Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
// otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
if (typeof wrapped === 'function') {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
wrapped.prototype = wrapped.prototype || {};
Object.defineProperties(wrapped, {
__rrweb_original__: {
enumerable: false,
value: original,
},
});
}
source[name] = wrapped;
return () => {
source[name] = original;
};
} catch {
return () => {
//
};
// This can throw if multiple fill happens on a global object like XMLHttpRequest
// Fixes https://github.com/getsentry/sentry-javascript/issues/2043
}
}
export default {
childNodes,
parentNode,
@@ -235,4 +278,5 @@ export default {
querySelector,
querySelectorAll,
mutationObserver: mutationObserverCtor,
patch,
};

View File

@@ -1,5 +1,5 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
# yarn lockfile v1
"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1":