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

polyfill flatMap for Chrome < 69 #2822

Merged
merged 1 commit into from
Aug 14, 2023
Merged

polyfill flatMap for Chrome < 69 #2822

merged 1 commit into from
Aug 14, 2023

Conversation

zackkrida
Copy link
Member

Fixes

Fixes #2745 by the sentry bot

Description

Polyfills the Array.prototype.flatMap method so it works in versions of Chrome < 69. This has occurred enough times to warrant the polyfilling.

Testing Instructions

Build locally and confirm the presence of the polyfill in the client bundle by searching for flatMap: and confirming it's there.

We should also see a minuscule increase to the bundle size.

Checklist

  • My pull request has a descriptive title (not a vague title likeUpdate index.md).
  • My pull request targets the default branch of the repository (main) or a parent feature branch.
  • My commit messages follow best practices.
  • My code follows the established code style of the repository.
  • I added or updated tests for the changes I made (if applicable).
  • I added or updated documentation (if applicable).
  • I tried running the project locally and verified that there are no visible errors.
  • I ran the DAG documentation generator (if applicable).

Developer Certificate of Origin

Developer Certificate of Origin
Developer Certificate of Origin
Version 1.1

Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.


Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

@zackkrida zackkrida requested a review from a team as a code owner August 13, 2023 17:56
@github-actions github-actions bot added 🧱 stack: documentation Related to Sphinx documentation 🧱 stack: frontend Related to the Nuxt frontend labels Aug 13, 2023
@openverse-bot openverse-bot added 🟨 priority: medium Not blocking but should be addressed soon 🛠 goal: fix Bug fix 💻 aspect: code Concerns the software code in the repository labels Aug 13, 2023
@github-actions
Copy link

Size Change: +518 B (0%)

Total Size: 868 kB

