js-routes 1.4.9 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +15 -0
  3. data/.gitignore +5 -0
  4. data/.nvmrc +1 -0
  5. data/.travis.yml +2 -1
  6. data/CHANGELOG.md +85 -0
  7. data/Rakefile +5 -2
  8. data/Readme.md +274 -98
  9. data/VERSION_2_UPGRADE.md +66 -0
  10. data/js-routes.gemspec +8 -5
  11. data/lib/js_routes/engine.rb +0 -1
  12. data/lib/js_routes/generators/middleware.rb +33 -0
  13. data/lib/js_routes/generators/webpacker.rb +32 -0
  14. data/lib/js_routes/middleware.rb +36 -0
  15. data/lib/js_routes/version.rb +1 -1
  16. data/lib/js_routes.rb +341 -171
  17. data/lib/routes.d.ts +79 -0
  18. data/lib/routes.js +501 -519
  19. data/lib/routes.ts +737 -0
  20. data/lib/tasks/js_routes.rake +8 -2
  21. data/lib/templates/erb.js +11 -0
  22. data/lib/templates/initializer.rb +5 -0
  23. data/lib/templates/routes.js.erb +1 -0
  24. data/package.json +37 -0
  25. data/spec/dummy/app/assets/config/manifest.js +2 -0
  26. data/spec/js_routes/default_serializer_spec.rb +19 -3
  27. data/spec/js_routes/{amd_compatibility_spec.rb → module_types/amd_spec.rb} +7 -14
  28. data/spec/js_routes/module_types/cjs_spec.rb +15 -0
  29. data/spec/js_routes/module_types/dts/routes.spec.d.ts +114 -0
  30. data/spec/js_routes/module_types/dts/test.spec.ts +56 -0
  31. data/spec/js_routes/module_types/dts_spec.rb +111 -0
  32. data/spec/js_routes/module_types/esm_spec.rb +45 -0
  33. data/spec/js_routes/module_types/nil_spec.rb +86 -0
  34. data/spec/js_routes/{generated_javascript_spec.rb → module_types/umd_spec.rb} +33 -27
  35. data/spec/js_routes/options_spec.rb +67 -56
  36. data/spec/js_routes/rails_routes_compatibility_spec.rb +69 -25
  37. data/spec/js_routes/zzz_last_post_rails_init_spec.rb +4 -4
  38. data/spec/spec_helper.rb +34 -17
  39. data/spec/support/routes.rb +10 -4
  40. data/spec/tsconfig.json +4 -0
  41. data/tsconfig.json +28 -0
  42. data/yarn.lock +2145 -0
  43. metadata +42 -22
  44. data/lib/routes.js.coffee +0 -411
data/lib/js_routes.rb CHANGED
@@ -1,46 +1,32 @@
1
1
  require 'uri'
2
- require 'js_routes/engine' if defined?(Rails)
2
+ if defined?(::Rails) && defined?(::Sprockets::Railtie)
3
+ require 'js_routes/engine'
4
+ end
3
5
  require 'js_routes/version'
6
+ require 'active_support/core_ext/string/indent'
4
7
 
5
8
  class JsRoutes
6
9
 
7
- #
8
- # OPTIONS
9
- #
10
+ class Configuration
11
+ DEFAULTS = {
12
+ namespace: nil,
13
+ exclude: [],
14
+ include: //,
15
+ file: nil,
16
+ prefix: -> { Rails.application.config.relative_url_root || "" },
17
+ url_links: false,
18
+ camel_case: false,
19
+ default_url_options: {},
20
+ compact: false,
21
+ serializer: nil,
22
+ special_options_key: "_options",
23
+ application: -> { Rails.application },
24
+ module_type: 'ESM',
25
+ documentation: true,
26
+ } #:nodoc:
27
+
28
+ attr_accessor(*DEFAULTS.keys)
10
29
 
