fix: cross-env validation and docs for renderer password#3090
fix: cross-env validation and docs for renderer password#3090
Conversation
) 1. Add NODE_ENV checking to Ruby-side validate_renderer_password_for_production, mirroring the Node-side runtimeEnvsAllowDevelopmentDefaults() behavior. This surfaces misconfigurations (e.g. NODE_ENV=production + RAILS_ENV=development) at Rails boot time rather than at Node request time. 2. Add clarifying comment to defaultReplayServerAsyncOperationLogs() explaining why it intentionally checks only NODE_ENV (JS debugging concern, not a security boundary). 3. Move validate_renderer_password_for_production call from setup_renderer_password to setup_config_values so enforcement is unconditional and resilient to future refactors of the password resolution logic. Closes #2887 Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
WalkthroughMoved renderer-password validation into the main config setup, broadened the validation to consider both Changes
Sequence Diagram(s)sequenceDiagram
participant Config as ReactOnRailsPro::Configuration
participant ENV as Environment
participant Validator as validate_renderer_password_for_production
Config->>Config: setup_config_values()
Config->>Config: setup_renderer_password()
Config->>Validator: validate_renderer_password_for_production()
Validator->>ENV: read RAILS_ENV, NODE_ENV
alt any present env outside {development,test}
Validator->>Config: raise error if no RENDERER_PASSWORD
else all present envs in {development,test}
Validator->>Config: no-op (skip validation)
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR hardens the Confidence Score: 5/5Safe to merge — logic is correct, fail-closed, and well-covered by tests. All findings are P2 or better. The cross-env validation logic is correct: it fails closed when both envs are absent, catches the NODE_ENV=production + RAILS_ENV=development misconfiguration, and preserves the development/test bypass. Moving the validator call to setup_config_values is a clean improvement with no behavioral regressions. Test coverage is thorough for the new scenarios. No files require special attention.
|
| Filename | Overview |
|---|---|
| react_on_rails_pro/lib/react_on_rails_pro/configuration.rb | Validator moved to setup_config_values for unconditional enforcement; now checks both RAILS_ENV and NODE_ENV with correct fail-closed logic |
| react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb | Tests updated to use ENV.fetch instead of ENV.[], with 4 new cross-env specs covering the key misconfiguration scenarios |
| packages/react-on-rails-pro-node-renderer/src/shared/configBuilder.ts | Adds clarifying comment explaining why defaultReplayServerAsyncOperationLogs() intentionally checks only NODE_ENV |
| react_on_rails_pro/sig/react_on_rails_pro/configuration.rbs | Adds missing RBS type signature for validate_renderer_password_for_production |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[setup_config_values] --> B[setup_renderer_password]
B --> C{renderer_password present?}
C -- Yes --> D[Skip URL/ENV extraction]
C -- No --> E[Extract from renderer_url]
E --> F{Password in URL?}
F -- Yes --> G[Set from URL]
F -- No --> H[Set from ENV RENDERER_PASSWORD]
D & G & H --> I[validate_renderer_password_for_production]
I --> J{renderer_password present?}
J -- Yes --> K[✅ Skip validation]
J -- No --> L{node_renderer?}
L -- No --> K
L -- Yes --> M[Build runtime_envs from RAILS_ENV + NODE_ENV]
M --> N{runtime_envs.any? AND all dev/test?}
N -- Yes --> K
N -- No --> O[🚨 Raise Error: RENDERER_PASSWORD required]
Reviews (1): Last reviewed commit: "fix: cross-env validation and documentat..." | Re-trigger Greptile
size-limit report 📦
|
ReviewThe approach is sound. Moving Logic correctness — The new condition mirrors
The fourth row is the key fix — the old code only checked Ordering — Two small items left inline (one missing test, one style nit on RBS signature — Correctly adds the private method. Looks good. |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb (1)
338-360: Add the NODE_ENV-only development case to the matrix.The new validator also allows
RAILS_ENVunset +NODE_ENV=development/test, but that branch is still untested here. Adding one explicit example would lock down the Node/Ruby parity this PR is trying to preserve.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb` around lines 338 - 360, Add a spec that covers the case where RAILS_ENV is unset and NODE_ENV is "development" (and optionally "test") by stubbing ENV.fetch("RAILS_ENV", nil) to return nil while stubbing ENV.fetch("NODE_ENV", nil) to return "development", then run the existing ReactOnRailsPro.configure block (setting config.server_renderer and config.renderer_url) and assert it does not raise; update the test matrix near the existing examples that use ReactOnRailsPro.configure and ENV.fetch to include this NODE_ENV-only development case so the validator branch allowing RAILS_ENV unset + NODE_ENV=development is exercised.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@react_on_rails_pro/lib/react_on_rails_pro/configuration.rb`:
- Around line 267-274: The diagnostic/error matrix text that describes
environment combinations must be updated to reflect the new dual-env rule
implemented by runtime_envs and allowed_envs: change any statement that
unconditionally treats "(RAILS_ENV unset)" as production-like to reflect that
RAILS_ENV can be unset when NODE_ENV is development or test (i.e., allowed by
runtime_envs.any? && runtime_envs.all? {...}). Locate the message or matrix text
that documents cross-env cases and adjust the entries so they correctly show
that only when neither RAILS_ENV nor NODE_ENV is development/test is the runtime
considered production-like; ensure the updated wording references the same
dual-check logic used by runtime_envs and allowed_envs.
---
Nitpick comments:
In `@react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb`:
- Around line 338-360: Add a spec that covers the case where RAILS_ENV is unset
and NODE_ENV is "development" (and optionally "test") by stubbing
ENV.fetch("RAILS_ENV", nil) to return nil while stubbing ENV.fetch("NODE_ENV",
nil) to return "development", then run the existing ReactOnRailsPro.configure
block (setting config.server_renderer and config.renderer_url) and assert it
does not raise; update the test matrix near the existing examples that use
ReactOnRailsPro.configure and ENV.fetch to include this NODE_ENV-only
development case so the validator branch allowing RAILS_ENV unset +
NODE_ENV=development is exercised.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 1eaa261d-f855-45ec-85dc-411fdec4990e
📒 Files selected for processing (4)
packages/react-on-rails-pro-node-renderer/src/shared/configBuilder.tsreact_on_rails_pro/lib/react_on_rails_pro/configuration.rbreact_on_rails_pro/sig/react_on_rails_pro/configuration.rbsreact_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is ON, but it could not run because on-demand usage is turned off. To enable Bugbot Autofix, turn on on-demand usage and set a spend limit in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c0d9631. Configure here.
- Use .compact_blank instead of .compact so empty-string env vars are filtered like Node's Boolean() filter (cursor[bot]) - Update error matrix to reflect dual-env rule — RAILS_ENV unset is not always production-like when NODE_ENV is development/test (coderabbitai[bot]) - Add test for RAILS_ENV=nil + NODE_ENV=development (claude[bot]) Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Review feedback addressed in 35bfb99
All 4 review threads resolved. 52 specs passing, RuboCop clean. |
|
Tip For best results, initiate chat on the files or code changes.
52 specs passing and RuboCop clean is a solid state. 🎉 ✏️ Learnings added
🧠 Learnings usedIf you found this review helpful, would you consider giving us a shout-out on X? Thank you for using CodeRabbit! |
Review: cross-env validation and renderer password docsOverall: solid change. The logic is correct, the Node-side mirror is precise, and moving the validator call out of Logic correctnessThe Ruby implementation of
Moving the validator callPreviously, if Minor observations
TestsThe new cross-env specs (4 production-like + 4 dev/test cases) give thorough coverage of the documented matrix, and the migration from |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb (1)
338-365: Add one blank-string env case to lock in.compact_blank.The new matrix only covers
niland named envs. Ifruntime_envsinreact_on_rails_pro/lib/react_on_rails_pro/configuration.rb:270-271regressed from.compact_blankback to.compact, these specs would still pass while reintroducing the empty-string mismatch with Node. An example withRAILS_ENV=""andNODE_ENV="development"would catch that.💡 Suggested example
+ it "does not raise when RAILS_ENV is blank and NODE_ENV is development" do + allow(ENV).to receive(:fetch).with("RAILS_ENV", nil).and_return("") + allow(ENV).to receive(:fetch).with("NODE_ENV", nil).and_return("development") + + expect do + ReactOnRailsPro.configure do |config| + config.server_renderer = "NodeRenderer" + config.renderer_url = "https://localhost:3800" + end + end.not_to raise_error + end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb` around lines 338 - 365, Add a spec that covers the empty-string env case to ensure runtime_envs uses .compact_blank: create a new example in configuration_spec (near the other env/matrix tests) that stubs ENV.fetch to return "" for "RAILS_ENV" and "development" for "NODE_ENV", then run the same ReactOnRailsPro.configure block and expect no error; this will catch regressions if runtime_envs in react_on_rails_pro/lib/react_on_rails_pro/configuration.rb (the runtime_envs method around lines referencing .compact_blank) were changed back to .compact.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb`:
- Around line 310-314: The shared before block must also stub
ENV.fetch("RENDERER_PASSWORD", nil) to return nil so tests exercise the "no
password" path; update the setup in the spec to stub ENV.fetch for
"RENDERER_PASSWORD" to nil (so setup_renderer_password in
react_on_rails_pro/lib/react_on_rails_pro/configuration.rb does not populate
renderer_password) ensuring the validator runs through the dev/test env matrix
rather than returning early.
---
Nitpick comments:
In `@react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb`:
- Around line 338-365: Add a spec that covers the empty-string env case to
ensure runtime_envs uses .compact_blank: create a new example in
configuration_spec (near the other env/matrix tests) that stubs ENV.fetch to
return "" for "RAILS_ENV" and "development" for "NODE_ENV", then run the same
ReactOnRailsPro.configure block and expect no error; this will catch regressions
if runtime_envs in react_on_rails_pro/lib/react_on_rails_pro/configuration.rb
(the runtime_envs method around lines referencing .compact_blank) were changed
back to .compact.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 7bed4bd1-babd-49de-9243-f5c78e985ad1
📒 Files selected for processing (2)
react_on_rails_pro/lib/react_on_rails_pro/configuration.rbreact_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb
🚧 Files skipped from review as they are similar to previous changes (1)
- react_on_rails_pro/lib/react_on_rails_pro/configuration.rb
Ensures the dev/test environment matrix tests actually exercise the env-checking logic by stubbing RENDERER_PASSWORD to nil. Without this, a RENDERER_PASSWORD set in the local or CI environment would cause the validator to return early, making the tests pass for the wrong reason. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Review comments addressed (round 2)Fixed (1):
Already resolved (4):
All review threads are now resolved. |
|
|
||
| it "does not raise when RAILS_ENV is test and NODE_ENV is development" do | ||
| allow(ENV).to receive(:fetch).with("RAILS_ENV", nil).and_return("test") | ||
| allow(ENV).to receive(:fetch).with("NODE_ENV", nil).and_return("development") |
There was a problem hiding this comment.
The new tests cover NODE_ENV=development + RAILS_ENV=nil but not the symmetric NODE_ENV=test + RAILS_ENV=nil case. Since test is also in allowed_envs, a NODE_ENV-only test env should likewise skip validation. Consider adding this case for full parity:
it "does not raise when RAILS_ENV is unset and NODE_ENV is test" do
allow(ENV).to receive(:fetch).with("RAILS_ENV", nil).and_return(nil)
allow(ENV).to receive(:fetch).with("NODE_ENV", nil).and_return("test")
expect do
ReactOnRailsPro.configure do |config|
config.server_renderer = "NodeRenderer"
config.renderer_url = "https://localhost:3800"
end
end.not_to raise_error
end| (both unset) — treated as production-like; RENDERER_PASSWORD required | ||
| staging — RENDERER_PASSWORD required | ||
| production — RENDERER_PASSWORD required | ||
| (mixed envs) — RENDERER_PASSWORD required (e.g. NODE_ENV=production + RAILS_ENV=development) |
There was a problem hiding this comment.
The updated matrix removed the old (any other) — RENDERER_PASSWORD required catch-all row without adding an equivalent. Cases like NODE_ENV=staging + RAILS_ENV=nil (a single non-dev/test env value) are still enforced correctly by the logic, but they're no longer represented in the matrix. Consider adding one more row to make the table exhaustive:
(any other value) — RENDERER_PASSWORD required (e.g. NODE_ENV=staging alone, custom env names)
Review: fix: cross-env validation and docs for renderer passwordOverall: Solid, well-reasoned PR. The logic correctly mirrors Node-side What works well
Behavioral change worth noting in CHANGELOGPreviously: This is intentional and correct, but it changes existing startup behavior for anyone running with MinorTwo specific notes left as inline comments:
|
## Summary Addresses all three follow-up items from PR #2829: - **Ruby-side NODE_ENV checking**: `validate_renderer_password_for_production` now checks both `RAILS_ENV` and `NODE_ENV`, mirroring the Node-side `runtimeEnvsAllowDevelopmentDefaults()`. Surfaces misconfigurations (e.g. `NODE_ENV=production` + `RAILS_ENV=development`) at Rails boot time instead of at Node request time. - **Clarifying comment**: Added comment to `defaultReplayServerAsyncOperationLogs()` explaining the intentional asymmetry — it only checks `NODE_ENV` because async log replay is a JS debugging concern, not a security boundary. - **Unconditional validator call**: Moved `validate_renderer_password_for_production` from inside `setup_renderer_password` to `setup_config_values`, making enforcement unconditional and resilient to future refactors of the password resolution logic. Closes #2887 ## Test plan - [x] All 51 Ruby configuration specs pass (including 4 new cross-env tests) - [x] All 31 Node renderer configBuilder tests pass - [x] RuboCop clean - [x] ESLint + Prettier clean - [ ] CI passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Tightens production-like startup validation for the Node renderer password, which can cause previously misconfigured deployments to fail fast at Rails boot. Changes are localized to configuration/validation paths with expanded spec coverage. > > **Overview** > Ensures `RENDERER_PASSWORD` enforcement is **fail-closed and consistent across Ruby and Node** by validating against both `RAILS_ENV` and `NODE_ENV`, including rejecting mixed-env setups (e.g. `NODE_ENV=production` + `RAILS_ENV=development`). > > Moves `validate_renderer_password_for_production` to run unconditionally during Rails `setup_config_values`, updates the error message docs/matrix accordingly, and expands Ruby specs to cover the new cross-env scenarios. > > Adds a clarifying comment in the Node `configBuilder` that `defaultReplayServerAsyncOperationLogs()` intentionally keys only off `NODE_ENV` (debugging behavior, not a security boundary). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 5a01f45. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Strengthened production validation for the Node renderer to prevent misconfiguration in mixed or production envs. * **Documentation** * Clarified default server operation logging behavior and updated environment-related messaging. * **Tests** * Expanded test coverage for environment-variable combinations to ensure consistent behavior across deployment and development scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
## Summary Addresses all three follow-up items from PR #2829: - **Ruby-side NODE_ENV checking**: `validate_renderer_password_for_production` now checks both `RAILS_ENV` and `NODE_ENV`, mirroring the Node-side `runtimeEnvsAllowDevelopmentDefaults()`. Surfaces misconfigurations (e.g. `NODE_ENV=production` + `RAILS_ENV=development`) at Rails boot time instead of at Node request time. - **Clarifying comment**: Added comment to `defaultReplayServerAsyncOperationLogs()` explaining the intentional asymmetry — it only checks `NODE_ENV` because async log replay is a JS debugging concern, not a security boundary. - **Unconditional validator call**: Moved `validate_renderer_password_for_production` from inside `setup_renderer_password` to `setup_config_values`, making enforcement unconditional and resilient to future refactors of the password resolution logic. Closes #2887 ## Test plan - [x] All 51 Ruby configuration specs pass (including 4 new cross-env tests) - [x] All 31 Node renderer configBuilder tests pass - [x] RuboCop clean - [x] ESLint + Prettier clean - [ ] CI passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Tightens production-like startup validation for the Node renderer password, which can cause previously misconfigured deployments to fail fast at Rails boot. Changes are localized to configuration/validation paths with expanded spec coverage. > > **Overview** > Ensures `RENDERER_PASSWORD` enforcement is **fail-closed and consistent across Ruby and Node** by validating against both `RAILS_ENV` and `NODE_ENV`, including rejecting mixed-env setups (e.g. `NODE_ENV=production` + `RAILS_ENV=development`). > > Moves `validate_renderer_password_for_production` to run unconditionally during Rails `setup_config_values`, updates the error message docs/matrix accordingly, and expands Ruby specs to cover the new cross-env scenarios. > > Adds a clarifying comment in the Node `configBuilder` that `defaultReplayServerAsyncOperationLogs()` intentionally keys only off `NODE_ENV` (debugging behavior, not a security boundary). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 5a01f45. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Strengthened production validation for the Node renderer to prevent misconfiguration in mixed or production envs. * **Documentation** * Clarified default server operation logging behavior and updated environment-related messaging. * **Tests** * Expanded test coverage for environment-variable combinations to ensure consistent behavior across deployment and development scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
…ages * origin/main: (44 commits) Consolidate CSP nonce sanitization into shared module (#2828) Add comprehensive --rsc-pro generator tests (#3098) fix: cross-env validation and docs for renderer password (#3090) Improve package metadata and Pro upgrade CTAs (#3112) docs: standardize warning syntax to GFM alert format (#3115) docs: improve react-intl documentation for React Server Components (#3085) Fix generator CI SSR regression on main (#3110) Refocus GitHub README on docs navigation (#3113) Add manual dev environment testing checklist for coding agents (#3074) Bump version to 16.6.0 Update CHANGELOG.md for 16.6.0 (#3078) fix: node-renderer diagnostic improvements (#3086) fix: pin third-party npm deps in generator to prevent peer dep conflicts (#3083) chore(deps): bump lodash from 4.17.23 to 4.18.1 in the npm-security group across 1 directory (#2920) fix: refactor formatExceptionMessage to accept generic request context (#2877) Bump version to 16.6.0.rc.1 Update CHANGELOG.md for 16.6.0.rc.1 (#3079) Update CHANGELOG.md unreleased section (#3077) Fix Content-Length mismatch and null renderingRequest errors in node renderer (#3069) Improve memory debugging docs with simpler heap snapshot approach (#3072) ... # Conflicts: # docs/pro/home-pro.md # docs/pro/react-on-rails-pro.md # docs/sidebars.ts

Summary
Addresses all three follow-up items from PR #2829:
validate_renderer_password_for_productionnow checks bothRAILS_ENVandNODE_ENV, mirroring the Node-sideruntimeEnvsAllowDevelopmentDefaults(). Surfaces misconfigurations (e.g.NODE_ENV=production+RAILS_ENV=development) at Rails boot time instead of at Node request time.defaultReplayServerAsyncOperationLogs()explaining the intentional asymmetry — it only checksNODE_ENVbecause async log replay is a JS debugging concern, not a security boundary.validate_renderer_password_for_productionfrom insidesetup_renderer_passwordtosetup_config_values, making enforcement unconditional and resilient to future refactors of the password resolution logic.Closes #2887
Test plan
🤖 Generated with Claude Code
Note
Medium Risk
Tightens production-like startup validation for the Node renderer password, which can cause previously misconfigured deployments to fail fast at Rails boot. Changes are localized to configuration/validation paths with expanded spec coverage.
Overview
Ensures
RENDERER_PASSWORDenforcement is fail-closed and consistent across Ruby and Node by validating against bothRAILS_ENVandNODE_ENV, including rejecting mixed-env setups (e.g.NODE_ENV=production+RAILS_ENV=development).Moves
validate_renderer_password_for_productionto run unconditionally during Railssetup_config_values, updates the error message docs/matrix accordingly, and expands Ruby specs to cover the new cross-env scenarios.Adds a clarifying comment in the Node
configBuilderthatdefaultReplayServerAsyncOperationLogs()intentionally keys only offNODE_ENV(debugging behavior, not a security boundary).Reviewed by Cursor Bugbot for commit 5a01f45. Bugbot is set up for automated code reviews on this repo. Configure here.
Summary by CodeRabbit
Bug Fixes
Documentation
Tests