js-routes 1.0.1 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c68aed8760da61aa1ff4977b8d69f09cfc609f18
4
- data.tar.gz: f4362dcdb29332048b5a19d3ed40dce4717b6bd9
3
+ metadata.gz: 33fffcaa3c5d7614a35673b8a53ea0f06030dbed
4
+ data.tar.gz: b8c5ffa5eb34114667b2d8e3f53dec2809816f2e
5
5
  SHA512:
6
- metadata.gz: cd44c50605191eda0663671b1d7bf46bcffa7e4e13705e8ca9177fc3c8ac332ea1abac89448a7dfc27e4e9eee5d98ad340f602fea6b082c0af144449e5e46c31
7
- data.tar.gz: bc598e7e2a6c51477162b6e76d4d423e4e6bd6454247305593d343934abd04ae20a829301695e7707ed86bc38c8da7ce00a3c224f3b9e3e5e3b3e35e8ce2320c
6
+ metadata.gz: 989c63812f7821d21fc94b0bd42f43e87be6a933a2f934733a8f30f3b575f566cb43619a3ca64b49e39ec1dc91ea633ab5337f5be133804aa995756e252cc27f
7
+ data.tar.gz: 880139c994a2f813b4e0c65d16f281626252462010a08f68e4ef234f3743cab1ae141041fb3cb60f4bdc04fe5d2803dbb22694cc08cf1604e5da692bc3f6e6ef
data/.travis.yml CHANGED
@@ -1,11 +1,14 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
 
4
+ before_install:
5
+ - gem install bundler # need for jruby and ruby-head
6
+
4
7
  rvm:
5
- - 1.9.3
6
8
  - 2.0
7
9
  - 2.1
8
- - 2.2
10
+ - 2.2.5
11
+ - 2.3.1
9
12
  - jruby-19mode
10
13
  - ruby-head
11
14
  - jruby-head
@@ -13,11 +16,13 @@ rvm:
13
16
  gemfile:
14
17
  - gemfiles/rails32.gemfile
15
18
  - gemfiles/rails40.gemfile
16
- - gemfiles/rails41.gemfile
17
- - gemfiles/rails42.gemfile
18
19
  - gemfiles/rails40_sprockets3.gemfile
20
+ - gemfiles/rails41.gemfile
19
21
  - gemfiles/rails41_sprockets3.gemfile
22
+ - gemfiles/rails42.gemfile
20
23
  - gemfiles/rails42_sprockets3.gemfile
24
+ - gemfiles/rails50.gemfile
25
+ - gemfiles/rails50_sprockets3.gemfile
21
26
 
22
27
  sudo: false
23
28
 
@@ -34,3 +39,13 @@ matrix:
34
39
  - rvm: jruby-19mode
35
40
  - rvm: ruby-head
36
41
  - rvm: jruby-head
42
+ - gemfile: gemfiles/rails50.gemfile
43
+ exclude:
44
+ - rvm: 2.0
45
+ gemfile: gemfiles/rails50.gemfile
46
+ - rvm: 2.0
47
+ gemfile: gemfiles/rails50_sprockets3.gemfile
48
+ - rvm: 2.1
49
+ gemfile: gemfiles/rails50.gemfile
50
+ - rvm: 2.1
51
+ gemfile: gemfiles/rails50_sprockets3.gemfile
data/Appraisals CHANGED
@@ -3,7 +3,7 @@ appraise "rails32" do
3
3
  gem 'tzinfo'
4
4
  end
5
5
 
6
- {rails40: '4.0.5', rails41: '4.1.1', rails42: '4.2.0'}.each do |rails, version|
6
+ {rails40: '4.0.5', rails41: '4.1.1', rails42: '4.2.1', rails50: '5.0.0'}.each do |rails, version|
7
7
  appraise "#{rails}" do
8
8
  gem "railties", "~> #{version}"
9
9
  gem "sprockets", "< 3"
@@ -13,4 +13,4 @@ end
13
13
  gem "railties", "~> #{version}"
14
14
  gem "sprockets", "~> 3.0"
15
15
  end
16
- end
16
+ end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,75 @@
1
1
  ## master
2
2
 