11
- DEFAULT_PATH = File.join('app','assets','javascripts','routes.js')
12
-
13
- DEFAULTS = {
14
- namespace: "Routes",
15
- exclude: [],
16
- include: //,
17
- file: DEFAULT_PATH,
18
- prefix: -> { Rails.application.config.relative_url_root || "" },
19
- url_links: false,
20
- camel_case: false,
21
- default_url_options: {},
22
- compact: false,
23
- serializer: nil,
24
- special_options_key: "_options",
25
- application: -> { Rails.application }
26
- }
27
-
28
- NODE_TYPES = {
29
- GROUP: 1,
30
- CAT: 2,
31
- SYMBOL: 3,
32
- OR: 4,
33
- STAR: 5,
34
- LITERAL: 6,
35
- SLASH: 7,
36
- DOT: 8
37
- }
38
-
39
- LAST_OPTIONS_KEY = "options".freeze
40
- FILTERED_DEFAULT_PARTS = [:controller, :action]
41
- URL_OPTIONS = [:protocol, :domain, :host, :port, :subdomain]
42
-
43
- class Configuration < Struct.new(*DEFAULTS.keys)
44
30
  def initialize(attributes = nil)
45
31
  assign(DEFAULTS)
46
32
  return unless attributes
@@ -52,6 +38,7 @@ class JsRoutes
52
38
  value = value.call if value.is_a?(Proc)
53
39
  send(:"#{attribute}=", value)
54
40
  end
41
+ normalize_and_verify
55
42
  self
56
43
  end
57
44
 
@@ -66,6 +53,56 @@ class JsRoutes
66
53
  def to_hash
67
54
  Hash[*members.zip(values).flatten(1)].symbolize_keys
68
55
  end
56
+
57
+ def esm?
58
+ module_type === 'ESM'
59
+ end
60
+
61
+ def dts?
62
+ self.module_type === 'DTS'
63
+ end
64
+
65
+ def modern?
66
+ esm? || dts?
67
+ end
68
+
69
+ def require_esm
70
+ raise "ESM module type is required" unless modern?
71
+ end
72
+
73
+ def source_file
74
+ File.dirname(__FILE__) + "/" + default_file_name
75
+ end
76
+
77
+ def output_file
78
+ webpacker_dir = Rails.root.join('app', 'javascript')
79
+ sprockets_dir = Rails.root.join('app','assets','javascripts')
80
+ file_name = file || default_file_name
81
+ sprockets_file = sprockets_dir.join(file_name)
82
+ webpacker_file = webpacker_dir.join(file_name)
83
+ !Dir.exist?(webpacker_dir) && defined?(::Sprockets) ? sprockets_file : webpacker_file
84
+ end
85
+
86
+ def normalize_and_verify
87
+ normalize
88
+ verify
89
+ end
90
+
91
+ protected
92
+
93
+ def default_file_name
94
+ dts? ? "routes.d.ts" : "routes.js"
95
+ end
96
+
97
+ def normalize
98
+ self.module_type = module_type&.upcase || 'NIL'
99
+ end
100
+
101
+ def verify
102
+ if module_type != 'NIL' && namespace
103
+ raise "JsRoutes namespace option can only be used if module_type is nil"
104
+ end
105
+ end
69
106
  end
70
107
 
71
108
  #
@@ -75,27 +112,28 @@ class JsRoutes
75
112
  class << self
76
113
  def setup(&block)
77
114
  configuration.tap(&block) if block
78
- end
79
-
80
- def options
81
- ActiveSupport::Deprecation.warn('JsRoutes.options method is deprecated use JsRoutes.configuration instead')
82
- configuration
115
+ configuration.normalize_and_verify
83
116
  end
84
117
 
85
118
  def configuration
86
119
  @configuration ||= Configuration.new
87
120
  end
88
121
 
89
- def generate(opts = {})
122
+ def generate(**opts)
90
123
  new(opts).generate
91
124
  end
92
125
 
93
- def generate!(file_name=nil, opts = {})
94
- if file_name.is_a?(Hash)
95
- opts = file_name
96
- file_name = opts[:file]
97
- end
98
- new(opts).generate!(file_name)
126
+ def generate!(file_name=nil, **opts)
127
+ new(file: file_name, **opts).generate!
128
+ end
129
+
130
+ def definitions(**opts)
131
+ generate(module_type: 'DTS', **opts)
132
+ end
133
+
134
+ def definitions!(file_name = nil, **opts)
135
+ file_name ||= configuration.file&.sub(%r{(\.d)?\.(j|t)s\Z}, ".d.ts")
136
+ generate!(file_name, module_type: 'DTS', **opts)
99
137
  end
100
138
 
