Module: CloudflareWorkers::BuildSupport

Defined in:
lib/cloudflare_workers/build_support.rb

Constant Summary collapse

RUNTIME_GEM_NAME =
'homura-runtime'
SINATRA_GEM_NAME =
'sinatra-homura'

Class Method Summary collapse

Class Method Details

.ensure_standalone_runtime(project_root, current_file: __FILE__, loaded_specs: Gem.loaded_specs) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/cloudflare_workers/build_support.rb', line 45

def ensure_standalone_runtime(project_root, current_file: __FILE__, loaded_specs: Gem.loaded_specs)
  target_dir = Pathname(project_root).join('cf-runtime')
  FileUtils.mkdir_p(target_dir)

  %w[setup-node-crypto.mjs worker_module.mjs].each do |name|
    FileUtils.cp(runtime_file(name, current_file: current_file, loaded_specs: loaded_specs), target_dir.join(name))
  end

  target_dir
end

.gem_lib(name, loaded_specs: Gem.loaded_specs) ⇒ Object



30
31
32
# File 'lib/cloudflare_workers/build_support.rb', line 30

def gem_lib(name, loaded_specs: Gem.loaded_specs)
  File.join(gem_root(name, loaded_specs: loaded_specs), 'lib')
end

.gem_root(name, loaded_specs: Gem.loaded_specs) ⇒ Object



16
17
18
19
20
21
# File 'lib/cloudflare_workers/build_support.rb', line 16

def gem_root(name, loaded_specs: Gem.loaded_specs)
  spec = loaded_spec(name, loaded_specs: loaded_specs)
  return spec.full_gem_path if spec

  raise("cloudflare-workers-build: gem #{name} not loaded; use bundle exec from app root")
end

.gem_vendor(name, loaded_specs: Gem.loaded_specs) ⇒ Object



34
35
36
37
38
39
# File 'lib/cloudflare_workers/build_support.rb', line 34

def gem_vendor(name, loaded_specs: Gem.loaded_specs)
  vendor = File.join(gem_root(name, loaded_specs: loaded_specs), 'vendor')
  return vendor if Dir.exist?(vendor)

  nil
end

.loaded_spec(name, loaded_specs: Gem.loaded_specs) ⇒ Object



12
13
14
# File 'lib/cloudflare_workers/build_support.rb', line 12

def loaded_spec(name, loaded_specs: Gem.loaded_specs)
  loaded_specs[name]
end

.runtime_file(*names, current_file: __FILE__, loaded_specs: Gem.loaded_specs) ⇒ Object



41
42
43
# File 'lib/cloudflare_workers/build_support.rb', line 41

def runtime_file(*names, current_file: __FILE__, loaded_specs: Gem.loaded_specs)
  runtime_root(current_file: current_file, loaded_specs: loaded_specs).join('runtime', *names)
end

.runtime_root(current_file:, loaded_specs: Gem.loaded_specs) ⇒ Object



23
24
25
26
27
28
# File 'lib/cloudflare_workers/build_support.rb', line 23

def runtime_root(current_file:, loaded_specs: Gem.loaded_specs)
  spec = loaded_spec(RUNTIME_GEM_NAME, loaded_specs: loaded_specs)
  return Pathname(spec.full_gem_path) if spec

  Pathname(current_file).expand_path.join('../..')
end

.standalone_namespace(project_root, suffix) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/cloudflare_workers/build_support.rb', line 56

def standalone_namespace(project_root, suffix)
  base = Pathname(project_root).basename.to_s
  parts = base.split(/[^A-Za-z0-9]+/).reject(&:empty?)
  module_name = parts.map { |part| part[0].upcase + part[1..].to_s }.join
  module_name = 'App' if module_name.empty?
  module_name = "App#{module_name}" if module_name.match?(/\A\d/)
  "#{module_name}#{suffix}"
end

.vendor_from_gemfile(project_root) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/cloudflare_workers/build_support.rb', line 65

def vendor_from_gemfile(project_root)
  gf = Pathname(project_root).join('Gemfile')
  return unless gf.file?

  txt = gf.read
  return unless (m = txt.match(/#{Regexp.escape(RUNTIME_GEM_NAME)}['"]\s*,\s*path:\s*['"]([^'"]+)['"]/))

  runtime_path = Pathname.new(m[1]).expand_path(project_root)
  vend = runtime_path.join('..', '..', 'vendor').expand_path
  vend if vend.directory?
end