Filename Size Change
./frontend/.nuxt/dist/client/app.js 122 kB -23 B (0%)
./frontend/.nuxt/dist/client/app.modern.js 113 kB -11 B (0%)
./frontend/.nuxt/dist/client/commons/app.js 90.5 kB +287 B (0%)
./frontend/.nuxt/dist/client/commons/app.modern.js 81.1 kB +318 B (0%)
ℹ️ View Unchanged
Filename Size Change
./frontend/.nuxt/dist/client/238.js 272 B -1 B (0%)
./frontend/.nuxt/dist/client/238.modern.js 277 B 0 B
./frontend/.nuxt/dist/client/239.js 1.85 kB 0 B
./frontend/.nuxt/dist/client/commons/components/v-search-grid/pages/search.js 5.17 kB +1 B (0%)
./frontend/.nuxt/dist/client/commons/components/v-search-grid/pages/search.modern.js 5.61 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/loading-icon.js 728 B -1 B (0%)
./frontend/.nuxt/dist/client/components/loading-icon.modern.js 733 B 0 B
./frontend/.nuxt/dist/client/components/table-sort-icon.js 515 B +1 B (0%)
./frontend/.nuxt/dist/client/components/table-sort-icon.modern.js 519 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-all-results-grid.js 6.61 kB -4 B (0%)
./frontend/.nuxt/dist/client/components/v-all-results-grid.modern.js 6.46 kB 0 B
./frontend/.nuxt/dist/client/components/v-audio-collection.js 4.38 kB -4 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-collection.modern.js 4.26 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-details.js 1.79 kB -2 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-details.modern.js 1.77 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-list.js 1.32 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-list.modern.js 1.31 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-result.js 1 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-result.modern.js 995 B 0 B
./frontend/.nuxt/dist/client/components/v-audio-track-skeleton.js 958 B -2 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-track-skeleton.modern.js 961 B 0 B
./frontend/.nuxt/dist/client/components/v-audio-track.js 5.67 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-audio-track.modern.js 5.63 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-back-to-search-results-link.js 634 B 0 B
./frontend/.nuxt/dist/client/components/v-back-to-search-results-link.modern.js 640 B 0 B
./frontend/.nuxt/dist/client/components/v-bone.js 632 B 0 B
./frontend/.nuxt/dist/client/components/v-bone.modern.js 636 B 0 B
./frontend/.nuxt/dist/client/components/v-box-layout.js 1.33 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-box-layout.modern.js 1.33 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-content-link.js 1.06 kB 0 B
./frontend/.nuxt/dist/client/components/v-content-link.modern.js 1.06 kB 0 B
./frontend/.nuxt/dist/client/components/v-content-page.js 531 B 0 B
./frontend/.nuxt/dist/client/components/v-content-page.modern.js 535 B 0 B
./frontend/.nuxt/dist/client/components/v-content-report-button.js 493 B 0 B
./frontend/.nuxt/dist/client/components/v-content-report-button.modern.js 497 B 0 B
./frontend/.nuxt/dist/client/components/v-content-report-form.js 3.33 kB -5 B (0%)
./frontend/.nuxt/dist/client/components/v-content-report-form.modern.js 3.21 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-content-report-popover.js 3.79 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-content-report-popover.modern.js 3.67 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-copy-button.js 3.99 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-copy-button.modern.js 4 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-copy-license.js 2.27 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-copy-license.modern.js 2.25 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-dmca-notice.js 793 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-dmca-notice.modern.js 797 B 0 B
./frontend/.nuxt/dist/client/components/v-error-image.js 2.41 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-error-image.modern.js 2.38 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-error-section.js 372 B 0 B
./frontend/.nuxt/dist/client/components/v-error-section.modern.js 376 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-external-search-form.js 2 kB 0 B
./frontend/.nuxt/dist/client/components/v-external-search-form.modern.js 1.98 kB -2 B (0%)
./frontend/.nuxt/dist/client/components/v-external-source-list.js 896 B 0 B
./frontend/.nuxt/dist/client/components/v-external-source-list.modern.js 894 B -2 B (0%)
./frontend/.nuxt/dist/client/components/v-full-layout.js 1.57 kB -5 B (0%)
./frontend/.nuxt/dist/client/components/v-full-layout.modern.js 1.57 kB -2 B (0%)
./frontend/.nuxt/dist/client/components/v-grid-skeleton.js 1.52 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-grid-skeleton.modern.js 1.53 kB 0 B
./frontend/.nuxt/dist/client/components/v-hide-button.js 812 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-hide-button.modern.js 815 B +2 B (0%)
./frontend/.nuxt/dist/client/components/v-home-gallery.js 4.28 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-home-gallery.modern.js 4.26 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-homepage-content.js 1.8 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-homepage-content.modern.js 1.77 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-icon-button.js 523 B 0 B
./frontend/.nuxt/dist/client/components/v-icon-button.modern.js 528 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-image-cell.js 1.95 kB 0 B
./frontend/.nuxt/dist/client/components/v-image-cell.modern.js 1.94 kB 0 B
./frontend/.nuxt/dist/client/components/v-image-details.js 1.44 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-image-details.modern.js 1.43 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-image-grid.js 4.41 kB -6 B (0%)
./frontend/.nuxt/dist/client/components/v-image-grid.modern.js 4.3 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-license-tab-panel.js 641 B 0 B
./frontend/.nuxt/dist/client/components/v-license-tab-panel.modern.js 650 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-load-more.js 1.18 kB 0 B
./frontend/.nuxt/dist/client/components/v-load-more.modern.js 1.07 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-media-license.js 930 B -2 B (0%)
./frontend/.nuxt/dist/client/components/v-media-license.modern.js 939 B 0 B
./frontend/.nuxt/dist/client/components/v-media-reuse.js 2.93 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-media-reuse.modern.js 2.91 kB 0 B
./frontend/.nuxt/dist/client/components/v-media-tag.js 416 B 0 B
./frontend/.nuxt/dist/client/components/v-media-tag.modern.js 421 B 0 B
./frontend/.nuxt/dist/client/components/v-modal.js 1 kB 0 B
./frontend/.nuxt/dist/client/components/v-modal.modern.js 996 B 0 B
./frontend/.nuxt/dist/client/components/v-no-results.js 854 B -1 B (0%)
./frontend/.nuxt/dist/client/components/v-no-results.modern.js 857 B 0 B
./frontend/.nuxt/dist/client/components/v-radio.js 1 kB -2 B (0%)
./frontend/.nuxt/dist/client/components/v-radio.modern.js 1.01 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-related-audio.js 824 B 0 B
./frontend/.nuxt/dist/client/components/v-related-audio.modern.js 744 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-related-audio/pages/search/audio.js 4.38 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-related-audio/pages/search/audio.modern.js 4.25 kB +2 B (0%)
./frontend/.nuxt/dist/client/components/v-related-images.js 806 B 0 B
./frontend/.nuxt/dist/client/components/v-related-images.modern.js 719 B 0 B
./frontend/.nuxt/dist/client/components/v-report-desc-form.js 975 B -1 B (0%)
./frontend/.nuxt/dist/client/components/v-report-desc-form.modern.js 981 B 0 B
./frontend/.nuxt/dist/client/components/v-row-layout.js 1.72 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-row-layout.modern.js 1.72 kB -3 B (0%)
./frontend/.nuxt/dist/client/components/v-safety-wall.js 1.31 kB 0 B
./frontend/.nuxt/dist/client/components/v-safety-wall.modern.js 1.32 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-scroll-button.js 891 B 0 B
./frontend/.nuxt/dist/client/components/v-scroll-button.modern.js 891 B 0 B
./frontend/.nuxt/dist/client/components/v-search-grid.js 6.82 kB -4 B (0%)
./frontend/.nuxt/dist/client/components/v-search-grid.modern.js 6.18 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-search-results-title.js 617 B -1 B (0%)
./frontend/.nuxt/dist/client/components/v-search-results-title.modern.js 621 B +1 B (0%)
./frontend/.nuxt/dist/client/components/v-server-timeout.js 302 B 0 B
./frontend/.nuxt/dist/client/components/v-server-timeout.modern.js 306 B 0 B
./frontend/.nuxt/dist/client/components/v-single-result-controls.js 1.36 kB 0 B
./frontend/.nuxt/dist/client/components/v-single-result-controls.modern.js 1.36 kB 0 B
./frontend/.nuxt/dist/client/components/v-sketch-fab-viewer.js 1.01 kB 0 B
./frontend/.nuxt/dist/client/components/v-sketch-fab-viewer.modern.js 915 B 0 B
./frontend/.nuxt/dist/client/components/v-snackbar.js 1.07 kB 0 B
./frontend/.nuxt/dist/client/components/v-snackbar.modern.js 1.07 kB +1 B (0%)
./frontend/.nuxt/dist/client/components/v-sources-table.js 14.4 kB +3 B (0%)
./frontend/.nuxt/dist/client/components/v-sources-table.modern.js 14.4 kB -1 B (0%)
./frontend/.nuxt/dist/client/components/v-warning-suppressor.js 306 B -1 B (0%)
./frontend/.nuxt/dist/client/components/v-warning-suppressor.modern.js 311 B 0 B
./frontend/.nuxt/dist/client/pages/about.js 1.42 kB 0 B
./frontend/.nuxt/dist/client/pages/about.modern.js 1.42 kB 0 B
./frontend/.nuxt/dist/client/pages/audio/_id/index.js 10.7 kB -9 B (0%)
./frontend/.nuxt/dist/client/pages/audio/_id/index.modern.js 10.4 kB 0 B
./frontend/.nuxt/dist/client/pages/feedback.js 1.36 kB 0 B
./frontend/.nuxt/dist/client/pages/feedback.modern.js 1.36 kB 0 B
./frontend/.nuxt/dist/client/pages/image/_id/index.js 8.22 kB -1 B (0%)
./frontend/.nuxt/dist/client/pages/image/_id/index.modern.js 8.04 kB -2 B (0%)
./frontend/.nuxt/dist/client/pages/image/_id/report.js 4.89 kB +4 B (0%)
./frontend/.nuxt/dist/client/pages/image/_id/report.modern.js 4.67 kB +2 B (0%)
./frontend/.nuxt/dist/client/pages/index.js 6.34 kB 0 B
./frontend/.nuxt/dist/client/pages/index.modern.js 6.3 kB -1 B (0%)
./frontend/.nuxt/dist/client/pages/preferences.js 1.32 kB 0 B
./frontend/.nuxt/dist/client/pages/preferences.modern.js 1.31 kB -2 B (0%)
./frontend/.nuxt/dist/client/pages/privacy.js 1.26 kB 0 B
./frontend/.nuxt/dist/client/pages/privacy.modern.js 1.26 kB -1 B (0%)
./frontend/.nuxt/dist/client/pages/search-help.js 1.62 kB -2 B (0%)
./frontend/.nuxt/dist/client/pages/search-help.modern.js 1.61 kB -1 B (0%)
./frontend/.nuxt/dist/client/pages/search.js 2.27 kB +1 B (0%)
./frontend/.nuxt/dist/client/pages/search.modern.js 2.09 kB -2 B (0%)
./frontend/.nuxt/dist/client/pages/search/audio.js 503 B 0 B
./frontend/.nuxt/dist/client/pages/search/audio.modern.js 506 B 0 B
./frontend/.nuxt/dist/client/pages/search/image.js 460 B -1 B (0%)
./frontend/.nuxt/dist/client/pages/search/image.modern.js 463 B 0 B
./frontend/.nuxt/dist/client/pages/search/index.js 315 B +2 B (+1%)
./frontend/.nuxt/dist/client/pages/search/index.modern.js 320 B 0 B
./frontend/.nuxt/dist/client/pages/search/model-3d.js 242 B 0 B
./frontend/.nuxt/dist/client/pages/search/model-3d.modern.js 246 B 0 B
./frontend/.nuxt/dist/client/pages/search/video.js 240 B 0 B
./frontend/.nuxt/dist/client/pages/search/video.modern.js 244 B 0 B
./frontend/.nuxt/dist/client/pages/sources.js 1.53 kB -1 B (0%)
./frontend/.nuxt/dist/client/pages/sources.modern.js 1.54 kB -1 B (0%)
./frontend/.nuxt/dist/client/runtime.js 2.75 kB 0 B
./frontend/.nuxt/dist/client/runtime.modern.js 2.75 kB 0 B
./frontend/.nuxt/dist/client/vendors/app.js 68.3 kB -1 B (0%)
./frontend/.nuxt/dist/client/vendors/app.modern.js 68.1 kB -3 B (0%)

