js-routes 2.2.9 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -3
- data/Readme.md +16 -15
- data/lib/js_routes/configuration.rb +7 -5
- data/lib/js_routes/generators/base.rb +6 -1
- data/lib/js_routes/generators/middleware.rb +2 -3
- data/lib/js_routes/generators/webpacker.rb +2 -1
- data/lib/js_routes/instance.rb +21 -6
- data/lib/js_routes/middleware.rb +5 -4
- data/lib/js_routes/route.rb +7 -3
- data/lib/js_routes/types.rb +10 -0
- data/lib/js_routes/utils.rb +18 -0
- data/lib/js_routes/version.rb +1 -1
- data/lib/js_routes.rb +12 -4
- data/lib/routes.d.ts +7 -6
- data/lib/routes.js +19 -18
- data/lib/routes.ts +33 -27
- data/lib/tasks/js_routes.rake +4 -2
- metadata +12 -145
- data/.document +0 -5
- data/.eslintrc.js +0 -15
- data/.github/workflows/ci.yml +0 -36
- data/.gitignore +0 -65
- data/.nvmrc +0 -1
- data/.rspec +0 -1
- data/Appraisals +0 -17
- data/Gemfile +0 -9
- data/Rakefile +0 -37
- data/VERSION_2_UPGRADE.md +0 -66
- data/bin/tapioca +0 -27
- data/gemfiles/rails50_sprockets_3.gemfile +0 -8
- data/gemfiles/rails51_sprockets_3.gemfile +0 -8
- data/gemfiles/rails52_sprockets_3.gemfile +0 -8
- data/gemfiles/rails70_sprockets_4.gemfile +0 -8
- data/js-routes.gemspec +0 -42
- data/package.json +0 -38
- data/sorbet/config +0 -4
- data/sorbet/rbi/annotations/.gitattributes +0 -1
- data/sorbet/rbi/annotations/actionpack.rbi +0 -428
- data/sorbet/rbi/annotations/actionview.rbi +0 -75
- data/sorbet/rbi/annotations/activesupport.rbi +0 -421
- data/sorbet/rbi/annotations/railties.rbi +0 -61
- data/sorbet/rbi/gems/.gitattributes +0 -1
- data/sorbet/rbi/gems/actionpack@7.0.4.1.rbi +0 -303
- data/sorbet/rbi/gems/actionview@7.0.4.1.rbi +0 -8
- data/sorbet/rbi/gems/activesupport@7.0.4.1.rbi +0 -16424
- data/sorbet/rbi/gems/appraisal@2.4.1.rbi +0 -584
- data/sorbet/rbi/gems/builder@3.2.4.rbi +0 -8
- data/sorbet/rbi/gems/bump@0.10.0.rbi +0 -168
- data/sorbet/rbi/gems/byebug@11.1.3.rbi +0 -3606
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +0 -3426
- data/sorbet/rbi/gems/concurrent-ruby@1.2.0.rbi +0 -11570
- data/sorbet/rbi/gems/crass@1.0.6.rbi +0 -8
- data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +0 -1083
- data/sorbet/rbi/gems/erubi@1.12.0.rbi +0 -145
- data/sorbet/rbi/gems/i18n@1.12.0.rbi +0 -2296
- data/sorbet/rbi/gems/libv8-node@16.10.0.0.rbi +0 -8
- data/sorbet/rbi/gems/loofah@2.19.1.rbi +0 -8
- data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -272
- data/sorbet/rbi/gems/mini_racer@0.6.3.rbi +0 -224
- data/sorbet/rbi/gems/minitest@5.17.0.rbi +0 -1457
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +0 -158
- data/sorbet/rbi/gems/nokogiri@1.14.0.rbi +0 -8
- data/sorbet/rbi/gems/parallel@1.24.0.rbi +0 -280
- data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +0 -951
- data/sorbet/rbi/gems/prism@0.24.0.rbi +0 -29744
- data/sorbet/rbi/gems/pry-byebug@3.10.1.rbi +0 -1150
- data/sorbet/rbi/gems/pry@0.14.2.rbi +0 -10075
- data/sorbet/rbi/gems/racc@1.6.2.rbi +0 -150
- data/sorbet/rbi/gems/rack-test@2.0.2.rbi +0 -8
- data/sorbet/rbi/gems/rack@2.2.6.2.rbi +0 -5585
- data/sorbet/rbi/gems/rails-dom-testing@2.0.3.rbi +0 -8
- data/sorbet/rbi/gems/rails-html-sanitizer@1.5.0.rbi +0 -8
- data/sorbet/rbi/gems/railties@7.0.4.1.rbi +0 -1959
- data/sorbet/rbi/gems/rake@13.0.6.rbi +0 -3072
- data/sorbet/rbi/gems/rbi@0.1.9.rbi +0 -3006
- data/sorbet/rbi/gems/rspec-core@3.12.0.rbi +0 -10868
- data/sorbet/rbi/gems/rspec-expectations@3.12.2.rbi +0 -8100
- data/sorbet/rbi/gems/rspec-mocks@3.12.3.rbi +0 -5299
- data/sorbet/rbi/gems/rspec-support@3.12.0.rbi +0 -1611
- data/sorbet/rbi/gems/rspec@3.12.0.rbi +0 -82
- data/sorbet/rbi/gems/spoom@1.2.4.rbi +0 -3777
- data/sorbet/rbi/gems/sprockets-rails@3.4.2.rbi +0 -14
- data/sorbet/rbi/gems/sprockets@4.2.0.rbi +0 -8
- data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +0 -23136
- data/sorbet/rbi/gems/tapioca@0.12.0.rbi +0 -3510
- data/sorbet/rbi/gems/thor@1.2.1.rbi +0 -3956
- data/sorbet/rbi/gems/tzinfo@2.0.5.rbi +0 -5914
- data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +0 -428
- data/sorbet/rbi/gems/yard@0.9.34.rbi +0 -18332
- data/sorbet/rbi/gems/zeitwerk@2.6.8.rbi +0 -8
- data/sorbet/rbi/todo.rbi +0 -31
- data/sorbet/tapioca/config.yml +0 -13
- data/sorbet/tapioca/require.rb +0 -4
- data/spec/dummy/app/assets/config/manifest.js +0 -2
- data/spec/dummy/app/assets/javascripts/.gitkeep +0 -0
- data/spec/dummy/config/routes.rb +0 -55
- data/spec/js_routes/default_serializer_spec.rb +0 -31
- data/spec/js_routes/module_types/amd_spec.rb +0 -35
- data/spec/js_routes/module_types/cjs_spec.rb +0 -15
- data/spec/js_routes/module_types/dts/routes.spec.d.ts +0 -115
- data/spec/js_routes/module_types/dts/test.spec.ts +0 -56
- data/spec/js_routes/module_types/dts_spec.rb +0 -126
- data/spec/js_routes/module_types/esm_spec.rb +0 -45
- data/spec/js_routes/module_types/nil_spec.rb +0 -87
- data/spec/js_routes/module_types/umd_spec.rb +0 -85
- data/spec/js_routes/options_spec.rb +0 -508
- data/spec/js_routes/rails_routes_compatibility_spec.rb +0 -473
- data/spec/js_routes/route_specification_spec.rb +0 -37
- data/spec/js_routes/zzz_sprockets_spec.rb +0 -152
- data/spec/spec_helper.rb +0 -135
- data/spec/support/routes.rb +0 -81
- data/spec/tsconfig.json +0 -4
- data/tsconfig.json +0 -28
- data/yarn.lock +0 -2457
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8030ebf1b79303bfad35b2003ced97e6ec398b8bab459bf0f867006c9bc5d763
|
4
|
+
data.tar.gz: 4d84acaa15dacc791f26e059cb620d5c08d90891103fa5d73750d4bae3973e8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24e4500fcf1f799633343366f84d619060cd57979edc25a9f83ec17baf6a505e3fbbd838f66b6ec70618bf7d991a0f0614a3c6ad02ce85a90931e4a047f168a6
|
7
|
+
data.tar.gz: 7cab5ccd03712368ea32d43604381b32491ada2a933bf656b6efa0002132e638653f250e5a5037487e36c6ecfed01454d6df359e2e308b5fc7cd237c7af2fca2
|
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,27 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## v2.3.0
|
4
|
+
|
5
|
+
* Drop support of Rails 4.x
|
6
|
+
* Fix support of shakapacker [#321](https://github.com/railsware/js-routes/issue/321).
|
7
|
+
* Fix support for Rails 8 [#319](https://github.com/railsware/js-routes/issue/319)
|
8
|
+
* Deprecated `rake js:routes:typescript`.
|
9
|
+
`rake js:routes` now automatically detects if types support can be used on not.
|
4
10
|
|
5
11
|
## v2.2.10
|
6
12
|
|
7
|
-
*
|
13
|
+
* Remove sorbet files from repo
|
14
|
+
* Clearly define files included in gem
|
15
|
+
* Fix Middleware and Middleware generator bugs [#316](https://github.com/railsware/js-routes/issue/316)
|
16
|
+
* Remove empty object linter warning on DTS module
|
17
|
+
* Generators: Add `.ts` extension when searching for main JS file of the project
|
8
18
|
|
9
19
|
## v2.2.9
|
10
20
|
|
21
|
+
* Fix middleware error for non-modern setup.
|
11
22
|
* Added [Sorbet](https://sorbet.org/) method signatures.
|
12
|
-
* Always use DTS module type when calling JsRoutes.definitions or .definitions!.
|
23
|
+
* Always use DTS module type when calling JsRoutes.definitions or .definitions!.
|
24
|
+
[#313](https://github.com/railsware/js-routes/issues/313)
|
13
25
|
|
14
26
|
## v2.2.8
|
15
27
|
|
data/Readme.md
CHANGED
@@ -2,7 +2,16 @@
|
|
2
2
|
|
3
3
|
[![CI](https://github.com/railsware/js-routes/actions/workflows/ci.yml/badge.svg)](https://github.com/railsware/js-routes/actions/workflows/ci.yml)
|
4
4
|
|
5
|
-
Generates javascript file that defines all Rails named routes as javascript helpers
|
5
|
+
Generates javascript file that defines all Rails named routes as javascript helpers:
|
6
|
+
|
7
|
+
``` js
|
8
|
+
import { root_path, api_user_path } from './routes';
|
9
|
+
|
10
|
+
root_path() # => /
|
11
|
+
api_user_path(25, include_profile: true, format: 'json') // => /api/users/25.json?include_profile=true
|
12
|
+
```
|
13
|
+
|
14
|
+
[More Examples](#usage)
|
6
15
|
|
7
16
|
## Intallation
|
8
17
|
|
@@ -348,7 +357,7 @@ Configuration above will create a nice javascript file with `Routes` object that
|
|
348
357
|
``` js
|
349
358
|
import {
|
350
359
|
user_path, user_project_path, company_path
|
351
|
-
}
|
360
|
+
} from 'routes';
|
352
361
|
|
353
362
|
users_path()
|
354
363
|
// => "/users"
|
@@ -459,15 +468,13 @@ console.log(routes.inbox_path); // OK, only `inbox_path` is included in the bund
|
|
459
468
|
console.log(Object.keys(routes)); // forces bundler to include all exports, breaking tree shaking
|
460
469
|
```
|
461
470
|
|
462
|
-
### Exclude
|
471
|
+
### Exclude/Include options
|
463
472
|
|
464
473
|
Split your routes into multiple files related to each section of your website like:
|
465
474
|
|
466
|
-
```
|
467
|
-
|
468
|
-
|
469
|
-
// app-routes.js.erb
|
470
|
-
<%= JsRoutes.generate(exclude: /^admin_/) %>
|
475
|
+
``` ruby
|
476
|
+
JsRoutes.generate!('app/javascript/admin-routes.js', include: /^admin_/) %>
|
477
|
+
JsRoutes.generate!('app/javascript/app-routes.js', exclude: /^admin_/) %>
|
471
478
|
```
|
472
479
|
|
473
480
|
## Advantages over alternatives
|
@@ -475,17 +482,11 @@ Split your routes into multiple files related to each section of your website li
|
|
475
482
|
There are some alternatives available. Most of them has only basic feature and don't reach the level of quality I accept.
|
476
483
|
Advantages of this one are:
|
477
484
|
|
478
|
-
*
|
485
|
+
* Actively maintained
|
479
486
|
* [ESM Tree shaking](https://webpack.js.org/guides/tree-shaking/) support
|
480
487
|
* Rich options set
|
481
488
|
* Full rails compatibility
|
482
489
|
* Support Rails `#to_param` convention for seo optimized paths
|
483
490
|
* Well tested
|
484
491
|
|
485
|
-
#### Thanks to [contributors](https://github.com/railsware/js-routes/contributors)
|
486
|
-
|
487
|
-
#### Have fun
|
488
|
-
|
489
492
|
|
490
|
-
## License
|
491
|
-
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Frailsware%2Fjs-routes.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Frailsware%2Fjs-routes?ref=badge_large)
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# typed: strict
|
2
|
+
|
2
3
|
require "pathname"
|
3
4
|
require "js_routes/types"
|
5
|
+
require 'js_routes/utils'
|
4
6
|
|
5
7
|
module JsRoutes
|
6
8
|
class Configuration
|
@@ -114,14 +116,14 @@ module JsRoutes
|
|
114
116
|
|
115
117
|
sig { returns(Pathname) }
|
116
118
|
def output_file
|
117
|
-
|
118
|
-
|
119
|
-
pathname('app', 'javascript')
|
119
|
+
shakapacker = JsRoutes::Utils.shakapacker
|
120
|
+
shakapacker_dir = shakapacker ?
|
121
|
+
shakapacker.config.source_path : pathname('app', 'javascript')
|
120
122
|
sprockets_dir = pathname('app','assets','javascripts')
|
121
123
|
file_name = file || default_file_name
|
122
124
|
sprockets_file = sprockets_dir.join(file_name)
|
123
|
-
webpacker_file =
|
124
|
-
!Dir.exist?(
|
125
|
+
webpacker_file = shakapacker_dir.join(file_name)
|
126
|
+
!Dir.exist?(shakapacker_dir) && defined?(::Sprockets) ? sprockets_file : webpacker_file
|
125
127
|
end
|
126
128
|
|
127
129
|
protected
|
@@ -3,13 +3,18 @@ require "rails/generators"
|
|
3
3
|
|
4
4
|
class JsRoutes::Generators::Base < Rails::Generators::Base
|
5
5
|
|
6
|
-
|
6
|
+
def self.inherited(subclass)
|
7
|
+
super
|
8
|
+
subclass.source_root(File.expand_path(__FILE__ + "/../../../templates"))
|
9
|
+
end
|
7
10
|
|
8
11
|
protected
|
9
12
|
|
10
13
|
def application_js_path
|
11
14
|
[
|
15
|
+
"app/javascript/packs/application.ts",
|
12
16
|
"app/javascript/packs/application.js",
|
17
|
+
"app/javascript/controllers/application.ts",
|
13
18
|
"app/javascript/controllers/application.js",
|
14
19
|
].find do |path|
|
15
20
|
File.exist?(Rails.root.join(path))
|
@@ -10,8 +10,7 @@ class JsRoutes::Generators::Middleware < JsRoutes::Generators::Base
|
|
10
10
|
if path = application_js_path
|
11
11
|
inject_into_file path, pack_content
|
12
12
|
end
|
13
|
-
JsRoutes.generate!
|
14
|
-
JsRoutes.definitions!
|
13
|
+
JsRoutes.generate!(typed: true)
|
15
14
|
end
|
16
15
|
|
17
16
|
protected
|
@@ -36,7 +35,7 @@ alert(`JsRoutes installed.\\nYour root path is ${root_path()}`)
|
|
36
35
|
enhanced_task = depends_on_js_bundling? ? "javascript:build" : "assets:precompile"
|
37
36
|
<<-RB
|
38
37
|
# Update js-routes file before javascript build
|
39
|
-
task "#{enhanced_task}" => "js:routes
|
38
|
+
task "#{enhanced_task}" => "js:routes"
|
40
39
|
RB
|
41
40
|
end
|
42
41
|
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require "rails/generators"
|
2
|
+
require 'js_routes/utils'
|
2
3
|
|
3
4
|
class JsRoutes::Generators::Webpacker < Rails::Generators::Base
|
4
5
|
|
5
6
|
def create_webpack
|
6
7
|
copy_file "initializer.rb", "config/initializers/js_routes.rb"
|
7
8
|
copy_file "erb.js", "config/webpack/loaders/erb.js"
|
8
|
-
copy_file "routes.js.erb", "#{
|
9
|
+
copy_file "routes.js.erb", "#{JsRoutes::Utils.shakapacker.config.source_path}/routes.js.erb"
|
9
10
|
inject_into_file "config/webpack/environment.js", loader_content
|
10
11
|
if path = application_js_path
|
11
12
|
inject_into_file path, pack_content
|
data/lib/js_routes/instance.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require "js_routes/configuration"
|
3
3
|
require "js_routes/route"
|
4
4
|
require "js_routes/types"
|
5
|
+
require 'fileutils'
|
5
6
|
|
6
7
|
module JsRoutes
|
7
8
|
class Instance # :nodoc:
|
@@ -23,9 +24,16 @@ module JsRoutes
|
|
23
24
|
sig {returns(String)}
|
24
25
|
def generate
|
25
26
|
# Ensure routes are loaded. If they're not, load them.
|
27
|
+
|
26
28
|
application = T.unsafe(self.application)
|
27
|
-
if named_routes.empty?
|
28
|
-
application.
|
29
|
+
if named_routes.empty?
|
30
|
+
if application.is_a?(Rails::Application)
|
31
|
+
if Rails.version >= "8.0.0"
|
32
|
+
application.reload_routes_unless_loaded
|
33
|
+
else
|
34
|
+
application.reload_routes!
|
35
|
+
end
|
36
|
+
end
|
29
37
|
end
|
30
38
|
content = File.read(@configuration.source_file)
|
31
39
|
|
@@ -57,6 +65,13 @@ module JsRoutes
|
|
57
65
|
end
|
58
66
|
end
|
59
67
|
|
68
|
+
sig { void }
|
69
|
+
def remove!
|
70
|
+
path = Rails.root.join(@configuration.output_file)
|
71
|
+
FileUtils.rm_rf(path)
|
72
|
+
FileUtils.rm_rf(path.sub(%r{\.js\z}, '.d.ts'))
|
73
|
+
end
|
74
|
+
|
60
75
|
protected
|
61
76
|
|
62
77
|
sig { returns(T::Hash[String, String]) }
|
@@ -170,8 +185,8 @@ export {};
|
|
170
185
|
sig { params(route: JourneyRoute).returns(T::Array[StringArray]) }
|
171
186
|
def mounted_app_routes(route)
|
172
187
|
rails_engine_app = T.unsafe(app_from_route(route))
|
173
|
-
if rails_engine_app.
|
174
|
-
rails_engine_app
|
188
|
+
if rails_engine_app.is_a?(Class) &&
|
189
|
+
rails_engine_app < Rails::Engine && !route.path.anchored
|
175
190
|
rails_engine_app.routes.named_routes.flat_map do |_, engine_route|
|
176
191
|
route_helpers_if_match(engine_route, route)
|
177
192
|
end
|
@@ -183,9 +198,9 @@ export {};
|
|
183
198
|
sig { params(route: JourneyRoute).returns(T.untyped) }
|
184
199
|
def app_from_route(route)
|
185
200
|
app = route.app
|
186
|
-
#
|
201
|
+
# Rails Engine can use additional
|
187
202
|
# ActionDispatch::Routing::Mapper::Constraints, which contain app
|
188
|
-
if app.
|
203
|
+
if app.is_a?(ActionDispatch::Routing::Mapper::Constraints)
|
189
204
|
app.app
|
190
205
|
else
|
191
206
|
app
|
data/lib/js_routes/middleware.rb
CHANGED
@@ -9,16 +9,18 @@ module JsRoutes
|
|
9
9
|
# https://github.com/fnando/i18n-js/blob/main/lib/i18n/js/middleware.rb
|
10
10
|
class Middleware
|
11
11
|
include JsRoutes::Types
|
12
|
+
include RackApp
|
13
|
+
|
12
14
|
extend T::Sig
|
13
15
|
|
14
|
-
sig { params(app: T.
|
16
|
+
sig { params(app: T.untyped).void }
|
15
17
|
def initialize(app)
|
16
18
|
@app = app
|
17
19
|
@routes_file = T.let(Rails.root.join("config/routes.rb"), Pathname)
|
18
20
|
@mtime = T.let(nil, T.nilable(Time))
|
19
21
|
end
|
20
22
|
|
21
|
-
sig { params(env: StringHash).returns(UntypedArray) }
|
23
|
+
sig { override.params(env: StringHash).returns(UntypedArray) }
|
22
24
|
def call(env)
|
23
25
|
update_js_routes
|
24
26
|
@app.call(env)
|
@@ -37,8 +39,7 @@ module JsRoutes
|
|
37
39
|
|
38
40
|
sig { void }
|
39
41
|
def regenerate
|
40
|
-
JsRoutes.generate!
|
41
|
-
JsRoutes.definitions! if JsRoutes.configuration.modern?
|
42
|
+
JsRoutes.generate!(typed: true)
|
42
43
|
end
|
43
44
|
|
44
45
|
sig { returns(T.nilable(Time)) }
|
data/lib/js_routes/route.rb
CHANGED
@@ -65,13 +65,15 @@ module JsRoutes
|
|
65
65
|
|
66
66
|
sig { returns(String) }
|
67
67
|
def definition_body
|
68
|
+
options_type = optional_parts_type ? "#{optional_parts_type} & RouteOptions" : "RouteOptions"
|
68
69
|
args = required_parts.map{|p| "#{apply_case(p)}: RequiredRouteParameter"}
|
69
|
-
args << "options?: #{
|
70
|
+
args << "options?: #{options_type}"
|
70
71
|
"((\n#{args.join(",\n").indent(2)}\n) => string) & RouteHelperExtras"
|
71
72
|
end
|
72
73
|
|
73
|
-
sig { returns(String) }
|
74
|
+
sig { returns(T.nilable(String)) }
|
74
75
|
def optional_parts_type
|
76
|
+
return nil if optional_parts.empty?
|
75
77
|
@optional_parts_type ||= T.let(
|
76
78
|
"{" + optional_parts.map {|p| "#{p}?: OptionalRouteParameter"}.join(', ') + "}",
|
77
79
|
T.nilable(String)
|
@@ -192,7 +194,9 @@ JS
|
|
192
194
|
sig { params(spec: SpecNode, parent_spec: T.nilable(RouteSpec)).returns(T.nilable(T.any(UntypedArray, String))) }
|
193
195
|
def serialize(spec, parent_spec=nil)
|
194
196
|
return nil unless spec
|
195
|
-
#
|
197
|
+
# Removing special character prefix from route variable name
|
198
|
+
# * for globbing
|
199
|
+
# : for common parameter
|
196
200
|
return spec.tr(':*', '') if spec.is_a?(String)
|
197
201
|
|
198
202
|
result = serialize_spec(spec, parent_spec)
|
data/lib/js_routes/types.rb
CHANGED
@@ -24,5 +24,15 @@ module JsRoutes
|
|
24
24
|
Prefix = T.type_alias do
|
25
25
|
T.any(T.proc.returns(String), String, NilClass)
|
26
26
|
end
|
27
|
+
|
28
|
+
module RackApp
|
29
|
+
extend T::Sig
|
30
|
+
extend T::Helpers
|
31
|
+
|
32
|
+
interface!
|
33
|
+
|
34
|
+
sig { abstract.params(input: StringHash).returns(UntypedArray) }
|
35
|
+
def call(input); end
|
36
|
+
end
|
27
37
|
end
|
28
38
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
module JsRoutes
|
4
|
+
module Utils
|
5
|
+
extend T::Sig
|
6
|
+
sig {returns(T.untyped)}
|
7
|
+
def self.shakapacker
|
8
|
+
if defined?(::Shakapacker)
|
9
|
+
::Shakapacker
|
10
|
+
elsif defined?(::Webpacker)
|
11
|
+
::Webpacker
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/lib/js_routes/version.rb
CHANGED
data/lib/js_routes.rb
CHANGED
@@ -34,19 +34,27 @@ module JsRoutes
|
|
34
34
|
Instance.new(**opts).generate
|
35
35
|
end
|
36
36
|
|
37
|
-
sig { params(file_name: FileName, opts: T.untyped).void }
|
38
|
-
def generate!(file_name = configuration.file, **opts)
|
37
|
+
sig { params(file_name: FileName, typed: T::Boolean, opts: T.untyped).void }
|
38
|
+
def generate!(file_name = configuration.file, typed: false, **opts)
|
39
39
|
Instance.new(file: file_name, **opts).generate!
|
40
|
+
definitions!(file_name, **opts) if typed
|
41
|
+
end
|
42
|
+
|
43
|
+
sig { params(file_name: FileName, opts: T.untyped).void }
|
44
|
+
def remove!(file_name = configuration.file, **opts)
|
45
|
+
Instance.new(file: file_name, **opts).remove!
|
40
46
|
end
|
41
47
|
|
42
48
|
sig { params(opts: T.untyped).returns(String) }
|
43
49
|
def definitions(**opts)
|
44
|
-
generate(**opts, module_type: 'DTS'
|
50
|
+
generate(**opts, module_type: 'DTS')
|
45
51
|
end
|
46
52
|
|
47
53
|
sig { params(file_name: FileName, opts: T.untyped).void }
|
48
54
|
def definitions!(file_name = nil, **opts)
|
49
|
-
file_name ||= configuration.file
|
55
|
+
file_name ||= configuration.file
|
56
|
+
|
57
|
+
file_name = file_name&.sub(%r{(\.d)?\.(j|t)s\Z}, ".d.ts")
|
50
58
|
generate!(file_name, **opts, module_type: 'DTS')
|
51
59
|
end
|
52
60
|
|
data/lib/routes.d.ts
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
declare type Optional<T> = {
|
6
6
|
[P in keyof T]?: T[P] | null;
|
7
7
|
};
|
8
|
+
declare type Collection<T> = Record<string, T>;
|
8
9
|
declare type BaseRouteParameter = string | boolean | Date | number;
|
9
10
|
declare type MethodRouteParameter = BaseRouteParameter | (() => BaseRouteParameter);
|
10
11
|
declare type ModelRouteParameter = {
|
@@ -19,8 +20,8 @@ declare type OptionalRouteParameter = undefined | null | RequiredRouteParameter;
|
|
19
20
|
declare type QueryRouteParameter = OptionalRouteParameter | QueryRouteParameter[] | {
|
20
21
|
[k: string]: QueryRouteParameter;
|
21
22
|
};
|
22
|
-
declare type RouteParameters =
|
23
|
-
declare type Serializable =
|
23
|
+
declare type RouteParameters = Collection<QueryRouteParameter>;
|
24
|
+
declare type Serializable = Collection<unknown>;
|
24
25
|
declare type Serializer = (value: Serializable) => string;
|
25
26
|
declare type RouteHelperExtras = {
|
26
27
|
requiredParams(): string[];
|
@@ -32,9 +33,9 @@ declare type RequiredParameters<T extends number> = T extends 1 ? [RequiredRoute
|
|
32
33
|
RequiredRouteParameter,
|
33
34
|
RequiredRouteParameter
|
34
35
|
] : RequiredRouteParameter[];
|
35
|
-
declare type RouteHelperOptions = RouteOptions &
|
36
|
+
declare type RouteHelperOptions = RouteOptions & Collection<OptionalRouteParameter>;
|
36
37
|
declare type RouteHelper<T extends number = number> = ((...args: [...RequiredParameters<T>, RouteHelperOptions]) => string) & RouteHelperExtras;
|
37
|
-
declare type RouteHelpers =
|
38
|
+
declare type RouteHelpers = Collection<RouteHelper>;
|
38
39
|
declare type Configuration = {
|
39
40
|
prefix: string;
|
40
41
|
default_url_options: RouteParameters;
|
@@ -56,7 +57,7 @@ declare type KeywordUrlOptions = Optional<{
|
|
56
57
|
params: RouteParameters;
|
57
58
|
}>;
|
58
59
|
declare type RouteOptions = KeywordUrlOptions & RouteParameters;
|
59
|
-
declare type PartsTable =
|
60
|
+
declare type PartsTable = Collection<{
|
60
61
|
r?: boolean;
|
61
62
|
d?: OptionalRouteParameter;
|
62
63
|
}>;
|
@@ -76,5 +77,5 @@ declare const define: undefined | (((arg: unknown[], callback: () => unknown) =>
|
|
76
77
|
amd?: unknown;
|
77
78
|
});
|
78
79
|
declare const module: {
|
79
|
-
exports:
|
80
|
+
exports: unknown;
|
80
81
|
} | undefined;
|
data/lib/routes.js
CHANGED
@@ -30,8 +30,9 @@ RubyVariables.WRAPPER(
|
|
30
30
|
const ModuleReferences = {
|
31
31
|
CJS: {
|
32
32
|
define(routes) {
|
33
|
-
|
34
|
-
|
33
|
+
if (module) {
|
34
|
+
module.exports = routes;
|
35
|
+
}
|
35
36
|
},
|
36
37
|
isSupported() {
|
37
38
|
return typeof module === "object";
|
@@ -39,10 +40,11 @@ RubyVariables.WRAPPER(
|
|
39
40
|
},
|
40
41
|
AMD: {
|
41
42
|
define(routes) {
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
if (define) {
|
44
|
+
define([], function () {
|
45
|
+
return routes;
|
46
|
+
});
|
47
|
+
}
|
46
48
|
},
|
47
49
|
isSupported() {
|
48
50
|
return typeof define === "function" && !!define.amd;
|
@@ -290,9 +292,9 @@ RubyVariables.WRAPPER(
|
|
290
292
|
if (url_params.length) {
|
291
293
|
result += "?" + url_params;
|
292
294
|
}
|
293
|
-
|
294
|
-
|
295
|
-
|
295
|
+
if (keyword_parameters.anchor) {
|
296
|
+
result += "#" + keyword_parameters.anchor;
|
297
|
+
}
|
296
298
|
if (absolute) {
|
297
299
|
result = this.route_url(keyword_parameters) + result;
|
298
300
|
}
|
@@ -502,28 +504,27 @@ RubyVariables.WRAPPER(
|
|
502
504
|
define_module(name, module) {
|
503
505
|
this.ensure_module_supported(name);
|
504
506
|
ModuleReferences[name].define(module);
|
507
|
+
return module;
|
505
508
|
}
|
506
509
|
}
|
507
|
-
const
|
510
|
+
const utils = new UtilsClass();
|
508
511
|
// We want this helper name to be short
|
509
512
|
const __jsr = {
|
510
513
|
r(parts_table, route_spec, absolute) {
|
511
|
-
return
|
514
|
+
return utils.route(parts_table, route_spec, absolute);
|
512
515
|
},
|
513
516
|
};
|
514
|
-
|
517
|
+
return utils.define_module(RubyVariables.MODULE_TYPE, {
|
515
518
|
...__jsr,
|
516
519
|
configure: (config) => {
|
517
|
-
return
|
520
|
+
return utils.configure(config);
|
518
521
|
},
|
519
522
|
config: () => {
|
520
|
-
return
|
523
|
+
return utils.config();
|
521
524
|
},
|
522
525
|
serialize: (object) => {
|
523
|
-
return
|
526
|
+
return utils.serialize(object);
|
524
527
|
},
|
525
528
|
...RubyVariables.ROUTES_OBJECT,
|
526
|
-
};
|
527
|
-
Utils.define_module(RubyVariables.MODULE_TYPE, result);
|
528
|
-
return result;
|
529
|
+
});
|
529
530
|
})();
|