Warn instead of fail on exceptions thrown from postcss (#1580)

* postcss was introduced in #1458 for use within adaptCssForReplay
* #1600 fixes the main case where invalid css could be introduced when if valid css from the output of `sheet.cssRules` was split according to how it was split across text nodes of the <style>
* the guard introduced here is still useful as we likely in future will switch to capturing the raw stylesheet contents (both <style> and <link>), at which point we will be much less confident of getting valid css
This commit is contained in:
John Henry Gunther
2025-02-06 08:33:12 -05:00
committed by GitHub
parent a6893f73ab
commit 47a7c3faa6
3 changed files with 30 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
---
"rrweb-snapshot": patch
---
Handle exceptions thrown from postcss when calling adaptCssForReplay

View File

@@ -62,11 +62,17 @@ export function adaptCssForReplay(cssText: string, cache: BuildCache): string {
const cachedStyle = cache?.stylesWithHoverClass.get(cssText);
if (cachedStyle) return cachedStyle;
const ast: { css: string } = postcss([
mediaSelectorPlugin,
pseudoClassPlugin,
]).process(cssText);
const result = ast.css;
let result = cssText;
try {
const ast: { css: string } = postcss([
mediaSelectorPlugin,
pseudoClassPlugin,
]).process(cssText);
result = ast.css;
} catch (error) {
console.warn('Failed to adapt css for replay', error);
}
cache?.stylesWithHoverClass.set(cssText, result);
return result;
}

View File

@@ -3,7 +3,7 @@
*/
import * as fs from 'fs';
import * as path from 'path';
import { beforeEach, describe, expect as _expect, it } from 'vitest';
import { beforeEach, describe, expect as _expect, it, vi } from 'vitest';
import {
adaptCssForReplay,
buildNodeWithSN,
@@ -270,4 +270,17 @@ ul li.specified c.\\:hover img {
should_not_modify,
);
});
it('handles exceptions from postcss when calling adaptCssForReplay', () => {
const consoleWarnSpy = vi
.spyOn(console, 'warn')
.mockImplementation(() => {});
// trigger CssSyntaxError by passing invalid css
const cssText = 'a{';
adaptCssForReplay(cssText, cache);
expect(consoleWarnSpy).toHaveBeenLastCalledWith(
'Failed to adapt css for replay',
expect.any(Error),
);
});
});