js-routes-zigexn 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,368 @@
1
+ ###
2
+ File generated by js-routes GEM_VERSION
3
+ Based on Rails routes of APP_CLASS
4
+ ###
5
+ # root is this
6
+ root = (exports ? this)
7
+
8
+ ParameterMissing = (@message) -> #
9
+ ParameterMissing:: = new Error()
10
+ defaults =
11
+ prefix: PREFIX
12
+ default_url_options: DEFAULT_URL_OPTIONS
13
+
14
+ NodeTypes = NODE_TYPES
15
+ SpecialOptionsKey = SPECIAL_OPTIONS_KEY
16
+ DeprecatedBehavior = DEPRECATED_BEHAVIOR
17
+
18
+ ReservedOptions = [
19
+ 'anchor'
20
+ 'trailing_slash'
21
+ 'host'
22
+ 'port'
23
+ 'protocol'
24
+ ]
25
+
26
+ Utils =
27
+
28
+ default_serializer: (object, prefix = null) ->
29
+ return "" unless object?
30
+ if !prefix and !(@get_object_type(object) is "object")
31
+ throw new Error("Url parameters should be a javascript hash")
32
+
33
+ s = []
34
+ switch @get_object_type(object)
35
+ when "array"
36
+ for element, i in object
37
+ s.push @default_serializer(element, prefix + "[]")
38
+ when "object"
39
+ for own key, prop of object
40
+ if !prop? and prefix?
41
+ prop = ""
42
+
43
+ if prop?
44
+ key = "#{prefix}[#{key}]" if prefix?
45
+ s.push @default_serializer(prop, key)
46
+ else
47
+ if object?
48
+ s.push "#{encodeURIComponent(prefix.toString())}=#{encodeURIComponent(object.toString())}"
49
+
50
+ return "" unless s.length
51
+ s.join("&")
52
+
53
+ custom_serializer: SERIALIZER
54
+ serialize: (object) ->
55
+ if @custom_serializer? and @get_object_type(@custom_serializer) is "function"
56
+ @custom_serializer(object)
57
+ else
58
+ @default_serializer(object)
59
+
60
+ clean_path: (path) ->
61
+ path = path.split("://")
62
+ last_index = path.length - 1
63
+ path[last_index] = path[last_index].replace(/\/+/g, "/")
64
+ path.join "://"
65
+
66
+ extract_options: (number_of_params, args) ->
67
+ last_el = args[args.length - 1]
68
+ 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))
69
+ options = args.pop() || {}
70
+ delete options[SpecialOptionsKey]
71
+ options
72
+ else
73
+ {}
74
+
75
+ looks_like_serialized_model: (object) ->
76
+ !object[SpecialOptionsKey] and ("id" of object or "to_param" of object)
77
+
78
+
79
+ path_identifier: (object) ->
80
+ return "0" if object is 0
81
+ # null, undefined, false or ''
82
+ return "" unless object
83
+ property = object
84
+ if @get_object_type(object) is "object"
85
+ if "to_param" of object
86
+ throw new ParameterMissing("Route parameter missing: to_param") unless object.to_param?
87
+ property = object.to_param
88
+ else if "id" of object
89
+ throw new ParameterMissing("Route parameter missing: id") unless object.id?
90
+ property = object.id
91
+ else
92
+ property = object
93
+
94
+ property = property.call(object) if @get_object_type(property) is "function"
95
+ property.toString()
96
+
97
+ clone: (obj) ->
98
+ return obj if !obj? or "object" isnt @get_object_type(obj)
99
+ copy = obj.constructor()
100
+ copy[key] = attr for own key, attr of obj
101
+ copy
102
+
103
+ merge: (xs...) ->
104
+ tap = (o, fn) -> fn(o); o
105
+ if xs?.length > 0
106
+ tap {}, (m) -> m[k] = v for k, v of x for x in xs
107
+
108
+ normalize_options: (parts, required_parts, default_options, actual_parameters) ->
109
+ options = @extract_options(parts.length, actual_parameters)
110
+
111
+ if actual_parameters.length > parts.length
112
+ throw new Error("Too many parameters provided for path")
113
+
114
+ use_all_parts = DeprecatedBehavior or actual_parameters.length > required_parts.length
115
+ parts_options = {}
116
+
117
+ for own key of options
118
+ use_all_parts = true
119
+ if @indexOf(parts, key) >= 0
120
+ parts_options[key] = value
121
+
122
+ options = @merge(defaults.default_url_options, default_options, options)
123
+ result = {}
124
+ url_parameters = {}
125
+ result['url_parameters'] = url_parameters
126
+ for own key, value of options
127
+ if @indexOf(ReservedOptions, key) >= 0
128
+ result[key] = value
129
+ else
130
+ url_parameters[key] = value
131
+
132
+ route_parts = if use_all_parts then parts else required_parts
133
+ i = 0
134
+ for part in route_parts when i < actual_parameters.length
135
+ unless parts_options.hasOwnProperty(part)
136
+ url_parameters[part] = actual_parameters[i]
137
+ ++i
138
+
139
+ result
140
+
141
+ build_route: (parts, required_parts, default_options, route, full_url, args) ->
142
+ args = Array::slice.call(args)
143
+
144
+ options = @normalize_options(parts, required_parts, default_options, args)
145
+ parameters = options['url_parameters']
146
+
147
+ # path
148
+ result = "#{@get_prefix()}#{@visit(route, parameters)}"
149
+ url = Utils.clean_path(result)
150
+ # set trailing_slash
151
+ url = url.replace(/(.*?)[\/]?$/, "$1/") if options['trailing_slash'] is true
152
+ # set additional url params
153
+ if (url_params = @serialize(parameters)).length
154
+ url += "?#{url_params}"
155
+ # set anchor
156
+ url += if options.anchor then "##{options.anchor}" else ""
157
+ if full_url
158
+ url = @route_url(options) + url
159
+ url
160
+
161
+ #
162
+ # This function is JavaScript impelementation of the
163
+ # Journey::Visitors::Formatter that builds route by given parameters
164
+ # from route binary tree.
165
+ # Binary tree is serialized in the following way:
166
+ # [node type, left node, right node ]
167
+ #
168
+ # @param {Boolean} optional Marks the currently visited branch as optional.
169
+ # If set to `true`, this method will not throw when encountering
170
+ # a missing parameter (used in recursive calls).
171
+ #
172
+ visit: (route, parameters, optional = false) ->
173
+ [type, left, right] = route
174
+ switch type
175
+ when NodeTypes.GROUP
176
+ @visit left, parameters, true
177
+ when NodeTypes.STAR
178
+ @visit_globbing left, parameters, true
179
+ when NodeTypes.LITERAL, NodeTypes.SLASH, NodeTypes.DOT
180
+ left
181
+ when NodeTypes.CAT
182
+ left_part = @visit(left, parameters, optional)
183
+ right_part = @visit(right, parameters, optional)
184
+ if optional and ((@is_optional_node(left[0]) and not left_part) or
185
+ ((@is_optional_node(right[0])) and not right_part))
186
+ return ""
187
+ "#{left_part}#{right_part}"
188
+ when NodeTypes.SYMBOL
189
+ value = parameters[left]
190
+ if value?
191
+ delete parameters[left]
192
+ return @path_identifier(value)
193
+ if optional
194
+ "" # missing parameter
195
+ else
196
+ throw new ParameterMissing("Route parameter missing: #{left}")
197
+ #
198
+ # I don't know what is this node type
199
+ # Please send your PR if you do
200
+ #
201
+ # when NodeTypes.OR:
202
+ else
203
+ throw new Error("Unknown Rails node type")
204
+
205
+
206
+ is_optional_node: (node) -> @indexOf([NodeTypes.STAR, NodeTypes.SYMBOL, NodeTypes.CAT], node) >= 0
207
+
208
+ #
209
+ # This method build spec for route
210
+ #
211
+ build_path_spec: (route, wildcard=false) ->
212
+ [type, left, right] = route
213
+ switch type
214
+ when NodeTypes.GROUP
215
+ "(#{@build_path_spec(left)})"
216
+ when NodeTypes.CAT
217
+ "#{@build_path_spec(left)}#{@build_path_spec(right)}"
218
+ when NodeTypes.STAR
219
+ @build_path_spec(left, true)
220
+ when NodeTypes.SYMBOL
221
+ if wildcard is true
222
+ "#{if left[0] is '*' then '' else '*'}#{left}"
223
+ else
224
+ ":#{left}"
225
+ when NodeTypes.SLASH, NodeTypes.DOT, NodeTypes.LITERAL
226
+ left
227
+ # Not sure about this one
228
+ # when NodeTypes.OR
229
+ else throw new Error("Unknown Rails node type")
230
+
231
+ #
232
+ # This method convert value for globbing in right value for rails route
233
+ #
234
+ visit_globbing: (route, parameters, optional) ->
235
+ [type, left, right] = route
236
+ # fix for rails 4 globbing
237
+ route[1] = left = left.replace(/^\*/i, "") if left.replace(/^\*/i, "") isnt left
238
+ value = parameters[left]
239
+ return @visit(route, parameters, optional) unless value?
240
+ parameters[left] = switch @get_object_type(value)
241
+ when "array"
242
+ value.join("/")
243
+ else
244
+ value
245
+ @visit route, parameters, optional
246
+
247
+ #
248
+ # This method check and return prefix from options
249
+ #
250
+ get_prefix: ->
251
+ prefix = defaults.prefix
252
+ prefix = (if prefix.match("/$") then prefix else "#{prefix}/") if prefix isnt ""
253
+ prefix
254
+
255
+ #
256
+ # route function: create route path function and add spec to it
257
+ #
258
+ route: (parts_table, default_options, route_spec, full_url) ->
259
+ required_parts = []
260
+ parts = []
261
+ for [part, required] in parts_table
262
+ parts.push(part)
263
+ required_parts.push(part) if required
264
+
265
+ path_fn = -> Utils.build_route(
266
+ parts, required_parts, default_options, route_spec, full_url, arguments
267
+ )
268
+ path_fn.required_params = required_parts
269
+ path_fn.toString = -> Utils.build_path_spec(route_spec)
270
+ path_fn
271
+
272
+
273
+ route_url: (route_defaults) ->
274
+ return route_defaults if typeof route_defaults == 'string'
275
+ protocol = route_defaults.protocol || Utils.current_protocol()
276
+ hostname = route_defaults.host || window.location.hostname
277
+ port = route_defaults.port || (Utils.current_port() unless route_defaults.host)
278
+ port = if port then ":#{port}" else ''
279
+
280
+ protocol + "://" + hostname + port
281
+
282
+
283
+ has_location: ->
284
+ typeof window != 'undefined' && typeof window.location != 'undefined'
285
+
286
+ current_host: ->
287
+ if @has_location() then window.location.hostname else null
288
+
289
+ current_protocol: () ->
290
+ if @has_location() && window.location.protocol != ''
291
+ # location.protocol includes the colon character
292
+ window.location.protocol.replace(/:$/, '')
293
+ else
294
+ 'http'
295
+
296
+ current_port: () ->
297
+ if @has_location() && window.location.port != ''
298
+ window.location.port
299
+ else
300
+ ''
301
+
302
+ #
303
+ # This is helper method to define object type.
304
+ # The typeof operator is probably the biggest design flaw of JavaScript, simply because it's basically completely broken.
305
+ #
306
+ # Value Class Type
307
+ # -------------------------------------
308
+ # "foo" String string
309
+ # new String("foo") String object
310
+ # 1.2 Number number
311
+ # new Number(1.2) Number object
312
+ # true Boolean boolean
313
+ # new Boolean(true) Boolean object
314
+ # new Date() Date object
315
+ # new Error() Error object
316
+ # [1,2,3] Array object
317
+ # new Array(1, 2, 3) Array object
318
+ # new Function("") Function function
319
+ # /abc/g RegExp object
320
+ # new RegExp("meow") RegExp object
321
+ # {} Object object
322
+ # new Object() Object object
323
+ #
324
+ # What is why I use Object.prototype.toString() to know better type of variable. Or use jQuery.type, if it available.
325
+ # _classToTypeCache used for perfomance cache of types map (underscore at the beginning mean private method - of course it doesn't realy private).
326
+ #
327
+ _classToTypeCache: null
328
+ _classToType: ->
329
+ return @_classToTypeCache if @_classToTypeCache?
330
+ @_classToTypeCache = {}
331
+ for name in "Boolean Number String Function Array Date RegExp Object Error".split(" ")
332
+ @_classToTypeCache["[object #{name}]"] = name.toLowerCase()
333
+ @_classToTypeCache
334
+ get_object_type: (obj) ->
335
+ return root.jQuery.type(obj) if root.jQuery and root.jQuery.type?
336
+ return "#{obj}" unless obj?
337
+ (if typeof obj is "object" or typeof obj is "function" then @_classToType()[Object::toString.call(obj)] or "object" else typeof obj)
338
+
339
+ # indexOf helper
340
+ indexOf: (array, element) -> if Array::indexOf then array.indexOf(element) else @indexOfImplementation(array, element)
341
+ indexOfImplementation: (array, element) ->
342
+ result = -1
343
+ (result = i for el, i in array when el is element)
344
+ result
345
+
346
+ namespace: (root, namespace, routes) ->
347
+ parts = namespace.split(".")
348
+ return routes if parts.length == 0
349
+ for part, index in parts
350
+ if index < parts.length - 1
351
+ root = (root[part] or= {})
352
+ else
353
+ return root[part] = routes
354
+
355
+ make: ->
356
+ routes = ROUTES
357
+ routes.options = defaults
358
+ routes.default_serializer = (object, prefix) ->
359
+ Utils.default_serializer(object, prefix)
360
+ Utils.namespace(root, NAMESPACE, routes)
361
+
362
+ # Set up Routes appropriately for the environment.
363
+ if typeof define is "function" and define.amd
364
+ # AMD
365
+ define [], -> Utils.make()
366
+ else
367
+ # Browser globals
368
+ Utils.make()
@@ -0,0 +1,8 @@
1
+ namespace :js do
2
+ desc "Make a js file that will have functions that will return restful routes/urls."
3
+ task routes: :environment do
4
+ require "js-routes"
5
+
6
+ JsRoutes.generate!
7
+ end
8
+ end
File without changes
@@ -0,0 +1,55 @@
1
+ App.routes.draw do
2
+ resource "3df1b2d050ae5a96eac8565c9daef37a"
3
+ resource "341f9e69e3db1c344de2fc6551885711"
4
+ resource "0e1bcb2dc1ce4d80ec15cae9140fb99a"
5
+ resource "15b91c612530bfc69c70d121c8713da4"
6
+ resource "49e12936168a64dce4d4ec148104fb5a"
7
+ resource "d878104611f88952aba49965c1d2d573"
8
+ resource "0e94bfc3c8aaee5ea09579fe73cbdaff"
9
+ resource "e1c2dd2ea9c63b380eb0947a0e1f49aa"
10
+ resource "587c6e26ad7f9a6aa09f81add77b16f5"
11
+ resource "8e00bfffebe0c874d6dad1c7b8c7cd6b"
12
+ resource "394482d3515e7e49989a8496afa7d367"
13
+ resource "4ab9c701622cba87eae50795564abe1c"
14
+ resource "af4b4a2ea501fefbdb8367eb108b2e14"
15
+ resource "116d17a93932a9a3e5bd2750665582f9"
16
+ resource "315f0a62063288cd56373c8a00870596"
17
+ resource "d5357ec6df4589f81ca8689cf0231667"
18
+ resource "560a3b8cf807e873843cd889400cd52b"
19
+ resource "361de6041f545e67db1aeaa6206c8ac7"
20
+ resource "28b0a54de4a0884386f1e324edc13194"
21
+ resource "ab77f21a956d956295187806cdf38cd1"
22
+ resource "0b8a362fd486247fb7c41898709b9815"
23
+ resource "5efa0a96733bc027b3309ffb54d1d1d0"
24
+ resource "70a3ee535c59fcf59c58b6d39178833c"
25
+ resource "5095fc05868c673ce450524f78cd28d3"
26
+ resource "79b994cfbc79432d644a3b83804f4924"
27
+ resource "e25125c477cd451fd74a76eaaebc9165"
28
+ resource "672fbfb432687e2fee7d0e799cc10ea4"
29
+ resource "2eb8350243305659082eb92b2e5b702c"
30
+ resource "08c9973b624e10b10dc7235659c81346"
31
+ resource "fee0d4b123529a2c652bef0ec0116ef2"
32
+ resource "8422445d2aa176b7733473164c461a2e"
33
+ resource "c24b8252b235431ca3df21a6ac119062"
34
+ resource "c08c66c7fc40e9937ff84a86f6c6d18a"
35
+ resource "964851acca72064d861188150e848d55"
36
+ resource "d02927a4fd37b37c03dbad5d3c7a4753"
37
+ resource "2a69df680ff9bd8d3855d9ce5a4e51f7"
38
+ resource "d8daed677f9a9a6926005afbdeebcf73"
39
+ resource "83d4db872f5f148e9ead108d483fec78"
40
+ resource "09f9fb4250595d26f4149b76fcfa957d"
41
+ resource "956cdb4d3cbf36bb9ccb7c7fcc36a602"
42
+ resource "02816449a6c929f55f8bad958f25d25a"
43
+ resource "2dd7ae38bd72f7e8b26aafb5f002d634"
44
+ resource "c7c9aaa3f7131f1e7dbc9325b3426d3e"
45
+ resource "7556e7d17c2a26acbad7d5fa86e6e640"
46
+ resource "d03081ef427a227a808c708282fdc86b"
47
+ resource "8f610d21e6e499c1eea98ca08191c05f"
48
+ resource "b6b412ae8a369f6bfc7f312245eacc8c"
49
+ resource "e9bcda8b00879c49bd7f05afee59a28e"
50
+ resource "6e89f4baddd4044b42be7c2d3b382567"
51
+ resource "5959c376d15a609f2e74f4f351d0a565"
52
+ resource "3b7e418511c305c78f2d2c292a3a1289"
53
+ resource "87acf6bf6e8191ff8900f420b33d5268"
54
+ resource "648a9b17078423f29f42aa2ecac1cc7d"
55
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe JsRoutes, "compatibility with AMD/require.js" do
4
+
5
+ before(:each) do
6
+ evaljs("window.GlobalCheck = {};")
7
+ evaljs("window.define = function (requirs, callback) { window.GlobalCheck['js-routes'] = callback.call(this); return window.GlobalCheck['js-routes']; };")
8
+ evaljs("window.define.amd = { jQuery: true };")
9
+ strRequire =<<EOF
10
+ window.require = function (r, callback) {
11
+ var allArgs, i;
12
+
13
+ allArgs = (function() {
14
+ var _i, _len, _results;
15
+ _results = [];
16
+ for (_i = 0, _len = r.length; _i < _len; _i++) {
17
+ i = r[_i];
18
+ _results.push(window.GlobalCheck[i]);
19
+ }
20
+ return _results;
21
+ })();
22
+
23
+ return callback.apply(null, allArgs);
24
+ };
25
+ EOF
26
+ evaljs(strRequire)
27
+ evaljs(JsRoutes.generate({}))
28
+ end
29
+
30
+ it "should working from global scope" do
31
+ expect(evaljs("Routes.inboxes_path()")).to eq(routes.inboxes_path())
32
+ end
33
+
34
+ it "should working from define function" do
35
+ expect(evaljs("Routes.inboxes_path()")).to eq(evaljs("GlobalCheck['js-routes'].inboxes_path()"))
36
+ end
37
+
38
+ it "should working from require" do
39
+ expect(evaljs("require(['js-routes'], function(r){ return r.inboxes_path(); })")).to eq(routes.inboxes_path())
40
+ end
41
+
42
+ end