react_on_rails 14.2.1 → 16.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/AI_AGENT_INSTRUCTIONS.md +63 -0
  3. data/CHANGELOG.md +564 -85
  4. data/CLAUDE.md +135 -0
  5. data/CODING_AGENTS.md +313 -0
  6. data/CONTRIBUTING.md +448 -37
  7. data/Gemfile.development_dependencies +6 -1
  8. data/Gemfile.lock +13 -4
  9. data/KUDOS.md +22 -1
  10. data/LICENSE.md +30 -4
  11. data/LICENSES/README.md +14 -0
  12. data/NEWS.md +48 -48
  13. data/PROJECTS.md +45 -40
  14. data/REACT-ON-RAILS-PRO-LICENSE.md +129 -0
  15. data/README.md +113 -42
  16. data/SUMMARY.md +62 -52
  17. data/TODO.md +135 -0
  18. data/bin/lefthook/check-trailing-newlines +38 -0
  19. data/bin/lefthook/get-changed-files +26 -0
  20. data/bin/lefthook/prettier-format +26 -0
  21. data/bin/lefthook/ruby-autofix +26 -0
  22. data/bin/lefthook/ruby-lint +27 -0
  23. data/eslint.config.ts +232 -0
  24. data/knip.ts +40 -6
  25. data/lib/generators/USAGE +4 -5
  26. data/lib/generators/react_on_rails/USAGE +65 -0
  27. data/lib/generators/react_on_rails/base_generator.rb +276 -62
  28. data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -0
  29. data/lib/generators/react_on_rails/generator_helper.rb +35 -1
  30. data/lib/generators/react_on_rails/generator_messages.rb +138 -17
  31. data/lib/generators/react_on_rails/install_generator.rb +474 -26
  32. data/lib/generators/react_on_rails/react_no_redux_generator.rb +19 -6
  33. data/lib/generators/react_on_rails/react_with_redux_generator.rb +110 -18
  34. data/lib/generators/react_on_rails/templates/.eslintrc +1 -1
  35. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +5 -0
  36. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-prod-assets +8 -0
  37. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static-assets +2 -0
  38. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -5
  39. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +2 -2
  40. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorldServer.js +1 -1
  41. data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/server-bundle.js +1 -8
  42. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.jsx +21 -0
  43. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.tsx +25 -0
  44. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.module.css +4 -0
  45. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.jsx +5 -0
  46. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.tsx +5 -0
  47. data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +1 -1
  48. data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb +4 -2
  49. data/lib/generators/react_on_rails/templates/base/base/babel.config.js.tt +5 -2
  50. data/lib/generators/react_on_rails/templates/base/base/bin/dev +34 -0
  51. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +14 -5
  52. data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +76 -7
  53. data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +1 -1
  54. data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt +6 -10
  55. data/lib/generators/react_on_rails/templates/base/base/config/webpack/production.js.tt +2 -2
  56. data/lib/generators/react_on_rails/templates/base/base/config/webpack/serverWebpackConfig.js.tt +3 -2
  57. data/lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt +2 -2
  58. data/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb +0 -2
  59. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/actions/helloWorldActionCreators.ts +18 -0
  60. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -6
  61. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +4 -0
  62. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.tsx +24 -0
  63. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/constants/helloWorldConstants.ts +6 -0
  64. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/containers/HelloWorldContainer.ts +20 -0
  65. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.js +1 -1
  66. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.ts +22 -0
  67. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.client.tsx +23 -0
  68. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.jsx +5 -0
  69. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.tsx +5 -0
  70. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.ts +18 -0
  71. data/lib/react_on_rails/configuration.rb +141 -57
  72. data/lib/react_on_rails/controller.rb +6 -2
  73. data/lib/react_on_rails/dev/file_manager.rb +78 -0
  74. data/lib/react_on_rails/dev/pack_generator.rb +27 -0
  75. data/lib/react_on_rails/dev/process_manager.rb +61 -0
  76. data/lib/react_on_rails/dev/server_manager.rb +487 -0
  77. data/lib/react_on_rails/dev.rb +20 -0
  78. data/lib/react_on_rails/doctor.rb +1149 -0
  79. data/lib/react_on_rails/engine.rb +6 -0
  80. data/lib/react_on_rails/git_utils.rb +12 -2
  81. data/lib/react_on_rails/helper.rb +176 -74
  82. data/lib/react_on_rails/json_parse_error.rb +6 -1
  83. data/lib/react_on_rails/packer_utils.rb +61 -71
  84. data/lib/react_on_rails/packs_generator.rb +221 -19
  85. data/lib/react_on_rails/prerender_error.rb +4 -0
  86. data/lib/react_on_rails/pro/NOTICE +21 -0
  87. data/lib/react_on_rails/pro/helper.rb +122 -0
  88. data/lib/react_on_rails/pro/utils.rb +53 -0
  89. data/lib/react_on_rails/react_component/render_options.rb +38 -6
  90. data/lib/react_on_rails/server_rendering_js_code.rb +0 -1
  91. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +12 -5
  92. data/lib/react_on_rails/system_checker.rb +659 -0
  93. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +1 -1
  94. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +6 -4
  95. data/lib/react_on_rails/test_helper.rb +2 -3
  96. data/lib/react_on_rails/utils.rb +139 -43
  97. data/lib/react_on_rails/version.rb +1 -1
  98. data/lib/react_on_rails/version_checker.rb +14 -20
  99. data/lib/react_on_rails/version_syntax_converter.rb +1 -1
  100. data/lib/react_on_rails.rb +1 -0
  101. data/lib/tasks/assets.rake +1 -1
  102. data/lib/tasks/doctor.rake +48 -0
  103. data/lib/tasks/generate_packs.rake +158 -1
  104. data/react_on_rails.gemspec +1 -0
  105. data/tsconfig.eslint.json +6 -0
  106. data/tsconfig.json +5 -3
  107. metadata +63 -14
  108. data/REACT-ON-RAILS-PRO-LICENSE +0 -95
  109. data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +0 -41
  110. data/lib/generators/react_on_rails/bin/dev +0 -30
  111. data/lib/generators/react_on_rails/bin/dev-static +0 -30
  112. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static.tt +0 -9
  113. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +0 -5
  114. data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/registration.js.tt +0 -8
  115. /data/lib/generators/react_on_rails/templates/base/base/config/webpack/{webpackConfig.js.tt → generateWebpackConfigs.js.tt} +0 -0
  116. /data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/{HelloWorldApp.jsx → HelloWorldApp.client.jsx} +0 -0
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ # Lint Ruby files with RuboCop
3
+ set -euo pipefail
4
+
5
+ CONTEXT="${1:-staged}"
6
+ files="$(bin/lefthook/get-changed-files "$CONTEXT" '\.(rb|rake|ru)$')"
7
+
8
+ if [ -z "$files" ]; then
9
+ echo "✅ No Ruby files to lint"
10
+ exit 0
11
+ fi
12
+
13
+ if [ "$CONTEXT" = "all-changed" ]; then
14
+ echo "🔍 RuboCop on all changed Ruby files:"
15
+ else
16
+ echo "🔍 RuboCop on $CONTEXT Ruby files:"
17
+ fi
18
+ printf " %s\n" $files
19
+
20
+ if ! bundle exec rubocop --force-exclusion --display-cop-names -- $files; then
21
+ echo ""
22
+ echo "❌ RuboCop check failed!"
23
+ echo "💡 Auto-fix: bundle exec rubocop --auto-correct --force-exclusion -- $files"
24
+ echo "🚫 Skip hook: git commit --no-verify"
25
+ exit 1
26
+ fi
27
+ echo "✅ RuboCop checks passed for Ruby files"
data/eslint.config.ts ADDED
@@ -0,0 +1,232 @@
1
+ import path from 'node:path';
2
+ import { globalIgnores } from 'eslint/config';
3
+ import jest from 'eslint-plugin-jest';
4
+ import prettierRecommended from 'eslint-plugin-prettier/recommended';
5
+ import testingLibrary from 'eslint-plugin-testing-library';
6
+ import globals from 'globals';
7
+ import tsEslint from 'typescript-eslint';
8
+ import { includeIgnoreFile } from '@eslint/compat';
9
+ import js from '@eslint/js';
10
+ import { FlatCompat } from '@eslint/eslintrc';
11
+
12
+ const compat = new FlatCompat({
13
+ baseDirectory: __dirname,
14
+ recommendedConfig: js.configs.recommended,
15
+ allConfig: js.configs.all,
16
+ });
17
+
18
+ const config = tsEslint.config([
19
+ includeIgnoreFile(path.resolve(__dirname, '.gitignore')),
20
+ globalIgnores([
21
+ // compiled code
22
+ 'node_package/lib/',
23
+ // used for tests only
24
+ 'spec/react_on_rails/dummy-for-generators',
25
+ // temporary and generated files
26
+ 'spec/dummy/.yalc',
27
+ 'spec/dummy/public',
28
+ 'spec/dummy/vendor',
29
+ 'spec/dummy/tmp',
30
+ 'spec/dummy/app/assets/config/manifest.js',
31
+ 'spec/dummy/client/app/packs/server-bundle.js',
32
+ '**/*.res.js',
33
+ '**/coverage',
34
+ '**/assets/webpack/',
35
+ '**/public/webpack/',
36
+ '**/generated/',
37
+ '**/app/assets/javascripts/application.js',
38
+ '**/cable.js',
39
+ '**/public/packs*/',
40
+ '**/gen-examples/',
41
+ '**/bundle/',
42
+ // dependencies
43
+ '**/node_modules/',
44
+ // fixtures
45
+ '**/fixtures/',
46
+ '**/.yalc/**/*',
47
+ // generator templates - exclude TypeScript templates that need tsconfig.json
48
+ '**/templates/**/*.tsx',
49
+ '**/templates/**/*.ts',
50
+ ]),
51
+ {
52
+ files: ['**/*.[jt]s', '**/*.[jt]sx', '**/*.[cm][jt]s'],
53
+ },
54
+ js.configs.recommended,
55
+ compat.extends('eslint-config-shakacode'),
56
+ {
57
+ languageOptions: {
58
+ globals: {
59
+ ...globals.browser,
60
+ ...globals.node,
61
+ },
62
+
63
+ parserOptions: {
64
+ requireConfigFile: false,
65
+
66
+ babelOptions: {
67
+ presets: ['@babel/preset-env', '@babel/preset-react'],
68
+ },
69
+ },
70
+ },
71
+
72
+ settings: {
73
+ 'import/core-modules': ['react-redux'],
74
+
75
+ 'import/resolver': {
76
+ alias: [['Assets', './spec/dummy/client/app/assets']],
77
+
78
+ node: {
79
+ extensions: ['.js', '.jsx', '.ts', '.tsx', '.d.ts'],
80
+ },
81
+ },
82
+ },
83
+
84
+ rules: {
85
+ 'no-shadow': 'off',
86
+ 'no-console': 'off',
87
+ 'function-paren-newline': 'off',
88
+ 'object-curly-newline': 'off',
89
+ 'no-restricted-syntax': ['error', 'SequenceExpression'],
90
+ 'no-void': [
91
+ 'error',
92
+ {
93
+ allowAsStatement: true,
94
+ },
95
+ ],
96
+
97
+ 'import/extensions': [
98
+ 'error',
99
+ 'ignorePackages',
100
+ {
101
+ js: 'never',
102
+ jsx: 'never',
103
+ ts: 'never',
104
+ tsx: 'never',
105
+ },
106
+ ],
107
+
108
+ 'import/first': 'off',
109
+ 'import/no-extraneous-dependencies': 'off',
110
+ // The rule seems broken: it's reporting errors on imports in files using `export` too,
111
+ // not just `module.exports`.
112
+ 'import/no-import-module-exports': 'off',
113
+ 'import/no-unresolved': [
114
+ 'error',
115
+ {
116
+ ignore: ['\\.res\\.js$'],
117
+ },
118
+ ],
119
+ 'react/destructuring-assignment': [
120
+ 'error',
121
+ 'always',
122
+ {
123
+ ignoreClassFields: true,
124
+ },
125
+ ],
126
+ 'react/forbid-prop-types': 'off',
127
+ 'react/function-component-definition': [
128
+ 'error',
129
+ {
130
+ namedComponents: ['arrow-function', 'function-declaration'],
131
+ unnamedComponents: 'arrow-function',
132
+ },
133
+ ],
134
+ 'react/jsx-props-no-spreading': 'off',
135
+ 'react/static-property-placement': 'off',
136
+ 'jsx-a11y/anchor-is-valid': 'off',
137
+ 'react/jsx-filename-extension': [
138
+ 'error',
139
+ {
140
+ extensions: ['.jsx', '.tsx'],
141
+ },
142
+ ],
143
+ },
144
+ },
145
+ {
146
+ files: ['node_package/**/*'],
147
+ rules: {
148
+ 'import/extensions': ['error', 'ignorePackages'],
149
+ },
150
+ },
151
+ {
152
+ files: ['lib/generators/react_on_rails/templates/**/*'],
153
+ rules: {
154
+ // It doesn't use package.json from the template
155
+ 'import/no-unresolved': 'off',
156
+ // We have `const [name, setName] = useState(props.name)` so can't just destructure props
157
+ 'react/destructuring-assignment': 'off',
158
+ // React 19 doesn't need PropTypes - we're targeting modern React
159
+ 'react/prop-types': 'off',
160
+ },
161
+ },
162
+ {
163
+ files: ['spec/dummy/**/*'],
164
+ rules: {
165
+ // The dummy app dependencies are managed separately and may not be installed
166
+ 'import/no-unresolved': 'off',
167
+ },
168
+ },
169
+ {
170
+ files: ['**/*.ts{x,}', '**/*.[cm]ts'],
171
+
172
+ extends: tsEslint.configs.strictTypeChecked,
173
+
174
+ languageOptions: {
175
+ parserOptions: {
176
+ projectService: {
177
+ allowDefaultProject: ['eslint.config.ts', 'knip.ts', 'node_package/tests/*.test.{ts,tsx}'],
178
+ // Needed because `import * as ... from` instead of `import ... from` doesn't work in this file
179
+ // for some imports.
180
+ defaultProject: 'tsconfig.eslint.json',
181
+ },
182
+ },
183
+ },
184
+
185
+ rules: {
186
+ '@typescript-eslint/no-namespace': 'off',
187
+ '@typescript-eslint/no-shadow': 'error',
188
+ '@typescript-eslint/no-confusing-void-expression': [
189
+ 'error',
190
+ {
191
+ ignoreArrowShorthand: true,
192
+ },
193
+ ],
194
+ // Too many false positives
195
+ '@typescript-eslint/no-unnecessary-condition': 'off',
196
+ '@typescript-eslint/no-unused-vars': [
197
+ 'error',
198
+ {
199
+ caughtErrorsIgnorePattern: '^_',
200
+ },
201
+ ],
202
+ '@typescript-eslint/restrict-template-expressions': 'off',
203
+ },
204
+ },
205
+ {
206
+ files: ['**/app-react16/**/*'],
207
+ rules: {
208
+ 'react/no-deprecated': 'off',
209
+ },
210
+ },
211
+ {
212
+ files: ['node_package/tests/**', '**/*.test.{js,jsx,ts,tsx}'],
213
+
214
+ extends: [
215
+ jest.configs['flat/recommended'],
216
+ jest.configs['flat/style'],
217
+ testingLibrary.configs['flat/dom'],
218
+ ],
219
+
220
+ rules: {
221
+ // Allows Jest mocks before import
222
+ 'import/first': 'off',
223
+ // Avoiding these methods complicates tests and isn't useful for our purposes
224
+ 'testing-library/no-node-access': 'off',
225
+ },
226
+ },
227
+ // must be the last config in the array
228
+ // https://github.com/prettier/eslint-plugin-prettier?tab=readme-ov-file#configuration-new-eslintconfigjs
229
+ prettierRecommended,
230
+ ]);
231
+
232
+ export default config;
data/knip.ts CHANGED
@@ -4,11 +4,34 @@ const config: KnipConfig = {
4
4
  // ! at the end means files are used in production
5
5
  workspaces: {
6
6
  '.': {
7
- entry: ['node_package/src/ReactOnRails.ts!', 'node_package/src/ReactOnRails.node.ts!'],
8
- project: ['node_package/src/**/*.[jt]s!', 'node_package/tests/**/*.[jt]s'],
7
+ entry: [
8
+ 'node_package/src/ReactOnRails.node.ts!',
9
+ 'node_package/src/pro/ReactOnRailsRSC.ts!',
10
+ 'node_package/src/pro/registerServerComponent/client.tsx!',
11
+ 'node_package/src/pro/registerServerComponent/server.tsx!',
12
+ 'node_package/src/pro/registerServerComponent/server.rsc.ts!',
13
+ 'node_package/src/pro/wrapServerComponentRenderer/server.tsx!',
14
+ 'node_package/src/pro/wrapServerComponentRenderer/server.rsc.tsx!',
15
+ 'node_package/src/pro/RSCRoute.tsx!',
16
+ 'node_package/src/pro/ServerComponentFetchError.ts!',
17
+ 'node_package/src/pro/getReactServerComponent.server.ts!',
18
+ 'node_package/src/pro/transformRSCNodeStream.ts!',
19
+ 'node_package/src/loadJsonFile.ts!',
20
+ 'eslint.config.ts',
21
+ ],
22
+ project: ['node_package/src/**/*.[jt]s{x,}!', 'node_package/tests/**/*.[jt]s{x,}'],
9
23
  babel: {
10
24
  config: ['node_package/babel.config.js'],
11
25
  },
26
+ ignore: [
27
+ 'node_package/tests/emptyForTesting.js',
28
+ // Pro features exported for external consumption
29
+ 'node_package/src/pro/streamServerRenderedReactComponent.ts:transformRenderStreamChunksToResultObject',
30
+ 'node_package/src/pro/streamServerRenderedReactComponent.ts:streamServerRenderedComponent',
31
+ 'node_package/src/pro/ServerComponentFetchError.ts:isServerComponentFetchError',
32
+ 'node_package/src/pro/RSCRoute.tsx:RSCRouteProps',
33
+ 'node_package/src/pro/streamServerRenderedReactComponent.ts:StreamingTrackers',
34
+ ],
12
35
  ignoreBinaries: [
13
36
  // Knip fails to detect it's declared in devDependencies
14
37
  'nps',
@@ -18,14 +41,24 @@ const config: KnipConfig = {
18
41
  ignoreDependencies: [
19
42
  // Required for TypeScript compilation, but we don't depend on Turbolinks itself.
20
43
  '@types/turbolinks',
21
- // used in package-scripts.yml
22
- 'concurrently',
23
44
  // The Knip ESLint plugin fails to detect these are transitively required by a config,
24
45
  // though we don't actually use its rules anywhere.
46
+ '@babel/eslint-parser',
47
+ '@babel/preset-react',
48
+ 'eslint-config-shakacode',
49
+ 'eslint-import-resolver-alias',
50
+ 'eslint-plugin-import',
25
51
  'eslint-plugin-jsx-a11y',
26
52
  'eslint-plugin-react',
27
- // Used in CI
28
- '@arethetypeswrong/cli',
53
+ 'eslint-plugin-react-hooks',
54
+ // These are used as transitive dependencies and missing from package.json
55
+ '@eslint/eslintrc',
56
+ '@eslint/js',
57
+ // used by Jest
58
+ 'jsdom',
59
+ // This is an optional peer dependency because users without RSC don't need it
60
+ // but Knip doesn't like such dependencies to be referenced directly in code
61
+ 'react-on-rails-rsc',
29
62
  ],
30
63
  },
31
64
  'spec/dummy': {
@@ -39,6 +72,7 @@ const config: KnipConfig = {
39
72
  // Declaring this as webpack.config instead doesn't work correctly
40
73
  'config/webpack/webpack.config.js',
41
74
  ],
75
+ ignore: ['**/app-react16/**/*'],
42
76
  project: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}!', 'config/webpack/*.js'],
43
77
  paths: {
44
78
  'Assets/*': ['client/app/assets/*'],
data/lib/generators/USAGE CHANGED
@@ -1,9 +1,8 @@
1
1
  Description:
2
2
 
3
- The react_on_rails:install generator integrates webpack with rails with ease. You
4
- can pass the redux option if you'd like to have redux setup for you automatically.
3
+ The react_on_rails:install generator integrates a React frontend, including SSR, with Rails.
5
4
 
6
- * Redux
5
+ * Redux (Optional)
7
6
 
8
7
  Passing the --redux generator option causes the generated Hello World example
9
8
  to integrate the Redux state container framework. The necessary node modules
@@ -13,11 +12,11 @@ can pass the redux option if you'd like to have redux setup for you automaticall
13
12
 
14
13
  After running the generator, you will want to:
15
14
 
16
- bundle && yarn
15
+ bundle && npm install # or yarn install, or pnpm install
17
16
 
18
17
  Then you may run
19
18
 
20
- foreman start -f Procfile.dev
19
+ ./bin/dev
21
20
 
22
21
  More Details:
23
22
 
@@ -0,0 +1,65 @@
1
+ Description:
2
+ The `react_on_rails:doctor` generator diagnoses your React on Rails setup
3
+ and identifies potential configuration issues. It performs comprehensive
4
+ checks on your environment, dependencies, and configuration files.
5
+
6
+ This command is especially useful for:
7
+ • Troubleshooting setup issues
8
+ • Verifying installation after running react_on_rails:install
9
+ • Ensuring compatibility after upgrades
10
+ • Getting help with configuration problems
11
+
12
+ Example:
13
+ # Basic diagnosis
14
+ rails generate react_on_rails:doctor
15
+
16
+ # Verbose output showing all checks
17
+ rails generate react_on_rails:doctor --verbose
18
+
19
+ # Show help
20
+ rails generate react_on_rails:doctor --help
21
+
22
+ Checks performed:
23
+ Environment Prerequisites:
24
+ • Node.js installation and version compatibility
25
+ • JavaScript package manager availability (npm, yarn, pnpm, bun)
26
+ • Git working directory status
27
+
28
+ React on Rails Packages:
29
+ • React on Rails gem installation
30
+ • react-on-rails NPM package installation
31
+ • Version synchronization between gem and NPM package
32
+ • Shakapacker configuration and installation
33
+
34
+ Dependencies:
35
+ • React and React DOM installation
36
+ • Babel preset configuration
37
+ • Required development dependencies
38
+
39
+ Rails Integration:
40
+ • React on Rails initializer configuration
41
+ • Route and controller setup (Hello World example)
42
+ • View helper integration
43
+
44
+ Webpack Configuration:
45
+ • Webpack config file existence and structure
46
+ • React on Rails compatibility checks
47
+ • Environment-specific configuration validation
48
+
49
+ Development Environment:
50
+ • JavaScript bundle files
51
+ • Procfile.dev for development workflow
52
+ • .gitignore configuration for generated files
53
+
54
+ Options:
55
+ --verbose, -v: Show detailed output for all checks, including successful ones
56
+ --fix, -f: Attempt to fix simple issues automatically (planned feature)
57
+
58
+ Exit codes:
59
+ 0: All checks passed or only warnings found
60
+ 1: Critical errors found that prevent React on Rails from working
61
+
62
+ For more help:
63
+ • Documentation: https://github.com/shakacode/react_on_rails
64
+ • Issues: https://github.com/shakacode/react_on_rails/issues
65
+ • Discord: https://discord.gg/reactrails