101
139
  def json(string)
@@ -113,184 +151,316 @@ class JsRoutes
113
151
 
114
152
  def generate
115
153
  # Ensure routes are loaded. If they're not, load them.
116
- if named_routes.to_a.empty? && application.respond_to?(:reload_routes!)
154
+ if named_routes.empty? && application.respond_to?(:reload_routes!)
117
155
  application.reload_routes!
118
156
  end
157
+ content = File.read(@configuration.source_file)
119
158
 
120
- {
121
- 'GEM_VERSION' => JsRoutes::VERSION,
122
- 'ROUTES' => js_routes,
123
- 'NODE_TYPES' => json(NODE_TYPES),
124
- 'RAILS_VERSION' => ActionPack.version,
125
- 'DEPRECATED_GLOBBING_BEHAVIOR' => ActionPack::VERSION::MAJOR == 4 && ActionPack::VERSION::MINOR == 0,
126
-
127
- 'APP_CLASS' => application.class.to_s,
128
- 'NAMESPACE' => json(@configuration.namespace),
129
- 'DEFAULT_URL_OPTIONS' => json(@configuration.default_url_options),
130
- 'PREFIX' => json(@configuration.prefix),
131
- 'SPECIAL_OPTIONS_KEY' => json(@configuration.special_options_key),
132
- 'SERIALIZER' => @configuration.serializer || json(nil),
133
- }.inject(File.read(File.dirname(__FILE__) + "/routes.js")) do |js, (key, value)|
134
- js.gsub!(key, value.to_s)
159
+ if !@configuration.dts?
160
+ content = js_variables.inject(content) do |js, (key, value)|
161
+ js.gsub!("RubyVariables.#{key}", value.to_s) ||
162
+ raise("Missing key #{key} in JS template")
163
+ end
135
164
  end
165
+ content + routes_export + prevent_types_export
136
166
  end
137
167
 
138
- def generate!(file_name = nil)
139
- # Some libraries like Devise do not yet loaded their routes so we will wait
140
- # until initialization process finish
168
+ def generate!
169
+ # Some libraries like Devise did not load their routes yet
170
+ # so we will wait until initialization process finishes
141
171
  # https://github.com/railsware/js-routes/issues/7
142
172
  Rails.configuration.after_initialize do
143
- file_name ||= self.class.configuration['file']
144
- file_path = Rails.root.join(file_name)
145
- js_content = generate
173
+ file_path = Rails.root.join(@configuration.output_file)
174
+ source_code = generate
146
175
 
147
176
  # We don't need to rewrite file if it already exist and have same content.
148
177
  # It helps asset pipeline or webpack understand that file wasn't changed.
149
- next if File.exist?(file_path) && File.read(file_path) == js_content
178
+ next if File.exist?(file_path) && File.read(file_path) == source_code
150
179
 
151
180
  File.open(file_path, 'w') do |f|
152
- f.write js_content
181
+ f.write source_code
153
182
  end
154
183
  end
155
184
  end
156
185
 
157
186
  protected
158
187
 
188
+ def js_variables
189
+ {
190
+ 'GEM_VERSION' => JsRoutes::VERSION,
191
+ 'ROUTES_OBJECT' => routes_object,
192
+ 'RAILS_VERSION' => ActionPack.version,
193
+ 'DEPRECATED_GLOBBING_BEHAVIOR' => ActionPack::VERSION::MAJOR == 4 && ActionPack::VERSION::MINOR == 0,
194
+
195
+ 'APP_CLASS' => application.class.to_s,
196
+ 'NAMESPACE' => json(@configuration.namespace),
197
+ 'DEFAULT_URL_OPTIONS' => json(@configuration.default_url_options),
198
+ 'PREFIX' => json(@configuration.prefix),
199
+ 'SPECIAL_OPTIONS_KEY' => json(@configuration.special_options_key),
200
+ 'SERIALIZER' => @configuration.serializer || json(nil),
201
+ 'MODULE_TYPE' => json(@configuration.module_type),
202
+ 'WRAPPER' => @configuration.esm? ? 'const __jsr = ' : '',
203
+ }
204
+ end
205
+
159
206
  def application
160
207
  @configuration.application
161
208
  end
162
209
 
