js-routes 2.2.3 → 2.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://travis-ci.org/railsware/js-routes.svg?branch=master)](https://travis-ci.org/railsware/js-routes)
|
3
|
-
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Frailsware%2Fjs-routes.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Frailsware%2Fjs-routes?ref=badge_shield)
|
4
2
|
|
5
|
-
|
3
|
+
[![CI](https://github.com/railsware/js-routes/actions/workflows/ci.yml/badge.svg)](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
|