Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add new css parser - postcss #1458

Merged
merged 35 commits into from
Jun 27, 2024
Merged

Conversation

daibhin
Copy link
Contributor

@daibhin daibhin commented Apr 24, 2024

rrweb-snapshot parses stylesheets to adapt the CSS for playback

In certain cases the parsing wasn't always correct:
PostHog/posthog#21427
#1379

Which led to improved CSS selector efforts first included in [email protected] (#1401)

Sadly this caused playback issues that consumed 100% CPU and froze playback
PostHog/posthog#21791
profiler


CSS parsing is performed in the https://github.com/rrweb-io/rrweb/blob/master/packages/rrweb-snapshot/src/css.ts which was pulled from https://github.com/reworkcss/css (which hasn't been updated in over 3 years)

I propose moving to https://github.com/csstree/csstree which creates an actual AST which can be used to effectively debug via https://astexplorer.net

I couldn't figure out some import issues in the test/integration.test.ts

Evaluation failed: ReferenceError: require is not defined

All test/css.test.ts tests still pass which confirms this is as good as the trickiest cases previously handled without any of the slowness introduced in #1401

Copy link

changeset-bot bot commented Apr 24, 2024

⚠️ No Changeset found

Latest commit: cdede94

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

}
getSelectors(ast.stylesheet);
const mediaFeatures = css
.findAll(newAst, (node) => node.type === 'MediaFeature')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly some further optimizations we could even make here by using the css.walk method to only traverse the AST once (rather than twice like I assume findAll is doing)