compressed-size-action

@github-actions
Copy link

Full-stack documentation: https://docs.openverse.org/_preview/2822

Please note that GitHub pages takes a little time to deploy newly pushed code, if the links above don't work or you see old versions, wait 5 minutes and try again.

You can check the GitHub pages deployment action list to see the current status of the deployments.

Copy link
Contributor

@obulat obulat left a comment

Choose a reason for hiding this comment

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

Thank you for fixing this! The testing instructions and comments are great.

Copy link
Collaborator

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

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

Rather than manually adding the polyfill (and potentially playing whack-a-mole if other newer APIs get used by dependencies), would it be cleaner to expand our browserslist to accurately reflect the browsers we wish to support (in this case, Chrome < 69)? As I understand it, if we do it that way we might only see a bundle size increase for the "legacy" bundle rather than in all bundles, in addition to the benefit of not needing to manually manage polyfills.

@obulat
Copy link
Contributor

obulat commented Aug 14, 2023

Rather than manually adding the polyfill (and potentially playing whack-a-mole if other newer APIs get used by dependencies), would it be cleaner to expand our browserslist to accurately reflect the browsers we wish to support (in this case, Chrome < 69)? As I understand it, if we do it that way we might only see a bundle size increase for the "legacy" bundle rather than in all bundles, in addition to the benefit of not needing to manually manage polyfills.

