From a2665cf5285dc9b8040a084b52a3299be3053662 Mon Sep 17 00:00:00 2001 From: Diego Muracciole Date: Sat, 16 Nov 2024 21:51:41 +0100 Subject: [PATCH] feat: add React 19 support (#2941) --- .changeset/curly-pugs-hope.md | 6 ++ .github/workflows/release.yml | 2 +- lerna.json | 2 +- package.json | 2 + packages/examples/next-14/package.json | 1 - packages/examples/next-15/package.json | 1 - packages/examples/vite/package.json | 11 +-- .../examples/vite/src/examples/svg/index.jsx | 5 +- packages/reconciler/build/trim-reconciler.js | 11 ++- packages/reconciler/package.json | 3 +- packages/reconciler/rollup.config.js | 37 +++++--- packages/reconciler/src/index.js | 49 ++--------- packages/reconciler/src/reconciler-26.js | 46 ++++++++++ packages/reconciler/src/reconciler-31.js | 88 +++++++++++++++++++ packages/renderer/package.json | 5 +- packages/renderer/rollup.config.js | 4 +- packages/renderer/src/index.js | 7 +- packages/renderer/src/renderer.js | 8 +- yarn.lock | 60 ++++++------- 19 files changed, 232 insertions(+), 116 deletions(-) create mode 100644 .changeset/curly-pugs-hope.md create mode 100644 packages/reconciler/src/reconciler-26.js create mode 100644 packages/reconciler/src/reconciler-31.js diff --git a/.changeset/curly-pugs-hope.md b/.changeset/curly-pugs-hope.md new file mode 100644 index 000000000..abbf2ad44 --- /dev/null +++ b/.changeset/curly-pugs-hope.md @@ -0,0 +1,6 @@ +--- +"@react-pdf/reconciler": minor +"@react-pdf/renderer": minor +--- + +feat: add React 19 support diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41923896e..b40d5bf80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: matrix: # We aim to test all maintained LTS versions of Node.js as well as the latest stable version node_version: [18, 20, 21] - react_version: [16, 17, 18] + react_version: [16, 17, 18, 19] steps: - name: Checkout diff --git a/lerna.json b/lerna.json index 7c1c56a78..4ca076462 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "version": "independent", - "packages": ["packages/*", "e2e/*"], + "packages": ["packages/*", "packages/examples/*", "e2e/*"], "npmClient": "yarn" } diff --git a/package.json b/package.json index d53ed9bd7..2551a7bcb 100644 --- a/package.json +++ b/package.json @@ -65,9 +65,11 @@ "react": "^18.2.0", "react-16": "npm:react@^16.8.0", "react-17": "npm:react@^17.0.0", + "react-19": "npm:react@19.0.0-rc-66855b96-20241106", "react-dom": "^18.2.0", "react-dom-16": "npm:react-dom@^16.8.0", "react-dom-17": "npm:react-dom@^17.0.0", + "react-dom-19": "npm:react-dom@19.0.0-rc-66855b96-20241106", "rimraf": "^2.6.3", "rollup": "^4.9.0", "rollup-plugin-copy": "^3.5.0", diff --git a/packages/examples/next-14/package.json b/packages/examples/next-14/package.json index 2ba272ad6..77a234077 100644 --- a/packages/examples/next-14/package.json +++ b/packages/examples/next-14/package.json @@ -4,7 +4,6 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", "start": "next start", "lint": "next lint" }, diff --git a/packages/examples/next-15/package.json b/packages/examples/next-15/package.json index 01d37a9d2..a1dc174e6 100644 --- a/packages/examples/next-15/package.json +++ b/packages/examples/next-15/package.json @@ -4,7 +4,6 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", "start": "next start", "lint": "next lint" }, diff --git a/packages/examples/vite/package.json b/packages/examples/vite/package.json index cfee187be..ac59731ab 100644 --- a/packages/examples/vite/package.json +++ b/packages/examples/vite/package.json @@ -7,20 +7,21 @@ "homepage": "https://github.com/diegomura/react-pdf#readme", "repository": "git@github.com:diegomura/react-pdf.git", "scripts": { - "dev": "vite ./src --open" + "dev": "vite ./src --open", + "build:site": "vite build ./src" }, "dependencies": { "@react-pdf/renderer": "^4.0.2" }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, "devDependencies": { "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.20", "postcss": "^8.4.47", "tailwindcss": "^3.4.12", "vite": "^5.0.11" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } } diff --git a/packages/examples/vite/src/examples/svg/index.jsx b/packages/examples/vite/src/examples/svg/index.jsx index 7c9d0c0fe..cd32ca075 100644 --- a/packages/examples/vite/src/examples/svg/index.jsx +++ b/packages/examples/vite/src/examples/svg/index.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import ReactPDF, { Document, Page, StyleSheet } from '@react-pdf/renderer'; +import { Document, Page, StyleSheet } from '@react-pdf/renderer'; import Svg0 from './svg'; import Svg1 from './Svg1'; @@ -8,9 +8,6 @@ import Svg4 from './Svg4'; import Star from './Star'; import Heart from './Heart'; -console.log(`React version: ${React.version}`); -console.log(`React-pdf version: ${ReactPDF.version}`); - const styles = StyleSheet.create({ page: { fontSize: 20, diff --git a/packages/reconciler/build/trim-reconciler.js b/packages/reconciler/build/trim-reconciler.js index 27b64918d..d454b9822 100644 --- a/packages/reconciler/build/trim-reconciler.js +++ b/packages/reconciler/build/trim-reconciler.js @@ -28,6 +28,13 @@ const KEEP_OPTIONS = { createTextInstance: true, createInstance: true, appendInitialChild: true, + noTimeout: true, + getCurrentUpdatePriority: true, + setCurrentUpdatePriority: true, + resolveUpdatePriority: true, + shouldAttemptEagerTransition: true, + requestPostPaintCallback: true, + maySuspendCommit: true, }; const STATIC_OPTIONS = { @@ -39,7 +46,9 @@ const STATIC_OPTIONS = { const METHOD_KEYS = { updateContainer: true, + updateContainerSync: true, createContainer: true, + flushSyncWork: true, }; function clearReconcilerOptions(path) { @@ -48,7 +57,7 @@ function clearReconcilerOptions(path) { const optionName = node.property?.name; // If we are not visiting config object, skip. - if (objectName !== '$$$hostConfig') return; + if (objectName !== '$$$hostConfig' && objectName !== '$$$config') return; // If it's an option we want to keep, skip. if (KEEP_OPTIONS[optionName]) return; diff --git a/packages/reconciler/package.json b/packages/reconciler/package.json index f498c6546..9d6efb79a 100644 --- a/packages/reconciler/package.json +++ b/packages/reconciler/package.json @@ -24,7 +24,8 @@ ], "devDependencies": { "ast-types": "^0.14.2", - "react-reconciler": "0.26.0", + "react-reconciler-26": "npm:react-reconciler@0.26.0", + "react-reconciler-31": "npm:react-reconciler@0.31.0-rc-603e6108-20241029", "recast": "^0.23.9" } } diff --git a/packages/reconciler/rollup.config.js b/packages/reconciler/rollup.config.js index cb88be479..b8cb581a5 100644 --- a/packages/reconciler/rollup.config.js +++ b/packages/reconciler/rollup.config.js @@ -6,13 +6,30 @@ import terser from '@rollup/plugin-terser'; import trimReconciler from './build/trim-reconciler.js'; -export default { - input: 'src/index.js', - output: { format: 'es', file: 'lib/index.js' }, - plugins: [ - resolve({ resolveOnly: ['react-reconciler'] }), - commonjs({ esmExternals: (id) => id === 'scheduler' }), - trimReconciler(), - terser({ compress: { dead_code: true } }), - ], -}; +export default [ + { + input: 'src/index.js', + output: { format: 'es', file: 'lib/index.js' }, + external: ['./reconciler-26', './reconciler-31'], + }, + { + input: 'src/reconciler-26.js', + output: { format: 'es', file: 'lib/reconciler-26.js' }, + plugins: [ + resolve({ resolveOnly: ['react-reconciler-26'] }), + commonjs({ esmExternals: (id) => id === 'scheduler' }), + trimReconciler(), + terser({ compress: { dead_code: true } }), + ], + }, + { + input: 'src/reconciler-31.js', + output: { format: 'es', file: 'lib/reconciler-31.js' }, + plugins: [ + resolve({ resolveOnly: ['react-reconciler-31'] }), + commonjs({ esmExternals: (id) => id === 'scheduler' }), + trimReconciler(), + terser({ compress: { dead_code: true } }), + ], + }, +]; diff --git a/packages/reconciler/src/index.js b/packages/reconciler/src/index.js index 6015e7b5b..92a48ac07 100644 --- a/packages/reconciler/src/index.js +++ b/packages/reconciler/src/index.js @@ -1,46 +1,11 @@ -/* eslint-disable import/extensions */ /* eslint-disable import/no-extraneous-dependencies */ -import Reconciler from 'react-reconciler/cjs/react-reconciler.production.min.js'; -import propsEqual from './propsEqual'; +import React from 'react'; +import createRendererForReact19 from './reconciler-31'; +import createRendererForReact18AndLess from './reconciler-26'; -const emptyObject = {}; +const isReact19 = React.version.startsWith('19'); -const createRenderer = ({ - appendChild, - appendChildToContainer, - commitTextUpdate, - commitUpdate, - createInstance, - createTextInstance, - insertBefore, - removeChild, - removeChildFromContainer, - resetAfterCommit, -}) => { - return Reconciler({ - appendChild, - appendChildToContainer, - appendInitialChild: appendChild, - createInstance, - createTextInstance, - insertBefore, - commitUpdate, - commitTextUpdate, - removeChild, - removeChildFromContainer, - resetAfterCommit, - shouldSetTextContent: () => false, - finalizeInitialChildren: () => false, - getPublicInstance: (instance) => instance, - getRootHostContext: () => emptyObject, - getChildHostContext: () => emptyObject, - prepareForCommit() {}, - clearContainer() {}, - resetTextContent() {}, - prepareUpdate: (element, type, oldProps, newProps) => - !propsEqual(oldProps, newProps), - }); -}; - -export default createRenderer; +export default isReact19 + ? createRendererForReact19 + : createRendererForReact18AndLess; diff --git a/packages/reconciler/src/reconciler-26.js b/packages/reconciler/src/reconciler-26.js new file mode 100644 index 000000000..62173009f --- /dev/null +++ b/packages/reconciler/src/reconciler-26.js @@ -0,0 +1,46 @@ +/* eslint-disable import/extensions */ +/* eslint-disable import/no-extraneous-dependencies */ +import Reconciler from 'react-reconciler-26/cjs/react-reconciler.production.min.js'; + +import propsEqual from './propsEqual'; + +const emptyObject = {}; + +const createRenderer = ({ + appendChild, + appendChildToContainer, + commitTextUpdate, + commitUpdate, + createInstance, + createTextInstance, + insertBefore, + removeChild, + removeChildFromContainer, + resetAfterCommit, +}) => { + return Reconciler({ + appendChild, + appendChildToContainer, + appendInitialChild: appendChild, + createInstance, + createTextInstance, + insertBefore, + commitUpdate, + commitTextUpdate, + removeChild, + removeChildFromContainer, + resetAfterCommit, + shouldSetTextContent: () => false, + finalizeInitialChildren: () => false, + getPublicInstance: (instance) => instance, + getRootHostContext: () => emptyObject, + getChildHostContext: () => emptyObject, + prepareForCommit() {}, + clearContainer() {}, + resetTextContent() {}, + prepareUpdate: (element, type, oldProps, newProps) => + !propsEqual(oldProps, newProps), + }); +}; + +export default createRenderer; diff --git a/packages/reconciler/src/reconciler-31.js b/packages/reconciler/src/reconciler-31.js new file mode 100644 index 000000000..c60aed6f0 --- /dev/null +++ b/packages/reconciler/src/reconciler-31.js @@ -0,0 +1,88 @@ +/* eslint-disable import/extensions */ +/* eslint-disable import/no-extraneous-dependencies */ + +import Reconciler from 'react-reconciler-31'; +import { + ConcurrentRoot, + DefaultEventPriority, +} from 'react-reconciler-31/constants'; + +import propsEqual from './propsEqual'; + +const emptyObject = {}; + +const logRecoverableError = console.error; + +const createRenderer = ({ + appendChild, + appendChildToContainer, + commitTextUpdate, + commitUpdate, + createInstance, + createTextInstance, + insertBefore, + removeChild, + removeChildFromContainer, + resetAfterCommit, +}) => { + const _commitUpdate = (instance, type, oldProps, newProps) => { + if (propsEqual(oldProps, newProps)) return; + commitUpdate(instance, null, type, oldProps, newProps); + }; + + const reconciler = Reconciler({ + appendChild, + appendChildToContainer, + appendInitialChild: appendChild, + createInstance, + createTextInstance, + insertBefore, + commitUpdate: _commitUpdate, + commitTextUpdate, + removeChild, + removeChildFromContainer, + resetAfterCommit, + noTimeout: -1, + shouldSetTextContent: () => false, + finalizeInitialChildren: () => false, + getPublicInstance: (instance) => instance, + getRootHostContext: () => emptyObject, + getChildHostContext: () => emptyObject, + prepareForCommit() {}, + clearContainer() {}, + resetTextContent() {}, + getCurrentUpdatePriority: () => DefaultEventPriority, + maySuspendCommit: () => false, + requestPostPaintCallback: () => {}, + resolveUpdatePriority: () => DefaultEventPriority, + setCurrentUpdatePriority: () => {}, + shouldAttemptEagerTransition: () => false, + }); + + const createContainer = (container) => { + return reconciler.createContainer( + container, + ConcurrentRoot, // tag + null, // hydration callbacks + false, // isStrictMode + null, // concurrentUpdatesByDefaultOverride + '', // identifierPrefix + logRecoverableError, // onUncaughtError + logRecoverableError, // onCaughtError + logRecoverableError, // onRecoverableError + null, // transitionCallbacks + ); + }; + + const updateContainer = (doc, mountNode, parentComponent, callback) => { + reconciler.updateContainerSync(doc, mountNode, parentComponent, callback); + reconciler.flushSyncWork(); + }; + + return { + createContainer, + updateContainer, + }; +}; + +export default createRenderer; diff --git a/packages/renderer/package.json b/packages/renderer/package.json index ba534337d..a71285cef 100644 --- a/packages/renderer/package.json +++ b/packages/renderer/package.json @@ -34,11 +34,10 @@ "events": "^3.3.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "queue": "^6.0.1", - "scheduler": "^0.17.0" + "queue": "^6.0.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "lint-staged": { "*.js": [ diff --git a/packages/renderer/rollup.config.js b/packages/renderer/rollup.config.js index d3f93cd51..ebcb52bbb 100644 --- a/packages/renderer/rollup.config.js +++ b/packages/renderer/rollup.config.js @@ -31,9 +31,7 @@ const getPlugins = ({ browser, declarationDests, minify = false }) => [ json(), ...(browser ? [ignore(['fs', 'path', 'url'])] : []), babel(babelConfig()), - commonjs({ - esmExternals: ['scheduler'], - }), + commonjs(), nodeResolve({ browser, preferBuiltins: !browser }), replace({ preventAssignment: true, diff --git a/packages/renderer/src/index.js b/packages/renderer/src/index.js index c6f3ac4ff..295656748 100644 --- a/packages/renderer/src/index.js +++ b/packages/renderer/src/index.js @@ -84,11 +84,8 @@ const pdf = (initialValue) => { // TODO: rename this method to `toStream` in next major release, because it return stream not a buffer const toBuffer = async () => { - const { - layout: _INTERNAL__LAYOUT__DATA_, - fileStream, - } = await render(); - callOnRender({_INTERNAL__LAYOUT__DATA_}); + const { layout: _INTERNAL__LAYOUT__DATA_, fileStream } = await render(); + callOnRender({ _INTERNAL__LAYOUT__DATA_ }); return fileStream; }; diff --git a/packages/renderer/src/renderer.js b/packages/renderer/src/renderer.js index 44a0ac215..ab4a33da2 100644 --- a/packages/renderer/src/renderer.js +++ b/packages/renderer/src/renderer.js @@ -13,11 +13,9 @@ const createInstance = (type, { style, children, ...props }) => ({ const createTextInstance = (text) => ({ type: 'TEXT_INSTANCE', value: text }); -const appendChild = (parentInstance, child) => { +const appendChild = (parent, child) => { const isParentText = - parentInstance.type === 'TEXT' || - parentInstance.type === 'LINK' || - parentInstance.type === 'TSPAN'; + parent.type === 'TEXT' || parent.type === 'LINK' || parent.type === 'TSPAN'; const isChildTextInstance = child.type === 'TEXT_INSTANCE'; const isOrphanTextInstance = isChildTextInstance && !isParentText; @@ -30,7 +28,7 @@ const appendChild = (parentInstance, child) => { return; } - parentInstance.children.push(child); + parent.children.push(child); }; const appendChildToContainer = (parentInstance, child) => { diff --git a/yarn.lock b/yarn.lock index f58fee245..3bb59e13e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8673,6 +8673,11 @@ randombytes@^2.1.0: loose-envify "^1.1.0" object-assign "^4.1.1" +"react-19@npm:react@19.0.0-rc-66855b96-20241106": + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-66855b96-20241106.tgz#f04d7283454a32bdd8e9757db4308b75b9739e56" + integrity sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg== + "react-dom-16@npm:react-dom@^16.8.0": version "16.14.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" @@ -8692,6 +8697,13 @@ randombytes@^2.1.0: object-assign "^4.1.1" scheduler "^0.20.2" +"react-dom-19@npm:react-dom@19.0.0-rc-66855b96-20241106": + version "19.0.0-rc-66855b96-20241106" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz#beba73decfd1b9365a3c83673a298623b15acb0b" + integrity sha512-D25vdaytZ1wFIRiwNU98NPQ/upS2P8Co4/oNoa02PzHbh8deWdepjm5qwZM/46OdSiGv4WSWwxP55RO9obqJEQ== + dependencies: + scheduler "0.25.0-rc-66855b96-20241106" + react-dom@19.0.0-rc-66855b96-20241106: version "19.0.0-rc-66855b96-20241106" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-66855b96-20241106.tgz#beba73decfd1b9365a3c83673a298623b15acb0b" @@ -8699,7 +8711,7 @@ react-dom@19.0.0-rc-66855b96-20241106: dependencies: scheduler "0.25.0-rc-66855b96-20241106" -react-dom@^18: +react-dom@^18, react-dom@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -8707,14 +8719,6 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.2" -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -8730,7 +8734,7 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-reconciler@0.26.0: +"react-reconciler-26@npm:react-reconciler@0.26.0": version "0.26.0" resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.0.tgz#053ae2fd1607e38a960e7a694ad694732e4989b6" integrity sha512-n2FJE9vPSiZ0Dn/jaV/iOAO6rXepnk74QGRcgwPSgmN/2syUJnbfEz7Bw5yodBfJhjA3L7cu1YdImYISTj4KZQ== @@ -8739,6 +8743,13 @@ react-reconciler@0.26.0: object-assign "^4.1.1" scheduler "^0.20.0" +"react-reconciler-31@npm:react-reconciler@0.31.0-rc-603e6108-20241029": + version "0.31.0-rc-603e6108-20241029" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-603e6108-20241029.tgz#548c14190b107e6e8b886e9e1142a1b341efe020" + integrity sha512-zCAmctVyk2efv9DR0GnpHNbd/mVxeWuOGrWeXwx1QXqSGTBWUqzoPEd4jv88e+3U53upXZqb86AMhKf0c9vkLw== + dependencies: + scheduler "0.25.0-rc-603e6108-20241029" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -8749,20 +8760,13 @@ react@19.0.0-rc-66855b96-20241106: resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-66855b96-20241106.tgz#f04d7283454a32bdd8e9757db4308b75b9739e56" integrity sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg== -react@^18: +react@^18, react@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -9218,19 +9222,16 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" +scheduler@0.25.0-rc-603e6108-20241029: + version "0.25.0-rc-603e6108-20241029" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz#684dd96647e104d23e0d29a37f18937daf82df19" + integrity sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA== + scheduler@0.25.0-rc-66855b96-20241106: version "0.25.0-rc-66855b96-20241106" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-66855b96-20241106.tgz#8bbb728eca4de5a5deca1f18370fbce41aee91d1" integrity sha512-HQXp/Mnp/MMRSXMQF7urNFla+gmtXW/Gr1KliuR0iboTit4KvZRY8KYaq5ccCTAOJiUqQh2rE2F3wgUekmgdlA== -scheduler@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" - integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -9247,13 +9248,6 @@ scheduler@^0.20.0, scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"