js-routes 2.2.3 → 2.2.5
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 +1 -1
- data/.github/workflows/ci.yml +36 -0
- data/Appraisals +2 -4
- data/CHANGELOG.md +7 -0
- data/Readme.md +50 -43
- data/gemfiles/rails50_sprockets_3.gemfile +1 -1
- data/gemfiles/rails51_sprockets_3.gemfile +1 -1
- data/gemfiles/rails52_sprockets_3.gemfile +1 -1
- data/gemfiles/rails70_sprockets_4.gemfile +8 -0
- data/lib/js_routes/engine.rb +6 -1
- data/lib/js_routes/generators/middleware.rb +1 -1
- data/lib/js_routes/instance.rb +2 -2
- data/lib/js_routes/middleware.rb +6 -2
- data/lib/js_routes/version.rb +1 -1
- data/lib/routes.d.ts +2 -0
- data/lib/routes.js +23 -5
- data/lib/routes.ts +34 -17
- data/package.json +7 -6
- data/spec/js_routes/default_serializer_spec.rb +5 -5
- data/spec/js_routes/module_types/amd_spec.rb +3 -3
- data/spec/js_routes/module_types/cjs_spec.rb +1 -1
- data/spec/js_routes/module_types/dts/routes.spec.d.ts +2 -0
- data/spec/js_routes/module_types/dts_spec.rb +1 -1
- data/spec/js_routes/module_types/esm_spec.rb +2 -2
- data/spec/js_routes/module_types/nil_spec.rb +7 -7
- data/spec/js_routes/module_types/umd_spec.rb +1 -1
- data/spec/js_routes/options_spec.rb +81 -81
- data/spec/js_routes/rails_routes_compatibility_spec.rb +127 -138
- data/spec/js_routes/route_specification_spec.rb +40 -0
- data/spec/js_routes/zzz_last_post_rails_init_spec.rb +8 -2
- data/spec/spec_helper.rb +5 -5
- data/yarn.lock +760 -448
- metadata +6 -10
- data/.travis.yml +0 -67
- data/gemfiles/rails40_sprockets_2.gemfile +0 -8
- data/gemfiles/rails40_sprockets_3.gemfile +0 -8
- data/gemfiles/rails41_sprockets_2.gemfile +0 -8
- data/gemfiles/rails41_sprockets_3.gemfile +0 -8
- data/gemfiles/rails42_sprockets_2.gemfile +0 -8
- data/gemfiles/rails42_sprockets_3.gemfile +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0fd81f6f8575bb26353c7e485f0551cc62420a266e22d5503739332b5762037
|
4
|
+
data.tar.gz: b84d4ad0f70f8e1f454bdd2c6fb8b77a316376b3407a3fd0b6c681d87b87ada9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23db2ecfc872d470727b60d7c63148aa15d9d5b76d6eaedbf7bbe5ee964ae5ca5abfb09f69199dd813fcd0b09b12d0920fcb0abf9b09a1bb2a6dbfbaf7884e75
|
7
|
+
data.tar.gz: faf0d713243b705277604493bdf2f5d9f61c5cd953ef9bcfbcd1f2d88fdfd850d27ed48e0740f0fa4c0f4492a310bec13d6a76fc070113703ab7e7750e812b0c
|
data/.eslintrc.js
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
pull_request:
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby: ["2.7"]
|
15
|
+
gemfile:
|
16
|
+
- gemfiles/rails50_sprockets_3.gemfile
|
17
|
+
- gemfiles/rails51_sprockets_3.gemfile
|
18
|
+
- gemfiles/rails52_sprockets_3.gemfile
|
19
|
+
- gemfiles/rails70_sprockets_4.gemfile
|
20
|
+
|
21
|
+
env:
|
22
|
+
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
23
|
+
steps:
|
24
|
+
- uses: actions/checkout@v2
|
25
|
+
- uses: ruby/setup-ruby@v1
|
26
|
+
with:
|
27
|
+
ruby-version: ${{ matrix.ruby }}
|
28
|
+
- uses: actions/setup-node@v3
|
29
|
+
with:
|
30
|
+
node-version: "16"
|
31
|
+
- name: install dependencies
|
32
|
+
run: |
|
33
|
+
bundle install --jobs 3 --retry 3
|
34
|
+
yarn install
|
35
|
+
- name: test
|
36
|
+
run: bundle exec rake spec
|
data/Appraisals
CHANGED
@@ -8,12 +8,10 @@ def define_appraisal(rails, version, sprockets)
|
|
8
8
|
end
|
9
9
|
|
10
10
|
[
|
11
|
-
[:rails40, '4.0.13', [2, 3]],
|
12
|
-
[:rails41, '4.1.16', [2, 3]],
|
13
|
-
[:rails42, '4.2.9', [2, 3]],
|
14
11
|
[:rails50, '5.0.5', [3]],
|
15
12
|
[:rails51, '5.1.3', [3]],
|
16
|
-
[:rails52, '5.2.3', [3]]
|
13
|
+
[:rails52, '5.2.3', [3]],
|
14
|
+
[:rails70, '7.0.3.1', [4]]
|
17
15
|
].each do |name, version, sprockets|
|
18
16
|
define_appraisal(name, version, sprockets)
|
19
17
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## master
|
2
2
|
|
3
|
+
|
4
|
+
## v2.2.5
|
5
|
+
|
6
|
+
* Upgraded eslint and prettier versions [#304](https://github.com/railsware/js-routes/issues/304)
|
7
|
+
* Fix middleware generator [#300](https://github.com/railsware/js-routes/issues/300)
|
8
|
+
* Support `params` special parameter
|
9
|
+
|
3
10
|
## v2.2.4
|
4
11
|
|
5
12
|
* Fix rails engine loading if sprockets is not in Gemfile. Fixes [#294](https://github.com/railsware/js-routes/issues/294)
|
data/Readme.md
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
# JsRoutes
|
2
|
-
[](https://travis-ci.org/railsware/js-routes)
|
3
|
-
[](https://app.fossa.io/projects/git%2Bgithub.com%2Frailsware%2Fjs-routes?ref=badge_shield)
|
4
2
|
|
5
|
-
|
3
|
+
[](https://github.com/railsware/js-routes/actions/workflows/ci.yml)
|
6
4
|
|
7
|
-
|
5
|
+
Generates javascript file that defines all Rails named routes as javascript helpers
|
8
6
|
|
9
7
|
## Intallation
|
10
8
|
|
@@ -54,15 +52,15 @@ Add the following to `config/environments/development.rb`:
|
|
54
52
|
config.middleware.use(JsRoutes::Middleware)
|
55
53
|
```
|
56
54
|
|
57
|
-
Use it in
|
55
|
+
Use it in any JS file:
|
58
56
|
|
59
57
|
``` javascript
|
60
|
-
import
|
61
|
-
|
62
|
-
alert(
|
58
|
+
import {post_path} from '../routes';
|
59
|
+
|
60
|
+
alert(post_path(1))
|
63
61
|
```
|
64
62
|
|
65
|
-
Upgrade `rake assets:precompile` to update js-routes files
|
63
|
+
Upgrade `rake assets:precompile` to update js-routes files in `Rakefile`:
|
66
64
|
|
67
65
|
``` ruby
|
68
66
|
namespace :assets do
|
@@ -133,11 +131,12 @@ Create routes file `app/javascript/routes.js.erb`:
|
|
133
131
|
<%= JsRoutes.generate() %>
|
134
132
|
```
|
135
133
|
|
136
|
-
Use routes wherever you need them
|
134
|
+
Use routes wherever you need them:
|
137
135
|
|
138
136
|
``` javascript
|
139
|
-
import
|
140
|
-
|
137
|
+
import {post_path} from 'routes.js.erb';
|
138
|
+
|
139
|
+
alert(post_path(2));
|
141
140
|
```
|
142
141
|
|
143
142
|
<div id='advanced-setup'></div>
|
@@ -175,14 +174,20 @@ You can manipulate the generated helper manually by injecting ruby into javascri
|
|
175
174
|
export const routes = <%= JsRoutes.generate(module_type: nil, namespace: nil) %>
|
176
175
|
```
|
177
176
|
|
178
|
-
If you want to generate the routes files
|
177
|
+
If you want to generate the routes files manually with custom options, you can use `JsRoutes.generate!`:
|
179
178
|
|
180
179
|
``` ruby
|
181
180
|
path = Rails.root.join("app/javascript")
|
182
181
|
|
183
|
-
JsRoutes.generate!(
|
184
|
-
|
185
|
-
|
182
|
+
JsRoutes.generate!(
|
183
|
+
"#{path}/app_routes.js", exclude: [/^admin_/, /^api_/]
|
184
|
+
)
|
185
|
+
JsRoutes.generate!(
|
186
|
+
"#{path}/adm_routes.js", include: /^admin_/
|
187
|
+
)
|
188
|
+
JsRoutes.generate!(
|
189
|
+
"#{path}/api_routes.js", include: /^api_/, default_url_options: {format: "json"}
|
190
|
+
)
|
186
191
|
```
|
187
192
|
|
188
193
|
<div id='definitions'></div>
|
@@ -252,11 +257,12 @@ end
|
|
252
257
|
Or dynamically in JavaScript, although only [Formatter Options](#formatter-options) are supported:
|
253
258
|
|
254
259
|
``` js
|
255
|
-
import
|
256
|
-
|
260
|
+
import {configure, config} from 'routes'
|
261
|
+
|
262
|
+
configure({
|
257
263
|
option: value
|
258
264
|
});
|
259
|
-
|
265
|
+
config(); // current config
|
260
266
|
```
|
261
267
|
|
262
268
|
### Available Options
|
@@ -290,7 +296,7 @@ Options to configure JavaScript file generator. These options are only available
|
|
290
296
|
* 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`.
|
291
297
|
* `compact` - Remove `_path` suffix in path routes(`*_url` routes stay untouched if they were enabled)
|
292
298
|
* Default: `false`
|
293
|
-
* Sample route call when option is set to true:
|
299
|
+
* Sample route call when option is set to true: `users() // => /users`
|
294
300
|
* `application` - a key to specify which rails engine you want to generate routes too.
|
295
301
|
* This option allows to only generate routes for a specific rails engine, that is mounted into routes instead of all Rails app routes
|
296
302
|
* Default: `Rails.application`
|
@@ -323,41 +329,44 @@ Options to configure routes formatting. These options are available both in Ruby
|
|
323
329
|
Configuration above will create a nice javascript file with `Routes` object that has all the rails routes available:
|
324
330
|
|
325
331
|
``` js
|
326
|
-
import
|
332
|
+
import {
|
333
|
+
user_path, user_project_path, company_path
|
334
|
+
} as Routes from 'routes';
|
327
335
|
|
328
|
-
|
336
|
+
users_path()
|
329
337
|
// => "/users"
|
330
338
|
|
331
|
-
|
339
|
+
user_path(1)
|
332
340
|
// => "/users/1"
|
333
341
|
|
334
|
-
|
342
|
+
user_path(1, {format: 'json'})
|
335
343
|
// => "/users/1.json"
|
336
344
|
|
337
|
-
|
345
|
+
user_path(1, {anchor: 'profile'})
|
338
346
|
// => "/users/1#profile"
|
339
347
|
|
340
|
-
|
348
|
+
new_user_project_path(1, {format: 'json'})
|
341
349
|
// => "/users/1/projects/new.json"
|
342
350
|
|
343
|
-
|
351
|
+
user_project_path(1,2, {q: 'hello', custom: true})
|
344
352
|
// => "/users/1/projects/2?q=hello&custom=true"
|
345
353
|
|
346
|
-
|
354
|
+
user_project_path(1,2, {hello: ['world', 'mars']})
|
347
355
|
// => "/users/1/projects/2?hello%5B%5D=world&hello%5B%5D=mars"
|
348
356
|
|
349
357
|
var google = {id: 1, name: "Google"};
|
350
|
-
|
358
|
+
company_path(google)
|
351
359
|
// => "/companies/1"
|
352
360
|
|
353
361
|
var google = {id: 1, name: "Google", to_param: "google"};
|
354
|
-
|
362
|
+
company_path(google)
|
355
363
|
// => "/companies/google"
|
356
364
|
```
|
357
365
|
|
358
366
|
In order to make routes helpers available globally:
|
359
367
|
|
360
368
|
``` js
|
369
|
+
import * as Routes from '../routes';
|
361
370
|
jQuery.extend(window, Routes)
|
362
371
|
```
|
363
372
|
|
@@ -366,22 +375,18 @@ jQuery.extend(window, Routes)
|
|
366
375
|
Possible to get `spec` of route by function `toString`:
|
367
376
|
|
368
377
|
```js
|
369
|
-
|
370
|
-
Routes.user_path.toString() // => "/users/:id(.:format)"
|
371
|
-
```
|
372
|
-
|
373
|
-
This function allow to get the same `spec` for route, if you will get string representation of the route function:
|
378
|
+
import {user_path, users_path} from '../routes'
|
374
379
|
|
375
|
-
|
376
|
-
|
377
|
-
'' + Routes.user_path // => "/users/:id(.:format)"
|
380
|
+
users_path.toString() // => "/users(.:format)"
|
381
|
+
user_path.toString() // => "/users/:id(.:format)"
|
378
382
|
```
|
379
383
|
|
384
|
+
|
380
385
|
Route function also contain method `requiredParams` inside which returns required param names array:
|
381
386
|
|
382
387
|
```js
|
383
|
-
|
384
|
-
|
388
|
+
users_path.requiredParams() // => []
|
389
|
+
user_path.requiredParams() // => ['id']
|
385
390
|
```
|
386
391
|
|
387
392
|
|
@@ -395,8 +400,10 @@ Sometimes the destinction between JS Hash and Object can not be found by JsRoute
|
|
395
400
|
In this case you would need to pass a special key to help:
|
396
401
|
|
397
402
|
``` js
|
398
|
-
|
399
|
-
|
403
|
+
import {company_project_path} from '../routes'
|
404
|
+
|
405
|
+
company_project_path({company_id: 1, id: 2}) // => Not enough parameters
|
406
|
+
company_project_path({company_id: 1, id: 2, _options: true}) // => "/companies/1/projects/2"
|
400
407
|
```
|
401
408
|
|
402
409
|
|
@@ -417,7 +424,7 @@ import {
|
|
417
424
|
inbox_message_path,
|
418
425
|
inbox_attachment_path,
|
419
426
|
user_path,
|
420
|
-
} from 'routes
|
427
|
+
} from '../routes'
|
421
428
|
```
|
422
429
|
|
423
430
|
Such import structure allows for moddern JS bundlers like [Webpack](https://webpack.js.org/) to only include explicitly imported routes into JS bundle file.
|
data/lib/js_routes/engine.rb
CHANGED
@@ -29,7 +29,8 @@ end
|
|
29
29
|
|
30
30
|
|
31
31
|
class Engine < ::Rails::Engine
|
32
|
-
|
32
|
+
def self.install_sprockets!
|
33
|
+
return if defined?(@installed_sprockets)
|
33
34
|
require 'sprockets/version'
|
34
35
|
v2 = Gem::Dependency.new('', ' ~> 2')
|
35
36
|
vgte3 = Gem::Dependency.new('', ' >= 3')
|
@@ -58,6 +59,10 @@ class Engine < ::Rails::Engine
|
|
58
59
|
raise StandardError, "Sprockets version #{sprockets_version} is not supported"
|
59
60
|
end
|
60
61
|
end
|
62
|
+
@installed_sprockets = true
|
63
|
+
end
|
64
|
+
if defined?(::Sprockets::Railtie)
|
65
|
+
install_sprockets!
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end
|
data/lib/js_routes/instance.rb
CHANGED
@@ -2,7 +2,7 @@ require "js_routes/configuration"
|
|
2
2
|
require "js_routes/route"
|
3
3
|
|
4
4
|
module JsRoutes
|
5
|
-
class Instance
|
5
|
+
class Instance # :nodoc:
|
6
6
|
|
7
7
|
attr_reader :configuration
|
8
8
|
#
|
@@ -55,7 +55,7 @@ module JsRoutes
|
|
55
55
|
'ROUTES_OBJECT' => routes_object,
|
56
56
|
'RAILS_VERSION' => ActionPack.version,
|
57
57
|
'DEPRECATED_GLOBBING_BEHAVIOR' => ActionPack::VERSION::MAJOR == 4 && ActionPack::VERSION::MINOR == 0,
|
58
|
-
|
58
|
+
'DEPRECATED_FALSE_PARAMETER_BEHAVIOR' => ActionPack::VERSION::MAJOR < 7,
|
59
59
|
'APP_CLASS' => application.class.to_s,
|
60
60
|
'DEFAULT_URL_OPTIONS' => json(@configuration.default_url_options),
|
61
61
|
'PREFIX' => json(@configuration.prefix),
|
data/lib/js_routes/middleware.rb
CHANGED
@@ -21,12 +21,16 @@ module JsRoutes
|
|
21
21
|
def update_js_routes
|
22
22
|
new_mtime = routes_mtime
|
23
23
|
unless new_mtime == @mtime
|
24
|
-
|
25
|
-
JsRoutes.definitions!
|
24
|
+
regenerate
|
26
25
|
@mtime = new_mtime
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
29
|
+
def regenerate
|
30
|
+
JsRoutes.generate!
|
31
|
+
JsRoutes.definitions!
|
32
|
+
end
|
33
|
+
|
30
34
|
def routes_mtime
|
31
35
|
File.mtime(@routes_file)
|
32
36
|
rescue Errno::ENOENT
|
data/lib/js_routes/version.rb
CHANGED
data/lib/routes.d.ts
CHANGED
@@ -53,6 +53,7 @@ declare type KeywordUrlOptions = Optional<{
|
|
53
53
|
port: string | number;
|
54
54
|
anchor: string;
|
55
55
|
trailing_slash: boolean;
|
56
|
+
params: RouteParameters;
|
56
57
|
}>;
|
57
58
|
declare type RouteOptions = KeywordUrlOptions & RouteParameters;
|
58
59
|
declare type PartsTable = Record<string, {
|
@@ -63,6 +64,7 @@ declare type ModuleType = "CJS" | "AMD" | "UMD" | "ESM" | "DTS" | "NIL";
|
|
63
64
|
declare const RubyVariables: {
|
64
65
|
PREFIX: string;
|
65
66
|
DEPRECATED_GLOBBING_BEHAVIOR: boolean;
|
67
|
+
DEPRECATED_FALSE_PARAMETER_BEHAVIOR: boolean;
|
66
68
|
SPECIAL_OPTIONS_KEY: string;
|
67
69
|
DEFAULT_URL_OPTIONS: RouteParameters;
|
68
70
|
SERIALIZER: Serializer;
|
data/lib/routes.js
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
* File generated by js-routes RubyVariables.GEM_VERSION
|
3
3
|
* Based on Rails RubyVariables.RAILS_VERSION routes of RubyVariables.APP_CLASS
|
4
4
|
*/
|
5
|
-
|
5
|
+
// eslint-disable-next-line
|
6
|
+
RubyVariables.WRAPPER(
|
7
|
+
// eslint-disable-next-line
|
8
|
+
() => {
|
6
9
|
const hasProp = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
7
10
|
let NodeTypes;
|
8
11
|
(function (NodeTypes) {
|
@@ -176,7 +179,11 @@ RubyVariables.WRAPPER(() => {
|
|
176
179
|
}
|
177
180
|
path_identifier(object) {
|
178
181
|
const result = this.unwrap_path_identifier(object);
|
179
|
-
return this.is_nullable(result) ||
|
182
|
+
return this.is_nullable(result) ||
|
183
|
+
(RubyVariables.DEPRECATED_FALSE_PARAMETER_BEHAVIOR &&
|
184
|
+
result === false)
|
185
|
+
? ""
|
186
|
+
: "" + result;
|
180
187
|
}
|
181
188
|
unwrap_path_identifier(object) {
|
182
189
|
let result = object;
|
@@ -222,12 +229,23 @@ RubyVariables.WRAPPER(() => {
|
|
222
229
|
...options,
|
223
230
|
};
|
224
231
|
const keyword_parameters = {};
|
225
|
-
|
232
|
+
let query_parameters = {};
|
226
233
|
for (const key in options) {
|
227
234
|
if (!hasProp(options, key))
|
228
235
|
continue;
|
229
236
|
const value = options[key];
|
230
|
-
if (
|
237
|
+
if (key === "params") {
|
238
|
+
if (this.is_object(value)) {
|
239
|
+
query_parameters = {
|
240
|
+
...query_parameters,
|
241
|
+
...value,
|
242
|
+
};
|
243
|
+
}
|
244
|
+
else {
|
245
|
+
throw new Error("params value should always be an object");
|
246
|
+
}
|
247
|
+
}
|
248
|
+
else if (this.is_reserved_option(key)) {
|
231
249
|
keyword_parameters[key] = value;
|
232
250
|
}
|
233
251
|
else {
|
@@ -251,7 +269,7 @@ RubyVariables.WRAPPER(() => {
|
|
251
269
|
return { keyword_parameters, query_parameters };
|
252
270
|
}
|
253
271
|
build_route(parts, required_params, default_options, route, absolute, args) {
|
254
|
-
const { keyword_parameters, query_parameters
|
272
|
+
const { keyword_parameters, query_parameters } = this.partition_parameters(parts, required_params, default_options, args);
|
255
273
|
const missing_params = required_params.filter((param) => !hasProp(query_parameters, param) ||
|
256
274
|
this.is_nullable(query_parameters[param]));
|
257
275
|
if (missing_params.length) {
|
data/lib/routes.ts
CHANGED
@@ -70,6 +70,7 @@ type KeywordUrlOptions = Optional<{
|
|
70
70
|
port: string | number;
|
71
71
|
anchor: string;
|
72
72
|
trailing_slash: boolean;
|
73
|
+
params: RouteParameters;
|
73
74
|
}>;
|
74
75
|
|
75
76
|
type RouteOptions = KeywordUrlOptions & RouteParameters;
|
@@ -81,6 +82,7 @@ type ModuleType = "CJS" | "AMD" | "UMD" | "ESM" | "DTS" | "NIL";
|
|
81
82
|
declare const RubyVariables: {
|
82
83
|
PREFIX: string;
|
83
84
|
DEPRECATED_GLOBBING_BEHAVIOR: boolean;
|
85
|
+
DEPRECATED_FALSE_PARAMETER_BEHAVIOR: boolean;
|
84
86
|
SPECIAL_OPTIONS_KEY: string;
|
85
87
|
DEFAULT_URL_OPTIONS: RouteParameters;
|
86
88
|
SERIALIZER: Serializer;
|
@@ -95,7 +97,9 @@ declare const define:
|
|
95
97
|
|
96
98
|
declare const module: { exports: any } | undefined;
|
97
99
|
|
100
|
+
// eslint-disable-next-line
|
98
101
|
RubyVariables.WRAPPER(
|
102
|
+
// eslint-disable-next-line
|
99
103
|
(): RouterExposedMethods => {
|
100
104
|
const hasProp = (value: unknown, key: string) =>
|
101
105
|
Object.prototype.hasOwnProperty.call(value, key);
|
@@ -222,7 +226,7 @@ RubyVariables.WRAPPER(
|
|
222
226
|
"port",
|
223
227
|
"protocol",
|
224
228
|
] as const;
|
225
|
-
type ReservedOption = typeof ReservedOptions[any];
|
229
|
+
type ReservedOption = (typeof ReservedOptions)[any];
|
226
230
|
|
227
231
|
class UtilsClass {
|
228
232
|
configuration: Configuration = {
|
@@ -233,7 +237,7 @@ RubyVariables.WRAPPER(
|
|
233
237
|
RubyVariables.SERIALIZER || this.default_serializer.bind(this),
|
234
238
|
};
|
235
239
|
|
236
|
-
default_serializer(value:
|
240
|
+
default_serializer(value: unknown, prefix?: string | null): string {
|
237
241
|
if (this.is_nullable(value)) {
|
238
242
|
return "";
|
239
243
|
}
|
@@ -292,14 +296,16 @@ RubyVariables.WRAPPER(
|
|
292
296
|
}
|
293
297
|
return {
|
294
298
|
args: args.slice(0, args.length - 1),
|
295
|
-
options:
|
299
|
+
options: last_el as unknown as RouteOptions,
|
296
300
|
};
|
297
301
|
} else {
|
298
302
|
return { args, options: {} };
|
299
303
|
}
|
300
304
|
}
|
301
305
|
|
302
|
-
looks_like_serialized_model(
|
306
|
+
looks_like_serialized_model(
|
307
|
+
object: unknown
|
308
|
+
): object is ModelRouteParameter {
|
303
309
|
return (
|
304
310
|
this.is_object(object) &&
|
305
311
|
!(this.configuration.special_options_key in object) &&
|
@@ -309,11 +315,15 @@ RubyVariables.WRAPPER(
|
|
309
315
|
|
310
316
|
path_identifier(object: QueryRouteParameter): string {
|
311
317
|
const result = this.unwrap_path_identifier(object);
|
312
|
-
return this.is_nullable(result) ||
|
318
|
+
return this.is_nullable(result) ||
|
319
|
+
(RubyVariables.DEPRECATED_FALSE_PARAMETER_BEHAVIOR &&
|
320
|
+
result === false)
|
321
|
+
? ""
|
322
|
+
: "" + result;
|
313
323
|
}
|
314
324
|
|
315
325
|
unwrap_path_identifier(object: QueryRouteParameter): unknown {
|
316
|
-
let result:
|
326
|
+
let result: unknown = object;
|
317
327
|
if (!this.is_object(object)) {
|
318
328
|
return object;
|
319
329
|
}
|
@@ -365,11 +375,20 @@ RubyVariables.WRAPPER(
|
|
365
375
|
};
|
366
376
|
|
367
377
|
const keyword_parameters: KeywordUrlOptions = {};
|
368
|
-
|
378
|
+
let query_parameters: RouteParameters = {};
|
369
379
|
for (const key in options) {
|
370
380
|
if (!hasProp(options, key)) continue;
|
371
381
|
const value = options[key];
|
372
|
-
if (
|
382
|
+
if (key === "params") {
|
383
|
+
if (this.is_object(value)) {
|
384
|
+
query_parameters = {
|
385
|
+
...query_parameters,
|
386
|
+
...(value as RouteParameters),
|
387
|
+
};
|
388
|
+
} else {
|
389
|
+
throw new Error("params value should always be an object");
|
390
|
+
}
|
391
|
+
} else if (this.is_reserved_option(key)) {
|
373
392
|
keyword_parameters[key] = value as any;
|
374
393
|
} else {
|
375
394
|
if (
|
@@ -401,15 +420,13 @@ RubyVariables.WRAPPER(
|
|
401
420
|
absolute: boolean,
|
402
421
|
args: OptionalRouteParameter[]
|
403
422
|
): string {
|
404
|
-
const {
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
args
|
412
|
-
);
|
423
|
+
const { keyword_parameters, query_parameters } =
|
424
|
+
this.partition_parameters(
|
425
|
+
parts,
|
426
|
+
required_params,
|
427
|
+
default_options,
|
428
|
+
args
|
429
|
+
);
|
413
430
|
const missing_params = required_params.filter(
|
414
431
|
(param) =>
|
415
432
|
!hasProp(query_parameters, param) ||
|
data/package.json
CHANGED
@@ -12,13 +12,13 @@
|
|
12
12
|
"dependencies": {
|
13
13
|
"@typescript-eslint/eslint-plugin": "^4.9.0",
|
14
14
|
"@typescript-eslint/parser": "^4.9.0",
|
15
|
-
"eslint": "^
|
16
|
-
"eslint-config-prettier": "^
|
17
|
-
"eslint-plugin-import": "^2.
|
15
|
+
"eslint": "^8.35.0",
|
16
|
+
"eslint-config-prettier": "^8.7.0",
|
17
|
+
"eslint-plugin-import": "^2.27.5",
|
18
18
|
"husky": "^4.3.0",
|
19
19
|
"lint-staged": "^10.5.2",
|
20
20
|
"pinst": "^2.1.1",
|
21
|
-
"prettier": "^2.
|
21
|
+
"prettier": "^2.8.4"
|
22
22
|
},
|
23
23
|
"scripts": {
|
24
24
|
"build": "tsc && yarn lint:fix",
|
@@ -31,7 +31,8 @@
|
|
31
31
|
}
|
32
32
|
},
|
33
33
|
"lint-staged": {
|
34
|
-
"./lib/routes.ts": [
|
34
|
+
"./lib/routes.ts": [
|
35
|
+
"yarn lint:fix"
|
36
|
+
]
|
35
37
|
}
|
36
|
-
|
37
38
|
}
|
@@ -3,29 +3,29 @@ require "spec_helper"
|
|
3
3
|
describe JsRoutes, "#serialize" 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 provide this method" do
|
10
|
-
|
10
|
+
expectjs("Routes.serialize({a: 1, b: [2,3], c: {d: 4, e: 5}, f: ''})").to eq(
|
11
11
|
"a=1&b%5B%5D=2&b%5B%5D=3&c%5Bd%5D=4&c%5Be%5D=5&f="
|
12
12
|
)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should provide this method" do
|
16
|
-
|
16
|
+
expectjs("Routes.serialize({a: 1, b: [2,3], c: {d: 4, e: 5}, f: ''})").to eq(
|
17
17
|
"a=1&b%5B%5D=2&b%5B%5D=3&c%5Bd%5D=4&c%5Be%5D=5&f="
|
18
18
|
)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "works with JS suckiness" do
|
22
|
-
|
22
|
+
expectjs(
|
23
23
|
[
|
24
24
|
"const query = Object.create(null);",
|
25
25
|
"query.a = 1;",
|
26
26
|
"query.b = 2;",
|
27
27
|
"Routes.serialize(query);",
|
28
28
|
].join("\n")
|
29
|
-
)
|
29
|
+
).to eq("a=1&b=2")
|
30
30
|
end
|
31
31
|
end
|