next_rails_scaffold 0.3.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c2225f9eacbc656621975912ce9b1c2929c187557fe469fb341bb09d49e5750
4
- data.tar.gz: 9315b207c3c4c8e5b64bf810185f99bd6bc6682ffc85a760a7c5149b85f7aaeb
3
+ metadata.gz: 7cfc0dd5220ecc60e9781e9844d08a3636b858e013572d66bbc8097b4928fa26
4
+ data.tar.gz: b93eb19cd0e4d9ea2effa6cef7ff11fd5a4d4f792d5925ccb2baaad9eee5f5d4
5
5
  SHA512:
6
- metadata.gz: be60c9ec365f1899d090820cffa5704003a1d07c6e0d6b1225d41081428b9e4ba7fe9fd1f2ea4b6ea9d1bb9c7af7556bcd089c2b99eaae093a341d7e548dd29f
7
- data.tar.gz: f93520c64dfacf3a926400672469d1ab53d60cd2fe8d70b8d0bda80b7bb657c927e014fce731813e90b4554df08d5e32a16f3ae4dbd832882ebe661f393e3088
6
+ metadata.gz: 79bc08d233802b69d1a1b6745dc561d95c8c8e1c1f138eadf4116840ee11d95e55b3c03447e843740eb05ea88298a94e3141e152b184330d142a9afa5b2839fd
7
+ data.tar.gz: 3f6245dd4badbfced192b0474541a27f14de49435fa43ed137afc2b0bb17542cc41d8d054396ba21614bcf211fcb37db980c37f710b60035029fe5e37cb41aa5
@@ -1,19 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "tty-prompt"
4
+
5
+ PackageManager = Struct.new(:fetch, :run, :add, :lock_file, :version) do
6
+ def to_s = run.split.first
7
+ end
8
+
3
9
  module Rails
4
10
  class NextRailsScaffoldGenerator < Rails::Generators::NamedBase
5
11
  include ::NextRailsScaffold::Actions
6
12
 
7
13
  source_root File.expand_path("templates", __dir__)
8
14
 
9
- NODE_REQUIRED_VERSION = ENV.fetch("NODE_REQUIRED_VERSION", ">= 18.20.6")
10
- YARN_VERSION = ENV.fetch("YARN_VERSION", "1.22.22")
15
+ PACKAGE_MANAGERS = {
16
+ "npm" => PackageManager.new("npx", "npm run", "npm install", "package-lock.json"),
17
+ "yarn" => PackageManager.new("yarn dlx", "yarn", "yarn add", "yarn.lock"),
18
+ "pnpm" => PackageManager.new("pnpm dlx", "pnpm", "pnpm add", "pnpm-lock.yaml"),
19
+ "bun" => PackageManager.new("bunx", "bun run", "bun add", "bun.lock.json")
20
+ }.freeze
21
+ NODE_REQUIRED_VERSION = ENV.fetch("NODE_REQUIRED_VERSION", ">= 18.20")
11
22
  NEXT_VERSION = ENV.fetch("NEXT_VERSION", "15.1.6")
12
23
 
13
24
  argument :attributes, type: :array, default: [], banner: "field:type field:type"
25
+ class_option :package_manager, type: :string, desc: "Package manager to use for frontend project"
26
+ class_option :skip_build, type: :boolean, default: false, desc: "Skip running Next.js build"
27
+ class_option :skip_routes, type: :boolean, default: false, desc: "Skip adding resources to routes.rb"
28
+
29
+ attr_accessor :selected_package_manager
14
30
 
15
31
  def initialize(args, *options) # :nodoc:
16
32
  super
33
+
34
+ @prompt = TTY::Prompt.new
35
+
17
36
  self.attributes = shell.base.attributes
18
37
  end
19
38
 
@@ -31,29 +50,32 @@ module Rails
31
50
  # end
32
51
  # end
33
52
  def add_resource_route
34
- return if options[:actions].present?
53
+ return if options[:actions].present? || options[:skip_routes]
35
54
 
36
55
  route "resources :#{file_name.pluralize}", namespace: regular_class_path, scope: "/api"
37
56
  end
38
57
 
