js-routes 1.2.9 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33fffcaa3c5d7614a35673b8a53ea0f06030dbed
4
- data.tar.gz: b8c5ffa5eb34114667b2d8e3f53dec2809816f2e
3
+ metadata.gz: 1b2b15773ea1f4c5fd8870ccda544a7386e28108
4
+ data.tar.gz: ffd6b967fd16e89a1d976098da3fa00109924319
5
5
  SHA512:
6
- metadata.gz: 989c63812f7821d21fc94b0bd42f43e87be6a933a2f934733a8f30f3b575f566cb43619a3ca64b49e39ec1dc91ea633ab5337f5be133804aa995756e252cc27f
7
- data.tar.gz: 880139c994a2f813b4e0c65d16f281626252462010a08f68e4ef234f3743cab1ae141041fb3cb60f4bdc04fe5d2803dbb22694cc08cf1604e5da692bc3f6e6ef
6
+ metadata.gz: 6e5b2c94c2c60924ab690669b61c95075e7bcc3ef576cd8284ee1a7d30aa63427a8826079eece47629cfe31bcafbde00ee63bae5b9f0d39f91a505ae4561c2f6
7
+ data.tar.gz: 69f1daf6f674da744d13dd6440af0a70399cfdfe3ecd29a3203c6ec9447e5367baaad19b998c85403c982cfbc6dc04e61f16a55ce796f493c47d69a43932265f
data/Readme.md CHANGED
@@ -71,6 +71,10 @@ Available options:
71
71
  * Example: `jQuery.param` - use jQuery's serializer algorithm. You can attach serialize function from your favorite AJAX framework.
72
72
  * Example: `MyApp.custom_serialize` - use completely custom serializer of your application.
73
73
 
74
+ * `special_options_key` - a special key that helps js-routes to destinguish serialized model from options hash
75
+ * This options is required because JS doesn't provide a difference between an object and a hash
76
+ * Default: `_options`
77
+
74
78
  ### Very Advanced Setup
75
79
 
76
80
  In case you need multiple route files for different parts of your application, you have to create the files manually.
@@ -168,6 +172,22 @@ Routes.users_path.required_params // => []
168
172
  Routes.user_path.required_params // => ['id']
