Module: Opal::Rails::LegacyUpgradeWarning

Defined in:
lib/opal/rails/legacy_upgrade_warning.rb

Constant Summary collapse

LEGACY_OPAL_CONFIG_KEYS =
%w[
  method_missing_enabled
  const_missing_enabled
  arity_check_enabled
  freezing_stubs_enabled
  missing_require_severity
].freeze
BUILD_CONFIG_KEYS =
%w[
  source_path
  entrypoints_path
  build_path
  entrypoints
].freeze

Class Method Summary collapse

Class Method Details

.legacy_entrypoints(root) ⇒ Object



86
87
88
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 86

def legacy_entrypoints(root)
  Dir[root.join('app/assets/{javascript,javascripts}/**/*.js.rb').to_s].sort.map { |path| Pathname(path) }
end

.legacy_initializer?(initializer_body) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
82
83
84
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 79

def legacy_initializer?(initializer_body)
  return false unless initializer_body
  return false if BUILD_CONFIG_KEYS.any? { |key| initializer_body.include?("config.opal.#{key}") }

  LEGACY_OPAL_CONFIG_KEYS.any? { |key| initializer_body.include?("config.opal.#{key}") }
end

.legacy_signals(root) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 53

def legacy_signals(root)
  root = Pathname(root)
  signals = []

  initializer = root.join('config/initializers/opal.rb')
  initializer_body = initializer.exist? ? initializer.read : nil

  if legacy_initializer?(initializer_body)
    signals << 'config/initializers/opal.rb still uses legacy 2.x runtime settings'
  end

  legacy_entrypoints(root).each do |entrypoint|
    signals << "legacy Opal asset entrypoint present at #{relative_to_root(entrypoint, root)}"
  end

  manifest = root.join('app/assets/config/manifest.js')
  if manifest.exist? && manifest.read.match?(%r{link_(?:tree|directory)\s+\.\./javascript\b})
    signals << 'app/assets/config/manifest.js still links the legacy javascript asset tree'
  end

  return [] unless initializer_body && signals.length >= 2
  return signals if root.join('app/opal').directory?

  signals << 'expected 3.x source root app/opal is missing'
end

.relative_to_root(path, root) ⇒ Object



90
91
92
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 90

def relative_to_root(path, root)
  path.relative_path_from(root).to_s
end

.suppress_warning?(app) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
50
51
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 47

def suppress_warning?(app)
  return false unless app.respond_to?(:config)

  app.config.respond_to?(:opal) && app.config.opal.suppress_legacy_upgrade_warning
end

.warn_if_needed(app, output: $stderr) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 21

def warn_if_needed(app, output: $stderr)
  return false if suppress_warning?(app)

  warning = warning_for(app.root)
  return false unless warning

  output.puts(warning)
  true
end

.warning_for(root) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/opal/rails/legacy_upgrade_warning.rb', line 31

def warning_for(root)
  signals = legacy_signals(root)
  return if signals.empty?

  "    WARNING: opal-rails detected a likely 2.x application layout that has not been ported to the 3.x build pipeline yet.\n\n    This app may fail after upgrade with missing `app/opal` entrypoints or missing `application.js` assets.\n    Pin `opal-rails` to the 2.0 series until the app can be ported, or follow `PORTING.md` before continuing.\n    If you have already ported the app and want to silence this check, set `config.opal.suppress_legacy_upgrade_warning = true`.\n\n    Detected legacy signals:\n    \#{signals.map { |signal| \"- \#{signal}\" }.join(\"\\n\")}\n  WARNING\nend\n"