js-routes 1.4.9 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.eslintrc.js +15 -0
- data/.gitignore +5 -0
- data/.nvmrc +1 -0
- data/.travis.yml +2 -1
- data/CHANGELOG.md +85 -0
- data/Rakefile +5 -2
- data/Readme.md +274 -98
- data/VERSION_2_UPGRADE.md +66 -0
- data/js-routes.gemspec +8 -5
- data/lib/js_routes/engine.rb +0 -1
- data/lib/js_routes/generators/middleware.rb +33 -0
- data/lib/js_routes/generators/webpacker.rb +32 -0
- data/lib/js_routes/middleware.rb +36 -0
- data/lib/js_routes/version.rb +1 -1
- data/lib/js_routes.rb +341 -171
- data/lib/routes.d.ts +79 -0
- data/lib/routes.js +501 -519
- data/lib/routes.ts +737 -0
- data/lib/tasks/js_routes.rake +8 -2
- data/lib/templates/erb.js +11 -0
- data/lib/templates/initializer.rb +5 -0
- data/lib/templates/routes.js.erb +1 -0
- data/package.json +37 -0
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/js_routes/default_serializer_spec.rb +19 -3
- data/spec/js_routes/{amd_compatibility_spec.rb → module_types/amd_spec.rb} +7 -14
- data/spec/js_routes/module_types/cjs_spec.rb +15 -0
- data/spec/js_routes/module_types/dts/routes.spec.d.ts +114 -0
- data/spec/js_routes/module_types/dts/test.spec.ts +56 -0
- data/spec/js_routes/module_types/dts_spec.rb +111 -0
- data/spec/js_routes/module_types/esm_spec.rb +45 -0
- data/spec/js_routes/module_types/nil_spec.rb +86 -0
- data/spec/js_routes/{generated_javascript_spec.rb → module_types/umd_spec.rb} +33 -27
- data/spec/js_routes/options_spec.rb +67 -56
- data/spec/js_routes/rails_routes_compatibility_spec.rb +69 -25
- data/spec/js_routes/zzz_last_post_rails_init_spec.rb +4 -4
- data/spec/spec_helper.rb +34 -17
- data/spec/support/routes.rb +10 -4
- data/spec/tsconfig.json +4 -0
- data/tsconfig.json +28 -0
- data/yarn.lock +2145 -0
- metadata +42 -22
- data/lib/routes.js.coffee +0 -411
@@ -2,10 +2,18 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JsRoutes, "options" do
|
4
4
|
|
5
|
+
let(:generated_js) do
|
6
|
+
JsRoutes.generate({
|
7
|
+
module_type: nil,
|
8
|
+
namespace: 'Routes',
|
9
|
+
**_options
|
10
|
+
})
|
11
|
+
end
|
12
|
+
|
5
13
|
before(:each) do
|
6
14
|
evaljs(_presetup) if _presetup
|
7
15
|
with_warnings(_warnings) do
|
8
|
-
evaljs(
|
16
|
+
evaljs(generated_js)
|
9
17
|
App.routes.default_url_options = _options[:default_url_options] || {}
|
10
18
|
end
|
11
19
|
end
|
@@ -37,9 +45,10 @@ describe JsRoutes, "options" do
|
|
37
45
|
let(:_presetup){ %q(var myCustomSerializer = 1) }
|
38
46
|
let(:_options) { {:serializer => "myCustomSerializer"} }
|
39
47
|
|
40
|
-
it "should
|
41
|
-
|
42
|
-
|
48
|
+
it "should throw error" do
|
49
|
+
expect {
|
50
|
+
evaljs(%q(Routes.inboxes_path({a: 1})))
|
51
|
+
}.to raise_error(js_error_class)
|
43
52
|
end
|
44
53
|
end
|
45
54
|
|
@@ -86,6 +95,18 @@ describe JsRoutes, "options" do
|
|
86
95
|
expect(evaljs("Routes.inboxes_path")).to be_nil
|
87
96
|
end
|
88
97
|
|
98
|
+
context "with camel_case option" do
|
99
|
+
let(:_options) { {include: /^admin_/, camel_case: true} }
|
100
|
+
|
101
|
+
it "should exclude specified routes from file" do
|
102
|
+
expect(evaljs("Routes.adminUsersPath()")).not_to be_nil
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should not exclude routes not under specified pattern" do
|
106
|
+
expect(evaljs("Routes.inboxesPath")).to be_nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
89
110
|
context "for rails engine" do
|
90
111
|
let(:_options) { {:include => /^blog_app_posts/} }
|
91
112
|
|
@@ -167,56 +188,19 @@ describe JsRoutes, "options" do
|
|
167
188
|
expect(evaljs("Routes.no_format_path({format: 'json'})")).to eq(test_routes.no_format_path(format: 'json'))
|
168
189
|
end
|
169
190
|
|
170
|
-
describe "namespace option" do
|
171
|
-
let(:_options) { {:namespace => "PHM"} }
|
172
|
-
it "should use this namespace for routing" do
|
173
|
-
expect(evaljs("window.Routes")).to be_nil
|
174
|
-
expect(evaljs("PHM.inbox_path")).not_to be_nil
|
175
|
-
end
|
176
|
-
|
177
|
-
context "is nil" do
|
178
|
-
let(:_options) { {:namespace => nil} }
|
179
|
-
it "should use this namespace for routing" do
|
180
|
-
evaljs("window.zz = #{JsRoutes.generate(namespace: nil)}")
|
181
|
-
expect(evaljs("window.Routes")).to be_nil
|
182
|
-
expect(evaljs("window.zz.inbox_path")).not_to be_nil
|
183
|
-
end
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
describe "is nested" do
|
188
|
-
context "and defined on client" do
|
189
|
-
let(:_presetup) { "window.PHM = {}" }
|
190
|
-
let(:_options) { {:namespace => "PHM.Routes"} }
|
191
|
-
it "should use this namespace for routing" do
|
192
|
-
expect(evaljs("PHM.Routes.inbox_path")).not_to be_nil
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
context "but undefined on client" do
|
197
|
-
let(:_options) { {:namespace => "PHM.Routes"} }
|
198
|
-
it "should initialize namespace" do
|
199
|
-
expect(evaljs("window.PHM.Routes.inbox_path")).not_to be_nil
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
context "and some parts are defined" do
|
204
|
-
let(:_presetup) { "window.PHM = { Utils: {} };" }
|
205
|
-
let(:_options) { {:namespace => "PHM.Routes"} }
|
206
|
-
it "should not overwrite existing parts" do
|
207
|
-
expect(evaljs("window.PHM.Utils")).not_to be_nil
|
208
|
-
expect(evaljs("window.PHM.Routes.inbox_path")).not_to be_nil
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
191
|
describe "default_url_options" do
|
215
192
|
context "with optional route parts" do
|
216
|
-
context "provided" do
|
193
|
+
context "provided by the default_url_options" do
|
217
194
|
let(:_options) { { :default_url_options => { :optional_id => "12", :format => "json" } } }
|
218
|
-
it "should use this
|
219
|
-
expect(evaljs("Routes.things_path()")).to eq(test_routes.things_path)
|
195
|
+
it "should use this options to fill optional parameters" do
|
196
|
+
expect(evaljs("Routes.things_path()")).to eq(test_routes.things_path(12))
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context "provided inline by the method parameters" do
|
201
|
+
let(:options) { { :default_url_options => { :optional_id => "12" } } }
|
202
|
+
it "should overwrite the default_url_options" do
|
203
|
+
expect(evaljs("Routes.things_path({ optional_id: 34 })")).to eq(test_routes.things_path(optional_id: 34))
|
220
204
|
end
|
221
205
|
end
|
222
206
|
|
@@ -229,12 +213,25 @@ describe JsRoutes, "options" do
|
|
229
213
|
end
|
230
214
|
|
231
215
|
context "with required route parts" do
|
232
|
-
let(:_options) { {:default_url_options => {:inbox_id => "12"}} }
|
233
|
-
it "should use this
|
216
|
+
let(:_options) { { :default_url_options => { :inbox_id => "12" } } }
|
217
|
+
it "should use this options to fill optional parameters" do
|
234
218
|
expect(evaljs("Routes.inbox_messages_path()")).to eq(test_routes.inbox_messages_path)
|
235
219
|
end
|
236
220
|
end
|
237
221
|
|
222
|
+
context "with optional and required route parts" do
|
223
|
+
let(:_options) { {:default_url_options => { :optional_id => "12" } } }
|
224
|
+
it "should use this options to fill the optional parameters" do
|
225
|
+
expect(evaljs("Routes.thing_path(1)")).to eq test_routes.thing_path(1, { optional_id: "12" })
|
226
|
+
end
|
227
|
+
|
228
|
+
context "when passing options that do not have defaults" do
|
229
|
+
it "should use this options to fill the optional parameters" do
|
230
|
+
expect(evaljs("Routes.thing_path(1, { format: 'json' })")).to eq test_routes.thing_path(1, { optional_id: "12", format: "json" } ) # test_routes.thing_path needs optional_id here to generate the correct route. Not sure why.
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
238
235
|
context "when overwritten on JS level" do
|
239
236
|
let(:_options) { { :default_url_options => { :format => "json" } } }
|
240
237
|
it "uses JS defined value" do
|
@@ -401,8 +398,14 @@ describe JsRoutes, "options" do
|
|
401
398
|
host
|
402
399
|
end
|
403
400
|
|
404
|
-
|
405
|
-
|
401
|
+
let(:_presetup) do
|
402
|
+
window = {location: {
|
403
|
+
protocol: current_protocol,
|
404
|
+
hostname: current_hostname,
|
405
|
+
port: current_port,
|
406
|
+
host: current_host,
|
407
|
+
}}
|
408
|
+
"const window = #{ActiveSupport::JSON.encode(window)}"
|
406
409
|
end
|
407
410
|
|
408
411
|
context "without specifying a default host" do
|
@@ -414,7 +417,6 @@ describe JsRoutes, "options" do
|
|
414
417
|
expect(evaljs("Routes.inbox_url(1)")).to eq("http://current.example.com#{test_routes.inbox_path(1)}")
|
415
418
|
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://current.example.com#{test_routes.inbox_path(1, :test_key => "test_val")}")
|
416
419
|
expect(evaljs("Routes.new_session_url()")).to eq("https://current.example.com#{test_routes.new_session_path}")
|
417
|
-
|
418
420
|
end
|
419
421
|
|
420
422
|
it "doesn't use current when specified in the route" do
|
@@ -491,4 +493,13 @@ describe JsRoutes, "options" do
|
|
491
493
|
expect(evaljs("Routes.posts_path()")).not_to be_nil
|
492
494
|
end
|
493
495
|
end
|
496
|
+
|
497
|
+
describe "documentation option" do
|
498
|
+
let(:_options) { {documentation: false} }
|
499
|
+
|
500
|
+
it "disables documentation generation" do
|
501
|
+
expect(generated_js).not_to include("@param")
|
502
|
+
expect(generated_js).not_to include("@returns")
|
503
|
+
end
|
504
|
+
end
|
494
505
|
end
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe JsRoutes, "compatibility with Rails" do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
evaljs(JsRoutes.generate({}))
|
6
|
+
evaljs(JsRoutes.generate({module_type: nil, namespace: 'Routes'}))
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should generate collection routing" do
|
@@ -16,13 +16,16 @@ describe JsRoutes, "compatibility with Rails" do
|
|
16
16
|
|
17
17
|
it "should raise error if required argument is not passed", :aggregate_failures do
|
18
18
|
expect { evaljs("Routes.thing_path()") }
|
19
|
-
.to raise_error(/Route
|
19
|
+
.to raise_error(/Route missing required keys: id/)
|
20
20
|
expect { evaljs("Routes.search_path()") }
|
21
|
-
.to raise_error(/Route
|
21
|
+
.to raise_error(/Route missing required keys: q/)
|
22
22
|
expect { evaljs("Routes.book_path()") }
|
23
|
-
.to raise_error(/Route
|
23
|
+
.to raise_error(/Route missing required keys: section, title/)
|
24
24
|
expect { evaljs("Routes.book_title_path()") }
|
25
|
-
.to raise_error(/Route
|
25
|
+
.to raise_error(/Route missing required keys: title/)
|
26
|
+
|
27
|
+
expect( evaljs("try {Routes.thing_path()} catch (e) { e.name }") ).to eq('ParametersMissing')
|
28
|
+
expect( evaljs("try {Routes.thing_path()} catch (e) { e.keys }") ).to eq(['id'])
|
26
29
|
end
|
27
30
|
|
28
31
|
it "should produce error stacktraces including function names" do
|
@@ -70,7 +73,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
70
73
|
expect(evaljs("Routes.inbox_path(1, {expanded: true, anchor: 'hello'})")).to eq(test_routes.inbox_path(1, :expanded => true, :anchor => "hello"))
|
71
74
|
end
|
72
75
|
|
73
|
-
it "should support required
|
76
|
+
it "should support required parameters given as options hash" do
|
74
77
|
expect(evaljs("Routes.search_path({q: 'hello'})")).to eq(test_routes.search_path(:q => 'hello'))
|
75
78
|
end
|
76
79
|
|
@@ -110,6 +113,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
110
113
|
|
111
114
|
it "doesn't apply defaults to path" do
|
112
115
|
expect(evaljs("Routes.with_defaults_path()")).to eq(test_routes.with_defaults_path)
|
116
|
+
expect(evaljs("Routes.with_defaults_path({format: 'json'})")).to eq(test_routes.with_defaults_path(format: 'json'))
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
@@ -131,6 +135,11 @@ describe JsRoutes, "compatibility with Rails" do
|
|
131
135
|
it "should support single route mapping" do
|
132
136
|
expect(evaljs("Routes.support_path({page: 3})")).to eq(test_routes.support_path(:page => 3))
|
133
137
|
end
|
138
|
+
|
139
|
+
it 'works' do
|
140
|
+
expect(evaljs("Routes.planner_manage_path({locale: 'ua'})")).to eq(planner_routes.manage_path(locale: 'ua'))
|
141
|
+
expect(evaljs("Routes.planner_manage_path()")).to eq(planner_routes.manage_path)
|
142
|
+
end
|
134
143
|
end
|
135
144
|
|
136
145
|
it "shouldn't require the format" do
|
@@ -149,7 +158,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
149
158
|
expect(evaljs("Routes.root_path()")).to eq(test_routes.root_path)
|
150
159
|
end
|
151
160
|
|
152
|
-
describe "get
|
161
|
+
describe "get parameters" do
|
153
162
|
it "should support simple get parameters" do
|
154
163
|
expect(evaljs("Routes.inbox_path(1, {format: 'json', lang: 'ua', q: 'hello'})")).to eq(test_routes.inbox_path(1, :lang => "ua", :q => "hello", :format => "json"))
|
155
164
|
end
|
@@ -158,6 +167,19 @@ describe JsRoutes, "compatibility with Rails" do
|
|
158
167
|
expect(evaljs("Routes.inbox_path(1, {hello: ['world', 'mars']})")).to eq(test_routes.inbox_path(1, :hello => [:world, :mars]))
|
159
168
|
end
|
160
169
|
|
170
|
+
context "object without prototype" do
|
171
|
+
before(:each) do
|
172
|
+
evaljs("let params = Object.create(null); params.q = 'hello';")
|
173
|
+
evaljs("let inbox = Object.create(null); inbox.to_param = 1;")
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should still work correctly" do
|
177
|
+
expect(evaljs("Routes.inbox_path(inbox, params)")).to eq(
|
178
|
+
test_routes.inbox_path(1, q: "hello")
|
179
|
+
)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
161
183
|
it "should support nested get parameters" do
|
162
184
|
expect(evaljs("Routes.inbox_path(1, {format: 'json', env: 'test', search: { category_ids: [2,5], q: 'hello'}})")).to eq(
|
163
185
|
test_routes.inbox_path(1, :env => 'test', :search => {:category_ids => [2,5], :q => "hello"}, :format => "json")
|
@@ -225,6 +247,15 @@ describe JsRoutes, "compatibility with Rails" do
|
|
225
247
|
expect(evaljs("Routes.things_path({ q: 'hello' })")).to eq(test_routes.things_path(q: 'hello'))
|
226
248
|
end
|
227
249
|
|
250
|
+
it "treats false as absent optional part" do
|
251
|
+
pending("https://github.com/rails/rails/issues/42280")
|
252
|
+
expect(evaljs("Routes.things_path(false)")).to eq(test_routes.things_path(false))
|
253
|
+
end
|
254
|
+
|
255
|
+
it "treats false as absent optional part when default is specified" do
|
256
|
+
expect(evaljs("Routes.campaigns_path(false)")).to eq(test_routes.campaigns_path(false))
|
257
|
+
end
|
258
|
+
|
228
259
|
it "should not require the optional parts as arguments" do
|
229
260
|
expect(evaljs("Routes.thing_path(null, 5)")).to eq(test_routes.thing_path(nil, 5))
|
230
261
|
end
|
@@ -235,7 +266,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
235
266
|
|
236
267
|
it "should raise error when passing non-full list of arguments and some query params" do
|
237
268
|
expect { evaljs("Routes.thing_path(5, {q: 'hello'})") }
|
238
|
-
.to raise_error(/Route
|
269
|
+
.to raise_error(/Route missing required keys: id/)
|
239
270
|
end
|
240
271
|
|
241
272
|
it "should treat null as non-given optional part" do
|
@@ -253,7 +284,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
253
284
|
|
254
285
|
context "and including them" do
|
255
286
|
it "should fail when insufficient arguments are given" do
|
256
|
-
expect { evaljs("Routes.thing_deep_path(2)") }.to raise_error(/Route
|
287
|
+
expect { evaljs("Routes.thing_deep_path(2)") }.to raise_error(/Route missing required keys: third_required/)
|
257
288
|
end
|
258
289
|
|
259
290
|
it "should include the optional parts" do
|
@@ -302,27 +333,22 @@ describe JsRoutes, "compatibility with Rails" do
|
|
302
333
|
evaljs("Routes.inbox_path()")
|
303
334
|
}.to raise_error(js_error_class)
|
304
335
|
end
|
336
|
+
|
305
337
|
it "should throw Exception if required parameter is not defined" do
|
306
338
|
expect {
|
307
339
|
evaljs("Routes.inbox_path(null)")
|
308
340
|
}.to raise_error(js_error_class)
|
309
341
|
end
|
310
342
|
|
311
|
-
it "should throw
|
312
|
-
expect {
|
313
|
-
evaljs("Routes.inbox_path(1,2,3)")
|
314
|
-
}.to raise_error(js_error_class)
|
315
|
-
end
|
316
|
-
|
317
|
-
it "should throw Exceptions if when pass id with null" do
|
343
|
+
it "should throw Exception if required parameter is not defined" do
|
318
344
|
expect {
|
319
|
-
evaljs("Routes.inbox_path(
|
345
|
+
evaljs("Routes.inbox_path(undefined)")
|
320
346
|
}.to raise_error(js_error_class)
|
321
347
|
end
|
322
348
|
|
323
|
-
it "should throw Exceptions if when
|
349
|
+
it "should throw Exceptions if when there is too many parameters" do
|
324
350
|
expect {
|
325
|
-
evaljs("Routes.inbox_path(
|
351
|
+
evaljs("Routes.inbox_path(1,2,3)")
|
326
352
|
}.to raise_error(js_error_class)
|
327
353
|
end
|
328
354
|
end
|
@@ -341,8 +367,19 @@ describe JsRoutes, "compatibility with Rails" do
|
|
341
367
|
let(:klass) { Struct.new(:id, :to_param) }
|
342
368
|
let(:inbox) { klass.new(1,"my") }
|
343
369
|
|
370
|
+
it "should throw Exceptions if when pass id with null" do
|
371
|
+
expect {
|
372
|
+
evaljs("Routes.inbox_path({id: null})")
|
373
|
+
}.to raise_error(js_error_class)
|
374
|
+
end
|
375
|
+
|
376
|
+
it "should throw Exceptions if when pass to_param with null" do
|
377
|
+
expect {
|
378
|
+
evaljs("Routes.inbox_path({to_param: null})")
|
379
|
+
}.to raise_error(js_error_class)
|
380
|
+
end
|
344
381
|
it "should support 0 as a to_param option" do
|
345
|
-
expect(evaljs("Routes.inbox_path({to_param: 0})")).to eq(test_routes.inbox_path(0))
|
382
|
+
expect(evaljs("Routes.inbox_path({to_param: 0})")).to eq(test_routes.inbox_path(Struct.new(:to_param).new('0')))
|
346
383
|
end
|
347
384
|
|
348
385
|
it "should check for options special key" do
|
@@ -379,6 +416,14 @@ describe JsRoutes, "compatibility with Rails" do
|
|
379
416
|
)).to eq(test_routes.inbox_message_path(inbox, 2, :custom => true, :format => "json"))
|
380
417
|
end
|
381
418
|
|
419
|
+
it "supports camel case property name" do
|
420
|
+
expect(evaljs("Routes.inbox_path({id: 1, toParam: 'my'})")).to eq(test_routes.inbox_path(inbox))
|
421
|
+
end
|
422
|
+
|
423
|
+
it "supports camel case method name" do
|
424
|
+
expect(evaljs("Routes.inbox_path({id: 1, toParam: function(){ return 'my';}})")).to eq(test_routes.inbox_path(inbox))
|
425
|
+
end
|
426
|
+
|
382
427
|
context "when globbing" do
|
383
428
|
it "should prefer to_param property over id property" do
|
384
429
|
expect(evaljs("Routes.book_path({id: 1, to_param: 'my'}, 1)")).to eq(test_routes.book_path(inbox, 1))
|
@@ -398,6 +443,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
398
443
|
)).to eq(test_routes.book_path(inbox, 2, :custom => true, :format => "json"))
|
399
444
|
end
|
400
445
|
end
|
446
|
+
|
401
447
|
end
|
402
448
|
|
403
449
|
context "when specs" do
|
@@ -418,15 +464,13 @@ describe JsRoutes, "compatibility with Rails" do
|
|
418
464
|
end
|
419
465
|
end
|
420
466
|
|
421
|
-
describe "
|
467
|
+
describe "requiredParams" do
|
422
468
|
it "should show inbox spec" do
|
423
|
-
expect(evaljs("Routes.inbox_path.
|
469
|
+
expect(evaljs("Routes.inbox_path.requiredParams()").to_a).to eq(["id"])
|
424
470
|
end
|
425
471
|
|
426
472
|
it "should show inbox message spec" do
|
427
|
-
expect(evaljs("Routes.inbox_message_path.
|
473
|
+
expect(evaljs("Routes.inbox_message_path.requiredParams()").to_a).to eq(["inbox_id", "id"])
|
428
474
|
end
|
429
475
|
end
|
430
|
-
|
431
|
-
|
432
476
|
end
|
@@ -5,7 +5,7 @@
|
|
5
5
|
require 'spec_helper'
|
6
6
|
require "fileutils"
|
7
7
|
|
8
|
-
describe "after Rails initialization" do
|
8
|
+
describe "after Rails initialization", :slow do
|
9
9
|
NAME = Rails.root.join('app', 'assets', 'javascripts', 'routes.js').to_s
|
10
10
|
|
11
11
|
def sprockets_v3?
|
@@ -93,7 +93,7 @@ describe "after Rails initialization" do
|
|
93
93
|
Rails.application.config.assets.initialize_on_precompile = true
|
94
94
|
end
|
95
95
|
it "should render some javascript" do
|
96
|
-
expect(evaluate(ctx, 'js-routes.js')).to match(/
|
96
|
+
expect(evaluate(ctx, 'js-routes.js')).to match(/Utils\.define_module/)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
context "and not initialize on precompile" do
|
@@ -101,7 +101,7 @@ describe "after Rails initialization" do
|
|
101
101
|
Rails.application.config.assets.initialize_on_precompile = false
|
102
102
|
end
|
103
103
|
it "should raise an exception if 3 version" do
|
104
|
-
expect(evaluate(ctx, 'js-routes.js')).to match(/
|
104
|
+
expect(evaluate(ctx, 'js-routes.js')).to match(/Utils\.define_module/)
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -122,7 +122,7 @@ describe "after Rails initialization" do
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
-
describe "JSRoutes thread safety" do
|
125
|
+
describe "JSRoutes thread safety", :slow do
|
126
126
|
before do
|
127
127
|
begin
|
128
128
|
Rails.application.initialize!
|
data/spec/spec_helper.rb
CHANGED
@@ -6,7 +6,14 @@ require 'rspec'
|
|
6
6
|
require 'rails/all'
|
7
7
|
require 'js-routes'
|
8
8
|
require 'active_support/core_ext/hash/slice'
|
9
|
-
|
9
|
+
|
10
|
+
unless ENV['TRAVIS_CI']
|
11
|
+
code = system("yarn build")
|
12
|
+
unless code
|
13
|
+
exit(1)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
10
17
|
|
11
18
|
if defined?(JRUBY_VERSION)
|
12
19
|
require 'rhino'
|
@@ -32,8 +39,15 @@ def js_error_class
|
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
|
-
def evaljs(string, force
|
36
|
-
jscontext(force).eval(string)
|
42
|
+
def evaljs(string, force: false, filename: 'context.js')
|
43
|
+
jscontext(force).eval(string, filename: filename)
|
44
|
+
rescue MiniRacer::ParseError => e
|
45
|
+
message = e.message
|
46
|
+
_, _, line, _ = message.split(':')
|
47
|
+
code = line && string.split("\n")[line.to_i-1]
|
48
|
+
raise "#{message}. Code: #{code.strip}";
|
49
|
+
rescue MiniRacer::RuntimeError => e
|
50
|
+
raise e
|
37
51
|
end
|
38
52
|
|
39
53
|
def test_routes
|
@@ -44,11 +58,21 @@ def blog_routes
|
|
44
58
|
BlogEngine::Engine.routes.url_helpers
|
45
59
|
end
|
46
60
|
|
61
|
+
def planner_routes
|
62
|
+
Planner::Engine.routes.url_helpers
|
63
|
+
end
|
64
|
+
|
47
65
|
ActiveSupport::Inflector.inflections do |inflect|
|
48
66
|
inflect.irregular "budgie", "budgies"
|
49
67
|
end
|
50
68
|
|
51
69
|
|
70
|
+
module Planner
|
71
|
+
class Engine < Rails::Engine
|
72
|
+
isolate_namespace Planner
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
52
76
|
module BlogEngine
|
53
77
|
class Engine < Rails::Engine
|
54
78
|
isolate_namespace BlogEngine
|
@@ -79,28 +103,21 @@ RSpec.configure do |config|
|
|
79
103
|
c.syntax = :expect
|
80
104
|
end
|
81
105
|
|
82
|
-
config.before(:
|
83
|
-
# compile all js files begin
|
84
|
-
Dir["#{File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))}/**/*.coffee"].each do |coffee|
|
85
|
-
File.open(coffee.gsub(/\.coffee$/, ""), 'w') do |f|
|
86
|
-
f.write(CoffeeScript.compile(File.read(coffee)).lstrip)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
# compile all js files end
|
106
|
+
config.before(:suite) do
|
90
107
|
draw_routes
|
91
108
|
end
|
92
109
|
|
93
110
|
config.before :each do
|
94
|
-
|
111
|
+
log = proc do |*values|
|
112
|
+
puts values.map(&:inspect).join(", ")
|
113
|
+
end
|
95
114
|
|
96
115
|
if defined?(JRUBY_VERSION)
|
97
|
-
jscontext[:log] = lambda do |context,
|
98
|
-
|
116
|
+
jscontext[:"console.log"] = lambda do |context, *values|
|
117
|
+
log(*values)
|
99
118
|
end
|
100
119
|
else
|
101
|
-
jscontext.attach("log",
|
102
|
-
puts value.inspect
|
103
|
-
end)
|
120
|
+
jscontext.attach("console.log", log)
|
104
121
|
end
|
105
122
|
end
|
106
123
|
end
|
data/spec/support/routes.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
def draw_routes
|
2
|
+
Planner::Engine.routes.draw do
|
3
|
+
get "/manage" => 'foo#foo', as: :manage
|
4
|
+
end
|
2
5
|
|
3
6
|
BlogEngine::Engine.routes.draw do
|
4
7
|
root to: "application#index"
|
5
|
-
resources :posts
|
8
|
+
resources :posts, only: [:show, :index]
|
6
9
|
end
|
7
10
|
App.routes.draw do
|
8
11
|
|
12
|
+
mount Planner::Engine, at: "/(locale/:locale)", as: :planner
|
13
|
+
|
14
|
+
mount BlogEngine::Engine => "/blog", as: :blog_app
|
9
15
|
get 'support(/page/:page)', to: BlogEngine::Engine, as: 'support'
|
10
16
|
|
11
17
|
resources :inboxes, only: [:index, :show] do
|
@@ -14,6 +20,8 @@ def draw_routes
|
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
23
|
+
get "(/:space)/campaigns" => "foo#foo", as: :campaigns, defaults: {space: nil}
|
24
|
+
|
17
25
|
root :to => "inboxes#index"
|
18
26
|
|
19
27
|
namespace :admin do
|
@@ -41,8 +49,6 @@ def draw_routes
|
|
41
49
|
get 'books/*section/:title' => 'books#show', :as => :book
|
42
50
|
get 'books/:title/*section' => 'books#show', :as => :book_title
|
43
51
|
|
44
|
-
mount BlogEngine::Engine => "/blog", :as => :blog_app
|
45
|
-
|
46
52
|
get '/no_format' => "foo#foo", :format => false, :as => :no_format
|
47
53
|
|
48
54
|
get '/json_only' => "foo#foo", :format => true, :constraints => {:format => /json/}, :as => :json_only
|
@@ -56,7 +62,7 @@ def draw_routes
|
|
56
62
|
|
57
63
|
resources :portals, :port => 8080, only: [:index]
|
58
64
|
|
59
|
-
get '/with_defaults' => 'foo#foo', defaults: { bar: 'tested', format: :json }, format:
|
65
|
+
get '/with_defaults' => 'foo#foo', defaults: { bar: 'tested', format: :json }, format: true
|
60
66
|
|
61
67
|
namespace :api, format: true, defaults: {format: 'json'} do
|
62
68
|
get "/purchases" => "purchases#index"
|
data/spec/tsconfig.json
ADDED
data/tsconfig.json
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"compilerOptions": {
|
3
|
+
"target": "es2019",
|
4
|
+
"lib": ["es2020", "dom"],
|
5
|
+
"module": "commonjs",
|
6
|
+
"sourceMap": false,
|
7
|
+
"declaration": true,
|
8
|
+
"allowSyntheticDefaultImports": true,
|
9
|
+
"resolveJsonModule": false,
|
10
|
+
"strictNullChecks": true,
|
11
|
+
"noImplicitAny": true,
|
12
|
+
"noImplicitThis": true,
|
13
|
+
"strictBindCallApply": true,
|
14
|
+
"strictFunctionTypes": true,
|
15
|
+
"alwaysStrict": false,
|
16
|
+
|
17
|
+
"esModuleInterop": true,
|
18
|
+
"forceConsistentCasingInFileNames": true,
|
19
|
+
"emitDecoratorMetadata": true,
|
20
|
+
"experimentalDecorators": true
|
21
|
+
|
22
|
+
},
|
23
|
+
"ts-node": {
|
24
|
+
"files": true,
|
25
|
+
"transpileOnly": false
|
26
|
+
},
|
27
|
+
"include": ["lib/*.ts"]
|
28
|
+
}
|