analysis/create-react-on-rails-app-proposal.md
Issue: https://github.com/shakacode/react_on_rails/issues/1637
Create an NPX-executable CLI tool (create-react-on-rails-app) that provides a single-command setup experience for React on Rails projects, similar to create-react-app or create-next-app.
npx create-react-on-rails-app my-app [options]
--template <type> - typescript, javascript, redux, redux-typescript (default: javascript)--package-manager <pm> - npm, pnpm (default: auto-detect)--bundler <type> - shakapacker, rspack (default: shakapacker)--tailwind - Add Tailwind CSS--pro - Install React on Rails Pro with RSC demo (future enhancement)--skip-install - Skip dependency installation--interactive - Interactive mode with prompts (future enhancement; not in Phase 1)# Basic JavaScript setup
npx create-react-on-rails-app my-app
# TypeScript with Tailwind
npx create-react-on-rails-app my-app --template=typescript --tailwind
# Redux with TypeScript, using pnpm
npx create-react-on-rails-app my-app --template=redux-typescript --package-manager=pnpm
# Using Rspack bundler
npx create-react-on-rails-app my-app --template=typescript --bundler=rspack
# Future: React on Rails Pro with RSC
npx create-react-on-rails-app my-app --pro
Rationale:
Build Setup:
dist/ folderPath: packages/create-react-on-rails-app/ within the react_on_rails monorepo
Benefits:
Approach: Port Ruby script logic to TypeScript shell orchestration
Reuse patterns from:
bin/new-demo - Rails app creation workflowbin/scaffold-demo - Template and option handlinglib/demo_scripts/ - Version management, validation logicImplementation Strategy:
// Port Ruby scripts to TypeScript that shells out to same commands
import { execSync } from 'child_process';
execSync('rails new my-app --database=postgresql --skip-javascript');
execSync('bundle add react_on_rails --strict');
execSync('bundle install');
execSync('rails generate react_on_rails:install --typescript');
packages/create-react-on-rails-app/
src/
index.ts # Main entry point
cli.ts # CLI orchestrator with Commander.js
validators.ts # Prerequisite checks (Node, Ruby, Rails)
rails-setup.ts # Rails app creation logic
template-handler.ts # Template application logic
package-manager.ts # Package manager detection/execution
types.ts # TypeScript type definitions
dist/ # Compiled JavaScript (gitignored, published to NPM)
index.js
cli.js
# ... (other compiled files)
bin/
create-react-on-rails-app.js # Entry point (#!/usr/bin/env node) - calls dist/index.js
package.json # Separate NPM package config
tsconfig.json # TypeScript configuration
README.md # Package documentation
{
"dependencies": {
"chalk": "^4.1.2",
"commander": "^12.1.0"
}
}
Check for required tools and versions:
rails --version)Validation Strategy:
The CLI validates that dependencies exist but does not attempt to install them. This respects the many different ways users manage their development environments.
Ruby Validation:
interface ValidationResult {
success: boolean;
message?: string;
}
function validateRuby(): ValidationResult {
try {
const rubyVersion = execSync('ruby --version', { encoding: 'utf8' });
const version = parseRubyVersion(rubyVersion);
if (version.major < 3) {
return {
success: false,
message: `Ruby ${version.full} detected. React on Rails requires Ruby 3.0+`,
};
}
return { success: true };
} catch (error) {
return {
success: false,
message: 'Ruby is not installed or not found in PATH',
};
}
}
Error Messages - Ruby Not Found:
Ruby is not installed or not found in PATH
React on Rails requires Ruby 3.0+
Popular installation options:
- mise: https://mise.jdx.dev/ (recommended)
- rbenv: https://github.com/rbenv/rbenv
- asdf: https://asdf-vm.com/
- rvm: https://rvm.io/
After installing Ruby, restart your terminal and try again.
Rails Validation:
function validateRails(): ValidationResult {
try {
const railsVersion = execSync('rails --version', { encoding: 'utf8' });
return { success: true };
} catch (error) {
return {
success: false,
message: 'Rails gem is not installed',
};
}
}
Error Messages - Rails Not Found:
Rails is not installed
Install Rails:
gem install rails
Then try again.
Node.js Validation:
function validateNode(): ValidationResult {
const version = process.versions.node;
const major = parseInt(version.split('.')[0], 10);
if (major < 18) {
return {
success: false,
message: `Node.js ${version} detected. React on Rails requires Node.js 18+`,
};
}
return { success: true };
}
Package Manager Validation:
function validatePackageManager(): ValidationResult {
const managers = ['npm', 'pnpm', 'bun'];
const available = managers.filter((pm) => {
try {
execSync(`${pm} --version`, { stdio: 'ignore' });
return true;
} catch {
return false;
}
});
if (available.length === 0) {
return {
success: false,
message: 'No JavaScript package manager found (npm, pnpm, or bun)',
};
}
return { success: true, message: `Found: ${available.join(', ')}` };
}
Philosophy:
rails new <app-name> --database=postgresql --skip-javascript
cd <app-name>
Configuration:
bundle add react_on_rails --strict
bundle install
Versioning:
--strict to lock to exact versionrails generate react_on_rails:install [--typescript] [--redux] [--rspack]
Options passed through:
--typescript if template includes TypeScript--redux if template is redux or redux-typescript--rspack if bundler is rspack--ignore-warnings to bypass generator warnings in scripted runsTailwind CSS (if --tailwind flag):
Future - React on Rails Pro (if --pro flag):
react-on-rails-pro gem<detected-package-manager> install # unless --skip-install
Package Manager Detection:
--package-manager if providedCreated my-app with React on Rails!
Next steps:
cd my-app
bin/dev
Visit http://localhost:3000/hello_world
Documentation: https://reactonrails.com/docs/
npx create-react-on-rails-app my-app --pro
License Validation
REACT_ON_RAILS_PRO_LICENSE environment variablePro Installation
react-on-rails-pro gem instead of open source versionreact-on-rails-rsc NPM packageConfiguration
Demo Content
Documentation
The react_on_rails-demos repository has Ruby scripts:
bin/new-demo - Creates basic demosbin/scaffold-demo - Creates advanced demos with optionslib/demo_scripts/ - Shared logic modulesUpdate demos repository to use the CLI tool:
# In bin/new-demo or bin/scaffold-demo
flags = []
flags << "--template=#{options[:template]}" if options[:template]
flags << "--tailwind" if options[:tailwind]
flags << "--typescript" if options[:typescript]
system("npx create-react-on-rails-app #{name} #{flags.join(' ')}")
packages/create-react-on-rails-app/ directory structurereact_on_rails:install generatorVersioning Strategy
Default Template
Interactive Mode
Git Initialization
Testing Strategy
When ready to begin implementation:
justin808/create-ror-app-cli)