Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ main
natively since `5.0`, and every Rails version this gem supports is `>= 5.2`.
To upgrade, remove `rails_12factor` from your project's `Gemfile`
* Replace `EmberCli::App#yarn_enabled?` with `EmberCli::App#yarn?`
* Pin the NodeJS version in the `package.json` that `rails generate
ember:heroku` writes, from the `engines.node` the Ember applications
declare. Applications that declare different versions are left unpinned
* Add `EmberCli::App#node_engine`, reading `engines.node` from the Ember
application's `package.json`

0.13.2
------
Expand Down
12 changes: 12 additions & 0 deletions lib/ember_cli/app.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require "json"

require "html_page/renderer"
require "ember_cli/path_set"
require "ember_cli/shell"
Expand Down Expand Up @@ -99,6 +101,16 @@ def bower?
paths.bower_json.exist?
end

def node_engine
package_json = paths.package_json

if package_json.exist?
JSON.parse(package_json.read).dig("engines", "node")
end
rescue JSON::ParserError
nil
end

def to_rack
deploy.to_rack
end
Expand Down
4 changes: 4 additions & 0 deletions lib/ember_cli/path_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ def gemfile
@gemfile ||= root.join("Gemfile")
end

def package_json
@package_json ||= root.join("package.json")
end

def bower_json
root.join("bower.json")
end
Expand Down
20 changes: 20 additions & 0 deletions lib/generators/ember/heroku/heroku_generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,26 @@ def identify_as_yarn_project

private

def node_engine
return @node_engine if defined?(@node_engine)

declared = apps.map(&:node_engine).compact.uniq

@node_engine =
if declared.size > 1
say_status(
:conflict,
"Ember applications declare different `engines.node` " \
"(#{declared.join(", ")}); pin one in package.json by hand",
:red,
)

nil
else
declared.first
end
end

def cache_directories
all_cached_directories.map do |cached_directory|
cached_directory.relative_path_from(Rails.root).to_s
Expand Down
5 changes: 5 additions & 0 deletions lib/generators/ember/heroku/templates/package.json.erb
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,10 @@
"bower": "*"
},
<% end %>
<% if node_engine %>
"engines": {
"node": <%= node_engine.to_json %>
},
<% end %>
"cacheDirectories": <%= cache_directories.to_json %>
}
48 changes: 48 additions & 0 deletions spec/generators/ember/heroku/heroku_generator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,54 @@ def gemfile_contents
end
end

describe "engines" do
it "pins the NodeJS version the Ember applications declare" do
setup_destination
configure_applications(node_engine: ">= 20.19.0")

run_generator

expect(package_json.fetch("engines")).to eq("node" => ">= 20.19.0")
end

it "omits engines when no Ember application declares one" do
setup_destination
configure_applications(node_engine: nil)

run_generator

expect(package_json.keys).not_to include("engines")
end

it "omits engines when the Ember applications disagree" do
setup_destination
configure_applications(
{ node_engine: ">= 20.19.0" },
{ node_engine: ">= 22.0.0" },
)

run_generator

expect(package_json.keys).not_to include("engines")
end

def configure_applications(*attributes)
apps = attributes.map do |app_attributes|
instance_double(
EmberCli::App,
{
bower?: false,
cached_directories: [],
yarn?: false,
}.merge(app_attributes),
)
end

allow(EmberCli).to receive(:apps).
and_return(apps.map.with_index { |app, i| ["app-#{i}", app] }.to_h)
end
end

def depend_on_bower(bower_enabled)
allow_any_instance_of(EmberCli::App).
to receive(:bower?).and_return(bower_enabled)
Expand Down
36 changes: 36 additions & 0 deletions spec/lib/ember_cli/app_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,42 @@
end
end

describe "#node_engine" do
it "reads engines.node from the application's package.json" do
stub_package_json('{"engines":{"node":">= 20.19.0"}}')
app = EmberCli::App.new("with node engine")

expect(app.node_engine).to eq ">= 20.19.0"
end

it "returns nil when the package.json declares no engines" do
stub_package_json('{"name":"frontend"}')
app = EmberCli::App.new("without engines")

expect(app.node_engine).to be_nil
end

it "returns nil when the package.json is absent" do
stub_paths(package_json: double("Pathname", exist?: false))
app = EmberCli::App.new("without package json")

expect(app.node_engine).to be_nil
end

it "returns nil when the package.json is malformed" do
stub_package_json("{")
app = EmberCli::App.new("with malformed package json")

expect(app.node_engine).to be_nil
end

def stub_package_json(contents)
stub_paths(
package_json: double("Pathname", exist?: true, read: contents),
)
end
end

describe "#compile" do
it "exits with exit status of 0" do
passed = EmberCli["my-app"].compile
Expand Down