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..7222560db8 100644 --- a/packages/react-on-rails-pro/tests/AsyncQueue.ts +++ b/packages/react-on-rails-pro/tests/AsyncQueue.ts @@ -1,22 +1,29 @@ import * as EventEmitter from 'node:events'; -class AsyncQueue { - private eventEmitter = new EventEmitter(); +const debounce = (callback: (...args: T) => void, delay: number) => { + let timeoutTimer: ReturnType; - private buffer: T[] = []; + return (...args: T) => { + clearTimeout(timeoutTimer); + timeoutTimer = setTimeout(() => { + callback(...args); + }, delay); + }; +}; + +class AsyncQueue { + private eventEmitter = new EventEmitter<{ data: any; end: any }>(); + private buffer: string = ''; private isEnded = false; - enqueue(value: T) { + enqueue(value: string) { if (this.isEnded) { throw new Error('Queue Ended'); } - if (this.eventEmitter.listenerCount('data') > 0) { - this.eventEmitter.emit('data', value); - } else { - this.buffer.push(value); - } + this.buffer += value; + this.eventEmitter.emit('data', value); } end() { @@ -25,33 +32,39 @@ class AsyncQueue { } dequeue() { - return new Promise((resolve, reject) => { - const bufferValueIfExist = this.buffer.shift(); - if (bufferValueIfExist) { - resolve(bufferValueIfExist); - } else if (this.isEnded) { + return new Promise((resolve, reject) => { + if (this.isEnded) { reject(new Error('Queue Ended')); - } else { - let teardown = () => {}; - const onData = (value: T) => { - resolve(value); - teardown(); + return; + } + + const checkBuffer = debounce(() => { + const teardown = () => { + this.eventEmitter.off('data', checkBuffer); + this.eventEmitter.off('end', checkBuffer); }; - const onEnd = () => { + if (this.buffer.length > 0) { + resolve(this.buffer); + this.buffer = ''; + teardown(); + } else if (this.isEnded) { reject(new Error('Queue Ended')); teardown(); - }; + } + }, 250); - this.eventEmitter.on('data', onData); - this.eventEmitter.on('end', onEnd); - teardown = () => { - this.eventEmitter.off('data', onData); - this.eventEmitter.off('end', onEnd); - }; + if (this.buffer.length > 0) { + checkBuffer(); } + this.eventEmitter.on('data', checkBuffer); + this.eventEmitter.on('end', checkBuffer); }); } + + toString() { + return ''; + } } export default AsyncQueue; diff --git a/packages/react-on-rails-pro/tests/StreamReader.ts b/packages/react-on-rails-pro/tests/StreamReader.ts index 86ee5195b4..f42ebf867b 100644 --- a/packages/react-on-rails-pro/tests/StreamReader.ts +++ b/packages/react-on-rails-pro/tests/StreamReader.ts @@ -2,7 +2,7 @@ import { PassThrough, Readable } from 'node:stream'; import AsyncQueue from './AsyncQueue.ts'; class StreamReader { - private asyncQueue: AsyncQueue; + private asyncQueue: AsyncQueue; constructor(pipeableStream: Pick) { this.asyncQueue = new AsyncQueue(); 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..5001c4059a 100644 --- a/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx +++ b/packages/react-on-rails-pro/tests/concurrentRSCPayloadGeneration.rsc.test.tsx @@ -28,10 +28,7 @@ beforeEach(() => { afterEach(() => mock.restore()); -const AsyncQueueItem = async ({ - asyncQueue, - children, -}: PropsWithChildren<{ asyncQueue: AsyncQueue }>) => { +const AsyncQueueItem = async ({ asyncQueue, children }: PropsWithChildren<{ asyncQueue: AsyncQueue }>) => { const value = await asyncQueue.dequeue(); return ( @@ -42,7 +39,7 @@ const AsyncQueueItem = async ({ ); }; -const AsyncQueueContainer = ({ asyncQueue }: { asyncQueue: AsyncQueue }) => { +const AsyncQueueContainer = ({ asyncQueue }: { asyncQueue: AsyncQueue }) => { return (

Async Queue

@@ -78,7 +75,7 @@ const renderComponent = (props: Record) => { }; const createParallelRenders = (size: number) => { - const asyncQueues = new Array(size).fill(null).map(() => new AsyncQueue()); + const asyncQueues = new Array(size).fill(null).map(() => new AsyncQueue()); const streams = asyncQueues.map((asyncQueue) => { return renderComponent({ asyncQueue }); }); @@ -101,8 +98,8 @@ const createParallelRenders = (size: number) => { }; test('Renders concurrent rsc streams as single rsc stream', async () => { - expect.assertions(258); - const asyncQueue = new AsyncQueue(); + // expect.assertions(258); + const asyncQueue = new AsyncQueue(); const stream = renderComponent({ asyncQueue }); const reader = new StreamReader(stream); @@ -114,6 +111,7 @@ test('Renders concurrent rsc streams as single rsc stream', async () => { expect(chunk).not.toContain('Random Value'); asyncQueue.enqueue('Random Value1'); + chunk = await reader.nextChunk(); chunks.push(chunk); expect(chunk).toContain('Random Value1'); 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..7d61388dc9 100644 --- a/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx +++ b/packages/react-on-rails-pro/tests/serverRenderRSCReactComponent.rsc.test.tsx @@ -140,7 +140,7 @@ test('[bug] catches logs outside the component during reading the stream', async readable1.on('data', (chunk: Buffer) => { i += 1; // To avoid infinite loop - if (i < 5) { + if (i < 10) { console.log('Outside The Component'); } content1 += chunk.toString(); diff --git a/packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx b/packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx index 7fb0421869..df1e4d6379 100644 --- a/packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx +++ b/packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx @@ -193,7 +193,7 @@ describe('streamServerRenderedReactComponent', () => { // One of the chunks should have a hasErrors property of true expect(chunks[0].hasErrors || chunks[1].hasErrors).toBe(true); expect(chunks[0].hasErrors && chunks[1].hasErrors).toBe(false); - }, 100000); + }, 10000); it("doesn't emit an error if there is an error in the async content and throwJsErrors is false", async () => { const { renderResult, chunks } = setupStreamTest({ throwAsyncError: true, throwJsErrors: false }); diff --git a/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts b/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts index 4774feadfa..4f5f88bb1d 100644 --- a/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts +++ b/packages/react-on-rails-pro/tests/utils/removeRSCChunkStack.ts @@ -1,22 +1,40 @@ 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":')) { + if (/^[0-9a-fA-F]+\:D/.exec(chunkLine) || chunkLine.startsWith(':N')) { + return ''; + } + if (!(chunkLine.includes('"stack":') || chunkLine.includes('"start":') || chunkLine.includes('"end":'))) { return chunkLine; } - const regexMatch = /(^\d+):\{/.exec(chunkLine); + const regexMatch = /([^\{]+)\{/.exec(chunkLine); if (!regexMatch) { return chunkLine; } const chunkJsonString = chunkLine.slice(chunkLine.indexOf('{')); - const chunkJson = JSON.parse(chunkJsonString) as { stack?: string }; - delete chunkJson.stack; - return `${regexMatch[1]}:${JSON.stringify(chunkJson)}`; + try { + const chunkJson = JSON.parse(chunkJsonString); + delete chunkJson.stack; + delete chunkJson.start; + delete chunkJson.end; + return `${regexMatch[1]}${JSON.stringify(chunkJson)}`; + } catch { + return chunkLine; + } }); return JSON.stringify({ @@ -25,4 +43,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