js-routes 1.4.9 → 2.2.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 +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
|
+
}
|