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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +182 -0
- data/Rakefile +6 -0
- data/app/assets/stylesheets/rn_stack/application.css +15 -0
- data/app/components/rn_stack/layout.html.erb +13 -0
- data/app/components/rn_stack/layout.rb +8 -0
- data/app/controllers/rn_stack/api_controller.rb +16 -0
- data/app/controllers/rn_stack/application_controller.rb +4 -0
- data/app/controllers/rn_stack/pages_controller.rb +9 -0
- data/app/helpers/rn_stack/application_helper.rb +4 -0
- data/app/helpers/rn_stack/hybrid_helper.rb +9 -0
- data/app/helpers/rn_stack/image_helper.rb +21 -0
- data/app/helpers/rn_stack/media_helper.rb +13 -0
- data/app/helpers/rn_stack/metadata_helper.rb +15 -0
- data/app/helpers/rn_stack/performance_helper.rb +26 -0
- data/app/jobs/rn_stack/application_job.rb +4 -0
- data/app/mailers/rn_stack/application_mailer.rb +6 -0
- data/app/models/rn_stack/application_record.rb +5 -0
- data/app/views/layouts/rn_stack/application.html.erb +17 -0
- data/config/routes.rb +2 -0
- data/lib/generators/rn_stack/api/api_generator.rb +11 -0
- data/lib/generators/rn_stack/api/templates/api.rb +5 -0
- data/lib/generators/rn_stack/api_doc/api_doc_generator.rb +12 -0
- data/lib/generators/rn_stack/api_version/api_version_generator.rb +11 -0
- data/lib/generators/rn_stack/auth/auth_generator.rb +16 -0
- data/lib/generators/rn_stack/deployment/deployment_generator.rb +20 -0
- data/lib/generators/rn_stack/deployment/templates/Dockerfile +8 -0
- data/lib/generators/rn_stack/deployment/templates/deployment.yaml +19 -0
- data/lib/generators/rn_stack/deployment/templates/service.yaml +12 -0
- data/lib/generators/rn_stack/example/example_generator.rb +20 -0
- data/lib/generators/rn_stack/i18n/i18n_generator.rb +19 -0
- data/lib/generators/rn_stack/install/install_generator.rb +23 -0
- data/lib/generators/rn_stack/job/job_generator.rb +10 -0
- data/lib/generators/rn_stack/mailer/mailer_generator.rb +10 -0
- data/lib/generators/rn_stack/media/media_generator.rb +19 -0
- data/lib/generators/rn_stack/model/model_generator.rb +12 -0
- data/lib/generators/rn_stack/monitor/monitor_generator.rb +25 -0
- data/lib/generators/rn_stack/page/page_generator.rb +11 -0
- data/lib/generators/rn_stack/page/templates/page.html.erb +2 -0
- data/lib/generators/rn_stack/production/production_generator.rb +24 -0
- data/lib/generators/rn_stack/scaffold/scaffold_generator.rb +12 -0
- data/lib/generators/rn_stack/security/security_generator.rb +23 -0
- data/lib/generators/rn_stack/service/service_generator.rb +11 -0
- data/lib/generators/rn_stack/service/templates/service.rb +9 -0
- data/lib/generators/rn_stack/store/store_generator.rb +11 -0
- data/lib/generators/rn_stack/store/templates/store.js +11 -0
- data/lib/generators/rn_stack/ui/ui_generator.rb +23 -0
- data/lib/rn_stack/action.rb +17 -0
- data/lib/rn_stack/engine.rb +23 -0
- data/lib/rn_stack/error_handler.rb +16 -0
- data/lib/rn_stack/router.rb +31 -0
- data/lib/rn_stack/version.rb +3 -0
- data/lib/rn_stack.rb +6 -0
- data/lib/tasks/rn_stack_tasks.rake +9 -0
- 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,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,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,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,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,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,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,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,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,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,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,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,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
|
data/lib/rn_stack.rb
ADDED
|
@@ -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: []
|