3
+ ## v1.2.9
4
+
5
+ * Fixed deprecation varning on Sprockets 3.7
6
+
7
+ ## v1.2.8
8
+
9
+ * Bugfix warning on Sprockets 4.0 #202
10
+
11
+ ## v1.2.7
12
+
13
+ * Drop support 1.9.3
14
+ * Add helper for indexOf, if no native implementation in JS engine
15
+ * Add sprockets3 compatibility
16
+ * Bugfix domain defaults to path #197
17
+
18
+ ## v1.2.6
19
+
20
+ * Use default prefix from `Rails.application.config.relative_url_root` #186
21
+ * Bugfix route globbing with optional fragments bug #191
22
+
23
+ ## v1.2.5
24
+
25
+ * Bugfix subdomain default parameter in routes #184
26
+ * Bugfix infinite recursion in some specific route sets #183
27
+
28
+ ## v1.2.4
29
+
30
+ * Additional bugfixes to support all versions of Sprockets: 2.x and 3.x
31
+
32
+ ## v1.2.3
33
+
34
+ * Sprockets ~= 3.0 support
35
+
36
+ ## v1.2.2
37
+
38
+ * Sprockets ~= 3.0 support
39
+ * Support default parameters specified in route.rb file
40
+
41
+ ## v1.2.1
42
+
43
+ * Fixes for Rails 5
44
+
45
+ ## v1.2.0
46
+
47
+ * Support host, port and protocol inline parameters
48
+ * Support host, port and protocol parameters given to a route explicitly
49
+ * Remove all incompatibilities between actiondispatch and js-routes in handling route URLs
50
+
51
+ ## v1.1.2
52
+
53
+ * Bugfix support nested object null parameters #164
54
+ * Bugfix support for nested optional parameters #162 #163
55
+
56
+ ## v1.1.1
57
+
58
+ * Bugfix regression in serialisation on blank strings caused by [#155](https://github.com/railsware/js-routes/pull/155/files)
59
+
60
+ ## v1.1.0
61
+
62
+ * Ensure routes are loaded, prior to generating them [#148](https://github.com/railsware/js-routes/pull/148)
63
+ * Use `flat_map` rather than `map{...}.flatten` [#149](https://github.com/railsware/js-routes/pull/149)
64
+ * URL escape routes.rb url to fix bad URI(is not URI?) error [#150](https://github.com/railsware/js-routes/pull/150)
65
+ * Fix for rails 5 - test rails-edge on travis allowing failure [#151](https://github.com/railsware/js-routes/pull/151)
66
+ * Adds `serializer` option [#155](https://github.com/railsware/js-routes/pull/155/files)
67
+
68
+ ## v1.0.1
69
+
70
+ * Support sprockets-3
71
+ * Performance optimization of include/exclude options
72
+
3
73
  ## v1.0.0
4
74
 
5
75
  * Add the compact mode [#125](https://github.com/railsware/js-routes/pull/125)
data/Rakefile CHANGED
@@ -12,9 +12,22 @@ require 'bundler/gem_tasks'
12
12
  require 'rspec/core'
13
13
  require 'rspec/core/rake_task'
14
14
  require 'appraisal'
15
+ load "rails/tasks/routes.rake"
15
16
 
16
17
  RSpec::Core::RakeTask.new(:spec)
17
18
 
18
19
  task :test_all => :appraisal # test all rails
19
20
 
20
- task :default => :spec
21
+ task :default => :spec
22
+
23
+
24
+ namespace :spec do
25
+ task :routes do
26
+ require './spec/spec_helper'
27
+ require 'action_dispatch/routing/inspector'
28
+ draw_routes
29
+ all_routes = Rails.application.routes.routes
30
+ inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
31
+ puts inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, ENV['CONTROLLER'])
32
+ end
33
+ end
data/Readme.md CHANGED
@@ -11,14 +11,12 @@ Your Rails Gemfile:
11
11
  gem "js-routes"
12
12
  ```
13
13
 
14
- ### Basic Setup (Asset Pipeline)
14
+ ### Basic Setup
15
15
 
16
16
  Require js routes file in `application.js` or other bundle
17
17
 
18
18
  ``` js
19
- /*
20
- = require js-routes
21
- */
19
+ //= require js-routes
22
20
  ```
23
21
 
24
22
  Also in order to flush asset pipeline cache sometimes you might need to run:
@@ -45,8 +43,7 @@ Available options:
45
43
 
46
44
  * `default_url_options` - default parameters used when generating URLs
47
45
  * Note that only specific options are supported at this time.
48
- * Supported options: `:format`, `:trailing_slash`, `:protocol`, `:host`, `:port`
49
- * Example: {:format => "json", :trailing_slash => true, :protocol => "https", :host => "example.com", :port => 3000}
46
+ * Example: {:format => "json", :trailing\_slash => true, :protocol => "https", :host => "example.com", :port => 3000}
50
47
  * Default: {}
51
48
  * `exclude` - Array of regexps to exclude from js routes.
52
49
  * Default: []
@@ -59,16 +56,20 @@ Available options:
59
56
  * Default: `Routes`
60
57
  * `prefix` - String representing a url path to prepend to all paths.
61
58
  * Example: `http://yourdomain.com`. This will cause route helpers to generate full path only.
62
- * Default: blank
59
+ * Default: Rails.application.config.relative_url_root
63
60
  * `camel_case` (version >= 0.8.8) - Generate camel case route names.
64
61
  * Default: false
65
62
  * `url_links` (version >= 0.8.9) - Generate `*_url` helpers (in addition to the default `*_path` helpers).
66
63
  * Example: true
67
64
  * Default: false
68
- * Be sure to specify a default host in `default_url_options`. Routes which specify a specific host, protocol, or port will be used instead of their corresponding default.
65
+ * Note: generated URLs will first use the protocol, host, and port options specified in the route definition. Otherwise, the URL will be based on the option specified in the `default_url_options` config. If no default option has been set, then the URL will fallback to the current URL based on `window.location`.
69
66
  * `compact` (version > 0.9.9) - Remove `_path` suffix in path routes(`*_url` routes stay untouched if they were enabled)
70
67
  * Default: false
71
68
  * Sample route call when option is set to true: Routes.users() => `/users`
69
+ * `serializer` (version >= 1.1.0) - Puts a JS function here that serializes a Javascript Hash object into URL paramters: `{a: 1, b: 2} => "a=1&b=2"`.
70
+ * Default: `nil`. Uses built-in serializer
71
+ * Example: `jQuery.param` - use jQuery's serializer algorithm. You can attach serialize function from your favorite AJAX framework.
72
+ * Example: `MyApp.custom_serialize` - use completely custom serializer of your application.
72
73
 
73
74
  ### Very Advanced Setup
74
75
 
@@ -91,7 +92,7 @@ If your application has an `admin` and an `application` namespace for example:
91
92
  #= require application/routes
92
93
  ```
93
94
 
94
- In order to generate the routes to a string:
95
+ In order to generate the routes JS code to a string:
95
96
 
96
97
  ```ruby
97
98
  routes_js = JsRoutes.generate(options)
@@ -106,6 +107,15 @@ JsRoutes.generate!("#{path}/adm_routes.js", :namespace => "AdmRoutes", :include
106
107
  JsRoutes.generate!("#{path}/api_routes.js", :namespace => "ApiRoutes", :include => /^api_/, :default_url_options => {:format => "json"})
107
108
  ```
108
109
 
110
+ ### Rails relative URL root
111
+
112
+ If you've installed your application in a sub-path or sub-URI of your server instead of at the root, you need to set the `RAILS_RELATIVE_URL_ROOT` environment variable to the correct path prefix for your application when you precompile assets. Eg., if your application's base URL is "https://appl.example.com/Application1", the command to precompile assets would be:
113
+ ```
114
+ RAILS_RELATIVE_URL_ROOT=/Application1 RAILS_ENV=production bundle exec rake assets:precompile
115
+ ```
116
+ The environment variable is only needed for precompilation of assets, at any other time (eg. when assets are compiled on-the-fly as in the development environment) Rails will set the relative URL root correctly on it's own.
117
+
118
+
109
119
  ## Usage
110
120
 
111
121
  Configuration above will create a nice javascript file with `Routes` object that has all the rails routes available:
@@ -114,6 +124,7 @@ Configuration above will create a nice javascript file with `Routes` object that
114
124
  Routes.users_path() // => "/users"
115
125
  Routes.user_path(1) // => "/users/1"
116
126
  Routes.user_path(1, {format: 'json'}) // => "/users/1.json"
127
+ Routes.user_path(1, {anchor: 'profile'}) // => "/users/1#profile"
117
128
  Routes.new_user_project_path(1, {format: 'json'}) // => "/users/1/projects/new.json"
118
129
  Routes.user_project_path(1,2, {q: 'hello', custom: true}) // => "/users/1/projects/2?q=hello&custom=true"
119
130
  Routes.user_project_path(1,2, {hello: ['world', 'mars']}) // => "/users/1/projects/2?hello%5B%5D=world&hello%5B%5D=mars"
@@ -178,7 +189,7 @@ Heroku environment has a specific problems with setup. It is impossible to use a
178
189
  For example create routes.js.erb in assets folder with needed content:
179
190
 
180
191
  ``` erb
181
- <%= JsRoutes.generate({ options }) %>
192
+ <%= JsRoutes.generate(options) %>
182
193
  ```
183
194
 
184
195
  This should just work.
@@ -188,8 +199,9 @@ This should just work.
188
199
  There are some alternatives available. Most of them has only basic feature and don't reach the level of quality I accept.
189
200
  Advantages of this one are:
190
201
 
191
- * Rails3 & Rails4 support
202
+ * Rails 3-5 support
192
203
  * Rich options set
204
+ * Full rails compatibility
193
205
  * Support Rails `#to_param` convention for seo optimized paths
194
206
  * Well tested
195
207
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "http://rubygems.org"
4
4
 
5
- gem "railties", "~> 4.2.0"
5
+ gem "railties", "~> 4.2.1"
6
6
  gem "sprockets", "< 3"
7
7
 
8
8
  gemspec :path => "../"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "http://rubygems.org"
4
4
 
5
- gem "railties", "~> 4.2.0"
5
+ gem "railties", "~> 4.2.1"
6
6
  gem "sprockets", "~> 3.0"
7
7
 
8
8
  gemspec :path => "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "railties", "~> 5.0.0"
6
+ gem "sprockets", "< 3"
7
+
8
+ gemspec :path => "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "railties", "~> 5.0.0"
6
+ gem "sprockets", "~> 3.0"
7
+
8
+ gemspec :path => "../"
data/js-routes.gemspec CHANGED
@@ -24,12 +24,12 @@ Gem::Specification.new do |s|
24
24
  s.add_runtime_dependency(%q<sprockets-rails>)
25
25
  s.add_development_dependency(%q<rspec>, [">= 3.0.0"])
26
26
  s.add_development_dependency(%q<bundler>, [">= 1.1.0"])
27
- s.add_development_dependency(%q<guard>, [">= 0"])
28
- s.add_development_dependency(%q<guard-coffeescript>, [">= 0"])
27
+ s.add_development_dependency(%q<coffee-script>, [">= 0"])
29
28
  s.add_development_dependency(%q<appraisal>, [">= 0.5.2"])
30
29
  if defined?(JRUBY_VERSION)
31
30
  s.add_development_dependency(%q<therubyrhino>, [">= 2.0.4"])
32
31
  else
32
+ s.add_development_dependency(%q<byebug>)
33
33
  s.add_development_dependency(%q<therubyracer>, [">= 0.12.1"])
34
34
  end
35
35
  end
@@ -1,21 +1,69 @@
1
- class JsRoutes
2
- class Engine < ::Rails::Engine
3
- JS_ROUTES_ASSET = 'js-routes'
1
+ class JsRoutesSprocketsExtension
2
+ def initialize(filename, &block)
3
+ @filename = filename
4
+ @source = block.call
5
+ end
6
+
7
+ def render(context, empty_hash_wtf)
8
+ self.class.run(@filename, @source, context)
9
+ end
4
10
 
5
- initializer 'js-routes.dependent_on_routes', after: "sprockets.environment" do
11
+ def self.run(filename, source, context)
12
+ if context.logical_path == 'js-routes'
6
13
  routes = Rails.root.join('config', 'routes.rb').to_s
14
+ context.depend_on(routes)
15
+ end
16
+ source
17
+ end
7
18
 
8
- if Rails.application.assets.respond_to?(:register_preprocessor)
9
- Rails.application.assets.register_preprocessor 'application/javascript', :'js-routes_dependent_on_routes' do |ctx,data|
10
- ctx.depend_on(routes) if ctx.logical_path == JS_ROUTES_ASSET
11
- data
12
- end
13
- end
19
+ def self.call(input)
20
+ filename = input[:filename]
21
+ source = input[:data]
22
+ context = input[:environment].context_class.new(input)
14
23
 
15
- # only sprockets >= 3.0
16
- if Rails.application.assets.respond_to?(:depend_on)
17
- Rails.application.assets.depend_on "file-digest://#{routes}"
18
- end
24
+ result = run(filename, source, context)
25
+ context.metadata.merge(data: result)
26
+ end
27
+ end
28
+
29
+
30
+ class Engine < ::Rails::Engine
31
+ require 'sprockets/version'
32
+ v2 = Gem::Dependency.new('', ' ~> 2')
33
+ v3 = Gem::Dependency.new('', ' >= 3' ,' < 3.7')
34
+ v37 = Gem::Dependency.new('', ' >= 3.7')
35
+ sprockets_version = Gem::Version.new(::Sprockets::VERSION).release
36
+ initializer_args = case sprockets_version
37
+ when -> (v) { v2.match?('', v) }
38
+ { after: "sprockets.environment" }
39
+ when -> (v) { v3.match?('', v) || v37.match?('', v) }
40
+ { after: :engines_blank_point, before: :finisher_hook }
41
+ else
42
+ raise StandardError, "Sprockets version #{sprockets_version} is not supported"
43
+ end
44
+
45
+ initializer 'js-routes.dependent_on_routes', initializer_args do
46
+ case sprockets_version
47
+ when -> (v) { v2.match?('', v) }
48
+ if Rails.application.assets.respond_to?(:register_preprocessor)
49
+ routes = Rails.root.join('config', 'routes.rb').to_s
50
+ Rails.application.assets.register_preprocessor 'application/javascript', :'js-routes_dependent_on_routes' do |ctx, data|
51
+ ctx.depend_on(routes) if ctx.logical_path == 'js-routes'
52
+ data
53
+ end
54
+ end
55
+ when -> (v) { v3.match?('', v) }
56
+ Rails.application.config.assets.configure do |config|
57
+ routes = Rails.root.join('config', 'routes.rb').to_s
58
+ config.register_preprocessor 'application/javascript', :'js-routes_dependent_on_routes' do |ctx, data|
59
+ ctx.depend_on(routes) if ctx.logical_path == 'js-routes'
60
+ data
61
+ end
62
+ end
63
+ when -> (v) { v37.match?('', v) }
64
+ Sprockets.register_preprocessor 'application/javascript', JsRoutesSprocketsExtension
65
+ else
66
+ raise StandardError, "Sprockets version #{sprockets_version} is not supported"
19
67
  end
20
68
  end
21
69
  end
@@ -1,3 +1,3 @@
1
1
  class JsRoutes
2
- VERSION = "1.0.1"
2
+ VERSION = "1.2.9"
3
3
  end
data/lib/js_routes.rb CHANGED
@@ -16,10 +16,11 @@ class JsRoutes
16
16
  include: //,
17
17
  file: DEFAULT_PATH,
18
18
  prefix: nil,
19
- url_links: nil,
19
+ url_links: false,
20
20
  camel_case: false,
21
21
  default_url_options: {},
22
- compact: false
22
+ compact: false,
23
+ serializer: nil
23
24
  }
24
25
 
25
26
  NODE_TYPES = {
@@ -34,6 +35,8 @@ class JsRoutes
34
35
  }
35
36
 
36
37
  LAST_OPTIONS_KEY = "options".freeze
38
+ FILTERED_DEFAULT_PARTS = [:controller, :action, :subdomain]
39
+ URL_OPTIONS = [:protocol, :domain, :host, :port, :subdomain]
37
40
 
38
41
  class Options < Struct.new(*DEFAULTS.keys)
39
42
  def to_hash
@@ -57,6 +60,11 @@ class JsRoutes
57
60
  end
58
61
 
59
62
  def generate(opts = {})
63
+ # Ensure routes are loaded. If they're not, load them.
64
+ if Rails.application.routes.named_routes.to_a.empty?
65
+ Rails.application.reload_routes!
66
+ end
67
+
60
68
  new(opts).generate
61
69
  end
62
70
 
@@ -92,21 +100,40 @@ class JsRoutes
92
100
  end
93
101
 
94
102
  def generate
95
- js = File.read(File.dirname(__FILE__) + "/routes.js")
96
- js.gsub!("NAMESPACE", @options[:namespace])
97
- js.gsub!("DEFAULT_URL_OPTIONS", json(@options[:default_url_options].merge(deprecated_default_format)))
98
- js.gsub!("PREFIX", @options[:prefix] || "")
99
- js.gsub!("NODE_TYPES", json(NODE_TYPES))
100
- js.gsub!("ROUTES", js_routes)
103
+ {
104
+ "GEM_VERSION" => JsRoutes::VERSION,
105
+ "APP_CLASS" => Rails.application.class.to_s,
106
+ "NAMESPACE" => @options[:namespace],
107
+ "DEFAULT_URL_OPTIONS" => json(@options[:default_url_options].merge(deprecate_url_options)),
108
+ "PREFIX" => @options[:prefix] || Rails.application.config.relative_url_root || "",
109
+ "NODE_TYPES" => json(NODE_TYPES),
110
+ "SERIALIZER" => @options[:serializer] || "null",
111
+ "ROUTES" => js_routes,
112
+ }.inject(File.read(File.dirname(__FILE__) + "/routes.js")) do |js, (key, value)|
113
+ js.gsub!(key, value)
114
+ end
101
115
  end
102
116
 
103
- def deprecated_default_format
117
+ def deprecate_url_options
118
+ result = {}
104
119
  if @options.key?(:default_format)
105
120
  warn("default_format option is deprecated. Use default_url_options = { format: <format> } instead")
106
- { format: @options[:default_format] }
107
- else
108
- {}
121
+ result.merge!( format: @options[:default_format] )
109
122
  end
123
+ if @options[:url_links].is_a?(String)
124
+ ActiveSupport::Deprecation.warn('js-routes url_links config value must be a boolean. Use default_url_options for specifying a default host.')
125
+
126
+ raise "invalid URL format in url_links (ex: http[s]://example.com)" if @options[:url_links].match(URI::Parser.new.make_regexp(%w(http https))).nil?
127
+ uri = URI.parse(@options[:url_links])
128
+ default_port = uri.scheme == "https" ? 443 : 80
129
+ port = uri.port == default_port ? nil : uri.port
130
+ result.merge!(
131
+ host: uri.host,
132
+ port: port,
133
+ protocol: uri.scheme,
134
+ )
135
+ end
136
+ result
110
137
  end
111
138
 
112
139
  def generate!(file_name = nil)
@@ -124,20 +151,23 @@ class JsRoutes
124
151
  protected
125
152
 
126
153
  def js_routes
127
- js_routes = Rails.application.routes.named_routes.routes.sort_by(&:to_s).map do |_, route|
128
- rails_engine_app = get_app_from_route(route)
129
- if rails_engine_app.respond_to?(:superclass) && rails_engine_app.superclass == Rails::Engine && !route.path.anchored
130
- rails_engine_app.routes.named_routes.map do |_, engine_route|
131
- build_route_if_match(engine_route, route)
132
- end
133
- else
134
- build_route_if_match(route)
135
- end
136
- end.flatten.compact
137
-
154
+ js_routes = Rails.application.routes.named_routes.to_a.sort_by(&:first).flat_map do |_, route|
155
+ [build_route_if_match(route)] + mounted_app_routes(route)
156
+ end.compact
138
157
  "{\n" + js_routes.join(",\n") + "}\n"
139
158
  end
140
159
 
160
+ def mounted_app_routes(route)
161
+ rails_engine_app = get_app_from_route(route)
162
+ if rails_engine_app.respond_to?(:superclass) && rails_engine_app.superclass == Rails::Engine && !route.path.anchored
163
+ rails_engine_app.routes.named_routes.map do |_, engine_route|
164
+ build_route_if_match(engine_route, route)
165
+ end
166
+ else
167
+ []
168
+ end
169
+ end
170
+
141
171
  def get_app_from_route(route)
142
172
  # rails engine in Rails 4.2 use additional ActionDispatch::Routing::Mapper::Constraints, which contain app
143
173
  if route.app.respond_to?(:app) && route.app.respond_to?(:constraints)
@@ -157,52 +187,42 @@ class JsRoutes
157
187
 
158
188
  def any_match?(route, parent_route, matchers)
159
189
  full_route = [parent_route.try(:name), route.name].compact.join('_')
160
-
190
+
161
191
  matchers = Array(matchers)
162
192
  matchers.any? {|regex| full_route =~ regex}
163
193
  end
164
194
 
165
195
  def build_js(route, parent_route)
166
196
  name = [parent_route.try(:name), route.name].compact
167
- parent_spec = parent_route.try(:path).try(:spec)
168
- required_parts, optional_parts = route.required_parts.clone, route.optional_parts.clone
169
- optional_parts.push(required_parts.delete :format) if required_parts.include?(:format)
170
197
  route_name = generate_route_name(name, (:path unless @options[:compact]))
171
- url_link = generate_url_link(name, route_name, required_parts, route)
198
+ parent_spec = parent_route.try(:path).try(:spec)
199
+ route_arguments = route_js_arguments(route, parent_spec)
200
+ url_link = generate_url_link(name, route_name, route_arguments, route)
172
201
  _ = <<-JS.strip!
173
202
  // #{name.join('.')} => #{parent_spec}#{route.path.spec}
174
- // function(#{[required_parts, LAST_OPTIONS_KEY].flatten.join(', ')})
175
- #{route_name}: Utils.route(#{json(required_parts)}, #{json(optional_parts)}, #{json(serialize(route.path.spec, parent_spec))}, arguments)#{",\n" + url_link if url_link.length > 0}
203
+ // function(#{build_params(route.required_parts)})
204
+ #{route_name}: Utils.route(#{route_arguments})#{",\n" + url_link if url_link.length > 0}
176
205
  JS
177
206
  end
178
207
 
179
- def generate_url_link(name, route_name, required_parts, route)
180
- return "" unless @options[:url_links]
181
- _ = <<-JS.strip!
182
- #{generate_route_name(name, :url)}: function(#{build_params(required_parts)}) {
183
- return #{generate_base_url_js(route)} + this.#{route_name}(#{build_params(required_parts)});
184
- }
185
- JS
208
+ def route_js_arguments(route, parent_spec)
209
+ required_parts = route.required_parts.clone
210
+ optional_parts = route.parts - required_parts
211
+ default_parts = route.defaults.select do |part, _|
212
+ FILTERED_DEFAULT_PARTS.exclude?(part) && URL_OPTIONS.include?(part) || required_parts.include?(part)
213
+ end
214
+ [
215
+ required_parts, optional_parts, serialize(route.path.spec, parent_spec), default_parts
216
+ ].map do |argument|
217
+ json(argument)
218
+ end.join(", ")
186
219
  end
187
220
 
188
- def generate_base_url_js(route)
189
- # preserve and deprecate previous behavior
190
- unless @options[:url_links] == true
191
- ActiveSupport::Deprecation.warn('js-routes url_links config value must be a boolean. Use default_url_options for specifying a default host.')
192
- raise "invalid URL format in url_links (ex: http[s]://example.com)" if @options[:url_links].match(URI::Parser.new.make_regexp(%w(http https))).nil?
193
- return "#{@options[:url_links].inspect}"
194
- else
195
- protocol = route.defaults[:protocol] || @options[:default_url_options][:protocol] || 'http'
196
- hostname = route.defaults[:host] || @options[:default_url_options][:host]
197
- port = route.defaults[:port] || (@options[:default_url_options][:port] unless route.defaults[:host])
198
- port = ":#{port}" if port
199
-
200
- unless hostname
201
- raise "A :default_url_options[:host] must be configured in order to generate *_url helpers"
202
- end
203
-
204
- return %Q|'#{protocol}://#{hostname}#{port}'|
205
- end
221
+ def generate_url_link(name, route_name, route_arguments, route)
222
+ return "" unless @options[:url_links]
223
+ <<-JS.strip!
224
+ #{generate_route_name(name, :url)}: Utils.route(#{route_arguments}, true)
225
+ JS
206
226
  end
207
227
 
208
228
  def generate_route_name(name, suffix)
@@ -216,11 +236,7 @@ class JsRoutes
216
236
  end
217
237
 
218
238
  def build_params(required_parts)
219
- params = required_parts.map do |name|
220
- # prepending each parameter name with underscore
221
- # to prevent conflict with JS reserved words
222
- "_#{name}"
223
- end << LAST_OPTIONS_KEY
239
+ params = required_parts + [LAST_OPTIONS_KEY]
224
240
  params.join(", ")
225
241
  end
226
242