js-routes 2.2.8 → 2.2.10
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/CHANGELOG.md +24 -9
- data/Readme.md +60 -45
- data/lib/js_routes/configuration.rb +80 -34
- data/lib/js_routes/engine.rb +2 -0
- data/lib/js_routes/generators/base.rb +19 -0
- data/lib/js_routes/generators/middleware.rb +6 -8
- data/lib/js_routes/generators/webpacker.rb +1 -3
- data/lib/js_routes/instance.rb +50 -15
- data/lib/js_routes/middleware.rb +16 -3
- data/lib/js_routes/route.rb +60 -17
- data/lib/js_routes/types.rb +38 -0
- data/lib/js_routes/version.rb +2 -1
- data/lib/js_routes.rb +25 -7
- metadata +28 -45
- 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 -4
- data/Rakefile +0 -37
- data/VERSION_2_UPGRADE.md +0 -66
- 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 -39
- data/package.json +0 -38
- 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 -111
- 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
data/lib/js_routes/instance.rb
CHANGED
@@ -1,26 +1,36 @@
|
|
1
|
+
# typed: strict
|
1
2
|
require "js_routes/configuration"
|
2
3
|
require "js_routes/route"
|
4
|
+
require "js_routes/types"
|
5
|
+
require 'fileutils'
|
3
6
|
|
4
7
|
module JsRoutes
|
5
8
|
class Instance # :nodoc:
|
9
|
+
include JsRoutes::Types
|
10
|
+
extend T::Sig
|
6
11
|
|
12
|
+
sig { returns(JsRoutes::Configuration) }
|
7
13
|
attr_reader :configuration
|
8
14
|
#
|
9
15
|
# Implementation
|
10
16
|
#
|
11
17
|
|
12
|
-
|
13
|
-
|
18
|
+
sig { params(options: T.untyped).void }
|
19
|
+
def initialize(**options)
|
20
|
+
options = T.let(options, Options)
|
21
|
+
@configuration = T.let(JsRoutes.configuration.merge(options), JsRoutes::Configuration)
|
14
22
|
end
|
15
23
|
|
24
|
+
sig {returns(String)}
|
16
25
|
def generate
|
17
26
|
# Ensure routes are loaded. If they're not, load them.
|
18
|
-
|
27
|
+
application = T.unsafe(self.application)
|
28
|
+
if named_routes.empty? && application.respond_to?(:reload_routes!, true)
|
19
29
|
application.reload_routes!
|
20
30
|
end
|
21
31
|
content = File.read(@configuration.source_file)
|
22
32
|
|
23
|
-
|
33
|
+
unless @configuration.dts?
|
24
34
|
content = js_variables.inject(content) do |js, (key, value)|
|
25
35
|
js.gsub!("RubyVariables.#{key}", value.to_s) ||
|
26
36
|
raise("Missing key #{key} in JS template")
|
@@ -29,11 +39,12 @@ module JsRoutes
|
|
29
39
|
content + routes_export + prevent_types_export
|
30
40
|
end
|
31
41
|
|
42
|
+
sig { void }
|
32
43
|
def generate!
|
33
44
|
# Some libraries like Devise did not load their routes yet
|
34
45
|
# so we will wait until initialization process finishes
|
35
46
|
# https://github.com/railsware/js-routes/issues/7
|
36
|
-
Rails.configuration.after_initialize do
|
47
|
+
T.unsafe(Rails).configuration.after_initialize do
|
37
48
|
file_path = Rails.root.join(@configuration.output_file)
|
38
49
|
source_code = generate
|
39
50
|
|
@@ -47,18 +58,29 @@ module JsRoutes
|
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
61
|
+
sig { void }
|
62
|
+
def remove!
|
63
|
+
path = Rails.root.join(@configuration.output_file)
|
64
|
+
FileUtils.rm_rf(path)
|
65
|
+
FileUtils.rm_rf(path.sub(%r{\.js\z}, '.d.ts'))
|
66
|
+
end
|
67
|
+
|
50
68
|
protected
|
51
69
|
|
70
|
+
sig { returns(T::Hash[String, String]) }
|
52
71
|
def js_variables
|
72
|
+
version = Rails.version
|
73
|
+
prefix = @configuration.prefix
|
74
|
+
prefix = prefix.call if prefix.is_a?(Proc)
|
53
75
|
{
|
54
76
|
'GEM_VERSION' => JsRoutes::VERSION,
|
55
77
|
'ROUTES_OBJECT' => routes_object,
|
56
|
-
'RAILS_VERSION' =>
|
57
|
-
'DEPRECATED_GLOBBING_BEHAVIOR' =>
|
58
|
-
'DEPRECATED_FALSE_PARAMETER_BEHAVIOR' =>
|
78
|
+
'RAILS_VERSION' => ::Rails.version,
|
79
|
+
'DEPRECATED_GLOBBING_BEHAVIOR' => version >= '4.0.0' && version < '4.1.0',
|
80
|
+
'DEPRECATED_FALSE_PARAMETER_BEHAVIOR' => version < '7.0.0',
|
59
81
|
'APP_CLASS' => application.class.to_s,
|
60
82
|
'DEFAULT_URL_OPTIONS' => json(@configuration.default_url_options),
|
61
|
-
'PREFIX' => json(
|
83
|
+
'PREFIX' => json(prefix),
|
62
84
|
'SPECIAL_OPTIONS_KEY' => json(@configuration.special_options_key),
|
63
85
|
'SERIALIZER' => @configuration.serializer || json(nil),
|
64
86
|
'MODULE_TYPE' => json(@configuration.module_type),
|
@@ -66,6 +88,7 @@ module JsRoutes
|
|
66
88
|
}
|
67
89
|
end
|
68
90
|
|
91
|
+
sig { returns(String) }
|
69
92
|
def wrapper_variable
|
70
93
|
case @configuration.module_type
|
71
94
|
when 'ESM'
|
@@ -86,18 +109,22 @@ module JsRoutes
|
|
86
109
|
end
|
87
110
|
end
|
88
111
|
|
112
|
+
sig { returns(Application) }
|
89
113
|
def application
|
90
|
-
@configuration.application
|
114
|
+
@configuration.application.call
|
91
115
|
end
|
92
116
|
|
93
|
-
|
94
|
-
|
117
|
+
sig { params(value: T.untyped).returns(String) }
|
118
|
+
def json(value)
|
119
|
+
JsRoutes.json(value)
|
95
120
|
end
|
96
121
|
|
122
|
+
sig { returns(T::Hash[Symbol, JourneyRoute]) }
|
97
123
|
def named_routes
|
98
|
-
application.routes.named_routes.
|
124
|
+
T.unsafe(application).routes.named_routes.to_h
|
99
125
|
end
|
100
126
|
|
127
|
+
sig { returns(String) }
|
101
128
|
def routes_object
|
102
129
|
return json({}) if @configuration.modern?
|
103
130
|
properties = routes_list.map do |comment, name, body|
|
@@ -106,10 +133,11 @@ module JsRoutes
|
|
106
133
|
"{\n" + properties.join(",\n\n") + "}\n"
|
107
134
|
end
|
108
135
|
|
136
|
+
sig { returns(T::Array[StringArray]) }
|
109
137
|
def static_exports
|
110
138
|
[:configure, :config, :serialize].map do |name|
|
111
139
|
[
|
112
|
-
"", name,
|
140
|
+
"", name.to_s,
|
113
141
|
@configuration.dts? ?
|
114
142
|
"RouterExposedMethods['#{name}']" :
|
115
143
|
"__jsr.#{name}"
|
@@ -117,6 +145,7 @@ module JsRoutes
|
|
117
145
|
end
|
118
146
|
end
|
119
147
|
|
148
|
+
sig { returns(String) }
|
120
149
|
def routes_export
|
121
150
|
return "" unless @configuration.modern?
|
122
151
|
[*static_exports, *routes_list].map do |comment, name, body|
|
@@ -124,6 +153,7 @@ module JsRoutes
|
|
124
153
|
end.join
|
125
154
|
end
|
126
155
|
|
156
|
+
sig { returns(String) }
|
127
157
|
def prevent_types_export
|
128
158
|
return "" unless @configuration.dts?
|
129
159
|
<<-JS
|
@@ -133,18 +163,21 @@ export {};
|
|
133
163
|
JS
|
134
164
|
end
|
135
165
|
|
166
|
+
sig { returns(String) }
|
136
167
|
def export_separator
|
137
168
|
@configuration.dts? ? ': ' : ' = '
|
138
169
|
end
|
139
170
|
|
171
|
+
sig { returns(T::Array[StringArray]) }
|
140
172
|
def routes_list
|
141
173
|
named_routes.sort_by(&:first).flat_map do |_, route|
|
142
174
|
route_helpers_if_match(route) + mounted_app_routes(route)
|
143
175
|
end
|
144
176
|
end
|
145
177
|
|
178
|
+
sig { params(route: JourneyRoute).returns(T::Array[StringArray]) }
|
146
179
|
def mounted_app_routes(route)
|
147
|
-
rails_engine_app = app_from_route(route)
|
180
|
+
rails_engine_app = T.unsafe(app_from_route(route))
|
148
181
|
if rails_engine_app.respond_to?(:superclass) &&
|
149
182
|
rails_engine_app.superclass == Rails::Engine && !route.path.anchored
|
150
183
|
rails_engine_app.routes.named_routes.flat_map do |_, engine_route|
|
@@ -155,6 +188,7 @@ export {};
|
|
155
188
|
end
|
156
189
|
end
|
157
190
|
|
191
|
+
sig { params(route: JourneyRoute).returns(T.untyped) }
|
158
192
|
def app_from_route(route)
|
159
193
|
app = route.app
|
160
194
|
# rails engine in Rails 4.2 use additional
|
@@ -166,6 +200,7 @@ export {};
|
|
166
200
|
end
|
167
201
|
end
|
168
202
|
|
203
|
+
sig { params(route: JourneyRoute, parent_route: T.nilable(JourneyRoute)).returns(T::Array[StringArray]) }
|
169
204
|
def route_helpers_if_match(route, parent_route = nil)
|
170
205
|
Route.new(@configuration, route, parent_route).helpers
|
171
206
|
end
|
data/lib/js_routes/middleware.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# typed: strict
|
2
|
+
require "js_routes/types"
|
3
|
+
|
1
4
|
module JsRoutes
|
2
5
|
# A Rack middleware that automatically updates routes file
|
3
6
|
# whenever routes.rb is modified
|
@@ -5,12 +8,19 @@ module JsRoutes
|
|
5
8
|
# Inspired by
|
6
9
|
# https://github.com/fnando/i18n-js/blob/main/lib/i18n/js/middleware.rb
|
7
10
|
class Middleware
|
11
|
+
include JsRoutes::Types
|
12
|
+
include RackApp
|
13
|
+
|
14
|
+
extend T::Sig
|
15
|
+
|
16
|
+
sig { params(app: T.untyped).void }
|
8
17
|
def initialize(app)
|
9
18
|
@app = app
|
10
|
-
@routes_file = Rails.root.join("config/routes.rb")
|
11
|
-
@mtime = nil
|
19
|
+
@routes_file = T.let(Rails.root.join("config/routes.rb"), Pathname)
|
20
|
+
@mtime = T.let(nil, T.nilable(Time))
|
12
21
|
end
|
13
22
|
|
23
|
+
sig { override.params(env: StringHash).returns(UntypedArray) }
|
14
24
|
def call(env)
|
15
25
|
update_js_routes
|
16
26
|
@app.call(env)
|
@@ -18,6 +28,7 @@ module JsRoutes
|
|
18
28
|
|
19
29
|
protected
|
20
30
|
|
31
|
+
sig { void }
|
21
32
|
def update_js_routes
|
22
33
|
new_mtime = routes_mtime
|
23
34
|
unless new_mtime == @mtime
|
@@ -26,11 +37,13 @@ module JsRoutes
|
|
26
37
|
end
|
27
38
|
end
|
28
39
|
|
40
|
+
sig { void }
|
29
41
|
def regenerate
|
30
42
|
JsRoutes.generate!
|
31
|
-
JsRoutes.definitions!
|
43
|
+
JsRoutes.definitions! if JsRoutes.configuration.modern?
|
32
44
|
end
|
33
45
|
|
46
|
+
sig { returns(T.nilable(Time)) }
|
34
47
|
def routes_mtime
|
35
48
|
File.mtime(@routes_file)
|
36
49
|
rescue Errno::ENOENT
|
data/lib/js_routes/route.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "js_routes/types"
|
4
|
+
require "action_dispatch/journey/route"
|
5
|
+
|
1
6
|
module JsRoutes
|
2
7
|
class Route #:nodoc:
|
3
|
-
|
4
|
-
|
5
|
-
|
8
|
+
include JsRoutes::Types
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
FILTERED_DEFAULT_PARTS = T.let([:controller, :action].freeze, SymbolArray)
|
12
|
+
URL_OPTIONS = T.let([:protocol, :domain, :host, :port, :subdomain].freeze, SymbolArray)
|
13
|
+
NODE_TYPES = T.let({
|
6
14
|
GROUP: 1,
|
7
15
|
CAT: 2,
|
8
16
|
SYMBOL: 3,
|
@@ -11,84 +19,110 @@ module JsRoutes
|
|
11
19
|
LITERAL: 6,
|
12
20
|
SLASH: 7,
|
13
21
|
DOT: 8
|
14
|
-
}
|
22
|
+
}.freeze, T::Hash[Symbol, Integer])
|
15
23
|
|
16
|
-
|
24
|
+
sig {returns(JsRoutes::Configuration)}
|
25
|
+
attr_reader :configuration
|
17
26
|
|
27
|
+
sig {returns(JourneyRoute)}
|
28
|
+
attr_reader :route
|
29
|
+
|
30
|
+
sig {returns(T.nilable(JourneyRoute))}
|
31
|
+
attr_reader :parent_route
|
32
|
+
|
33
|
+
sig { params(configuration: JsRoutes::Configuration, route: JourneyRoute, parent_route: T.nilable(JourneyRoute)).void }
|
18
34
|
def initialize(configuration, route, parent_route = nil)
|
19
35
|
@configuration = configuration
|
20
36
|
@route = route
|
21
37
|
@parent_route = parent_route
|
22
38
|
end
|
23
39
|
|
40
|
+
sig { returns(T::Array[StringArray]) }
|
24
41
|
def helpers
|
25
42
|
helper_types.map do |absolute|
|
26
43
|
[ documentation, helper_name(absolute), body(absolute) ]
|
27
44
|
end
|
28
45
|
end
|
29
46
|
|
47
|
+
sig {returns(T::Array[T::Boolean])}
|
30
48
|
def helper_types
|
31
49
|
return [] unless match_configuration?
|
32
|
-
@configuration
|
50
|
+
@configuration.url_links ? [true, false] : [false]
|
33
51
|
end
|
34
52
|
|
53
|
+
sig { params(absolute: T::Boolean).returns(String) }
|
35
54
|
def body(absolute)
|
36
55
|
if @configuration.dts?
|
37
56
|
definition_body
|
38
57
|
else
|
39
58
|
# For tree-shaking ESM, add a #__PURE__ comment informing Webpack/minifiers that the call to `__jsr.r`
|
40
59
|
# has no side-effects (e.g. modifying global variables) and is safe to remove when unused.
|
41
|
-
# https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-
|
60
|
+
# https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-sidyeeffects
|
42
61
|
pure_comment = @configuration.esm? ? '/*#__PURE__*/ ' : ''
|
43
62
|
"#{pure_comment}__jsr.r(#{arguments(absolute).map{|a| json(a)}.join(', ')})"
|
44
63
|
end
|
45
64
|
end
|
46
65
|
|
66
|
+
sig { returns(String) }
|
47
67
|
def definition_body
|
68
|
+
options_type = optional_parts_type ? "#{optional_parts_type} & RouteOptions" : "RouteOptions"
|
48
69
|
args = required_parts.map{|p| "#{apply_case(p)}: RequiredRouteParameter"}
|
49
|
-
args << "options?: #{
|
70
|
+
args << "options?: #{options_type}"
|
50
71
|
"((\n#{args.join(",\n").indent(2)}\n) => string) & RouteHelperExtras"
|
51
72
|
end
|
52
73
|
|
74
|
+
sig { returns(T.nilable(String)) }
|
53
75
|
def optional_parts_type
|
54
|
-
|
55
|
-
|
76
|
+
return nil if optional_parts.empty?
|
77
|
+
@optional_parts_type ||= T.let(
|
78
|
+
"{" + optional_parts.map {|p| "#{p}?: OptionalRouteParameter"}.join(', ') + "}",
|
79
|
+
T.nilable(String)
|
80
|
+
)
|
56
81
|
end
|
57
82
|
|
58
83
|
protected
|
59
84
|
|
85
|
+
|
86
|
+
sig { params(absolute: T::Boolean).returns(UntypedArray) }
|
60
87
|
def arguments(absolute)
|
61
88
|
absolute ? [*base_arguments, true] : base_arguments
|
62
89
|
end
|
63
90
|
|
91
|
+
sig { returns(T::Boolean) }
|
64
92
|
def match_configuration?
|
65
|
-
!match?(@configuration
|
93
|
+
!match?(@configuration.exclude) && match?(@configuration.include)
|
66
94
|
end
|
67
95
|
|
96
|
+
sig { returns(T.nilable(String)) }
|
68
97
|
def base_name
|
69
|
-
@base_name ||= parent_route ?
|
70
|
-
[parent_route
|
98
|
+
@base_name ||= T.let(parent_route ?
|
99
|
+
[parent_route&.name, route.name].join('_') : route.name, T.nilable(String))
|
71
100
|
end
|
72
101
|
|
102
|
+
sig { returns(T.nilable(RouteSpec)) }
|
73
103
|
def parent_spec
|
74
104
|
parent_route&.path&.spec
|
75
105
|
end
|
76
106
|
|
107
|
+
sig { returns(RouteSpec) }
|
77
108
|
def spec
|
78
109
|
route.path.spec
|
79
110
|
end
|
80
111
|
|
112
|
+
sig { params(value: T.untyped).returns(String) }
|
81
113
|
def json(value)
|
82
114
|
JsRoutes.json(value)
|
83
115
|
end
|
84
116
|
|
117
|
+
sig { params(absolute: T::Boolean).returns(String) }
|
85
118
|
def helper_name(absolute)
|
86
|
-
suffix = absolute ? :url : @configuration
|
119
|
+
suffix = absolute ? :url : @configuration.compact ? nil : :path
|
87
120
|
apply_case(base_name, suffix)
|
88
121
|
end
|
89
122
|
|
123
|
+
sig { returns(String) }
|
90
124
|
def documentation
|
91
|
-
return
|
125
|
+
return '' unless @configuration.documentation
|
92
126
|
<<-JS
|
93
127
|
/**
|
94
128
|
* Generates rails route to
|
@@ -99,18 +133,22 @@ module JsRoutes
|
|
99
133
|
JS
|
100
134
|
end
|
101
135
|
|
136
|
+
sig { returns(SymbolArray) }
|
102
137
|
def required_parts
|
103
138
|
route.required_parts
|
104
139
|
end
|
105
140
|
|
141
|
+
sig { returns(SymbolArray) }
|
106
142
|
def optional_parts
|
107
143
|
route.path.optional_names
|
108
144
|
end
|
109
145
|
|
146
|
+
sig { returns(UntypedArray) }
|
110
147
|
def base_arguments
|
111
|
-
@base_arguments ||= [parts_table, serialize(spec, parent_spec)]
|
148
|
+
@base_arguments ||= T.let([parts_table, serialize(spec, parent_spec)], T.nilable(UntypedArray))
|
112
149
|
end
|
113
150
|
|
151
|
+
sig { returns(T::Hash[Symbol, Options]) }
|
114
152
|
def parts_table
|
115
153
|
parts_table = {}
|
116
154
|
route.parts.each do |part, hash|
|
@@ -131,25 +169,29 @@ JS
|
|
131
169
|
parts_table
|
132
170
|
end
|
133
171
|
|
172
|
+
sig { returns(String) }
|
134
173
|
def documentation_params
|
135
174
|
required_parts.map do |param|
|
136
175
|
"\n * @param {any} #{apply_case(param)}"
|
137
176
|
end.join
|
138
177
|
end
|
139
178
|
|
179
|
+
sig { params(matchers: Clusivity).returns(T::Boolean) }
|
140
180
|
def match?(matchers)
|
141
181
|
Array(matchers).any? { |regex| base_name =~ regex }
|
142
182
|
end
|
143
183
|
|
184
|
+
sig { params(values: T.nilable(Literal)).returns(String) }
|
144
185
|
def apply_case(*values)
|
145
186
|
value = values.compact.map(&:to_s).join('_')
|
146
|
-
@configuration
|
187
|
+
@configuration.camel_case ? value.camelize(:lower) : value
|
147
188
|
end
|
148
189
|
|
149
190
|
# This function serializes Journey route into JSON structure
|
150
191
|
# We do not use Hash for human readable serialization
|
151
192
|
# And preffer Array serialization because it is shorter.
|
152
193
|
# Routes.js file will be smaller.
|
194
|
+
sig { params(spec: SpecNode, parent_spec: T.nilable(RouteSpec)).returns(T.nilable(T.any(UntypedArray, String))) }
|
153
195
|
def serialize(spec, parent_spec=nil)
|
154
196
|
return nil unless spec
|
155
197
|
# Rails 4 globbing requires * removal
|
@@ -168,6 +210,7 @@ JS
|
|
168
210
|
result
|
169
211
|
end
|
170
212
|
|
213
|
+
sig { params(spec: RouteSpec, parent_spec: T.nilable(RouteSpec)).returns(UntypedArray) }
|
171
214
|
def serialize_spec(spec, parent_spec = nil)
|
172
215
|
[
|
173
216
|
NODE_TYPES[spec.type],
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# typed: strict
|
2
|
+
require "action_dispatch/journey/route"
|
3
|
+
require "pathname"
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
module JsRoutes
|
7
|
+
module Types
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
UntypedArray = T.type_alias {T::Array[T.untyped]}
|
11
|
+
StringArray = T.type_alias {T::Array[String]}
|
12
|
+
SymbolArray = T.type_alias {T::Array[Symbol]}
|
13
|
+
StringHash = T.type_alias { T::Hash[String, T.untyped] }
|
14
|
+
Options = T.type_alias { T::Hash[Symbol, T.untyped] }
|
15
|
+
SpecNode = T.type_alias { T.any(String, RouteSpec, NilClass) }
|
16
|
+
Literal = T.type_alias { T.any(String, Symbol) }
|
17
|
+
JourneyRoute = T.type_alias{ActionDispatch::Journey::Route}
|
18
|
+
RouteSpec = T.type_alias {T.untyped}
|
19
|
+
Application = T.type_alias { T.any(T::Class[Rails::Engine], Rails::Application) }
|
20
|
+
ApplicationCaller = T.type_alias { T.proc.returns(Application) }
|
21
|
+
Clusivity = T.type_alias { T.any(Regexp, T::Array[Regexp]) }
|
22
|
+
FileName = T.type_alias { T.any(String, Pathname, NilClass) }
|
23
|
+
ConfigurationBlock = T.type_alias { T.proc.params(arg0: JsRoutes::Configuration).void }
|
24
|
+
Prefix = T.type_alias do
|
25
|
+
T.any(T.proc.returns(String), String, NilClass)
|
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
|
37
|
+
end
|
38
|
+
end
|
data/lib/js_routes/version.rb
CHANGED
data/lib/js_routes.rb
CHANGED
@@ -1,45 +1,63 @@
|
|
1
|
+
# typed: strict
|
1
2
|
if defined?(::Rails)
|
2
3
|
require 'js_routes/engine'
|
3
4
|
end
|
4
5
|
require 'js_routes/version'
|
5
6
|
require "js_routes/configuration"
|
6
7
|
require "js_routes/instance"
|
8
|
+
require "js_routes/types"
|
7
9
|
require 'active_support/core_ext/string/indent'
|
8
10
|
|
9
11
|
module JsRoutes
|
12
|
+
extend T::Sig
|
10
13
|
|
11
14
|
#
|
12
15
|
# API
|
13
16
|
#
|
14
17
|
|
15
18
|
class << self
|
19
|
+
include JsRoutes::Types
|
20
|
+
extend T::Sig
|
21
|
+
|
22
|
+
sig { params(block: ConfigurationBlock).void }
|
16
23
|
def setup(&block)
|
17
|
-
configuration.
|
24
|
+
configuration.setup(&block)
|
18
25
|
end
|
19
26
|
|
27
|
+
sig { returns(JsRoutes::Configuration) }
|
20
28
|
def configuration
|
21
|
-
@configuration ||= Configuration.new
|
29
|
+
@configuration ||= T.let(Configuration.new, T.nilable(JsRoutes::Configuration))
|
22
30
|
end
|
23
31
|
|
32
|
+
sig { params(opts: T.untyped).returns(String) }
|
24
33
|
def generate(**opts)
|
25
|
-
Instance.new(opts).generate
|
34
|
+
Instance.new(**opts).generate
|
26
35
|
end
|
27
36
|
|
37
|
+
sig { params(file_name: FileName, opts: T.untyped).void }
|
28
38
|
def generate!(file_name = configuration.file, **opts)
|
29
39
|
Instance.new(file: file_name, **opts).generate!
|
30
40
|
end
|
31
41
|
|
42
|
+
sig { params(file_name: FileName, opts: T.untyped).void }
|
43
|
+
def remove!(file_name = configuration.file, **opts)
|
44
|
+
Instance.new(file: file_name, **opts).remove!
|
45
|
+
end
|
46
|
+
|
47
|
+
sig { params(opts: T.untyped).returns(String) }
|
32
48
|
def definitions(**opts)
|
33
|
-
generate(module_type: 'DTS',
|
49
|
+
generate(**opts, module_type: 'DTS',)
|
34
50
|
end
|
35
51
|
|
52
|
+
sig { params(file_name: FileName, opts: T.untyped).void }
|
36
53
|
def definitions!(file_name = nil, **opts)
|
37
54
|
file_name ||= configuration.file&.sub(%r{(\.d)?\.(j|t)s\Z}, ".d.ts")
|
38
|
-
generate!(file_name, module_type: 'DTS'
|
55
|
+
generate!(file_name, **opts, module_type: 'DTS')
|
39
56
|
end
|
40
57
|
|
41
|
-
|
42
|
-
|
58
|
+
sig { params(value: T.untyped).returns(String) }
|
59
|
+
def json(value)
|
60
|
+
ActiveSupport::JSON.encode(value)
|
43
61
|
end
|
44
62
|
end
|
45
63
|
module Generators
|