210
+ def json(string)
211
+ self.class.json(string)
212
+ end
213
+
163
214
  def named_routes
164
215
  application.routes.named_routes.to_a
165
216
  end
166
217
 
167
- def js_routes
168
- js_routes = named_routes.sort_by(&:first).flat_map do |_, route|
169
- [build_route_if_match(route)] + mounted_app_routes(route)
170
- end.compact
171
- "{\n" + js_routes.join(",\n") + "}\n"
218
+ def routes_object
219
+ return json({}) if @configuration.modern?
220
+ properties = routes_list.map do |comment, name, body|
221
+ "#{comment}#{name}: #{body}".indent(2)
222
+ end
223
+ "{\n" + properties.join(",\n\n") + "}\n"
224
+ end
225
+
226
+ def static_exports
227
+ [:configure, :config, :serialize].map do |name|
228
+ [
229
+ "", name,
230
+ @configuration.dts? ?
231
+ "RouterExposedMethods['#{name}']" :
232
+ "__jsr.#{name}"
233
+ ]
234
+ end
235
+ end
236
+
237
+ def routes_export
238
+ return "" unless @configuration.modern?
239
+ [*static_exports, *routes_list].map do |comment, name, body|
240
+ "#{comment}export const #{name}#{export_separator}#{body};\n\n"
241
+ end.join
242
+ end
243
+
244
+ def prevent_types_export
245
+ return "" unless @configuration.dts?
246
+ <<-JS
247
+ // By some reason this line prevents all types in a file
248
+ // from being automatically exported
249
+ export {};
250
+ JS
251
+ end
252
+
253
+ def export_separator
254
+ @configuration.dts? ? ': ' : ' = '
255
+ end
256
+
257
+ def routes_list
258
+ named_routes.sort_by(&:first).flat_map do |_, route|
259
+ route_helpers_if_match(route) + mounted_app_routes(route)
260
+ end
172
261
  end
173
262
 
174
263
  def mounted_app_routes(route)
175
- rails_engine_app = get_app_from_route(route)
264
+ rails_engine_app = app_from_route(route)
176
265
  if rails_engine_app.respond_to?(:superclass) &&
177
266
  rails_engine_app.superclass == Rails::Engine && !route.path.anchored
178
- rails_engine_app.routes.named_routes.map do |_, engine_route|
179
- build_route_if_match(engine_route, route)
267
+ rails_engine_app.routes.named_routes.flat_map do |_, engine_route|
268
+ route_helpers_if_match(engine_route, route)
180
269
  end
181
270
  else
182
271
  []
183
272
  end
184
273
  end
185
274
 
186
- def get_app_from_route(route)
275
+ def app_from_route(route)
276
+ app = route.app
187
277
  # rails engine in Rails 4.2 use additional
188
278
  # ActionDispatch::Routing::Mapper::Constraints, which contain app
189
- if route.app.respond_to?(:app) && route.app.respond_to?(:constraints)
190
- route.app.app
279
+ if app.respond_to?(:app) && app.respond_to?(:constraints)
280
+ app.app
191
281
  else
192
- route.app
282
+ app
193
283
  end
194
284
  end
195
285
 
196
- def build_route_if_match(route, parent_route = nil)
197
- if any_match?(route, parent_route, @configuration[:exclude]) ||
198
- !any_match?(route, parent_route, @configuration[:include])
199
- nil
200
- else
201
- build_js(route, parent_route)
202
- end
286
+ def route_helpers_if_match(route, parent_route = nil)
287
+ JsRoute.new(@configuration, route, parent_route).helpers
203
288
  end
204
289
 
205
- def any_match?(route, parent_route, matchers)
206
- full_route = [parent_route.try(:name), route.name].compact.join('_')
290
+ class JsRoute #:nodoc:
291
+ FILTERED_DEFAULT_PARTS = [:controller, :action]
292
+ URL_OPTIONS = [:protocol, :domain, :host, :port, :subdomain]
293
+ NODE_TYPES = {
294
+ GROUP: 1,
295
+ CAT: 2,
296
+ SYMBOL: 3,
297
+ OR: 4,
298
+ STAR: 5,
299
+ LITERAL: 6,
300
+ SLASH: 7,
301
+ DOT: 8
302
+ }
303
+
304
+ attr_reader :configuration, :route, :parent_route
305
+
306
+ def initialize(configuration, route, parent_route = nil)
307
+ @configuration = configuration
308
+ @route = route
309
+ @parent_route = parent_route
310
+ end
207
311
 
