Class: PetiteVite::InstallGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/petite_vite/install/install_generator.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.exit_on_failure?Boolean

Returns:

  • (Boolean)


5
6
7
# File 'lib/generators/petite_vite/install/install_generator.rb', line 5

def self.exit_on_failure?
  true
end

Instance Method Details

#create_dev_scriptsObject



48
49
50
51
52
53
54
# File 'lib/generators/petite_vite/install/install_generator.rb', line 48

def create_dev_scripts
  return if File.exist?(File.join(destination_root, "Procfile.dev"))

  template("Procfile.dev", "Procfile.dev")
  template("bin/dev", "bin/dev")
  chmod("bin/dev", 0o755)
end

#create_initializerObject



39
40
41
42
# File 'lib/generators/petite_vite/install/install_generator.rb', line 39

def create_initializer
  template("initializer.rb", "config/initializers/petite_vite.rb")
  template("petite_vite.json", "config/petite_vite.json")
end

#create_package_jsonObject



44
45
46
# File 'lib/generators/petite_vite/install/install_generator.rb', line 44

def create_package_json
  template("package.json", "package.json")
end

#insert_to_frontend_source_mainObject



60
61
62
# File 'lib/generators/petite_vite/install/install_generator.rb', line 60

def insert_to_frontend_source_main
  prepend_to_file(File.join(destination_root, frontend_root!, frontend_source_main!), "import 'vite/modulepreload-polyfill'\n")
end

#insert_to_layoutObject



94
95
96
97
98
99
100
101
102
103
# File 'lib/generators/petite_vite/install/install_generator.rb', line 94

def insert_to_layout
  Dir.glob(File.join(destination_root, "app", "views", "layouts", "**.html.erb")).each do |abspath|
    basename = File.basename(abspath)
    next if basename == "mailer.html.erb"
    relpath = Pathname.new(abspath).relative_path_from(destination_root).to_s
    insert_into_file(relpath, before: %r{^\s*</head>}, verbose: false) do
      "<%= vite_tags %>\n"
    end
  end
end

#insert_to_procfile_devObject



56
57
58
# File 'lib/generators/petite_vite/install/install_generator.rb', line 56

def insert_to_procfile_dev
  append_to_file("Procfile.dev", "vite: cd #{frontend_root!} && yarn dev\n")
end

#insert_to_vite_configObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/generators/petite_vite/install/install_generator.rb', line 64

def insert_to_vite_config
  vite_config_path = File.join(destination_root, frontend_root!, frontend_vite_config!)

  depth = frontend_root!.count("/") + 1
  relative_prefix = "../" * depth
  insert_into_file(vite_config_path, before: %r{^\s*export default defineConfig\b}, verbose: false) do
    "import shared from '#{relative_prefix}config/petite_vite.json'\n"
  end

  injected = <<~SCRIPT.indent(2)
    clearScreen: false,
    server: {
      cors: {
        origin: shared.viteCorsOrigin,
      },
      origin: shared.viteCorsOrigin,
      port: shared.viteDevServerPort,
      strictPort: true,
    },
    build: {
      manifest: true,
      rollupOptions: {
        input: shared.frontendInput,
      },
    },
  SCRIPT

  gsub_file(vite_config_path, %r{(export default defineConfig\s*\(\s*\{\s*\n)}, "\\1#{injected}", verbose: false)
end

#verify_frontend_existsObject



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/generators/petite_vite/install/install_generator.rb', line 25

def verify_frontend_exists
  return if skip_frontend_check!

  path = File.join(destination_root, frontend_root!)
  unless File.exist?(path)
    raise "Expected #{path} to exist. Pass --skip-frontend-check to bypass."
  end

  path = File.join(destination_root, frontend_root!, "package.json")
  unless File.exist?(path)
    raise "Expected #{path} to exist. Pass --skip-frontend-check to bypass."
  end
end

#verify_inputObject



18
19
20
21
22
23
# File 'lib/generators/petite_vite/install/install_generator.rb', line 18

def verify_input
  vite_dev_server_port!
  frontend_root!
  rails_development_url!
  skip_frontend_check!
end