169
173
  ```
170
174
 
175
+
176
+ ## Rails Compatibilities
177
+
178
+ JsRoutes ties to be as close as possible to rails behaviour in all aspects of routing API.
179
+ Please make and issue in case of any incomtibilities found outside of described below.
180
+
181
+ ### Object and Hash distinction issue
182
+
183
+ Sometimes the destinction between JS Hash and Object can not be found by js-routes.
184
+ In this case you would need to pass a special key to help:
185
+
186
+ ``` js
187
+ Routes.company_project_path({company_id: 1, id: 2, _options: true}) // => "/companies/1/projects/2"
188
+ ```
189
+
190
+
171
191
  ## What about security?
172
192
 
173
193
  js-routes itself do not have security holes. It makes URLs
@@ -20,7 +20,8 @@ class JsRoutes
20
20
  camel_case: false,
21
21
  default_url_options: {},
22
22
  compact: false,
23
- serializer: nil
23
+ serializer: nil,
24
+ special_options_key: "_options",
24
25
  }
25
26
 
26
27
  NODE_TYPES = {
@@ -107,8 +108,9 @@ class JsRoutes
107
108
  "DEFAULT_URL_OPTIONS" => json(@options[:default_url_options].merge(deprecate_url_options)),
108
109
  "PREFIX" => @options[:prefix] || Rails.application.config.relative_url_root || "",
109
110
  "NODE_TYPES" => json(NODE_TYPES),
110
- "SERIALIZER" => @options[:serializer] || "null",
111
+ "SERIALIZER" => @options[:serializer] || json(nil),
111
112
  "ROUTES" => js_routes,
113
+ "SPECIAL_OPTIONS_KEY" => @options[:special_options_key].to_s
112
114
  }.inject(File.read(File.dirname(__FILE__) + "/routes.js")) do |js, (key, value)|
113
115
  js.gsub!(key, value)
114
116
  end
@@ -1,3 +1,3 @@
1
1
  class JsRoutes
2
- VERSION = "1.2.9"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -4,7 +4,7 @@ Based on Rails routes of APP_CLASS
4
4
  */
5
5
 
6
6
  (function() {
7
- var NodeTypes, ParameterMissing, ReservedOptions, Utils, createGlobalJsRoutesObject, defaults, root,
7
+ var NodeTypes, ParameterMissing, ReservedOptions, SpecialOptionsKey, Utils, createGlobalJsRoutesObject, defaults, root,
8
8
  hasProp = {}.hasOwnProperty,
9
9
  slice = [].slice;
10
10
 
@@ -23,6 +23,8 @@ Based on Rails routes of APP_CLASS
23
23
 
24
24
  NodeTypes = NODE_TYPES;
25
25
 
26
+ SpecialOptionsKey = "SPECIAL_OPTIONS_KEY";
27
+
26
28
  ReservedOptions = ['anchor', 'trailing_slash', 'host', 'port', 'protocol'];
27
29
 
28
30
  Utils = {
@@ -86,16 +88,18 @@ Based on Rails routes of APP_CLASS
86
88
  return path.join("://");
87
89
  },
88
90
  extract_options: function(number_of_params, args) {
89
- var last_el;
91
+ var last_el, options;
90
92
  last_el = args[args.length - 1];
91
93
  if ((args.length > number_of_params && last_el === void 0) || ((last_el != null) && "object" === this.get_object_type(last_el) && !this.looks_like_serialized_model(last_el))) {
92
- return args.pop() || {};
94
+ options = args.pop() || {};
95
+ delete options[SpecialOptionsKey];
96
+ return options;
93
97
  } else {
94
98
  return {};
95
99
  }
96
100
  },
97
101
  looks_like_serialized_model: function(object) {
98
- return "id" in object || "to_param" in object;
102
+ return !object[SpecialOptionsKey] && ("id" in object || "to_param" in object);
99
103
  },
100
104
  path_identifier: function(object) {
101
105
  var property;
@@ -12,6 +12,7 @@ defaults =
12
12
  default_url_options: DEFAULT_URL_OPTIONS
13
13
 
14
14
  NodeTypes = NODE_TYPES
15
+ SpecialOptionsKey = "SPECIAL_OPTIONS_KEY"
15
16
 
16
17
  ReservedOptions = [
17
18
  'anchor'
@@ -64,13 +65,14 @@ Utils =
64
65
  extract_options: (number_of_params, args) ->
65
66
  last_el = args[args.length - 1]
66
67
  if (args.length > number_of_params and last_el == undefined) or(last_el? and "object" is @get_object_type(last_el) and !@looks_like_serialized_model(last_el))
67
- args.pop() || {}
68
+ options = args.pop() || {}
69
+ delete options[SpecialOptionsKey]
70
+ options
68
71
  else
69
72
  {}
70
73
 
71
74
  looks_like_serialized_model: (object) ->
72
- # consider object a model if it have a path identifier properties like id and to_param
73
- "id" of object or "to_param" of object
75
+ !object[SpecialOptionsKey] and ("id" of object or "to_param" of object)
74
76
 
75
77
 
76
78
  path_identifier: (object) ->
@@ -476,4 +476,14 @@ describe JsRoutes, "options" do
476
476
  end
477
477
  end
478
478
  end
479
+
480
+ describe "special_options_key" do
481
+ let(:_options) { { special_options_key: :__options__ } }
482
+ it "can be redefined" do
483
+ expect {
484
+ expect(evaljs("Routes.inbox_message_path({inbox_id: 1, id: 2, _options: true})")).to eq("")
485
+ }.to raise_error(js_error_class)
486
+ expect(evaljs("Routes.inbox_message_path({inbox_id: 1, id: 2, __options__: true})")).to eq(routes.inbox_message_path(inbox_id: 1, id: 2))
487
+ end
488
+ end
479
489
  end
@@ -18,14 +18,6 @@ describe JsRoutes, "compatibility with Rails" do
18
18
  expect(evaljs("Routes.inbox_path(0)")).to eq(routes.inbox_path(0))
19
19
  end
20
20
 
21
- it "should support 0 as a to_param option" do
22
- expect(evaljs("Routes.inbox_path({to_param: 0})")).to eq(routes.inbox_path(0))
23
- end
24
-
25
- it "should support 0 as an id option" do
26
- expect(evaljs("Routes.inbox_path({id: 0})")).to eq(routes.inbox_path(0))
27
- end
28
-
29
21
  it "should generate nested routing with one parameter" do
30
22
  expect(evaljs("Routes.inbox_messages_path(1)")).to eq(routes.inbox_messages_path(1))
31
23
  end
@@ -253,7 +245,27 @@ describe JsRoutes, "compatibility with Rails" do
253
245
 
254
246
  context "when arguments are objects" do
255
247
 
256
- let(:inbox) {Struct.new(:id, :to_param).new(1,"my")}
248
+ let(:klass) { Struct.new(:id, :to_param) }
249
+ let(:inbox) { klass.new(1,"my") }
250
+
251
+ it "should support 0 as a to_param option" do
252
+ expect(evaljs("Routes.inbox_path({to_param: 0})")).to eq(routes.inbox_path(0))
253
+ end
254
+
255
+ it "should check for options special key" do
256
+ expect(evaljs("Routes.inbox_path({id: 7, q: 'hello', _options: true})")).to eq(routes.inbox_path(id: 7, q: 'hello'))
257
+ expect {
258
+ evaljs("Routes.inbox_path({to_param: 7, _options: true})")
259
+ }.to raise_error(js_error_class)
260
+ expect(evaljs("Routes.inbox_message_path(5, {id: 7, q: 'hello', _options: true})")).to eq(routes.inbox_message_path(5, id: 7, q: 'hello'))
261
+ end
262
+
263
+ it "should check for options special key" do
264
+ end
265
+
266
+ it "should support 0 as an id option" do
267
+ expect(evaljs("Routes.inbox_path({id: 0})")).to eq(routes.inbox_path(0))
268
+ end
257
269
 
258
270
  it "should use id property of the object in path" do
259
271
  expect(evaljs("Routes.inbox_path({id: 1})")).to eq(routes.inbox_path(1))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js-routes
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.9
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Gusiev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-10 00:00:00.000000000 Z
11
+ date: 2016-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties