-
-
Notifications
You must be signed in to change notification settings - Fork 633
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix Version Checker's hard-coded path for package.json #1657
Changes from 3 commits
ceb80a0
5c2164c
d066e37
9a07b64
a64c1b5
e073587
45cb6df
ad2d79d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,8 +5,9 @@ | |
module ReactOnRails | ||
class Engine < ::Rails::Engine | ||
config.to_prepare do | ||
if File.exist?(VersionChecker::NodePackageVersion.package_json_path) | ||
VersionChecker.build.raise_if_gem_and_node_package_versions_differ | ||
if VersionChecker.instance("package.json").raise_if_gem_and_node_package_versions_differ && | ||
VersionChecker.instance("client/package.json").raise_if_gem_and_node_package_versions_differ | ||
Rails.logger.warn("No 'react-on-rails' entry found in 'dependencies' in package.json or client/package.json.") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. all this consistency checking logic should go to one method, that logs warnings for now, and will throw for the next major version bump |
||
end | ||
ReactOnRails::ServerRenderingPool.reset_pool | ||
end | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -12,6 +12,10 @@ def self.build | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
new(NodePackageVersion.build) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def self.instance(package_json_path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
justin808 marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. do we need the arg? can we just use |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
new(NodePackageVersion.new(package_json_path)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider adding parameter validation for package_json_path The new instance method accepts a path parameter without validation. This could lead to issues if invalid paths are provided. def self.instance(package_json_path)
+ raise ReactOnRails::Error, "package_json_path cannot be nil" if package_json_path.nil?
+ raise ReactOnRails::Error, "package_json_path must be a string" unless package_json_path.is_a?(String)
new(NodePackageVersion.new(package_json_path))
end 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def initialize(node_package_version) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@node_package_version = node_package_version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -20,17 +24,19 @@ def initialize(node_package_version) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# unless the user really knows what they're doing. So we will give a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# warning if they do not. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def raise_if_gem_and_node_package_versions_differ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is anybody code still calling this one? we'll need a reminder for the next big update? Maybe leave a PR pending? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can create a follow-up PR and leave it pending. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return true unless node_package_version.raw | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return if node_package_version.relative_path? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise_node_semver_version_warning if node_package_version.semver_wildcard? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node_major_minor_patch = node_package_version.major_minor_patch | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gem_major_minor_patch = gem_major_minor_patch_version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
versions_match = node_major_minor_patch[0] == gem_major_minor_patch[0] && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node_major_minor_patch[1] == gem_major_minor_patch[1] && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
node_major_minor_patch[2] == gem_major_minor_patch[2] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise_differing_versions_warning unless versions_match | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise_node_semver_version_warning if node_package_version.semver_wildcard? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider renaming method to better reflect its behavior The method name Additionally, the -def raise_if_gem_and_node_package_versions_differ
+def check_gem_and_node_package_versions
return true unless node_package_version.raw
return if node_package_version.relative_path?
raise_node_semver_version_warning if node_package_version.semver_wildcard?
node_major_minor_patch = node_package_version.major_minor_patch
gem_major_minor_patch = gem_major_minor_patch_version
versions_match = node_major_minor_patch[0] == gem_major_minor_patch[0] &&
node_major_minor_patch[1] == gem_major_minor_patch[1] &&
node_major_minor_patch[2] == gem_major_minor_patch[2]
raise_differing_versions_warning unless versions_match
- false
+ versions_match
end 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -43,18 +49,19 @@ def common_error_msg | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
your installed node package. Do not use >= or ~> in your Gemfile for react_on_rails. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Do not use ^ or ~ in your package.json for react-on-rails. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Run `yarn add react-on-rails --exact` in the directory containing folder node_modules. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
***This warning will become a fatal error in ReactOnRails v15*** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Review warning message implementation The current implementation:
Consider:
Also applies to: 53-54, 58-60 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MSG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def raise_differing_versions_warning | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. method names can't be raise, but mean |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msg = "**ERROR** ReactOnRails: ReactOnRails gem and node package versions do not match\n#{common_error_msg}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ReactOnRails::Error, msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msg = "**WARNING** ReactOnRails: ReactOnRails gem and node package versions do not match\n#{common_error_msg}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rails.logger.warn(msg) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def raise_node_semver_version_warning | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msg = "**ERROR** ReactOnRails: Your node package version for react-on-rails contains a " \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msg = "**WARNING** ReactOnRails: Your node package version for react-on-rails contains a " \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"^ or ~\n#{common_error_msg}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ReactOnRails::Error, msg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rails.logger.warn(msg) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify warning messages per feedback The current warning messages are still verbose and the v15 warning may cause unnecessary concern. Per justin808's feedback, these should be more concise. def common_error_msg
<<-MSG.strip_heredoc
Detected: #{node_package_version.raw}
gem: #{gem_version}
- Ensure the installed version of the gem is the same as the version of
- your installed node package. Do not use >= or ~> in your Gemfile for react_on_rails.
- Do not use ^ or ~ in your package.json for react-on-rails.
- Run `yarn add react-on-rails --exact` in the directory containing folder node_modules.
- ***This warning will become a fatal error in ReactOnRails v15***
+ To fix: Run `yarn add react-on-rails@#{gem_version} --exact`
MSG
end
def raise_differing_versions_warning
- msg = "**WARNING** ReactOnRails: ReactOnRails gem and node package versions do not match\n#{common_error_msg}"
+ msg = "Version mismatch between gem and node package\n#{common_error_msg}"
Rails.logger.warn(msg)
end
def raise_node_semver_version_warning
- msg = "**WARNING** ReactOnRails: Your node package version for react-on-rails contains a " \
- "^ or ~\n#{common_error_msg}"
+ msg = "Semver wildcards not supported in package.json\n#{common_error_msg}"
Rails.logger.warn(msg)
end 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def gem_version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -73,21 +80,21 @@ def self.build | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
new(package_json_path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def self.package_json_path | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rails.root.join("client", "package.json") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def self.package_json_path(relative_path = "package.json") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rails.root.join(relative_path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add path validation for package.json The method accepts any relative path without validation. Consider adding checks to:
def self.package_json_path(relative_path = "package.json")
+ unless relative_path.end_with?("package.json")
+ raise ReactOnRails::Error, "Path must end with package.json"
+ end
+ path = Rails.root.join(relative_path)
+ unless path.to_s.start_with?(Rails.root.to_s)
+ raise ReactOnRails::Error, "Path must be within Rails root directory"
+ end
- Rails.root.join(relative_path)
+ path
end 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def initialize(package_json) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@package_json = package_json | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def raw | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil unless File.exist?(package_json) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parsed_package_contents = JSON.parse(package_json_contents) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if parsed_package_contents.key?("dependencies") && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parsed_package_contents["dependencies"].key?("react-on-rails") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parsed_package_contents["dependencies"]["react-on-rails"] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ReactOnRails::Error, "No 'react-on-rails' entry in package.json dependencies" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -96,7 +103,7 @@ def semver_wildcard? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def relative_path? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raw.match(%r{(\.\.|\Afile:///)}).present? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raw.match(/(\.\.|\Afile:)/).present? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Security: Strengthen relative path detection The current regex allows potentially dangerous path patterns:
Consider using a more restrictive approach: - raw.match(/(\.\.|\Afile:)/).present?
+ raw.start_with?('file:./') || raw.start_with?('file:src/')
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def major_minor_patch | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{ | ||
"dependencies": { | ||
"babel": "^6.3.26", | ||
"react-on-rails": "file:.yalc/react-on-rails", | ||
"webpack": "^1.12.8" | ||
}, | ||
"devDependencies": { | ||
"babel-eslint": "^5.0.0-beta6" | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should be using
node_modules_location
.https://github.com/search?q=repo%3Ashakacode%2Freact_on_rails%20node_modules_location&type=code