rn_stack 0.1.0

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +182 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/stylesheets/rn_stack/application.css +15 -0
  6. data/app/components/rn_stack/layout.html.erb +13 -0
  7. data/app/components/rn_stack/layout.rb +8 -0
  8. data/app/controllers/rn_stack/api_controller.rb +16 -0
  9. data/app/controllers/rn_stack/application_controller.rb +4 -0
  10. data/app/controllers/rn_stack/pages_controller.rb +9 -0
  11. data/app/helpers/rn_stack/application_helper.rb +4 -0
  12. data/app/helpers/rn_stack/hybrid_helper.rb +9 -0
  13. data/app/helpers/rn_stack/image_helper.rb +21 -0
  14. data/app/helpers/rn_stack/media_helper.rb +13 -0
  15. data/app/helpers/rn_stack/metadata_helper.rb +15 -0
  16. data/app/helpers/rn_stack/performance_helper.rb +26 -0
  17. data/app/jobs/rn_stack/application_job.rb +4 -0
  18. data/app/mailers/rn_stack/application_mailer.rb +6 -0
  19. data/app/models/rn_stack/application_record.rb +5 -0
  20. data/app/views/layouts/rn_stack/application.html.erb +17 -0
  21. data/config/routes.rb +2 -0
  22. data/lib/generators/rn_stack/api/api_generator.rb +11 -0
  23. data/lib/generators/rn_stack/api/templates/api.rb +5 -0
  24. data/lib/generators/rn_stack/api_doc/api_doc_generator.rb +12 -0
  25. data/lib/generators/rn_stack/api_version/api_version_generator.rb +11 -0
  26. data/lib/generators/rn_stack/auth/auth_generator.rb +16 -0
  27. data/lib/generators/rn_stack/deployment/deployment_generator.rb +20 -0
  28. data/lib/generators/rn_stack/deployment/templates/Dockerfile +8 -0
  29. data/lib/generators/rn_stack/deployment/templates/deployment.yaml +19 -0
  30. data/lib/generators/rn_stack/deployment/templates/service.yaml +12 -0
  31. data/lib/generators/rn_stack/example/example_generator.rb +20 -0
  32. data/lib/generators/rn_stack/i18n/i18n_generator.rb +19 -0
  33. data/lib/generators/rn_stack/install/install_generator.rb +23 -0
  34. data/lib/generators/rn_stack/job/job_generator.rb +10 -0
  35. data/lib/generators/rn_stack/mailer/mailer_generator.rb +10 -0
  36. data/lib/generators/rn_stack/media/media_generator.rb +19 -0
  37. data/lib/generators/rn_stack/model/model_generator.rb +12 -0
  38. data/lib/generators/rn_stack/monitor/monitor_generator.rb +25 -0
  39. data/lib/generators/rn_stack/page/page_generator.rb +11 -0
  40. data/lib/generators/rn_stack/page/templates/page.html.erb +2 -0
  41. data/lib/generators/rn_stack/production/production_generator.rb +24 -0
  42. data/lib/generators/rn_stack/scaffold/scaffold_generator.rb +12 -0
  43. data/lib/generators/rn_stack/security/security_generator.rb +23 -0
  44. data/lib/generators/rn_stack/service/service_generator.rb +11 -0
  45. data/lib/generators/rn_stack/service/templates/service.rb +9 -0
  46. data/lib/generators/rn_stack/store/store_generator.rb +11 -0
  47. data/lib/generators/rn_stack/store/templates/store.js +11 -0
  48. data/lib/generators/rn_stack/ui/ui_generator.rb +23 -0
  49. data/lib/rn_stack/action.rb +17 -0
  50. data/lib/rn_stack/engine.rb +23 -0
  51. data/lib/rn_stack/error_handler.rb +16 -0
  52. data/lib/rn_stack/router.rb +31 -0
  53. data/lib/rn_stack/version.rb +3 -0
  54. data/lib/rn_stack.rb +6 -0
  55. data/lib/tasks/rn_stack_tasks.rake +9 -0
  56. metadata +182 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ff7a9962162bd4275bf8685ef26f84aa4a7d86310db2c6d805ccf166a50fe1d9
