From a3a2414f0ea91c26276728fc7f9d837f81828075 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 9 May 2023 14:55:35 +0200 Subject: [PATCH] Rework polyfills loading (#24907) --- .../base_polyfills.ts} | 22 ++---- .../extra_polyfills.ts} | 0 .../{load_polyfills.js => polyfills/index.ts} | 16 ++--- app/javascript/packs/application.js | 2 +- app/javascript/packs/public.jsx | 6 +- app/javascript/packs/share.jsx | 2 +- package.json | 5 +- tsconfig.json | 1 + yarn.lock | 70 ++----------------- 9 files changed, 25 insertions(+), 99 deletions(-) rename app/javascript/mastodon/{base_polyfills.js => polyfills/base_polyfills.ts} (58%) rename app/javascript/mastodon/{extra_polyfills.js => polyfills/extra_polyfills.ts} (100%) rename app/javascript/mastodon/{load_polyfills.js => polyfills/index.ts} (82%) diff --git a/app/javascript/mastodon/base_polyfills.js b/app/javascript/mastodon/polyfills/base_polyfills.ts similarity index 58% rename from app/javascript/mastodon/base_polyfills.js rename to app/javascript/mastodon/polyfills/base_polyfills.ts index 91bc5d6dc8..2e583f580d 100644 --- a/app/javascript/mastodon/base_polyfills.js +++ b/app/javascript/mastodon/polyfills/base_polyfills.ts @@ -1,26 +1,16 @@ import 'intl'; import 'intl/locale-data/jsonp/en'; -import 'es6-symbol/implement'; -import assign from 'object-assign'; -import values from 'object.values'; -import { decode as decodeBase64 } from './utils/base64'; -import promiseFinally from 'promise.prototype.finally'; - -if (!Object.assign) { - Object.assign = assign; -} - -if (!Object.values) { - values.shim(); -} - -promiseFinally.shim(); +import 'core-js/features/object/assign'; +import 'core-js/features/object/values'; +import 'core-js/features/symbol'; +import 'core-js/features/promise/finally'; +import { decode as decodeBase64 } from '../utils/base64'; if (!HTMLCanvasElement.prototype.toBlob) { const BASE64_MARKER = ';base64,'; Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { - value(callback, type = 'image/png', quality) { + value(callback: BlobCallback, type = 'image/png', quality: any) { const dataURL = this.toDataURL(type, quality); let data; diff --git a/app/javascript/mastodon/extra_polyfills.js b/app/javascript/mastodon/polyfills/extra_polyfills.ts similarity index 100% rename from app/javascript/mastodon/extra_polyfills.js rename to app/javascript/mastodon/polyfills/extra_polyfills.ts diff --git a/app/javascript/mastodon/load_polyfills.js b/app/javascript/mastodon/polyfills/index.ts similarity index 82% rename from app/javascript/mastodon/load_polyfills.js rename to app/javascript/mastodon/polyfills/index.ts index 7909dc4ea3..6d2e5426e4 100644 --- a/app/javascript/mastodon/load_polyfills.js +++ b/app/javascript/mastodon/polyfills/index.ts @@ -10,14 +10,14 @@ function importExtraPolyfills() { return import(/* webpackChunkName: "extra_polyfills" */ './extra_polyfills'); } -function loadPolyfills() { +export function loadPolyfills() { const needsBasePolyfills = !( - HTMLCanvasElement.prototype.toBlob && - window.Intl && - Object.assign && - Object.values && - window.Symbol && - Promise.prototype.finally + 'toBlob' in HTMLCanvasElement.prototype && + 'Intl' in window && + 'assign' in Object && + 'values' in Object && + 'Symbol' in window && + 'finally' in Promise.prototype ); // Latest version of Firefox and Safari do not have IntersectionObserver. @@ -36,5 +36,3 @@ function loadPolyfills() { needsExtraPolyfills && importExtraPolyfills(), ]); } - -export default loadPolyfills; diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 020f2b4a0e..ab87083659 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,5 +1,5 @@ import './public-path'; -import loadPolyfills from '../mastodon/load_polyfills'; +import { loadPolyfills } from '../mastodon/polyfills'; import { start } from '../mastodon/common'; start(); diff --git a/app/javascript/packs/public.jsx b/app/javascript/packs/public.jsx index 21c52fc12a..3c6fd36300 100644 --- a/app/javascript/packs/public.jsx +++ b/app/javascript/packs/public.jsx @@ -1,9 +1,9 @@ import './public-path'; -import loadPolyfills from '../mastodon/load_polyfills'; +import escapeTextContentForBrowser from 'escape-html'; +import { loadPolyfills } from '../mastodon/polyfills'; +import ready from '../mastodon/ready'; import { start } from '../mastodon/common'; -import escapeTextContentForBrowser from 'escape-html'; -import ready from '../mastodon/ready'; import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions'; import 'cocoon-js-vanilla'; import axios from 'axios'; diff --git a/app/javascript/packs/share.jsx b/app/javascript/packs/share.jsx index 97c3c7b0e5..542a2f3ae8 100644 --- a/app/javascript/packs/share.jsx +++ b/app/javascript/packs/share.jsx @@ -1,5 +1,5 @@ import './public-path'; -import loadPolyfills from '../mastodon/load_polyfills'; +import { loadPolyfills } from '../mastodon/polyfills'; import { start } from '../mastodon/common'; import ready from '../mastodon/ready'; import ComposeContainer from '../mastodon/containers/compose_container'; diff --git a/package.json b/package.json index b56b79d9fa..8ca7727225 100644 --- a/package.json +++ b/package.json @@ -52,13 +52,13 @@ "cocoon-js-vanilla": "^1.3.0", "color-blend": "^4.0.0", "compression-webpack-plugin": "^6.1.1", + "core-js": "^3.30.2", "cross-env": "^7.0.3", "css-loader": "^5.2.7", "cssnano": "^6.0.1", "detect-passive-events": "^2.0.3", "dotenv": "^16.0.3", "emoji-mart": "npm:emoji-mart-lazyload@latest", - "es6-symbol": "^3.1.3", "escape-html": "^1.0.3", "express": "^4.18.2", "file-loader": "^6.2.0", @@ -80,14 +80,11 @@ "mini-css-extract-plugin": "^1.6.2", "mkdirp": "^2.1.6", "npmlog": "^7.0.1", - "object-assign": "^4.1.1", - "object.values": "^1.1.6", "path-complete-extname": "^1.0.0", "pg": "^8.5.0", "pg-connection-string": "^2.5.0", "postcss": "^8.4.23", "postcss-loader": "^4.3.0", - "promise.prototype.finally": "^3.1.4", "prop-types": "^15.8.1", "punycode": "^2.3.0", "react": "^16.14.0", diff --git a/tsconfig.json b/tsconfig.json index 09cea2a75f..2c2193d55f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "jsx": "react", "target": "esnext", + "module": "CommonJS", "moduleResolution": "node", "allowJs": true, "noEmit": true, diff --git a/yarn.lock b/yarn.lock index be8ef990fd..380fc480a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4135,6 +4135,11 @@ core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-js@^3.30.2: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" + integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4409,14 +4414,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.6.tgz#865d0b5833d7d8d40f4e5b8a6d76aea3de4725ef" integrity sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw== -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -4967,32 +4964,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5425,13 +5396,6 @@ express@^4.17.1, express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== - dependencies: - type "^2.0.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -8234,11 +8198,6 @@ neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -9284,15 +9243,6 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise.prototype.finally@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz#4e756a154e4db27fae24c6b18703495c31da3927" - integrity sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - prompts@^2.0.1: version "2.3.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" @@ -11426,16 +11376,6 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== - "typescript@^4.7 || 5", typescript@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"