208
- matchers = Array(matchers)
209
- matchers.any? { |regex| full_route =~ regex }
210
- end
312
+ def helpers
313
+ helper_types.map do |absolute|
314
+ [ documentation, helper_name(absolute), body(absolute) ]
315
+ end
316
+ end
211
317
 
212
- def build_js(route, parent_route)
213
- name = [parent_route.try(:name), route.name].compact
214
- route_name = generate_route_name(name, (:path unless @configuration[:compact]))
215
- parent_spec = parent_route.try(:path).try(:spec)
216
- route_arguments = route_js_arguments(route, parent_spec)
217
- url_link = generate_url_link(name, route_arguments)
218
- _ = <<-JS.strip!
219
- // #{name.join('.')} => #{parent_spec}#{route.path.spec}
220
- // function(#{build_params(route.required_parts)})
221
- #{route_name}: Utils.route(#{route_arguments})#{",\n" + url_link if url_link.length > 0}
222
- JS
223
- end
318
+ def helper_types
319
+ return [] unless match_configuration?
320
+ @configuration[:url_links] ? [true, false] : [false]
321
+ end
224
322
 
225
- def route_js_arguments(route, parent_spec)
226
- required_parts = route.required_parts
227
- parts_table = route.parts.each_with_object({}) do |part, hash|
228
- hash[part] = required_parts.include?(part)
229
- end
230
- default_options = route.defaults.select do |part, _|
231
- FILTERED_DEFAULT_PARTS.exclude?(part) &&
232
- URL_OPTIONS.include?(part) || parts_table[part]
233
- end
234
- [
235
- # JS objects don't preserve the order of properties which is crucial,
236
- # so array is a better choice.
237
- parts_table.to_a,
238
- default_options,
239
- serialize(route.path.spec, parent_spec)
240
- ].map do |argument|
241
- json(argument)
242
- end.join(', ')
243
- end
323
+ def body(absolute)
324
+ @configuration.dts? ?
325
+ definition_body : "__jsr.r(#{arguments(absolute).map{|a| json(a)}.join(', ')})"
326
+ end
244
327
 
245
- def generate_url_link(name, route_arguments)
246
- return '' unless @configuration[:url_links]
328
+ def definition_body
329
+ args = required_parts.map{|p| "#{apply_case(p)}: RequiredRouteParameter"}
330
+ args << "options?: #{optional_parts_type} & RouteOptions"
331
+ "((\n#{args.join(",\n").indent(2)}\n) => string) & RouteHelperExtras"
332
+ end
247
333
 
248
- <<-JS.strip!
249
- #{generate_route_name(name, :url)}: Utils.route(#{route_arguments}, true)
250
- JS
251
- end
334
+ def optional_parts_type
335
+ @optional_parts_type ||=
336
+ "{" + optional_parts.map {|p| "#{p}?: OptionalRouteParameter"}.join(', ') + "}"
337
+ end
252
338
 
253
- def generate_route_name(*parts)
254
- route_name = parts.compact.join('_')
255
- @configuration[:camel_case] ? route_name.camelize(:lower) : route_name
256
- end
339
+ protected
257
340
 
258
- def json(string)
259
- self.class.json(string)
260
- end
341
+ def arguments(absolute)
342
+ absolute ? [*base_arguments, true] : base_arguments
343
+ end
261
344
 
262
- def build_params(required_parts)
263
- params = required_parts + [LAST_OPTIONS_KEY]
264
- params.join(', ')
265
- end
345
+ def match_configuration?
346
+ !match?(@configuration[:exclude]) && match?(@configuration[:include])
347
+ end
266
348
 
267
- # This function serializes Journey route into JSON structure
268
- # We do not use Hash for human readable serialization
269
- # And preffer Array serialization because it is shorter.
270
- # Routes.js file will be smaller.
271
- def serialize(spec, parent_spec=nil)
272
- return nil unless spec
273
- # Rails 4 globbing requires * removal
274
- return spec.tr(':*', '') if spec.is_a?(String)
275
-
276
- result = serialize_spec(spec, parent_spec)
277
- if parent_spec && result[1].is_a?(String)
278
- result = [
279
- # We encode node symbols as integer
280
- # to reduce the routes.js file size
281
- NODE_TYPES[:CAT],
282
- serialize_spec(parent_spec),
283
- result
284
- ]
349
+ def base_name
350
+ @base_name ||= parent_route ?
351
+ [parent_route.name, route.name].join('_') : route.name
285
352
  end