4
+ data.tar.gz: 6a2583bd921f1ff32ca40259f560df0475a870297551001fcc8358ea61d49a9b
5
+ SHA512:
6
+ metadata.gz: c02d02c1721edf70379cfe181ac60514c8ed36928bab3b8ddeff880f940c6316bc3f074607876a29f2d3e952ae59c1b0866e784aac3708a7596abade1b398ca9
7
+ data.tar.gz: 767dff0d0d4df95d9333aabe27b5633c0afe93979009525b1d8aab79c08106bd4939aa9e6c0c5102e6de3ad95827de75307a8be5cce218c7f8a6ec665f4f7d1a
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright shiboshreeroy
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,182 @@
1
+ # RnStack: The Professional Hybrid Framework
2
+
3
+ `rn_stack` is a production-grade Rails Engine that bridges the gap between Ruby on Rails and the modern, high-performance architectural patterns popularized by Next.js and Angular.
4
+
5
+ It provides a unified integration layer, allowing you to build polyglot applications that seamlessly mix Rails (ERB/Stimulus), React, and TypeScript.
6
+
7
+ ---
8
+
9
+ ## ๐Ÿ“‘ Table of Contents
10
+
11
+ - [๐Ÿš€ Getting Started](#-getting-started)
12
+ - [๐Ÿ› ๏ธ CLI Productivity Suite](#-cli-productivity-suite)
13
+ - [๐Ÿ—๏ธ Core Architecture Concepts](#-core-architecture-concepts)
14
+ - [๐Ÿ“– Usage Examples](#-usage-examples)
15
+ - [๐Ÿš€ Production Readiness Checklist](#-production-readiness-checklist)
16
+ - [๐Ÿงช Testing, Debugging & Configuration](#-testing-debugging--configuration)
17
+ - [๐Ÿš€ CI/CD & Team Conventions](#-cicd--team-conventions)
18
+
19
+ ---
20
+
21
+ ## ๐Ÿš€ Getting Started
22
+
23
+ ### 1. Installation
24
+ Add to your Gemfile:
25
+ ```ruby
26
+ gem "rn_stack", path: "path/to/rn_stack"
27
+ ```
28
+
29
+ ### 2. Initialization
30
+ Run the setup script to configure Rails, Vite, and Databases:
31
+ ```bash
32
+ chmod +x bin/setup_script
33
+ bin/setup_script
34
+ ```
35
+
36
+ ### 3. Development
37
+ Create a `Procfile.dev` to manage backend and frontend services:
38
+ ```yaml
39
+ web: bundle exec rails s
40
+ vite: bin/vite dev
41
+ ```
42
+ Run development:
43
+ ```bash
44
+ gem install foreman
45
+ foreman start -f Procfile.dev
46
+ ```
47
+
48
+ ---
49
+
50
+ ## ๐Ÿ’ก Learning & Examples
51
+
52
+ Generate runnable, real-world architectural blueprints:
53
+
54
+ ```bash
55
+ # Scaffold a full blog system
56
+ rails generate rn_stack:example blog
57
+
58
+ # Scaffold a starter dashboard
59
+ rails generate rn_stack:example dashboard
60
+ ```
61
+
62
+ ---
63
+
64
+ ## ๐Ÿ› ๏ธ The CLI Productivity Suite
65
+
66
+
67
+ `rn_stack` provides a powerful CLI suite for rapid development.
68
+
69
+
70
+ ### CLI Productivity Suite
71
+ | Task | Command |
72
+ | :--- | :--- |
73
+ | **Pages** | `rails generate rn_stack:page [name]` |
74
+ | **API Handlers** | `rails generate rn_stack:api [name]` |
75
+ | **Maintenance** | `bundle exec rake rn_stack:maintenance` |
76
+ | **MVC Scaffold** | `rails generate rn_stack:scaffold [model] [attrs]` |
77
+ | **UI Components**| `rails generate rn_stack:ui` |
78
+ | **Jobs** | `rails generate rn_stack:job [name]` |
79
+
80
+ ### Architecture, Security & Enterprise
81
+ | Task | Command |
82
+ | :--- | :--- |
83
+ | **Services/Stores**| `rails generate rn_stack:service [name]` \| `rails generate rn_stack:store [name]` |
84
+ | **Auth/RBAC** | `rails generate rn_stack:auth` |
85
+ | **Security/I18n**| `rails generate rn_stack:security` \| `rails generate rn_stack:i18n` |
86
+ | **Media/Mailer** | `rails generate rn_stack:media [model] [field]` \| `rails generate rn_stack:mailer [name]` |
87
+ | **Prod/Deploy** | `rails generate rn_stack:production` \| `rails generate rn_stack:deployment` |
88
+ | **Monitoring/Doc/Version**| `rails generate rn_stack:monitor` \| `rails generate rn_stack:api_doc` \| `rails generate rn_stack:api_version [v1]` |
89
+
90
+ ---
91
+
92
+ ## ๐Ÿ—๏ธ Core Architecture Concepts
93
+
94
+ `rn_stack` enforces a professional separation of concerns:
95
+
96
+ - **Routing:** File-system based (`app/pages`, `app/api`).
97
+ - **Logic:** `app/services` for business logic, `RnStack::Action` for data mutations.
98
+ - **State:** `app/frontend/stores` for reactive frontend state.
99
+ - **Assets:** Vite pipeline (Rails, React, TypeScript, Stimulus).
100
+ - **Media:** Professional helpers (`pro_image_tag`, `pro_audio_tag`, `pro_video_tag`).
101
+
102
+ ---
103
+
104
+ ## ๐Ÿ“– Usage Examples
105
+
106
+ ### 1. File-System Routing (Static & Dynamic)
107
+ - **Static**: `app/pages/about.html.erb` -> `/about`
108
+ - **Dynamic**: `app/pages/users/[id].html.erb` -> `/users/:id`
109
+ All routes are automatically registered and wrapped in your default layout.
110
+
111
+ ### 2. High-Performance Media
112
+ ```erb
113
+ <%= pro_image_tag @user.avatar, size: [300, 300] %>
114
+ <%= pro_audio_tag "track.mp3" %>
115
+ <%= pro_video_tag "movie.mp4" %>
116
+ ```
117
+
118
+ ### 2. SEO & Performance
119
+ ```erb
120
+ <% set_metadata(title: "My Page", description: "SEO Description") %>
121
+
122
+ <% with_isr_cache("sidebar", expires_in: 30.minutes) do %>
123
+ <%= render "sidebar" %>
124
+ <% end %>
125
+
126
+ <%= self_hosted_font_tag "my-font" %>
127
+ ```
128
+
129
+ ### 3. Searching & Filtering (using Ransack)
130
+ ```ruby
131
+ @q = Product.ransack(params[:q])
132
+ @products = @q.result(distinct: true)
133
+ ```
134
+
135
+ ---
136
+
137
+ ## ๐Ÿš€ Production Readiness Checklist
138
+
139
+ 1. **[ ] Infrastructure**: Run `rails generate rn_stack:production`.
140
+ 2. **[ ] Observability**: Run `rails generate rn_stack:monitor`.
141
+ 3. **[ ] Containerization**: Run `rails generate rn_stack:deployment`.
142
+ 4. **[ ] Security**: Run `rails generate rn_stack:security`.
143
+ 5. **[ ] Assets**: Ensure `bin/vite build` is configured for production.
144
+
145
+ ---
146
+
147
+ ## ๐Ÿงช Testing, Debugging & Configuration
148
+
149
+ - **Testing**: Use standard `bundle exec rake test` and Capybara for full-stack integration.
150
+ - **Debugging**: Standard Rails logging (`Rails.logger`) and Vite HMR console.
151
+ - **Configuration**: Create `config/initializers/rn_stack.rb` to tune framework defaults.
152
+
153
+ ---
154
+
155
+ ## ๐Ÿš€ CI/CD & Team Conventions
156
+
157
+ ### CI/CD Pipeline (GitHub Actions)
158
+ Example workflow for `rn_stack` applications (`.github/workflows/ci.yml`):
159
+ ```yaml
160
+ name: CI
161
+ on: [push]
162
+ jobs:
163
+ test:
164
+ runs-on: ubuntu-latest
165
+ steps:
166
+ - uses: actions/checkout@v3
167
+ - name: Setup Ruby
168
+ uses: ruby/setup-ruby@v1
169
+ with:
170
+ bundler-cache: true
171
+ - name: Run Tests
172
+ run: bundle exec rake test
173
+ ```
174
+
175
+ ---
176
+
177
+ ## ๐Ÿ“ Architecture Overview
178
+ See `ARCHITECTURE.md` for a deep dive into the design philosophy.
179
+
180
+ ---
181
+ ## License
182
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ require "bundler/gem_tasks"
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,13 @@
1
+ <%# app/components/rn_stack/layout.html.erb %>
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <title><%= @title || "RnStack Application" %></title>
6
+ <%= yield :head %>
7
+ <%= vite_client_tag %>
8
+ <%= vite_javascript_tag 'application' %>
9
+ </head>
10
+ <body>
11
+ <%= content %>
12
+ </body>
13
+ </html>
@@ -0,0 +1,8 @@
1
+ module RnStack
2
+ class Layout < ViewComponent::Base
3
+ # Base layout component that can be extended by user-defined layouts
4
+ def initialize(title: nil)
5
+ @title = title
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ module RnStack
2
+ class ApiController < ApplicationController
3
+ skip_before_action :verify_authenticity_token
4
+
5
+ def handle
6
+ # Dynamically load and call the API handler
7
+ # e.g., app/api/users.rb -> constant Users
8
+ handler_class = params[:api_path].camelize.constantize
9
+ render json: handler_class.call(request)
10
+ rescue NameError => e
11
+ render json: { error: "Handler not found", details: e.message }, status: :not_found
12
+ rescue StandardError => e
13
+ render json: { error: "API Error", details: e.message }, status: :internal_server_error
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module RnStack
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ module RnStack
2
+ class PagesController < ApplicationController
3
+ def show
4
+ render RnStack::Layout.new(title: params[:page_path].titleize) {
5
+ render_to_string(file: Rails.root.join("app/pages", "#{params[:page_path]}.html.erb"), layout: false)
6
+ }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module RnStack
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ module RnStack
2
+ module HybridHelper
3
+ # A bridge to mount React components within Rails views
4
+ def mount_react_component(component_name, props = {}, options = {})
5
+ # Using react-rails react_component helper
6
+ react_component(component_name, props, options)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module RnStack
2
+ module ImageHelper
3
+ # A professional wrapper for active_storage
4
+ def pro_image_tag(attachment, options = {})
5
+ return unless attachment.attached?
6
+
7
+ # Default transformations
8
+ transformations = {
9
+ resize_to_limit: options[:size] || [800, 800],
10
+ format: :webp,
11
+ saver: { quality: 80 }
12
+ }
13
+
14
+ # Advanced transformations
15
+ transformations[:crop] = "#{options[:crop_w]}x#{options[:crop_h]}+#{options[:x]}+#{options[:y]}" if options[:crop]
16
+ transformations[:monochrome] = true if options[:grayscale]
17
+
18
+ image_tag attachment.variant(transformations)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module RnStack
2
+ module MediaHelper
3
+ # Professional wrapper for audio tags
4
+ def pro_audio_tag(source, options = {})
5
+ audio_tag(source, { controls: true }.merge(options))
6
+ end
7
+
8
+ # Professional wrapper for video tags
9
+ def pro_video_tag(source, options = {})
10
+ video_tag(source, { controls: true, preload: 'metadata' }.merge(options))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module RnStack
2
+ module MetadataHelper
3
+ def set_metadata(title: nil, description: nil, og_tags: {})
4
+ content_for(:head) do
5
+ capture do
6
+ concat tag.title(title) if title
7
+ concat tag.meta(name: "description", content: description) if description
8
+ og_tags.each do |property, content|
9
+ concat tag.meta(property: "og:#{property}", content: content)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ module RnStack
2
+ module PerformanceHelper
3
+ # ISR-like fragment caching: revalidates content periodically
4
+ def with_isr_cache(key, expires_in: 1.hour, &block)
5
+ cache("isr/#{key}", expires_in: expires_in, &block)
6
+ end
7
+
8
+ # Font optimization helper
9
+ def self_hosted_font_tag(font_name, options = {})
10
+ # In Rails, fonts should be in app/assets/fonts
11
+ tag.link(rel: "preload", href: asset_path("#{font_name}.woff2"), as: "font", type: "font/woff2", crossorigin: "anonymous")
12
+ end
13
+
14
+ # Script loading strategy helper
15
+ def optimized_script_tag(source, strategy: :async)
16
+ case strategy
17
+ when :async
18
+ javascript_include_tag source, async: true
19
+ when :defer
20
+ javascript_include_tag source, defer: true
21
+ else
22
+ javascript_include_tag source
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ module RnStack
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module RnStack
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module RnStack
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rn stack</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= yield :head %>
9
+
10
+ <%= stylesheet_link_tag "rn_stack/application", media: "all" %>
11
+ </head>
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ RnStack::Engine.routes.draw do
2
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ApiGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def create_api_file
8
+ template "api.rb", "app/api/#{file_name}.rb"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class <%= file_name.camelize %>
2
+ def self.call(request)
3
+ { message: "Hello from <%= file_name %> API" }
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ApiDocGenerator < Rails::Generators::Base
5
+ def setup_api_docs
6
+ say "Configuring OpenAPI/Swagger Documentation..."
7
+ # This generator would typically scaffold an swagger/openapi.yml
8
+ # or integrate a gem like 'rswag'
9
+ say "API Documentation boilerplate generated."
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ApiVersionGenerator < Rails::Generators::NamedBase
5
+ def create_api_version
6
+ say "Scaffolding API Version: #{file_name}..."
7
+ directory "app/api/#{file_name}"
8
+ say "API version structure created in app/api/#{file_name}/"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class AuthGenerator < Rails::Generators::Base
5
+ def setup_auth
6
+ say "Configuring Devise for Authentication..."
7
+ # In a real-world scenario:
8
+ # run "bundle add devise"
9
+ # run "rails generate devise:install"
10
+ # run "rails generate devise User"
11
+
12
+ say "Adding Role-Based Authorization support (roles: user, admin)..."
13
+ # This would typically involve generating a migration to add 'role' to the User model
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class DeploymentGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def scaffold_deployment
8
+ say "Scaffolding Docker and Kubernetes infrastructure..."
9
+
10
+ # 1. Dockerfile
11
+ template "Dockerfile", "Dockerfile"
12
+
13
+ # 2. Kubernetes Manifests
14
+ template "deployment.yaml", "k8s/deployment.yaml"
15
+ template "service.yaml", "k8s/service.yaml"
16
+
17
+ say "Deployment infrastructure scaffolded in ./Dockerfile and ./k8s/"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ FROM ruby:3.2-slim
2
+ RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
3
+ WORKDIR /app
4
+ COPY Gemfile Gemfile.lock ./
5
+ RUN bundle install
6
+ COPY . .
7
+ EXPOSE 3000
8
+ CMD ["rails", "server", "-b", "0.0.0.0"]
@@ -0,0 +1,19 @@
1
+ apiVersion: apps/v1
2
+ kind: Deployment
3
+ metadata:
4
+ name: rn-stack-app
5
+ spec:
6
+ replicas: 3
7
+ selector:
8
+ matchLabels:
9
+ app: rn-stack
10
+ template:
11
+ metadata:
12
+ labels:
13
+ app: rn-stack
14
+ spec:
15
+ containers:
16
+ - name: app
17
+ image: your-repo/rn-stack:latest
18
+ ports:
19
+ - containerPort: 3000
@@ -0,0 +1,12 @@
1
+ apiVersion: v1
2
+ kind: Service
3
+ metadata:
4
+ name: rn-stack-service
5
+ spec:
6
+ selector:
7
+ app: rn-stack
8
+ ports:
9
+ - protocol: TCP
10
+ port: 80
11
+ targetPort: 3000
12
+ type: LoadBalancer
@@ -0,0 +1,20 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ExampleGenerator < Rails::Generators::Base
5
+ argument :example_type, type: :string, enum: ["blog", "dashboard"], description: "Type of example to scaffold"
6
+
7
+ def scaffold_example
8
+ say "Scaffolding #{example_type} example..."
9
+
10
+ case example_type
11
+ when "blog"
12
+ invoke "rn_stack:scaffold", ["Post", "title:string", "content:text"]
13
+ say "Blog scaffolded. Check app/models/post.rb and app/controllers/posts_controller.rb"
14
+ when "dashboard"
15
+ invoke "rn_stack:page", ["dashboard"]
16
+ say "Dashboard scaffolded. Check app/pages/dashboard.html.erb"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class I18nGenerator < Rails::Generators::Base
5
+ def setup_i18n
6
+ say "Configuring I18n localization structure..."
7
+ # Create config/locales structure
8
+ create_file "config/locales/en.yml", <<~YAML
9
+ en:
10
+ hello: "Hello World"
11
+ YAML
12
+ create_file "config/locales/es.yml", <<~YAML
13
+ es:
14
+ hello: "Hola Mundo"
15
+ YAML
16
+ say "I18n locales scaffolded in config/locales/"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class InstallGenerator < Rails::Generators::Base
5
+ class_option :css, type: :string, default: "css", enum: ["tailwind", "bootstrap", "sass", "css"], description: "Choose your styling framework"
6
+
7
+ def setup_styling
8
+ case options[:css]
9
+ when "tailwind"
10
+ say "Configuring Tailwind CSS..."
11
+ # In a real-world scenario, you would invoke the tailwindcss-rails installer
12
+ # run "bundle add tailwindcss-rails"
13
+ # run "rails tailwindcss:install"
14
+ when "bootstrap"
15
+ say "Configuring Bootstrap..."
16
+ when "sass"
17
+ say "Configuring Sass..."
18
+ else
19
+ say "Configuring standard CSS..."
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class JobGenerator < Rails::Generators::NamedBase
5
+ def create_job
6
+ say "Scaffolding background job..."
7
+ invoke "job", [file_name]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class MailerGenerator < Rails::Generators::NamedBase
5
+ def create_mailer
6
+ say "Scaffolding transactional mailer..."
7
+ invoke "mailer", [file_name]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class MediaGenerator < Rails::Generators::Base
5
+ argument :model_name, type: :string
6
+ argument :field_name, type: :string, default: "image"
7
+
8
+ def add_has_one_attached
9
+ # Simple abstraction to add ActiveStorage association to a model
10
+ path = "app/models/#{model_name.underscore}.rb"
11
+ if File.exist?(path)
12
+ inject_into_file path, " has_one_attached :#{field_name}\n", after: "class #{model_name.camelize} < ApplicationRecord\n"
13
+ say "Added 'has_one_attached :#{field_name}' to #{path}"
14
+ else
15
+ say "Model file not found: #{path}", :red
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ModelGenerator < Rails::Generators::Base
5
+ argument :model_name, type: :string
6
+ argument :attributes, type: :array, default: [], banner: "field:type field:type"
7
+
8
+ def invoke_rails_model
9
+ invoke "active_record:model", [model_name] + attributes
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class MonitorGenerator < Rails::Generators::Base
5
+ def setup_monitoring
6
+ say "Scaffolding Observability & Health Checks..."
7
+
8
+ # 1. Health Check
9
+ create_file "app/controllers/rn_stack/health_controller.rb", <<~RUBY
10
+ module RnStack
11
+ class HealthController < ApplicationController
12
+ def show
13
+ render json: { status: "OK", database: "connected" }, status: :ok
14
+ end
15
+ end
16
+ end
17
+ RUBY
18
+
19
+ # 2. Error Monitoring (Sentry placeholder)
20
+ say "Configuring Error Monitoring (Sentry)..."
21
+
22
+ say "Monitoring & Health Checks initialized."
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class PageGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def create_page_file
8
+ template "page.html.erb", "app/pages/#{file_name}.html.erb"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ <h1><%= file_name.titleize %></h1>
2
+ <p>This is the <%= file_name %> page.</p>
@@ -0,0 +1,24 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ProductionGenerator < Rails::Generators::Base
5
+ def setup_production_stack
6
+ say "Configuring Production Infrastructure..."
7
+
8
+ # 1. Background Jobs
9
+ say "Setting up Background Jobs (SolidQueue)..."
10
+ # Placeholder: In a real app, this would execute:
11
+ # bundle add solid_queue && rails solid_queue:install
12
+
13
+ # 2. Deployment (Kamal)
14
+ say "Setting up Deployment Infrastructure (Kamal)..."
15
+ # Placeholder: In a real app, this would execute:
16
+ # bundle add kamal && kamal init
17
+
18
+ # 3. Observability/Logging
19
+ say "Adding Observability/Logging boilerplate..."
20
+
21
+ say "Production infrastructure initialized."
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ScaffoldGenerator < Rails::Generators::Base
5
+ argument :name, type: :string
6
+ argument :attributes, type: :array, default: [], banner: "field:type field:type"
7
+
8
+ def invoke_rails_scaffold
9
+ invoke "scaffold", [name] + attributes
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class SecurityGenerator < Rails::Generators::Base
5
+ def setup_security
6
+ say "Configuring Content Security Policy (CSP) and Security Headers..."
7
+ # Create secure initializer
8
+ create_file "config/initializers/content_security_policy.rb", <<~RUBY
9
+ Rails.application.configure do
10
+ config.content_security_policy do |policy|
11
+ policy.default_src :self, :https
12
+ policy.font_src :self, :https, :data
13
+ policy.img_src :self, :https, :data
14
+ policy.object_src :none
15
+ policy.script_src :self, :https
16
+ policy.style_src :self, :https
17
+ end
18
+ end
19
+ RUBY
20
+ say "Security policy initialized in config/initializers/content_security_policy.rb"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class ServiceGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def create_service
8
+ template "service.rb", "app/services/#{file_name}_service.rb"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class <%= file_name.camelize %>Service
2
+ def initialize(params = {})
3
+ @params = params
4
+ end
5
+
6
+ def call
7
+ # Business logic here
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class StoreGenerator < Rails::Generators::NamedBase
5
+ source_root File.expand_path('templates', __dir__)
6
+
7
+ def create_store
8
+ template "store.js", "app/frontend/stores/#{file_name}_store.js"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ // Simple reactive store pattern
2
+ export const <%= file_name.camelize %>Store = {
3
+ state: {
4
+ data: null,
5
+ },
6
+
7
+ update(newData) {
8
+ this.state.data = newData;
9
+ // Dispatch events or update UI here
10
+ }
11
+ };
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+
3
+ module RnStack
4
+ class UiGenerator < Rails::Generators::Base
5
+ def setup_ui_components
6
+ say "Scaffolding Professional UI Components..."
7
+
8
+ # 1. Toasts/Alerts
9
+ say "Generating Toast and Alert Stimulus Controllers..."
10
+
11
+ # 2. Skeletons
12
+ say "Adding Skeleton loading CSS..."
13
+
14
+ # 3. Dialogs/Modals
15
+ say "Generating Modal boilerplate..."
16
+
17
+ # 4. Reactive Forms
18
+ say "Configuring Reactive Form helpers..."
19
+
20
+ say "UI components scaffolded successfully."
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module RnStack
2
+ # Base class for Server Actions (Next.js style mutations)
3
+ class Action
4
+ def self.call(params = {}, request = nil)
5
+ new(params, request).execute
6
+ end
7
+
8
+ def initialize(params = {}, request = nil)
9
+ @params = params
10
+ @request = request
11
+ end
12
+
13
+ def execute
14
+ raise NotImplementedError, "Subclasses must implement #execute"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "router"
2
+
3
+ module RnStack
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace RnStack
6
+
7
+ initializer "rn_stack.load_routes" do |app|
8
+ app.routes.append do
9
+ RnStack::Router.register_routes(self)
10
+ end
11
+ end
12
+
13
+ initializer "rn_stack.load_helpers" do
14
+ ActiveSupport.on_load(:action_view) do
15
+ include RnStack::HybridHelper
16
+ include RnStack::ImageHelper
17
+ include RnStack::MediaHelper
18
+ include RnStack::MetadataHelper
19
+ include RnStack::PerformanceHelper
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module RnStack
2
+ module ErrorHandler
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ rescue_from StandardError, with: :handle_standard_error
7
+ end
8
+
9
+ private
10
+
11
+ def handle_standard_error(exception)
12
+ Rails.logger.error "[RnStack::ErrorHandler] #{exception.message}"
13
+ render json: { error: "Internal Server Error", message: exception.message }, status: :internal_server_error
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module RnStack
2
+ class Router
3
+ def self.register_routes(mapper)
4
+ register_page_routes(mapper)
5
+ register_api_routes(mapper)
6
+ end
7
+
8
+ def self.register_page_routes(mapper)
9
+ Dir.glob(File.join(Rails.root, "app/pages/**/*.html.erb")).each do |file|
10
+ relative_path = file.sub(File.join(Rails.root, "app/pages/"), "").sub(".html.erb", "")
11
+ # Convert [param] to :param for Rails routing
12
+ route_path = relative_path.gsub(/\[([^\]]+)\]/, ':\1')
13
+ route_path = "/#{route_path.gsub('index', '')}".gsub(/\/+/, '/')
14
+ route_path = "/" if route_path == "/index" || route_path == "//"
15
+
16
+ mapper.get route_path, to: "rn_stack/pages#show", defaults: { page_path: relative_path }
17
+ end
18
+ end
19
+
20
+ def self.register_api_routes(mapper)
21
+ Dir.glob(File.join(Rails.root, "app/api/**/*.rb")).each do |file|
22
+ relative_path = file.sub(File.join(Rails.root, "app/api/"), "").sub(".rb", "")
23
+ # Convert [param] to :param for Rails routing
24
+ route_path = relative_path.gsub(/\[([^\]]+)\]/, ':\1')
25
+ route_path = "/api/#{route_path}".gsub(/\/+/, '/')
26
+
27
+ mapper.match route_path, to: "rn_stack/api#handle", via: [:get, :post, :put, :patch, :delete], defaults: { api_path: relative_path }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module RnStack
2
+ VERSION = "0.1.0"
3
+ end
data/lib/rn_stack.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "rn_stack/version"
2
+ require "rn_stack/engine"
3
+
4
+ module RnStack
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,9 @@
1
+ namespace :rn_stack do
2
+ desc "Run rn_stack framework maintenance tasks"
3
+ task maintenance: :environment do
4
+ puts "Running RnStack maintenance..."
5
+ # Perform cache clearing, log rotation, etc.
6
+ Rails.cache.clear
7
+ puts "RnStack maintenance complete."
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rn_stack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - shiboshreeroy
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 8.1.3
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 8.1.3
26
+ - !ruby/object:Gem::Dependency
27
+ name: vite_rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: react-rails
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: view_component
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: image_processing
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: devise
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ description: Bridges Rails with Next.js/Angular-style architectures.
97
+ email:
98
+ - shiboshreeroy169@gmail.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - MIT-LICENSE
104
+ - README.md
105
+ - Rakefile
106
+ - app/assets/stylesheets/rn_stack/application.css
107
+ - app/components/rn_stack/layout.html.erb
108
+ - app/components/rn_stack/layout.rb
109
+ - app/controllers/rn_stack/api_controller.rb
110
+ - app/controllers/rn_stack/application_controller.rb
111
+ - app/controllers/rn_stack/pages_controller.rb
112
+ - app/helpers/rn_stack/application_helper.rb
113
+ - app/helpers/rn_stack/hybrid_helper.rb
114
+ - app/helpers/rn_stack/image_helper.rb
115
+ - app/helpers/rn_stack/media_helper.rb
116
+ - app/helpers/rn_stack/metadata_helper.rb
117
+ - app/helpers/rn_stack/performance_helper.rb
118
+ - app/jobs/rn_stack/application_job.rb
119
+ - app/mailers/rn_stack/application_mailer.rb
120
+ - app/models/rn_stack/application_record.rb
121
+ - app/views/layouts/rn_stack/application.html.erb
122
+ - config/routes.rb
123
+ - lib/generators/rn_stack/api/api_generator.rb
124
+ - lib/generators/rn_stack/api/templates/api.rb
125
+ - lib/generators/rn_stack/api_doc/api_doc_generator.rb
126
+ - lib/generators/rn_stack/api_version/api_version_generator.rb
127
+ - lib/generators/rn_stack/auth/auth_generator.rb
128
+ - lib/generators/rn_stack/deployment/deployment_generator.rb
129
+ - lib/generators/rn_stack/deployment/templates/Dockerfile
130
+ - lib/generators/rn_stack/deployment/templates/deployment.yaml
131
+ - lib/generators/rn_stack/deployment/templates/service.yaml
132
+ - lib/generators/rn_stack/example/example_generator.rb
133
+ - lib/generators/rn_stack/i18n/i18n_generator.rb
134
+ - lib/generators/rn_stack/install/install_generator.rb
135
+ - lib/generators/rn_stack/job/job_generator.rb
136
+ - lib/generators/rn_stack/mailer/mailer_generator.rb
137
+ - lib/generators/rn_stack/media/media_generator.rb
138
+ - lib/generators/rn_stack/model/model_generator.rb
139
+ - lib/generators/rn_stack/monitor/monitor_generator.rb
140
+ - lib/generators/rn_stack/page/page_generator.rb
141
+ - lib/generators/rn_stack/page/templates/page.html.erb
142
+ - lib/generators/rn_stack/production/production_generator.rb
143
+ - lib/generators/rn_stack/scaffold/scaffold_generator.rb
144
+ - lib/generators/rn_stack/security/security_generator.rb
145
+ - lib/generators/rn_stack/service/service_generator.rb
146
+ - lib/generators/rn_stack/service/templates/service.rb
147
+ - lib/generators/rn_stack/store/store_generator.rb
148
+ - lib/generators/rn_stack/store/templates/store.js
149
+ - lib/generators/rn_stack/ui/ui_generator.rb
150
+ - lib/rn_stack.rb
151
+ - lib/rn_stack/action.rb
152
+ - lib/rn_stack/engine.rb
153
+ - lib/rn_stack/error_handler.rb
154
+ - lib/rn_stack/router.rb
155
+ - lib/rn_stack/version.rb
156
+ - lib/tasks/rn_stack_tasks.rake
157
+ homepage: https://github.com/rn_stack/rn_stack
158
+ licenses:
159
+ - MIT
160
+ metadata:
161
+ allowed_push_host: https://rubygems.org
162
+ homepage_uri: https://github.com/rn_stack/rn_stack
163
+ source_code_uri: https://github.com/rn_stack/rn_stack
164
+ changelog_uri: https://github.com/rn_stack/rn_stack/CHANGELOG.md
165
+ rdoc_options: []
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ requirements: []
179
+ rubygems_version: 4.0.11
180
+ specification_version: 4
181
+ summary: Professional Hybrid Rails Framework
182
+ test_files: []