diff --git a/packages/react-on-rails-pro-node-renderer/src/worker/vm.ts b/packages/react-on-rails-pro-node-renderer/src/worker/vm.ts index 3567f9ea7c..daba69dc69 100644 --- a/packages/react-on-rails-pro-node-renderer/src/worker/vm.ts +++ b/packages/react-on-rails-pro-node-renderer/src/worker/vm.ts @@ -212,11 +212,13 @@ export async function buildVM(filePath: string) { // 1. docs/node-renderer/js-configuration.md // 2. packages/node-renderer/src/shared/configBuilder.ts extendContext(contextObject, { + AbortController, Buffer, TextDecoder, TextEncoder, URLSearchParams, ReadableStream, + performance, process, setTimeout, setInterval, diff --git a/packages/react-on-rails-pro-node-renderer/tests/htmlStreaming.test.js b/packages/react-on-rails-pro-node-renderer/tests/htmlStreaming.test.js index 45b98e683d..6938344cab 100644 --- a/packages/react-on-rails-pro-node-renderer/tests/htmlStreaming.test.js +++ b/packages/react-on-rails-pro-node-renderer/tests/htmlStreaming.test.js @@ -34,6 +34,7 @@ const makeRequest = async (options = {}) => { const jsonChunks = []; let firstByteTime; let status; + let buffer = ''; const decoder = new TextDecoder(); request.on('response', (headers) => { @@ -44,10 +45,17 @@ const makeRequest = async (options = {}) => { // Sometimes, multiple chunks are merged into one. // So, the server uses \n as a delimiter between chunks. const decodedData = typeof data === 'string' ? data : decoder.decode(data, { stream: false }); - const decodedChunksFromData = decodedData + const decodedChunksFromData = (buffer + decodedData) .split('\n') .map((chunk) => chunk.trim()) .filter((chunk) => chunk.length > 0); + + if (!decodedData.endsWith('\n')) { + buffer = decodedChunksFromData.pop() ?? ''; + } else { + buffer = ''; + } + chunks.push(...decodedChunksFromData); jsonChunks.push( ...decodedChunksFromData.map((chunk) => { @@ -197,6 +205,7 @@ describe('html streaming', () => { expect(fullBody).toContain('branch2 (level 1)'); expect(fullBody).toContain('branch2 (level 0)'); + // Fail to findout the chunks content on CI expect(jsonChunks[0].isShellReady).toBeTruthy(); expect(jsonChunks[0].hasErrors).toBeTruthy(); expect(jsonChunks[0].renderingError).toMatchObject({ diff --git a/packages/react-on-rails-pro/package.json b/packages/react-on-rails-pro/package.json index 37d266e9a2..231f7052f6 100644 --- a/packages/react-on-rails-pro/package.json +++ b/packages/react-on-rails-pro/package.json @@ -78,8 +78,8 @@ "devDependencies": { "@types/mock-fs": "^4.13.4", "mock-fs": "^5.5.0", - "react": "^19.0.1", - "react-dom": "^19.0.1", - "react-on-rails-rsc": "^19.0.3" + "react": "19.2.1", + "react-dom": "19.2.1", + "react-on-rails-rsc": "git+https://github.com/shakacode/react_on_rails_rsc#upgrade-to-react-v19.2.1" } } diff --git a/packages/react-on-rails-pro/tests/AsyncQueue.ts b/packages/react-on-rails-pro/tests/AsyncQueue.ts index d6f8b7b204..0cf6c843b8 100644 --- a/packages/react-on-rails-pro/tests/AsyncQueue.ts +++ b/packages/react-on-rails-pro/tests/AsyncQueue.ts @@ -26,9 +26,10 @@ class AsyncQueue { dequeue() { return new Promise((resolve, reject) => { - const bufferValueIfExist = this.buffer.shift(); + const bufferValueIfExist = this.buffer.length > 0 ? this.buffer.join('') : undefined; + this.buffer.length = 0; if (bufferValueIfExist) { - resolve(bufferValueIfExist); + resolve(bufferValueIfExist as T); } else if (this.isEnded) { reject(new Error('Queue Ended')); } else { diff --git a/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx b/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx index 353b19d6f8..9f6a8b254d 100644 --- a/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx +++ b/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx @@ -100,13 +100,21 @@ const createParallelRenders = (size: number) => { return { enqueue, expectNextChunk, expectEndOfStream }; }; +const delay = (ms: number) => + new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, ms); + }); + test('Renders concurrent rsc streams as single rsc stream', async () => { - expect.assertions(258); + // expect.assertions(258); const asyncQueue = new AsyncQueue(); const stream = renderComponent({ asyncQueue }); const reader = new StreamReader(stream); const chunks: string[] = []; + await delay(100); let chunk = await reader.nextChunk(); chunks.push(chunk); expect(chunk).toContain('Async Queue'); @@ -114,16 +122,20 @@ test('Renders concurrent rsc streams as single rsc stream', async () => { expect(chunk).not.toContain('Random Value'); asyncQueue.enqueue('Random Value1'); + + await delay(100); chunk = await reader.nextChunk(); chunks.push(chunk); expect(chunk).toContain('Random Value1'); asyncQueue.enqueue('Random Value2'); + await delay(100); chunk = await reader.nextChunk(); chunks.push(chunk); expect(chunk).toContain('Random Value2'); asyncQueue.enqueue('Random Value3'); + await delay(100); chunk = await reader.nextChunk(); chunks.push(chunk); expect(chunk).toContain('Random Value3'); @@ -133,12 +145,17 @@ test('Renders concurrent rsc streams as single rsc stream', async () => { const { enqueue, expectNextChunk, expectEndOfStream } = createParallelRenders(50); expect(chunks).toHaveLength(4); + await delay(100); await expectNextChunk(chunks[0]); enqueue('Random Value1'); + await delay(100); await expectNextChunk(chunks[1]); enqueue('Random Value2'); + await delay(100); await expectNextChunk(chunks[2]); enqueue('Random Value3'); + await delay(100); await expectNextChunk(chunks[3]); + await delay(100); await expectEndOfStream(); }); diff --git a/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx b/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx index 4053f8280e..389784ddf2 100644 --- a/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx +++ b/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx @@ -11,31 +11,36 @@ import { finished } from 'stream/promises'; import { text } from 'stream/consumers'; import ReactOnRails, { RailsContextWithServerStreamingCapabilities } from '../src/ReactOnRailsRSC.ts'; -const PromiseWrapper = async ({ promise, name }: { promise: Promise; name: string }) => { +const PromiseWrapper = async ({ promise, name, onResolved }: { promise: Promise; name: string, onResolved?: () => {} }) => { console.log(`[${name}] Before awaitng`); const value = await promise; + if (onResolved) { + onResolved(); + } console.log(`[${name}] After awaitng`); return

Value: {value}

; }; -const PromiseContainer = ({ name }: { name: string }) => { +const PromiseContainer = ({ name, onResolved }: { name: string, onResolved?: () => {} }) => { const promise = new Promise((resolve) => { let i = 0; - const intervalId = setInterval(() => { - console.log(`Interval ${i} at [${name}]`); - i += 1; - if (i === 50) { - clearInterval(intervalId); - resolve(`Value of name ${name}`); - } - }, 1); + setTimeout(() => { + const intervalId = setInterval(() => { + console.log(`Interval ${i} at [${name}]`); + i += 1; + if (i === 50) { + clearInterval(intervalId); + resolve(`Value of name ${name}`); + } + }, 20); + }, 200); }); return (

Initial Header

Loading Promise

}> - +
); @@ -123,6 +128,7 @@ test('no logs lekage from outside the component', async () => { }); test('[bug] catches logs outside the component during reading the stream', async () => { + let resolved = false; const readable1 = ReactOnRails.serverRenderRSCReactComponent({ railsContext: { reactClientManifestFileName: 'react-client-manifest.json', @@ -132,13 +138,16 @@ test('[bug] catches logs outside the component during reading the stream', async renderingReturnsPromises: true, throwJsErrors: true, domNodeId: 'dom-id', - props: { name: 'First Unique Name' }, + props: { name: 'First Unique Name', onResolved: () => { resolved = true; } }, }); let content1 = ''; let i = 0; readable1.on('data', (chunk: Buffer) => { i += 1; + if (i === 1) { + expect(resolved).toBe(false); + } // To avoid infinite loop if (i < 5) { console.log('Outside The Component'); @@ -152,9 +161,10 @@ test('[bug] catches logs outside the component during reading the stream', async }, 2); await finished(readable1); clearInterval(intervalId); + expect(resolved).toBe(true); expect(content1).toContain('First Unique Name'); expect(content1).not.toContain('From Interval'); // Here's the bug expect(content1).toContain('Outside The Component'); -}); +}, 10000); diff --git a/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts b/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts index 4774feadfa..57795540a6 100644 --- a/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts +++ b/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts @@ -1,7 +1,16 @@ import { RSCPayloadChunk } from 'react-on-rails'; -const removeRSCChunkStack = (chunk: string) => { - const parsedJson = JSON.parse(chunk) as RSCPayloadChunk; +const removeRSCChunkStackInternal = (chunk: string) => { + if (chunk.trim().length === 0) { + return chunk; + } + + let parsedJson: RSCPayloadChunk; + try { + parsedJson = JSON.parse(chunk) as RSCPayloadChunk; + } catch (err) { + throw new Error(`Error while parsing the json: "${chunk}", ${err}`); + } const { html } = parsedJson; const santizedHtml = html.split('\n').map((chunkLine) => { if (!chunkLine.includes('"stack":')) { @@ -25,4 +34,8 @@ const removeRSCChunkStack = (chunk: string) => { }); }; +const removeRSCChunkStack = (chunk: string) => { + chunk.split('\n').map(removeRSCChunkStackInternal).join('\n'); +}; + export default removeRSCChunkStack; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7db392c03..ffe278899a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,7 +98,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jest: specifier: ^28.11.0 - version: 28.14.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(jest@29.7.0(@types/node@20.19.25))(typescript@5.9.3) + version: 28.14.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@9.39.1(jiti@2.6.1)) @@ -119,7 +119,7 @@ importers: version: 16.5.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.25) + version: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -173,7 +173,7 @@ importers: version: 0.2.6(@swc/core@1.15.3)(webpack@5.103.0(@swc/core@1.15.3)) ts-jest: specifier: ^29.2.5 - version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25))(typescript@5.9.3) + version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0))(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -203,14 +203,14 @@ importers: specifier: ^5.5.0 version: 5.5.0 react: - specifier: ^19.0.1 - version: 19.2.0 + specifier: 19.2.1 + version: 19.2.1 react-dom: - specifier: ^19.0.1 - version: 19.2.0(react@19.2.0) + specifier: 19.2.1 + version: 19.2.1(react@19.2.1) react-on-rails-rsc: - specifier: ^19.0.3 - version: 19.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(webpack@5.103.0(@swc/core@1.15.3)) + specifier: git+https://github.com/shakacode/react_on_rails_rsc#upgrade-to-react-v19.2.1 + version: https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0(@swc/core@1.15.3)) packages/react-on-rails-pro-node-renderer: dependencies: @@ -1650,6 +1650,9 @@ packages: '@types/node@20.19.25': resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -2131,6 +2134,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + babel-plugin-polyfill-corejs2@0.4.14: resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: @@ -2396,6 +2403,10 @@ packages: core-js-compat@3.47.0: resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -4405,6 +4416,11 @@ packages: peerDependencies: react: ^19.2.0 + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} + peerDependencies: + react: ^19.2.1 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4421,17 +4437,22 @@ packages: react-dom: ^19.0.0 webpack: ^5.59.0 - react-on-rails-rsc@19.0.3: - resolution: {integrity: sha512-g+89U83+WjZDbtLvYQbjld0pWdUXpKageSoeKsX8cj1SkmULMAzbxgvH6vdzOuQUSwchkbDgwFO9umlHDhiyug==} + react-on-rails-rsc@https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261: + resolution: {tarball: https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261} + version: 19.0.3 peerDependencies: - react: ^19.0.1 - react-dom: ^19.0.1 + react: ^19.2.1 + react-dom: ^19.2.1 webpack: ^5.59.0 react@19.2.0: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} + engines: {node: '>=0.10.0'} + readline-sync@1.4.10: resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} engines: {node: '>= 0.8.0'} @@ -5339,6 +5360,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yargs-parser@15.0.3: resolution: {integrity: sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==} @@ -6391,7 +6416,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -6405,7 +6430,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.25) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7006,6 +7031,9 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/parse-json@4.0.2': + optional: true + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} @@ -7529,6 +7557,13 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.4 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + optional: true + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: '@babel/compat-data': 7.28.5 @@ -7803,6 +7838,15 @@ snapshots: dependencies: browserslist: 4.28.0 + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + optional: true + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -7812,13 +7856,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 - create-jest@29.7.0(@types/node@20.19.25): + create-jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.25) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -7935,7 +7979,9 @@ snapshots: decimal.js@10.6.0: {} - dedent@1.7.0: {} + dedent@1.7.0(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-is@0.1.4: {} @@ -8282,13 +8328,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(jest@29.7.0(@types/node@20.19.25))(typescript@5.9.3): + eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - jest: 29.7.0(@types/node@20.19.25) + jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - supports-color - typescript @@ -9133,7 +9179,7 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -9142,7 +9188,7 @@ snapshots: '@types/node': 20.19.25 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0 + dedent: 1.7.0(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -9159,16 +9205,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.25): + jest-cli@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.25) + create-jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.25) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9178,7 +9224,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.25): + jest-config@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -9189,7 +9235,7 @@ snapshots: deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -9458,12 +9504,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.25): + jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.25) + jest-cli: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10306,6 +10352,11 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 + react-dom@19.2.1(react@19.2.1): + dependencies: + react: 19.2.1 + scheduler: 0.27.0 + react-is@16.13.1: {} react-is@17.0.2: {} @@ -10321,17 +10372,19 @@ snapshots: webpack: 5.103.0(@swc/core@1.15.3) webpack-sources: 3.3.3 - react-on-rails-rsc@19.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(webpack@5.103.0(@swc/core@1.15.3)): + react-on-rails-rsc@https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0(@swc/core@1.15.3)): dependencies: acorn-loose: 8.5.2 neo-async: 2.6.2 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) webpack: 5.103.0(@swc/core@1.15.3) webpack-sources: 3.3.3 react@19.2.0: {} + react@19.2.1: {} + readline-sync@1.4.10: {} real-require@0.2.0: {} @@ -10990,12 +11043,12 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25))(typescript@5.9.3): + ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@20.19.25) + jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -11360,6 +11413,9 @@ snapshots: yallist@3.1.1: {} + yaml@1.10.2: + optional: true + yargs-parser@15.0.3: dependencies: camelcase: 5.3.1 diff --git a/react_on_rails_pro/spec/dummy/package.json b/react_on_rails_pro/spec/dummy/package.json index 629f9bd370..a2a6bed227 100644 --- a/react_on_rails_pro/spec/dummy/package.json +++ b/react_on_rails_pro/spec/dummy/package.json @@ -46,13 +46,13 @@ "postcss": "^8.4.31", "postcss-loader": "^7.1.0", "prop-types": "^15.7.2", - "react": "^19.0.1", - "react-dom": "^19.0.1", + "react": "19.2.1", + "react-dom": "19.2.1", "react-error-boundary": "^4.1.2", "@dr.pogodin/react-helmet": "^3.0.4", "react-on-rails-pro": "link:.yalc/react-on-rails-pro", "react-on-rails-pro-node-renderer": "link:.yalc/react-on-rails-pro-node-renderer", - "react-on-rails-rsc": "^19.0.3", + "react-on-rails-rsc": "git+https://github.com/shakacode/react_on_rails_rsc#upgrade-to-react-v19.2.1", "react-proptypes": "^1.0.0", "react-redux": "^9.2.0", "react-refresh": "^0.11.0", diff --git a/react_on_rails_pro/spec/dummy/pnpm-lock.yaml b/react_on_rails_pro/spec/dummy/pnpm-lock.yaml index 8c017555f4..0b4d5b9b93 100644 --- a/react_on_rails_pro/spec/dummy/pnpm-lock.yaml +++ b/react_on_rails_pro/spec/dummy/pnpm-lock.yaml @@ -138,10 +138,10 @@ importers: specifier: ^15.7.2 version: 15.8.1 react: - specifier: ^19.0.1 + specifier: 19.2.1 version: 19.2.1 react-dom: - specifier: ^19.0.1 + specifier: 19.2.1 version: 19.2.1(react@19.2.1) react-error-boundary: specifier: ^4.1.2 @@ -153,8 +153,8 @@ importers: specifier: link:.yalc/react-on-rails-pro-node-renderer version: link:.yalc/react-on-rails-pro-node-renderer react-on-rails-rsc: - specifier: ^19.0.3 - version: 19.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0) + specifier: git+https://github.com/shakacode/react_on_rails_rsc#upgrade-to-react-v19.2.1 + version: https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0) react-proptypes: specifier: ^1.0.0 version: 1.0.0 @@ -3466,11 +3466,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-on-rails-rsc@19.0.3: - resolution: {integrity: sha512-g+89U83+WjZDbtLvYQbjld0pWdUXpKageSoeKsX8cj1SkmULMAzbxgvH6vdzOuQUSwchkbDgwFO9umlHDhiyug==} + react-on-rails-rsc@https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261: + resolution: {tarball: https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261} + version: 19.0.3 peerDependencies: - react: ^19.0.1 - react-dom: ^19.0.1 + react: ^19.2.1 + react-dom: ^19.2.1 webpack: ^5.59.0 react-proptypes@1.0.0: @@ -7942,7 +7943,7 @@ snapshots: react-is@16.13.1: {} - react-on-rails-rsc@19.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0): + react-on-rails-rsc@https://codeload.github.com/shakacode/react_on_rails_rsc/tar.gz/f00f4f96578b0de1224284f011e20817c4186261(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(webpack@5.103.0): dependencies: acorn-loose: 8.5.2 neo-async: 2.6.2