39
- # Check Javascript depencies and create a new Next.js project. Install the the usefull packages and create the
58
+ # Check Javascript dependencies and create a new Next.js project. Install the the useful packages and create the
40
59
  # scaffold code for frontend application.
41
60
  def create_frontend_project
42
61
  return say_status :remove, "skip frontend folder", :yellow if shell.base.behavior == :revoke
43
62
 
44
- check_node!
45
63
  append_gitignore!
46
64
 
47
65
  empty_directory "frontend"
48
66
 
49
67
  inside("frontend") do
68
+ check_node!
69
+ check_pm_version!
50
70
  create_next_app!
51
71
  install_hygen!
52
72
 
53
73
  language = File.exist?("tsconfig.json") ? "typescript" : "javascript"
54
74
 
55
- run("npx hygen scaffold #{language} #{name} #{mapped_attributes.join(" ")}")
56
- run("yarn build")
75
+ run("#{selected_package_manager} hygen scaffold #{language} #{name} #{mapped_attributes.join(" ")}")
76
+ if !options[:skip_build] && @prompt.no?("Do you want to build your Next.js project? (y/N)")
77
+ run("#{selected_package_manager.run} build")
78
+ end
57
79
  end
58
80
  end
59
81
 
@@ -70,6 +92,30 @@ module Rails
70
92
  end
71
93
  end
72
94
 
95
+ def check_pm_version!
96
+ package_manager = shell.base.options[:package_manager]
97
+
98
+ unless package_manager
99
+ PACKAGE_MANAGERS.each do |manager, details|
100
+ if File.exist?(details.lock_file)
101
+ package_manager = manager
102
+ break
103
+ end
104
+ end
105
+ end
106
+
107
+ until PACKAGE_MANAGERS.keys.include?(package_manager)
108
+ puts "Invalid package manager" unless package_manager.nil?
109
+
110
+ package_manager = @prompt.select("Which package manager do you want to use?", PACKAGE_MANAGERS.keys)
111
+ end
112
+
113
+ self.selected_package_manager = PACKAGE_MANAGERS[package_manager]
114
+
115
+ selected_package_manager.version = run("#{selected_package_manager} --version", capture: true).gsub(/[^0-9.]/, "")
116
+ log :package_manager, "Using #{selected_package_manager} version '#{selected_package_manager.version}'"
117
+ end
118
+
73
119
  def append_gitignore!
74
120
  rows = <<~HEREDOC
75
121
 
@@ -83,16 +129,22 @@ module Rails
83
129
  def create_next_app!
84
130
  return if File.exist?("package.json")
85
131
 
86
- run("npm install --global yarn@#{YARN_VERSION}")
87
- run("yarn global add create-next-app@#{NEXT_VERSION}")
88
- run("yarn create next-app . --no-app --src-dir --import-alias \"@/*\"")
132
+ run(
133
+ "#{selected_package_manager.fetch} create-next-app@#{NEXT_VERSION} . " \
134
+ "--no-app --src-dir --import-alias \"@/*\""
135
+ )
136
+
137
+ if selected_package_manager.to_s == "yarn" &&
138
+ Gem::Dependency.new("", ">= 2.0").match?("", selected_package_manager.version)
139
+ run("yarn config set nodeLinker node-modules")
140
+ end
89
141
  end
90
142
 
91
143
  def install_hygen!
92
144
  return if Dir.exist?("_templates")
93
145
 
94
- run("yarn add -D hygen hygen-add")
95
- run("npx hygen-add next-rails-scaffold")
146
+ run("#{selected_package_manager.add} -D hygen hygen-add")
147
+ run("#{selected_package_manager} hygen-add next-rails-scaffold")
96
148
  end
97
149
 
98
150
  def mapped_attributes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NextRailsScaffold
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: next_rails_scaffold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Raphael Araújo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-01-23 00:00:00.000000000 Z
11
+ date: 2025-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 7.1.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-prompt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.23.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.23.1
27
41
  description: |
28
42
  The `next_rails_scaffold` gem is a powerful extension to the standard Ruby on Rails scaffold generator. It streamlines the development workflow by not only creating the backend structure with Rails but also automating the setup of a frontend directory using Next.js. Upon running the scaffold generator, this gem intelligently generates a Next.js application within the specified frontend directory.
29
43