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.
- checksums.yaml +4 -4
- data/AI_AGENT_INSTRUCTIONS.md +63 -0
- data/CHANGELOG.md +564 -85
- data/CLAUDE.md +135 -0
- data/CODING_AGENTS.md +313 -0
- data/CONTRIBUTING.md +448 -37
- data/Gemfile.development_dependencies +6 -1
- data/Gemfile.lock +13 -4
- data/KUDOS.md +22 -1
- data/LICENSE.md +30 -4
- data/LICENSES/README.md +14 -0
- data/NEWS.md +48 -48
- data/PROJECTS.md +45 -40
- data/REACT-ON-RAILS-PRO-LICENSE.md +129 -0
- data/README.md +113 -42
- data/SUMMARY.md +62 -52
- data/TODO.md +135 -0
- data/bin/lefthook/check-trailing-newlines +38 -0
- data/bin/lefthook/get-changed-files +26 -0
- data/bin/lefthook/prettier-format +26 -0
- data/bin/lefthook/ruby-autofix +26 -0
- data/bin/lefthook/ruby-lint +27 -0
- data/eslint.config.ts +232 -0
- data/knip.ts +40 -6
- data/lib/generators/USAGE +4 -5
- data/lib/generators/react_on_rails/USAGE +65 -0
- data/lib/generators/react_on_rails/base_generator.rb +276 -62
- data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -0
- data/lib/generators/react_on_rails/generator_helper.rb +35 -1
- data/lib/generators/react_on_rails/generator_messages.rb +138 -17
- data/lib/generators/react_on_rails/install_generator.rb +474 -26
- data/lib/generators/react_on_rails/react_no_redux_generator.rb +19 -6
- data/lib/generators/react_on_rails/react_with_redux_generator.rb +110 -18
- data/lib/generators/react_on_rails/templates/.eslintrc +1 -1
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +5 -0
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-prod-assets +8 -0
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static-assets +2 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -5
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +2 -2
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorldServer.js +1 -1
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/server-bundle.js +1 -8
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.jsx +21 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.tsx +25 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.module.css +4 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.jsx +5 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.tsx +5 -0
- data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +1 -1
- data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb +4 -2
- data/lib/generators/react_on_rails/templates/base/base/babel.config.js.tt +5 -2
- data/lib/generators/react_on_rails/templates/base/base/bin/dev +34 -0
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +14 -5
- data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +76 -7
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +1 -1
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt +6 -10
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/production.js.tt +2 -2
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/serverWebpackConfig.js.tt +3 -2
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt +2 -2
- data/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb +0 -2
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/actions/helloWorldActionCreators.ts +18 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -6
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +4 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.tsx +24 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/constants/helloWorldConstants.ts +6 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/containers/HelloWorldContainer.ts +20 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.js +1 -1
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.ts +22 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.client.tsx +23 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.jsx +5 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.tsx +5 -0
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.ts +18 -0
- data/lib/react_on_rails/configuration.rb +141 -57
- data/lib/react_on_rails/controller.rb +6 -2
- data/lib/react_on_rails/dev/file_manager.rb +78 -0
- data/lib/react_on_rails/dev/pack_generator.rb +27 -0
- data/lib/react_on_rails/dev/process_manager.rb +61 -0
- data/lib/react_on_rails/dev/server_manager.rb +487 -0
- data/lib/react_on_rails/dev.rb +20 -0
- data/lib/react_on_rails/doctor.rb +1149 -0
- data/lib/react_on_rails/engine.rb +6 -0
- data/lib/react_on_rails/git_utils.rb +12 -2
- data/lib/react_on_rails/helper.rb +176 -74
- data/lib/react_on_rails/json_parse_error.rb +6 -1
- data/lib/react_on_rails/packer_utils.rb +61 -71
- data/lib/react_on_rails/packs_generator.rb +221 -19
- data/lib/react_on_rails/prerender_error.rb +4 -0
- data/lib/react_on_rails/pro/NOTICE +21 -0
- data/lib/react_on_rails/pro/helper.rb +122 -0
- data/lib/react_on_rails/pro/utils.rb +53 -0
- data/lib/react_on_rails/react_component/render_options.rb +38 -6
- data/lib/react_on_rails/server_rendering_js_code.rb +0 -1
- data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +12 -5
- data/lib/react_on_rails/system_checker.rb +659 -0
- data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +1 -1
- data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +6 -4
- data/lib/react_on_rails/test_helper.rb +2 -3
- data/lib/react_on_rails/utils.rb +139 -43
- data/lib/react_on_rails/version.rb +1 -1
- data/lib/react_on_rails/version_checker.rb +14 -20
- data/lib/react_on_rails/version_syntax_converter.rb +1 -1
- data/lib/react_on_rails.rb +1 -0
- data/lib/tasks/assets.rake +1 -1
- data/lib/tasks/doctor.rake +48 -0
- data/lib/tasks/generate_packs.rake +158 -1
- data/react_on_rails.gemspec +1 -0
- data/tsconfig.eslint.json +6 -0
- data/tsconfig.json +5 -3
- metadata +63 -14
- data/REACT-ON-RAILS-PRO-LICENSE +0 -95
- data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +0 -41
- data/lib/generators/react_on_rails/bin/dev +0 -30
- data/lib/generators/react_on_rails/bin/dev-static +0 -30
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static.tt +0 -9
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +0 -5
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/registration.js.tt +0 -8
- /data/lib/generators/react_on_rails/templates/base/base/config/webpack/{webpackConfig.js.tt → generateWebpackConfigs.js.tt} +0 -0
- /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: [
|
8
|
-
|
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
|
-
|
28
|
-
|
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
|
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
|
-
|
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
|