Would adding something like "chrome >= 68" to the "browserslist" in package.json also turn into a game of wack-a-mole, though? What if another version of another browser would start causing a different issue?
I looked up the distribution of browsers that cause this error, and there is a wide range of browsers and versions. There's an argument for adding this polyfill specifically because we do get a very clear signal from Sentry that we need to polyfill the flatMap. I am not against your suggestion, @sarayourfriend , I'm just trying to understand the tradeoffs.

Copy link
Collaborator

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

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

I'm going to approve and merge this now, actually, because the bundle size increase is relatively small and browserslist doesn't support complex usage of not ("or not" does not work the way we would think it does). But I will say that if we're adding a polyfill for this, we should consider how our browserslist target is configured. The number of actual clients that are effected by this, based on Chrome numbers on our Plausible, is probably ~200. That 200 clients of 578000. In other words, very few people.

I think a preferrable alternative to always including the flat-map polyfill could be an asynchronous import of https://polyfill.io/v3/polyfill.min.js?version=3.111.0&features=Array.prototype.flatMap%2CArray.prototype.flat. Polyfill.io only returns the polyfills if the requesting browser needs it. We'd add await import('https://polyfill.io/v3/polyfill.min.js?version=3.111.0&features=Array.prototype.flatMap%2CArray.prototype.flat') before using the particular vueuse core composable that requires it.

In any case, we can go with this option for now, but we could open to change it to use a conditional polyfill. Half a kB doesn't seem like heaps when our total bundle size is 868 kB... but that rationale would have us never make bundle size improvements that incrementally add up in the end. From a carbon perspective, on the other hand, it might be better to always send that half a kB rather than creating another request to the polyfill.io CDN. Hard trade offs to make 🤔 I haven't gone ahead and opened the issue because I don't know exactly which action to recommend myself.

@sarayourfriend sarayourfriend merged commit bed62ff into main Aug 14, 2023
60 checks passed
@sarayourfriend sarayourfriend deleted the flat-map-polyfill branch August 14, 2023 01:45
@sarayourfriend
Copy link
Collaborator

Oops, I was writing my approving review while you were writing your comment, Olga. The approach with browserslist I was hoping would work is the not supports array-flat, but it doesn't combine "not" in a flexible enough way. It might be possible to do but I think it would be very complex.

In any case, approved and merged. I think my comment about the actual number of people effected by this is valid though and we should consider strongly what kind of coverage we consider as standard. Our browserslist configuration is actually narrower than the default browsers list config, so there isn't anything to currently suggest we have an intention of very wide client support.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💻 aspect: code Concerns the software code in the repository 🛠 goal: fix Bug fix 🟨 priority: medium Not blocking but should be addressed soon 🧱 stack: documentation Related to Sphinx documentation 🧱 stack: frontend Related to the Nuxt frontend
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

Error when cleaning up vueuse event handlers on Chrome 68 TypeError: n.flatMap is not a function
4 participants