286
- result
287
- end
288
353
 
289
- def serialize_spec(spec, parent_spec = nil)
290
- [
291
- NODE_TYPES[spec.type],
292
- serialize(spec.left, parent_spec),
293
- spec.respond_to?(:right) && serialize(spec.right)
294
- ]
354
+ def parent_spec
355
+ parent_route&.path&.spec
356
+ end
357
+
358
+ def spec
359
+ route.path.spec
360
+ end
361
+
362
+ def json(value)
363
+ JsRoutes.json(value)
364
+ end
365
+
366
+ def helper_name(absolute)
367
+ suffix = absolute ? :url : @configuration[:compact] ? nil : :path
368
+ apply_case(base_name, suffix)
369
+ end
370
+
371
+ def documentation
372
+ return nil unless @configuration[:documentation]
373
+ <<-JS
374
+ /**
375
+ * Generates rails route to
376
+ * #{parent_spec}#{spec}#{documentation_params}
377
+ * @param {object | undefined} options
378
+ * @returns {string} route path
379
+ */
380
+ JS
381
+ end
382
+
383
+ def required_parts
384
+ route.required_parts
385
+ end
386
+
387
+ def optional_parts
388
+ route.path.optional_names
389
+ end
390
+
391
+ def base_arguments
392
+ @base_arguments ||= [parts_table, serialize(spec, parent_spec)]
393
+ end
394
+
395
+ def parts_table
396
+ parts_table = {}
397
+ route.parts.each do |part, hash|
398
+ parts_table[part] ||= {}
399
+ if required_parts.include?(part)
400
+ # Using shortened keys to reduce js file size
401
+ parts_table[part][:r] = true
402
+ end
403
+ end
404
+ route.defaults.each do |part, value|
405
+ if FILTERED_DEFAULT_PARTS.exclude?(part) &&
406
+ URL_OPTIONS.include?(part) || parts_table[part]
407
+ parts_table[part] ||= {}
408
+ # Using shortened keys to reduce js file size
409
+ parts_table[part][:d] = value
410
+ end
411
+ end
412
+ parts_table
413
+ end
414
+
415
+ def documentation_params
416
+ required_parts.map do |param|
417
+ "\n * @param {any} #{apply_case(param)}"
418
+ end.join
419
+ end
420
+
421
+ def match?(matchers)
422
+ Array(matchers).any? { |regex| base_name =~ regex }
423
+ end
424
+
425
+ def apply_case(*values)
426
+ value = values.compact.map(&:to_s).join('_')
427
+ @configuration[:camel_case] ? value.camelize(:lower) : value
428
+ end
429
+
430
+ # This function serializes Journey route into JSON structure
431
+ # We do not use Hash for human readable serialization
432
+ # And preffer Array serialization because it is shorter.
433
+ # Routes.js file will be smaller.
434
+ def serialize(spec, parent_spec=nil)
435
+ return nil unless spec
436
+ # Rails 4 globbing requires * removal
437
+ return spec.tr(':*', '') if spec.is_a?(String)
438
+
439
+ result = serialize_spec(spec, parent_spec)
440
+ if parent_spec && result[1].is_a?(String) && parent_spec.type != :SLASH
441
+ result = [
442
+ # We encode node symbols as integer
443
+ # to reduce the routes.js file size
444
+ NODE_TYPES[:CAT],
445
+ serialize_spec(parent_spec),
446
+ result
447
+ ]
448
+ end
449
+ result
450
+ end
451
+
452
+ def serialize_spec(spec, parent_spec = nil)
453
+ [
454
+ NODE_TYPES[spec.type],
455
+ serialize(spec.left, parent_spec),
456
+ spec.respond_to?(:right) ? serialize(spec.right) : nil
457
+ ].compact
458
+ end
459
+ end
460
+ module Generators
295
461
  end
296
462
  end
