Class: Lilac::CLI::PackageStager

Inherits:
Object
  • Object
show all
Defined in:
lib/lilac/cli/build/package_stager.rb

Overview

Stages Lilac package .mrb files under dist/packages/ and (for the :full target) writes the lilac.packages.json manifest the scaffold-style boot script reads to load each package ahead of evalScript.

Two input channels merge here (decisions §25 / §26):

1. **Bundler auto-discovery** — `PackageDiscovery.run` finds gems
 whose gemspec declares `metadata["lilac_package"] = "true"`.
 Each gem's `mrblib/*.rb` is compiled locally to `.mrb` so the
 mruby version matches the vendored core wasm.
2. **Explicit `c.packages = [...paths]`** — pre-compiled `.mrb`
 files. Useful for advanced overrides (custom package not in
 a gem, vendored fork, etc.).

Manifest emission is target-dependent:

- `:full` writes `dist/lilac.packages.json` so the user's hand-
rolled boot script can `fetch` it and `loadBytecode` each entry
- `:compiled` skips the manifest — the generated boot module
inlines `loadBytecode` calls directly

Sibling of BundleAssetWriter / VendorWriter: same shape (a build phase owning one cluster of file emissions), invoked once from Builder#build.

Constant Summary collapse

PACKAGES_DIR =
'packages'
MANIFEST_FILENAME =
'lilac.packages.json'

Instance Method Summary collapse

Constructor Details

#initialize(packages:, target:, output_dir:, bytecode_builder:) ⇒ PackageStager

Returns a new instance of PackageStager.



37
38
39
40
41
42
# File 'lib/lilac/cli/build/package_stager.rb', line 37

def initialize(packages:, target:, output_dir:, bytecode_builder:)
  @packages = packages
  @target = target
  @output_dir = output_dir
  @bytecode_builder = bytecode_builder
end

Instance Method Details

#run!Object

Returns Array<String> — page-relative URLs of every staged .mrb. Empty when no packages are configured or discovered.



46
47
48
49
50
51
52
53
# File 'lib/lilac/cli/build/package_stager.rb', line 46

def run!
  return [] if @packages.empty? && discovered_packages.empty?

  FileUtils.mkdir_p(File.join(@output_dir, PACKAGES_DIR))
  urls = (stage_discovered + stage_explicit).uniq
  write_manifest!(urls) if @target == :full
  urls
end