11# frozen_string_literal: true
22
3- PackageManager = Struct . new ( :fetch , :run , :add , :lock_file ) do
4- def to_s = fetch
3+ require "tty-prompt"
4+
5+ PackageManager = Struct . new ( :fetch , :run , :add , :lock_file , :version ) do
6+ def to_s = run . split . first
57end
68
79module Rails
@@ -29,18 +31,9 @@ class NextRailsScaffoldGenerator < Rails::Generators::NamedBase
2931 def initialize ( args , *options ) # :nodoc:
3032 super
3133
32- self . attributes = shell . base . attributes
33-
34- package_manager = shell . base . options [ :package_manager ]
35- until PACKAGE_MANAGERS . keys . include? ( package_manager )
36- puts "Invalid package manager" unless package_manager . nil?
37- package_manager = ask (
38- "Which package manager do you want to use? " \
39- "(#{ PACKAGE_MANAGERS . keys . to_sentence ( words_connector : " or " ) } ): "
40- )
41- end
34+ @prompt = TTY ::Prompt . new
4235
43- self . selected_package_manager = PACKAGE_MANAGERS [ package_manager ]
36+ self . attributes = shell . base . attributes
4437 end
4538
4639 # Properly nests namespaces passed into a generator
@@ -67,19 +60,20 @@ def add_resource_route
6760 def create_frontend_project
6861 return say_status :remove , "skip frontend folder" , :yellow if shell . base . behavior == :revoke
6962
70- check_node!
7163 append_gitignore!
7264
7365 empty_directory "frontend"
7466
7567 inside ( "frontend" ) do
68+ check_node!
69+ check_pm_version!
7670 create_next_app!
7771 install_hygen!
7872
7973 language = File . exist? ( "tsconfig.json" ) ? "typescript" : "javascript"
8074
8175 run ( "#{ selected_package_manager } hygen scaffold #{ language } #{ name } #{ mapped_attributes . join ( " " ) } " )
82- if !options [ :skip_build ] && yes ?( "Do you want to build your Next.js project? (y/N)" )
76+ if !options [ :skip_build ] && @prompt . no ?( "Do you want to build your Next.js project? (y/N)" )
8377 run ( "#{ selected_package_manager . run } build" )
8478 end
8579 end
@@ -98,6 +92,30 @@ def check_node!
9892 end
9993 end
10094
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+
101119 def append_gitignore!
102120 rows = <<~HEREDOC
103121
@@ -115,6 +133,11 @@ def create_next_app!
115133 "#{ selected_package_manager . fetch } create-next-app@#{ NEXT_VERSION } . " \
116134 "--no-app --src-dir --import-alias \" @/*\" "
117135 )
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
118141 end
119142
120143 def install_hygen!
0 commit comments