463
+
464
+ require "js_routes/middleware"
465
+ require "js_routes/generators/webpacker"
466
+ require "js_routes/generators/middleware"
data/lib/routes.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * File generated by js-routes RubyVariables.GEM_VERSION
3
+ * Based on Rails RubyVariables.RAILS_VERSION routes of RubyVariables.APP_CLASS
4
+ */
5
+ declare type Optional<T> = {
6
+ [P in keyof T]?: T[P] | null;
7
+ };
8
+ declare type BaseRouteParameter = string | boolean | Date | number;
9
+ declare type MethodRouteParameter = BaseRouteParameter | (() => BaseRouteParameter);
10
+ declare type ModelRouteParameter = {
11
+ id: MethodRouteParameter;
12
+ } | {
13
+ to_param: MethodRouteParameter;
14
+ } | {
15
+ toParam: MethodRouteParameter;
16
+ };
17
+ declare type RequiredRouteParameter = BaseRouteParameter | ModelRouteParameter;
18
+ declare type OptionalRouteParameter = undefined | null | RequiredRouteParameter;
19
+ declare type QueryRouteParameter = OptionalRouteParameter | QueryRouteParameter[] | {
20
+ [k: string]: QueryRouteParameter;
21
+ };
22
+ declare type RouteParameters = Record<string, QueryRouteParameter>;
23
+ declare type Serializable = Record<string, unknown>;
24
+ declare type Serializer = (value: Serializable) => string;
25
+ declare type RouteHelperExtras = {
26
+ requiredParams(): string[];
27
+ toString(): string;
28
+ };
29
+ declare type RequiredParameters<T extends number> = T extends 1 ? [RequiredRouteParameter] : T extends 2 ? [RequiredRouteParameter, RequiredRouteParameter] : T extends 3 ? [RequiredRouteParameter, RequiredRouteParameter, RequiredRouteParameter] : T extends 4 ? [
30
+ RequiredRouteParameter,
31
+ RequiredRouteParameter,
32
+ RequiredRouteParameter,
33
+ RequiredRouteParameter
34
+ ] : RequiredRouteParameter[];
35
+ declare type RouteHelperOptions<T extends string> = RouteOptions & Optional<Record<T, OptionalRouteParameter>>;
36
+ declare type RouteHelper<T extends number = number, U extends string = string> = ((...args: [...RequiredParameters<T>, RouteHelperOptions<U>]) => string) & RouteHelperExtras;
37
+ declare type RouteHelpers = Record<string, RouteHelper>;
38
+ declare type Configuration = {
39
+ prefix: string;
40
+ default_url_options: RouteParameters;
41
+ special_options_key: string;
42
+ serializer: Serializer;
43
+ };
44
+ interface RouterExposedMethods {
45
+ config(): Configuration;
46
+ configure(arg: Partial<Configuration>): Configuration;
47
+ serialize: Serializer;
48
+ }
49
+ declare type KeywordUrlOptions = Optional<{
50
+ host: string;
51
+ protocol: string;
52
+ subdomain: string;
53
+ port: string | number;
54
+ anchor: string;
55
+ trailing_slash: boolean;
56
+ }>;
57
+ declare type RouteOptions = KeywordUrlOptions & RouteParameters;
58
+ declare type PartsTable = Record<string, {
59
+ r?: boolean;
60
+ d?: OptionalRouteParameter;
61
+ }>;
62
+ declare type ModuleType = "CJS" | "AMD" | "UMD" | "ESM" | "DTS" | "NIL";
63
+ declare const RubyVariables: {
64
+ PREFIX: string;
65
+ DEPRECATED_GLOBBING_BEHAVIOR: boolean;
66
+ SPECIAL_OPTIONS_KEY: string;
67
+ DEFAULT_URL_OPTIONS: RouteParameters;
68
+ SERIALIZER: Serializer;
69
+ NAMESPACE: string;
70
+ ROUTES_OBJECT: RouteHelpers;
71
+ MODULE_TYPE: ModuleType;
72
+ WRAPPER: <T>(callback: T) => T;
73
+ };
74
+ declare const define: undefined | (((arg: unknown[], callback: () => unknown) => void) & {
75
+ amd?: unknown;
76
+ });
77
+ declare const module: {
78
+ exports: any;
79
+ } | undefined;