@@ -1,6 +1,6 @@
{
"name": "rrweb-snapshot",
"version": "2.0.0-alpha.13",
"version": "2.0.0-alpha.12",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should probably be 13?

@eoghanmurray
Copy link
Contributor

This is great and something I thought we might get to 'some day' after the recent fixes to css.ts.

Would you be able to post a before/after of the built file sizes from this change; i.e.

$ ls -al packages/rrweb/dist/*.js packages/rrweb/dist/record/*.js packages/rrweb/dist/replay/*.js

One of the reasons css.ts was ported over was so that we could tree shake it a bit.

@daibhin
Copy link
Contributor Author

daibhin commented Apr 29, 2024

Something isn't right here because I'm getting the same values when running yarn build:dev && ls -al packages/rrweb/dist/*.js packages/rrweb/dist/record/*.js packages/rrweb/dist/replay/*.js on both branches.

Possibly need to fix the import errors I mentioned in the description first 🤔 🤷 Scratch that I got it working at the repo root

Before

-rw-r--r--@ 7 david  staff   26568 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record-pack.js
-rw-r--r--@ 7 david  staff   10418 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record-pack.min.js
-rw-r--r--@ 7 david  staff  165350 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record.js
-rw-r--r--@ 7 david  staff   68811 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record.min.js
-rw-r--r--@ 7 david  staff  209951 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay-unpack.js
-rw-r--r--@ 7 david  staff   92849 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay-unpack.min.js
-rw-r--r--@ 7 david  staff  193751 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay.js
-rw-r--r--@ 7 david  staff   88049 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay.min.js
-rw-r--r--@ 7 david  staff  401587 29 Apr 18:24 packages/rrweb/dist/rrweb-all.js
-rw-r--r--@ 7 david  staff  170294 29 Apr 18:24 packages/rrweb/dist/rrweb-all.min.js
-rw-r--r--@ 7 david  staff  351097 29 Apr 18:24 packages/rrweb/dist/rrweb.js
-rw-r--r--@ 7 david  staff  152936 29 Apr 18:24 packages/rrweb/dist/rrweb.min.js

After

-rwxrwxr-x@ 3 david  staff   26584 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record-pack.js
-rwxrwxr-x@ 3 david  staff   10437 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record-pack.min.js
-rwxrwxr-x@ 3 david  staff  157698 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record.js
-rwxrwxr-x@ 3 david  staff   68728 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record.min.js
-rwxrwxr-x@ 3 david  staff  191575 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay-unpack.js
-rwxrwxr-x@ 3 david  staff   87904 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay-unpack.min.js
-rwxrwxr-x@ 3 david  staff  175375 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay.js
-rwxrwxr-x@ 3 david  staff   83086 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay.min.js
-rwxrwxr-x@ 3 david  staff  375719 30 Apr 16:33 packages/rrweb/dist/rrweb-all.js
-rwxrwxr-x@ 3 david  staff  165248 30 Apr 16:33 packages/rrweb/dist/rrweb-all.min.js
-rwxrwxr-x@ 3 david  staff  325229 30 Apr 16:34 packages/rrweb/dist/rrweb.js
-rwxrwxr-x@ 3 david  staff  147850 30 Apr 16:34 packages/rrweb/dist/rrweb.min.js

@daibhin
Copy link
Contributor Author

daibhin commented Apr 30, 2024

In a significant update here I moved to using postcss once I figured out how their plugin system works. AST explorer was particularly useful in writing the plugins needed. Here's an example for the media selector: https://astexplorer.net/#/gist/244e2fb4da940df52bf0f4b94277db44/7ccd8e85c2a64282f021b34717b0076c418f61b1

This massively simplifies the adaptCssForReplay method and is extensible to the point that we can easily improve it by adding more custom plugins.

I've moved around some test files to better separate concerns. Some of the tests were "testing the framework" given they had been copied over from https://github.com/reworkcss/css/blob/master/test/parse.js. I removed any that were no longer relevant but left any of the cases added in https://github.com/rrweb-io/rrweb/pull/1440/files#diff-ca07555d1c1965f9c7ef3b5df3772a19953138b8eac62deb7786e549b25b455d as we know they've specifically broken in the past and we would like to avoid breaking them in the future

@eoghanmurray
Copy link
Contributor

Super! What sort of filesize numbers are there with the postcss version?

@daibhin
Copy link
Contributor Author

daibhin commented May 3, 2024

Sorry @eoghanmurray, probably wasn't clear but I updated my earlier comment with latest build numbers having run yarn build:dev && ls -al packages/rrweb/dist/*.js packages/rrweb/dist/record/*.js packages/rrweb/dist/replay/*.js

master

-rw-r--r--@ 7 david  staff   26568 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record-pack.js
-rw-r--r--@ 7 david  staff   10418 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record-pack.min.js
-rw-r--r--@ 7 david  staff  165350 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record.js
-rw-r--r--@ 7 david  staff   68811 29 Apr 18:24 packages/rrweb/dist/record/rrweb-record.min.js
-rw-r--r--@ 7 david  staff  209951 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay-unpack.js
-rw-r--r--@ 7 david  staff   92849 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay-unpack.min.js
-rw-r--r--@ 7 david  staff  193751 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay.js
-rw-r--r--@ 7 david  staff   88049 29 Apr 18:24 packages/rrweb/dist/replay/rrweb-replay.min.js
-rw-r--r--@ 7 david  staff  401587 29 Apr 18:24 packages/rrweb/dist/rrweb-all.js
-rw-r--r--@ 7 david  staff  170294 29 Apr 18:24 packages/rrweb/dist/rrweb-all.min.js
-rw-r--r--@ 7 david  staff  351097 29 Apr 18:24 packages/rrweb/dist/rrweb.js
-rw-r--r--@ 7 david  staff  152936 29 Apr 18:24 packages/rrweb/dist/rrweb.min.js

fix/css-selectors

-rwxrwxr-x@ 3 david  staff   26584 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record-pack.js
-rwxrwxr-x@ 3 david  staff   10437 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record-pack.min.js
-rwxrwxr-x@ 3 david  staff  157698 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record.js
-rwxrwxr-x@ 3 david  staff   68728 30 Apr 16:33 packages/rrweb/dist/record/rrweb-record.min.js
-rwxrwxr-x@ 3 david  staff  191575 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay-unpack.js
-rwxrwxr-x@ 3 david  staff   87904 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay-unpack.min.js
-rwxrwxr-x@ 3 david  staff  175375 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay.js
-rwxrwxr-x@ 3 david  staff   83086 30 Apr 16:33 packages/rrweb/dist/replay/rrweb-replay.min.js
-rwxrwxr-x@ 3 david  staff  375719 30 Apr 16:33 packages/rrweb/dist/rrweb-all.js
-rwxrwxr-x@ 3 david  staff  165248 30 Apr 16:33 packages/rrweb/dist/rrweb-all.min.js
-rwxrwxr-x@ 3 david  staff  325229 30 Apr 16:34 packages/rrweb/dist/rrweb.js
-rwxrwxr-x@ 3 david  staff  147850 30 Apr 16:34 packages/rrweb/dist/rrweb.min.js

@eoghanmurray eoghanmurray changed the title feat: add new css parser feat: add new css parser - postcss May 7, 2024
@@ -9,6 +9,9 @@ import {
} from './types';
import { isElement, Mirror, isNodeMetaEqual } from './utils';

// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires
const postcss = require('postcss');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with the various import methods, but feel this needs a bit of an explanation as to why you are doing it this way

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is causing tests to fail with require is not defined

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it that we need a typescript version of https://github.com/giuseppeg/postcss-pseudo-classes
?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This require business might be fixed with this PR: #1033

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the heads up @Juice10. I've been meaning to get back to this PR but have had some vacation recently. The good news is that this seems to have resolved all known CSS issues for us. I can hold off until the Vite changes are merged if that is imminent

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@daibhin, PR has been merged, although what you have done (replacing require by import) seems perfectly good

@eoghanmurray
Copy link
Contributor

eoghanmurray commented May 8, 2024

Hopefully the following doesn't derail the conversation, and even if we go ahead with the following, that doesn't detract from the worth of the current PR...

So okay I just had a thought; all this CSS processing is on the replay side, right?
I'm wondering why we don't just iterate over the final sheet.rules directly after the stylesheet has been rendered. We will be rendering it as an inline <style> so the .sheet.rules will be accessible. I don't think we'd need any 3rd party library for that approach, and it would have another advantage in that we could apply the hover classes to stylesheets that are only referenced in the recording (assuming the .sheet.rules are accessible). I'm planning to do this approach anyway so that we can apply our hover classes to CDN stylesheets that are currently recorded only by reference — if you replay the with crossorigin="anonymous" present, then it's possible to access and modify the rules for the sheet. If that succeeds, it could enable further paring back on what needs to be inlined at record time; we could avoid inlining anything that has a 'versioned' url and a permanent web presence.

===

edit: I've drafted this up in #1480

Copy link
Contributor

@eoghanmurray eoghanmurray left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Broadly approve but have a few questions before merging.

},
};

// Adapted from https://github.com/giuseppeg/postcss-pseudo-classes/blob/master/index.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, and I think I questioned somewhere whether we needed to import this.

I'm having some doubts now though, as just notice the following is possible with that plugin:

  restrictTo: ['hover'],

did you consider that?
This approach of copying over a subset of the code has it's attractions too.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I considered adding the package but thought it easier just to copy the code. When I inlined it there were a bunch of options we didn't really need e.g. restrictTo so just simplified the whole thing down. We can always go back and add the original in future, but I chose to go with the simpler (no import / no extra options) until we knew if we needed any more

value: val ? trim(val[0]).replace(commentre, '') : '',
});
selectorParts.forEach(function (selectorPart) {
const pseudos = selectorPart.match(/::?([^:]+)/g);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could possibly be more specific and include the hover string here given we know that's what we will be matching against

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as in that's the only one we need to support

Copy link
Contributor Author

@daibhin daibhin Jun 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This actually finds all pseudo elements on a selector, not just the hover. I simplified a different regex down in https://github.com/rrweb-io/rrweb/pull/1458/files#diff-8561a438ce9ce73d7e38ce75f7971111e91ea0365bf4588a82620655d8fc8e14R55

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did that commit make it in to the merge? I can't see anything by following the link above? I'm still seeing const pseudos = selectorPart.match(/::?([^:]+)/g); in current version

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I wrote up a simplified version in #1535, which I'm just looking at as it has a failing test; however I'm not so sure that the test failure isn't more correct!

We added the test in question in #1440 and it looks like the following:

body > ul :is(li:not(:first-of-type) a:hover, li:not(:first-of-type).active a) {background: red;}

The focus then was on ensuring that the above wasn't parsed as two separate selectors because of the internal comma, however that hasn't broken, but I think we missed that there was also a :hover in there which should mean that the whole selector should be duplicated (which is how the test fails).

In the version from this PR, everything between the brackets of :is is bundled in with the :is, so the internal :hover is effectively ignored. I haven't investigated why it was ignored previously. I'll duplicate this comment over in #1535 if you'd prefer to continue conversation there.

packages/rrweb-snapshot/test/css.test.ts Outdated Show resolved Hide resolved
@daibhin
Copy link
Contributor Author

daibhin commented Jun 26, 2024

@Juice10 thanks for fixing up the imports. Do you know if the failing test is related to my changes somehow?

Example:
 FAIL  test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
 ❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
 ❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
 ❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
 ❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
 ❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24
@Juice10
Copy link
Contributor

Juice10 commented Jun 26, 2024

@daibhin failing test was for 2872d0e was due to an upgraded package, thats fixed now (by locking the package version). The failure for c7153b7 seems to be due to jest being extended where we switched over to vitest. I just fixed that issue, but it looks like a chunk of the :hover tests are failing (you'll see that soon for 9df9946 )

Copy link
Contributor

@Juice10 Juice10 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks really good, and is so much easier to adapt!

@Juice10 Juice10 merged commit 89ae4d2 into rrweb-io:master Jun 27, 2024
6 checks passed
jeffdnguyen pushed a commit to pendo-io/rrweb that referenced this pull request Jul 29, 2024
* feat: add new css parser

* make selectors change

* selectors and tests

* media changes

* remove old css references

* better variable name

* use postcss and port tests

* fix media test

* inline plugins

* fix failing multiline selector

* correct test result

* move tests to correct file

* cleanup all tests

* remove unused css-tree

* update bundle

* cleanup dependencies

* revert config files to master

* remove d.ts files

* update snapshot

* reset rebuilt test

* apply fuzzy css matching

* remove extra test

* Fix imports

* Newer versions of nswapi break rrdom-nodejs tests.
Example:
 FAIL  test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
 ❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
 ❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
 ❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
 ❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
 ❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24

* Migrate from jest to vitest

* Order of selectors has changed with postcss

* Remove unused eslint

---------

Co-authored-by: Justin Halsall <[email protected]>
jeffdnguyen pushed a commit to pendo-io/rrweb that referenced this pull request Jul 29, 2024
* feat: add new css parser

* make selectors change

* selectors and tests

* media changes

* remove old css references

* better variable name

* use postcss and port tests

* fix media test

* inline plugins

* fix failing multiline selector

* correct test result

* move tests to correct file

* cleanup all tests

* remove unused css-tree

* update bundle

* cleanup dependencies

* revert config files to master

* remove d.ts files

* update snapshot

* reset rebuilt test

* apply fuzzy css matching

* remove extra test

* Fix imports

* Newer versions of nswapi break rrdom-nodejs tests.
Example:
 FAIL  test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
 ❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
 ❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
 ❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
 ❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
 ❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24

* Migrate from jest to vitest

* Order of selectors has changed with postcss

* Remove unused eslint

---------

Co-authored-by: Justin Halsall <[email protected]>
Vadman97 added a commit to highlight/highlight that referenced this pull request Aug 20, 2024
## Summary

rrweb-io/rrweb#1458 introduced issues with
certain customers' applications such as:
```js
Uncaught CssSyntaxError: <css input>:1778:83: Unknown word
Uncaught CssSyntaxError: <css input>:1:65502: Unknown word
Uncaught CssSyntaxError: <css input>:1:2: Unclosed block
```

example of such a session:
https://app.highlight.io/92422/sessions/qGaSpGVNh4Ewqj8k23lNC5zNtcB1
affected highlight.run clients are >=9.1.5 with certain bundled CSS

this may also affect the replayer so the new frontend usage of rrweb is
affected

## How did you test this change?

fixes playback of [session that used to not
play](https://app.highlight.io/92422/sessions/qGaSpGVNh4Ewqj8k23lNC5zNtcB1)
<img width="1487" alt="Screenshot 2024-08-19 at 15 54 49"
src="https://github.com/user-attachments/assets/305779eb-6ee4-489f-999c-3c608f04d86b">

new client build working
<img width="1403" alt="Screenshot 2024-08-19 at 16 07 24"
src="https://github.com/user-attachments/assets/f6a46f8f-827f-42b0-acc2-cd01fc2ae249">

## Are there any deployment considerations?

new changeset

## Does this work require review from our design team?

no
Vadman97 added a commit to highlight/highlight that referenced this pull request Aug 20, 2024
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and publish to npm
yourself or [setup this action to publish
automatically](https://github.com/changesets/action#with-publishing). If
you're not ready to do a release yet, that's fine, whenever you add more
changesets to main, this PR will be updated.


# Releases
## [email protected]

### Patch Changes

-   262a073: revert postcss changes to css parsing in rrweb
    <rrweb-io/rrweb#1458> introduced
    a new CSS parser which causes issues with certain large CSS files

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]
    -   @highlight-run/[email protected]
    -   @highlight-run/[email protected]

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]
    -   @highlight-run/[email protected]
    -   @highlight-run/[email protected]

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Vadim Korolik <[email protected]>
@daibhin daibhin deleted the fix/css-selectors branch October 14, 2024 11:30
jxiwang pushed a commit to amplitude/rrweb that referenced this pull request Oct 22, 2024
* feat: add new css parser

* make selectors change

* selectors and tests

* media changes

* remove old css references

* better variable name

* use postcss and port tests

* fix media test

* inline plugins

* fix failing multiline selector

* correct test result

* move tests to correct file

* cleanup all tests

* remove unused css-tree

* update bundle

* cleanup dependencies

* revert config files to master

* remove d.ts files

* update snapshot

* reset rebuilt test

* apply fuzzy css matching

* remove extra test

* Fix imports

* Newer versions of nswapi break rrdom-nodejs tests.
Example:
 FAIL  test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
 ❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
 ❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
 ❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
 ❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
 ❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24

* Migrate from jest to vitest

* Order of selectors has changed with postcss

* Remove unused eslint

---------

Co-authored-by: Justin Halsall <[email protected]>
ShayMalchi added a commit to SaolaAI/rrweb that referenced this pull request Nov 6, 2024
* Skip mask check on leaf elements (rrweb-io#1512)

* Minor fixup for rrweb-io#1349; the 'we can avoid the check on leaf elements' optimisation wasn't being applied as `n.childNodes` was always truthy even when there were no childNodes.

Changing it to `n.childNodes.length` directly there (see rrweb-io#1402) actually caused a bug as during a mutation, we serialize the text node directly, and need to jump to the parentElement to do the check.
This is why I've reimplemented this optimisation inside `needMaskingText` where we are already had an `isElement` test

Thanks to @Paulhejia (https://github.com/Paulhejia/rrweb/) for spotting that `Boolean(n.childNodes)` is aways true.

* Assuming all jest should have been removed in rrweb-io#1033 (rrweb-io#1511)

* all references to jest should have been removed in rrweb-io#1033
* clarify that `cross-env` is used to ensure that environmental variables get applied on Windows (previous usage of cross-env was removed in rrweb-io#1033)

* Fix async assertions in test files (rrweb-io#1510)

* fix: await assertSnapshot in test files for async assertions

* Fix maskInputFn is ignored during the creation of the full snapshot (rrweb-io#1386)

Fix that the optional `maskInputFn` was being accidentally ignored during the creation of the full snapshot

* Improve development tooling (rrweb-io#1516)

- Running `yarn build` in a `packages/*/` directory will trigger build of all dependencies too, and cache them if possible.
- Fix for `yarn dev` breaking for `rrweb` package whenever changing files in `rrweb` package
- Update typescript, turbo, vite and vite-plugin-dts
- Require `workspaces-to-typescript-project-references` from `prepublish`

* Version Packages (alpha) (rrweb-io#1513)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Keep all packages in sync

* feat: add new css parser - postcss (rrweb-io#1458)

* feat: add new css parser

* make selectors change

* selectors and tests

* media changes

* remove old css references

* better variable name

* use postcss and port tests

* fix media test

* inline plugins

* fix failing multiline selector

* correct test result

* move tests to correct file

* cleanup all tests

* remove unused css-tree

* update bundle

* cleanup dependencies

* revert config files to master

* remove d.ts files

* update snapshot

* reset rebuilt test

* apply fuzzy css matching

* remove extra test

* Fix imports

* Newer versions of nswapi break rrdom-nodejs tests.
Example:
 FAIL  test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
 ❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
 ❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
 ❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
 ❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
 ❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24

* Migrate from jest to vitest

* Order of selectors has changed with postcss

* Remove unused eslint

---------

Co-authored-by: Justin Halsall <[email protected]>

* fix: console assert only logs when arg 0 is falsy (rrweb-io#1530)

* fix: console assert only logs when arg 0 is falsy

* [Feature] Include takeFullSnapshot function in rrweb (rrweb-io#1527)

* export takeFullSnapshot function in rrweb

* chore: reduce flakey test due to '[vite] connected' message (rrweb-io#1525)

* fix: duplicate textContent for style element cause incremental style mutation invalid (rrweb-io#1417)

fix style element corner case
 - historically we have recorded duplicated css content in certain cases (demonstrated by the attached replayer test). This fix ensures that the replayer doesn't doubly add the content, which can cause problems when further mutations occur
---------
Review and further tests contributed by: Eoghan Murray <[email protected]>

* Added support for deprecated addRule & removeRule methods (rrweb-io#1515)

* Added support for deprecated addRule & removeRule methods

* Respect addRule default value

* fix: nested stylesheets should have absolute URLs (rrweb-io#1533)

* Replace relative URLs with absolute URLs when stringifying stylesheets

* Add test to show desired behavior for imported stylesheets from seperate directory

* Rename `absoluteToStylesheet` to `absolutifyURLs` and call it once after stringifying imported stylesheet

* Don't create the intermediary array of the spread operator

* Formalize that `stringifyRule` should expect a sheet href

* Ensure a <style> element can also import and gets it's url absolutized

* Handle case where non imported stylesheet has relative urls that need to be absolutified

* Clarify in test files where jpegs are expected to appear in absolutified urls

* Move absolutifyURLs call for import rules out of trycatch

* Add a benchmarking test for stringifyStylesheet

* Avoid the duplication on how to fall back

---------

Co-authored-by: Eoghan Murray <[email protected]>
Co-authored-by: eoghanmurray <[email protected]>

* Support top-layer <dialog> recording & replay (rrweb-io#1503)

* chore: its important to run `yarn build:all` before running `yarn dev`

* feat: trigger showModal from rrdom and rrweb

* feat: Add support for replaying modal and non modal dialog elements

* chore: Update dev script to remove CLEAR_DIST_DIR flag

* Get modal recording and replay working

* DRY up dialog test and dedupe snapshot images

* feat: Refactor dialog test to use updated attribute name

* feat: Update dialog test to include rr_open attribute

* chore: Add npm dependency [email protected]

* Add more test cases for dialog

* Clean up naming

* Refactor dialog open code

* Revert changed code that doesn't do anything

* Add documentation for unimplemented type

* chore: Remove unnecessary comments in dialog.test.ts

* rename rr_open to rr_openMode

* Replace todo with a skipped test

* Add better logging for CI

* Rename rr_openMode to rr_open_mode

rrdom downcases all attribute names which made `rr_openMode` tricky to deal with

* Remove unused images

* Move after iframe append based on @YunFeng0817's comment
rrweb-io#1503 (comment)

* Remove redundant dialog handling from rrdom.

rrdom already handles dialog element creation it's self

* Rename variables for dialog handling in rrweb replay module

* Update packages/rrdom/src/document.ts

---------

Co-authored-by: Eoghan Murray <[email protected]>

* Added session downloader for chrome extension (rrweb-io#1522)

* Added session downloader for chrome extension

- The session list now has a button to download sessions as .json files for use with rrweb-player
- Improved styling for the delete and download buttons

* Reverse monkey patch built in methods to support LWC (rrweb-io#1509)

* Get around monkey patched Nodes

* inlineImages: Setting of `image.crossOrigin` is not always necessary (rrweb-io#1468)

Setting of the `crossorigin` attribute is not necessary for same-origin images, and causes an immediate image reload (albeit from cache) necessitating the use of a load event listener which subsequently mutates the snapshot.  This change allows us to  avoid the mutation of the snapshot for the same-origin case.

* Modify inlineImages test to remove delay and show that we can inline images without mutation

* Add an explicit test for when the `image.crossOrigin = 'anonymous';` method is necessary.  Uses a combination of about:blank and our test server to simulate a cross-origin context

* Other test changes: there were some spurious rrweb mutations being generated by the addition of the crossorigin attribute that are now elimnated from the rrweb/__snapshots__/integration.test.ts.snap after this PR - this is good

* Move `childNodes` to @rrweb/utils

* Use non-monkey patched versions of the `childNodes`, `parentNode` `parentElement` `textContent` accessors

* Add getRootNode and contains, and add comprehensive todo list

* chore: Update turbo.json tasks for better build process

* Update caniuse-lite

* chore: Update eslint-plugin-compat to version 5.0.0

* chore: Bump @rrweb/utils version to 2.0.0-alpha.15

* delete unused yarn.lock files

* Set correct @rrweb/utils version in package.json

* Migrate over some accessors to reverse-monkey-patched version

* Add missing functions

* Fix illegal invocation error

* Revert closer to what it was.

This feels incorrect to me (Justin Halsall), but some of the tests break without it so I'm restoring this to be closer to its original here:
https://github.com/rrweb-io/rrweb/blame/cfd686d488a9b88dba6b6f8880b5e4375dd8062c/packages/rrweb-snapshot/src/snapshot.ts#L1011

* Reverse monkey patch all methods LWC hijacks

* Make tests more stable

* Safely handle rrdom nodes in hasShadowRoot

* Remove duplicated test

* Use variable `serverURL` in test

* Use monorepo default browserlist

* Fix typing issue for new typescript

* Remove unused package

* Remove unused code

* Add prefix to reverse-monkey-patched methods to make them more explicit

* Add default exports to @rrweb/utils

---------

Co-authored-by: Eoghan Murray <[email protected]>

* Version Packages (alpha) (rrweb-io#1526)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Single style capture (rrweb-io#1437)

Support a contrived/rare case where a <style> element has multiple text node children (this is usually only possible to recreate via javascript append) ... this PR fixes cases where there are subsequent text mutations to these nodes; previously these would have been lost

* In this scenario, a new CSS comment may now be inserted into the captured `_cssText` for a <style> element to show where it should be broken up into text elements upon replay: `/* rr_split */`
* The new 'can record and replay style mutations' test is the principal way to the problematic scenarios, and is a detailed 'catch-all' test with many checks to cover most of the ways things can fail
* There are new tests for splitting/rebuilding the css using the rr_split marker
* The prior 'dynamic stylesheet' route is now the main route for serializing a stylesheet; dynamic stylesheet were missed out in rrweb-io#1533 but that case is now covered with this PR

This PR was originally extracted from rrweb-io#1475 so the  initial motivation was to change the approach on stringifying <style> elements to do so in a single place.  This is also the motivating factor for always serializing <style> elements via the `_cssText` attribute rather than in it's childNodes; in rrweb-io#1475 we will be delaying populating `_cssText` for performance and instead recorrding them as assets.

Thanks for the detailed review to  Justin Halsall <[email protected]> & Yun Feng <https://github.com/YunFeng0817>

* Simplify the hover replacement function (rrweb-io#1535)

Simplify the hover replacement function, which has been borrowed from postcss-pseudo-classes

Note: 'parses nested commas in selectors correctly' was failing after this PR, however I don't think that the previous behaviour was desirable, so have added a new test to formalize this expectation

* fix some typos in optimize-storage.md (rrweb-io#1565)

* fix some typos in optimize-storage.md

* Update docs/recipes/optimize-storage.md

* Create metal-mugs-mate.md

---------

Co-authored-by: Justin Halsall <[email protected]>

* fix(rrdom): Ignore invalid DOM attributes when diffing (rrweb-io#1561)

* fix(rrdom): Ignore invalid DOM attributes when diffing (rrweb-io#213)

We encountered an issue where replays with invalid attributes (e.g.
`@click`) would break rendering the replay after seeking. The exception
bubbles up to
[here](https://github.com/rrweb-io/rrweb/blob/62093d4385a09eb0980c2ac02d97eea5ce2882be/packages/rrweb/src/replay/index.ts#L270-L279),
which means the replay will continue to play, but the replay mirror will
be incomplete.

Closes https://github.com/getsentry/team-replay/issues/458

* add changeset

* fix(snapshot): dimensions for blocked element not being applied (rrweb-io#1331)

fix for replay of a blocked element when using 'fast forward' (rrdom)

 - Dimensions were not being properly applied when you seek to a position in the replay. Need to use `setProperty` rather than trying to set the width/height directly

* ref: isParentRemoved to cache subtree (rrweb-io#1543)

* ref: isParentRemoved to cache subtree
* ref: cache at insertion too
* ref: remove wrapper function

---------

Co-authored-by: Justin Halsall <[email protected]>

* changeset to 2.0.13

* fix snapshot build

---------

Co-authored-by: Eoghan Murray <[email protected]>
Co-authored-by: Justin Halsall <[email protected]>
Co-authored-by: Alexey Babik <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: David Newell <[email protected]>
Co-authored-by: Paul D'Ambra <[email protected]>
Co-authored-by: Christopher Arredondo <[email protected]>
Co-authored-by: Yun Feng <[email protected]>
Co-authored-by: minja malešević <[email protected]>
Co-authored-by: Jeff Nguyen <[email protected]>
Co-authored-by: eoghanmurray <[email protected]>
Co-authored-by: Arun Kunigiri <[email protected]>
Co-authored-by: Riadh Mouamnia <[email protected]>
Co-authored-by: Billy Vong <[email protected]>
Co-authored-by: Jonas <[email protected]>
Co-authored-by: Shay Malchi <[email protected]>
giraffekey pushed a commit to giraffekey/highlight that referenced this pull request Nov 21, 2024
…t#9186)

## Summary

rrweb-io/rrweb#1458 introduced issues with
certain customers' applications such as:
```js
Uncaught CssSyntaxError: <css input>:1778:83: Unknown word
Uncaught CssSyntaxError: <css input>:1:65502: Unknown word
Uncaught CssSyntaxError: <css input>:1:2: Unclosed block
```

example of such a session:
https://app.highlight.io/92422/sessions/qGaSpGVNh4Ewqj8k23lNC5zNtcB1
affected highlight.run clients are >=9.1.5 with certain bundled CSS

this may also affect the replayer so the new frontend usage of rrweb is
affected

## How did you test this change?

fixes playback of [session that used to not
play](https://app.highlight.io/92422/sessions/qGaSpGVNh4Ewqj8k23lNC5zNtcB1)
<img width="1487" alt="Screenshot 2024-08-19 at 15 54 49"
src="https://github.com/user-attachments/assets/305779eb-6ee4-489f-999c-3c608f04d86b">

new client build working
<img width="1403" alt="Screenshot 2024-08-19 at 16 07 24"
src="https://github.com/user-attachments/assets/f6a46f8f-827f-42b0-acc2-cd01fc2ae249">

## Are there any deployment considerations?

new changeset

## Does this work require review from our design team?

no
giraffekey pushed a commit to giraffekey/highlight that referenced this pull request Nov 21, 2024
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and publish to npm
yourself or [setup this action to publish
automatically](https://github.com/changesets/action#with-publishing). If
you're not ready to do a release yet, that's fine, whenever you add more
changesets to main, this PR will be updated.


# Releases
## [email protected]

### Patch Changes

-   262a073: revert postcss changes to css parsing in rrweb
    <rrweb-io/rrweb#1458> introduced
    a new CSS parser which causes issues with certain large CSS files

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]
    -   @highlight-run/[email protected]
    -   @highlight-run/[email protected]

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]

## @highlight-run/[email protected]

### Patch Changes

-   Updated dependencies [262a073]
    -   [email protected]
    -   @highlight-run/[email protected]
    -   @highlight-run/[email protected]

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Vadim Korolik <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants