js-routes 2.0.7 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/js_routes.rb CHANGED
@@ -7,48 +7,26 @@ require 'active_support/core_ext/string/indent'
7
7
 
8
8
  class JsRoutes
9
9
 
10
- #
11
- # OPTIONS
12
- #
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)
13
29
 
14
- DEFAULTS = {
15
- namespace: nil,
16
- exclude: [],
17
- include: //,
18
- file: -> do
19
- webpacker_dir = Rails.root.join('app', 'javascript')
20
- sprockets_dir = Rails.root.join('app','assets','javascripts')
21
- sprockets_file = sprockets_dir.join('routes.js')
22
- webpacker_file = webpacker_dir.join('routes.js')
23
- !Dir.exist?(webpacker_dir) && defined?(::Sprockets) ? sprockets_file : webpacker_file
24
- end,
25
- prefix: -> { Rails.application.config.relative_url_root || "" },
26
- url_links: false,
27
- camel_case: false,
28
- default_url_options: {},
29
- compact: false,
30
- serializer: nil,
31
- special_options_key: "_options",
32
- application: -> { Rails.application },
33
- module_type: 'ESM',
34
- documentation: true,
35
- } #:nodoc:
36
-
37
- NODE_TYPES = {
38
- GROUP: 1,
39
- CAT: 2,
40
- SYMBOL: 3,
41
- OR: 4,
42
- STAR: 5,
43
- LITERAL: 6,
44
- SLASH: 7,
45
- DOT: 8
46
- } #:nodoc:
47
-
48
- FILTERED_DEFAULT_PARTS = [:controller, :action] #:nodoc:
49
- URL_OPTIONS = [:protocol, :domain, :host, :port, :subdomain] #:nodoc:
50
-
51
- class Configuration < Struct.new(*DEFAULTS.keys)
52
30
  def initialize(attributes = nil)
53
31
  assign(DEFAULTS)
54
32
  return unless attributes
@@ -60,6 +38,7 @@ class JsRoutes
60
38
  value = value.call if value.is_a?(Proc)
61
39
  send(:"#{attribute}=", value)
62
40
  end
41
+ normalize_and_verify
63
42
  self
64
43
  end
65
44
 
@@ -76,7 +55,53 @@ class JsRoutes
76
55
  end
77
56
 
78
57
  def esm?
79
- self.module_type === '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
80
105
  end
81
106
  end
82
107
 
@@ -87,22 +112,28 @@ class JsRoutes
87
112
  class << self
88
113
  def setup(&block)
89
114
  configuration.tap(&block) if block
115
+ configuration.normalize_and_verify
90
116
  end
91
117
 
92
118
  def configuration
93
119
  @configuration ||= Configuration.new
94
120
  end
95
121
 
96
- def generate(opts = {})
122
+ def generate(**opts)
97
123
  new(opts).generate
98
124
  end
99
125
 
100
- def generate!(file_name=nil, opts = {})
101
- if file_name.is_a?(Hash)
102
- opts = file_name
103
- file_name = opts[:file]
104
- end
105
- 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{\.(j|t)s\Z}, ".d.ts")
136
+ generate!(file_name, module_type: 'DTS', **opts)
106
137
  end
107
138
 
108
139
  def json(string)
@@ -123,48 +154,55 @@ class JsRoutes
123
154
  if named_routes.to_a.empty? && application.respond_to?(:reload_routes!)
124
155
  application.reload_routes!
125
156
  end
157
+ content = File.read(@configuration.source_file)
126
158
 
127
- {
128
- 'GEM_VERSION' => JsRoutes::VERSION,
129
- 'ROUTES_OBJECT' => routes_object,
130
- 'RAILS_VERSION' => ActionPack.version,
131
- 'DEPRECATED_GLOBBING_BEHAVIOR' => ActionPack::VERSION::MAJOR == 4 && ActionPack::VERSION::MINOR == 0,
132
-
133
- 'APP_CLASS' => application.class.to_s,
134
- 'NAMESPACE' => json(@configuration.namespace),
135
- 'DEFAULT_URL_OPTIONS' => json(@configuration.default_url_options),
136
- 'PREFIX' => json(@configuration.prefix),
137
- 'SPECIAL_OPTIONS_KEY' => json(@configuration.special_options_key),
138
- 'SERIALIZER' => @configuration.serializer || json(nil),
139
- 'MODULE_TYPE' => json(@configuration.module_type),
140
- 'WRAPPER' => @configuration.esm? ? 'const __jsr = ' : '',
141
- }.inject(File.read(File.dirname(__FILE__) + "/routes.js")) do |js, (key, value)|
142
- js.gsub!("RubyVariables.#{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) ||
143
162
  raise("Missing key #{key} in JS template")
144
- end + routes_export
163
+ end
164
+ end
165
+ content + routes_export + prevent_types_export
145
166
  end
146
167
 
147
- def generate!(file_name = nil)
148
- # Some libraries like Devise do not yet loaded their routes so we will wait
149
- # 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
150
171
  # https://github.com/railsware/js-routes/issues/7
151
172
  Rails.configuration.after_initialize do
152
- file_name ||= self.class.configuration['file']
153
- file_path = Rails.root.join(file_name)
154
- js_content = generate
173
+ file_path = Rails.root.join(@configuration.output_file)
174
+ source_code = generate
155
175
 
156
176
  # We don't need to rewrite file if it already exist and have same content.
157
177
  # It helps asset pipeline or webpack understand that file wasn't changed.
158
- 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
159
179
 
160
180
  File.open(file_path, 'w') do |f|
161
- f.write js_content
181
+ f.write source_code
162
182
  end
163
183
  end
164
184
  end
165
185
 
166
186
  protected
167
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
+
168
206
  def application
169
207
  @configuration.application
170
208
  end
@@ -178,32 +216,52 @@ class JsRoutes
178
216
  end
179
217
 
180
218
  def routes_object
181
- return json({}) if @configuration.esm?
219
+ return json({}) if @configuration.modern?
182
220
  properties = routes_list.map do |comment, name, body|
183
221
  "#{comment}#{name}: #{body}".indent(2)
184
222
  end
185
223
  "{\n" + properties.join(",\n\n") + "}\n"
186
224
  end
187
225
 
188
- STATIC_EXPORTS = [:configure, :config, :serialize].map do |name|
189
- ["", name, "__jsr.#{name}"]
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
190
235
  end
191
236
 
192
237
  def routes_export
193
- return "" unless @configuration.esm?
194
- [*STATIC_EXPORTS, *routes_list].map do |comment, name, body|
195
- "#{comment}export const #{name} = #{body};"
196
- end.join("\n\n")
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? ? ': ' : ' = '
197
255
  end
198
256
 
199
257
  def routes_list
200
258
  named_routes.sort_by(&:first).flat_map do |_, route|
201
259
  route_helpers_if_match(route) + mounted_app_routes(route)
202
- end.compact
260
+ end
203
261
  end
204
262
 
205
263
  def mounted_app_routes(route)
206
- rails_engine_app = get_app_from_route(route)
264
+ rails_engine_app = app_from_route(route)
207
265
  if rails_engine_app.respond_to?(:superclass) &&
208
266
  rails_engine_app.superclass == Rails::Engine && !route.path.anchored
209
267
  rails_engine_app.routes.named_routes.flat_map do |_, engine_route|
@@ -214,7 +272,7 @@ class JsRoutes
214
272
  end
215
273
  end
216
274
 
217
- def get_app_from_route(route)
275
+ def app_from_route(route)
218
276
  # rails engine in Rails 4.2 use additional
219
277
  # ActionDispatch::Routing::Mapper::Constraints, which contain app
220
278
  if route.app.respond_to?(:app) && route.app.respond_to?(:constraints)
@@ -229,6 +287,19 @@ class JsRoutes
229
287
  end
230
288
 
231
289
  class JsRoute #:nodoc:
290
+ FILTERED_DEFAULT_PARTS = [:controller, :action]
291
+ URL_OPTIONS = [:protocol, :domain, :host, :port, :subdomain]
292
+ NODE_TYPES = {
293
+ GROUP: 1,
294
+ CAT: 2,
295
+ SYMBOL: 3,
296
+ OR: 4,
297
+ STAR: 5,
298
+ LITERAL: 6,
299
+ SLASH: 7,
300
+ DOT: 8
301
+ }
302
+
232
303
  attr_reader :configuration, :route, :parent_route
233
304
 
234
305
  def initialize(configuration, route, parent_route = nil)
@@ -238,22 +309,36 @@ class JsRoutes
238
309
  end
239
310
 
240
311
  def helpers
241
- unless match_configuration?
242
- []
243
- else
244
- [false, true].map do |absolute|
245
- absolute && !@configuration[:url_links] ?
246
- nil : [ documentation, helper_name(absolute), body(absolute) ]
247
- end
312
+ helper_types.map do |absolute|
313
+ [ documentation, helper_name(absolute), body(absolute) ]
248
314
  end
249
315
  end
250
316
 
317
+ def helper_types
318
+ return [] unless match_configuration?
319
+ @configuration[:url_links] ? [true, false] : [false]
320
+ end
321
+
251
322
  def body(absolute)
252
- "__jsr.r(#{arguments(absolute).join(', ')})"
323
+ @configuration.dts? ?
324
+ definition_body : "__jsr.r(#{arguments(absolute).map{|a| json(a)}.join(', ')})"
325
+ end
326
+
327
+ def definition_body
328
+ args = required_parts.map{|p| "#{apply_case(p)}: RequiredRouteParameter"}
329
+ args << "options?: #{optional_parts_type} & RouteOptions"
330
+ "((\n#{args.join(",\n").indent(2)}\n) => string) & RouteHelperExtras"
253
331
  end
254
332
 
333
+ def optional_parts_type
334
+ @optional_parts_type ||=
335
+ "{" + optional_parts.map {|p| "#{p}?: OptionalRouteParameter"}.join(', ') + "}"
336
+ end
337
+
338
+ protected
339
+
255
340
  def arguments(absolute)
256
- absolute ? base_arguments + [json(true)] : base_arguments
341
+ absolute ? [*base_arguments, true] : base_arguments
257
342
  end
258
343
 
259
344
  def match_configuration?
@@ -298,10 +383,15 @@ JS
298
383
  route.required_parts
299
384
  end
300
385
 
301
- protected
386
+ def optional_parts
387
+ route.path.optional_names
388
+ end
302
389
 
303
390
  def base_arguments
304
- return @base_arguments if defined?(@base_arguments)
391
+ @base_arguments ||= [parts_table, serialize(spec, parent_spec)]
392
+ end
393
+
394
+ def parts_table
305
395
  parts_table = {}
306
396
  route.parts.each do |part, hash|
307
397
  parts_table[part] ||= {}
@@ -318,11 +408,7 @@ JS
318
408
  parts_table[part][:d] = value
319
409
  end
320
410
  end
321
- @base_arguments = [
322
- parts_table, serialize(spec, parent_spec)
323
- ].map do |argument|
324
- json(argument)
325
- end
411
+ parts_table
326
412
  end
327
413
 
328
414
  def documentation_params
@@ -371,3 +457,5 @@ JS
371
457
  end
372
458
  end
373
459
  end
460
+
461
+ require "js_routes/generators/webpacker"
data/lib/routes.d.ts CHANGED
@@ -2,14 +2,38 @@
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
- declare type RouteParameter = unknown;
6
- declare type RouteParameters = Record<string, RouteParameter>;
7
- declare type Serializer = (value: unknown) => string;
8
- declare type RouteHelper = {
9
- (...args: RouteParameter[]): string;
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 = {
10
26
  requiredParams(): string[];
11
27
  toString(): string;
12
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;
13
37
  declare type RouteHelpers = Record<string, RouteHelper>;
14
38
  declare type Configuration = {
15
39
  prefix: string;
@@ -17,9 +41,6 @@ declare type Configuration = {
17
41
  special_options_key: string;
18
42
  serializer: Serializer;
19
43
  };
20
- declare type Optional<T> = {
21
- [P in keyof T]?: T[P] | null;
22
- };
23
44
  interface RouterExposedMethods {
24
45
  config(): Configuration;
25
46
  configure(arg: Partial<Configuration>): Configuration;
@@ -29,15 +50,16 @@ declare type KeywordUrlOptions = Optional<{
29
50
  host: string;
30
51
  protocol: string;
31
52
  subdomain: string;
32
- port: string;
53
+ port: string | number;
33
54
  anchor: string;
34
55
  trailing_slash: boolean;
35
56
  }>;
57
+ declare type RouteOptions = KeywordUrlOptions & RouteParameters;
36
58
  declare type PartsTable = Record<string, {
37
59
  r?: boolean;
38
- d?: unknown;
60
+ d?: OptionalRouteParameter;
39
61
  }>;
40
- declare type ModuleType = "CJS" | "AMD" | "UMD" | "ESM";
62
+ declare type ModuleType = "CJS" | "AMD" | "UMD" | "ESM" | "DTS" | "NIL";
41
63
  declare const RubyVariables: {
42
64
  PREFIX: string;
43
65
  DEPRECATED_GLOBBING_BEHAVIOR: boolean;
@@ -46,7 +68,7 @@ declare const RubyVariables: {
46
68
  SERIALIZER: Serializer;
47
69
  NAMESPACE: string;
48
70
  ROUTES_OBJECT: RouteHelpers;
49
- MODULE_TYPE: ModuleType | null;
71
+ MODULE_TYPE: ModuleType;
50
72
  WRAPPER: <T>(callback: T) => T;
51
73
  };
52
74
  declare const define: undefined | (((arg: unknown[], callback: () => unknown) => void) & {
data/lib/routes.js CHANGED
@@ -16,27 +16,35 @@ RubyVariables.WRAPPER((that) => {
16
16
  NodeTypes[NodeTypes["DOT"] = 8] = "DOT";
17
17
  })(NodeTypes || (NodeTypes = {}));
18
18
  const Root = that;
19
+ const isBroswer = typeof window !== "undefined";
19
20
  const ModuleReferences = {
20
21
  CJS: {
21
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
22
- define: (routes) => (module.exports = routes),
23
- support: () => typeof module === "object",
22
+ define(routes) {
23
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
24
+ module.exports = routes;
25
+ },
26
+ isSupported() {
27
+ return typeof module === "object";
28
+ },
24
29
  },
25
30
  AMD: {
26
- define: (routes) =>
27
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
28
- define([], function () {
29
- return routes;
30
- }),
31
- support: () => typeof define === "function" && !!define.amd,
31
+ define(routes) {
32
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
33
+ define([], function () {
34
+ return routes;
35
+ });
36
+ },
37
+ isSupported() {
38
+ return typeof define === "function" && !!define.amd;
39
+ },
32
40
  },
33
41
  UMD: {
34
- define: (routes) => {
35
- if (ModuleReferences.AMD.support()) {
42
+ define(routes) {
43
+ if (ModuleReferences.AMD.isSupported()) {
36
44
  ModuleReferences.AMD.define(routes);
37
45
  }
38
46
  else {
39
- if (ModuleReferences.CJS.support()) {
47
+ if (ModuleReferences.CJS.isSupported()) {
40
48
  try {
41
49
  ModuleReferences.CJS.define(routes);
42
50
  }
@@ -47,11 +55,36 @@ RubyVariables.WRAPPER((that) => {
47
55
  }
48
56
  }
49
57
  },
50
- support: () => ModuleReferences.AMD.support() || ModuleReferences.CJS.support(),
58
+ isSupported() {
59
+ return (ModuleReferences.AMD.isSupported() ||
60
+ ModuleReferences.CJS.isSupported());
61
+ },
51
62
  },
52
63
  ESM: {
53
- define: () => null,
54
- support: () => true,
64
+ define() {
65
+ // Module can only be defined using ruby code generation
66
+ },
67
+ isSupported() {
68
+ // Its impossible to check if "export" keyword is supported
69
+ return true;
70
+ },
71
+ },
72
+ NIL: {
73
+ define(routes) {
74
+ Utils.namespace(Root, RubyVariables.NAMESPACE, routes);
75
+ },
76
+ isSupported() {
77
+ return !!Root;
78
+ },
79
+ },
80
+ DTS: {
81
+ // Acts the same as ESM
82
+ define(routes) {
83
+ ModuleReferences.ESM.define(routes);
84
+ },
85
+ isSupported() {
86
+ return ModuleReferences.ESM.isSupported();
87
+ },
55
88
  },
56
89
  };
57
90
  class ParametersMissing extends Error {
@@ -62,7 +95,6 @@ RubyVariables.WRAPPER((that) => {
62
95
  this.name = ParametersMissing.name;
63
96
  }
64
97
  }
65
- const DeprecatedGlobbingBehavior = RubyVariables.DEPRECATED_GLOBBING_BEHAVIOR;
66
98
  const UriEncoderSegmentRegex = /[^a-zA-Z0-9\-._~!$&'()*+,;=:@]/g;
67
99
  const ReservedOptions = [
68
100
  "anchor",
@@ -140,7 +172,7 @@ RubyVariables.WRAPPER((that) => {
140
172
  }
141
173
  looks_like_serialized_model(object) {
142
174
  return (this.is_object(object) &&
143
- !object[this.configuration.special_options_key] &&
175
+ !(this.configuration.special_options_key in object) &&
144
176
  ("id" in object || "to_param" in object || "toParam" in object));
145
177
  }
146
178
  path_identifier(object) {
@@ -298,9 +330,7 @@ RubyVariables.WRAPPER((that) => {
298
330
  }
299
331
  }
300
332
  encode_segment(segment) {
301
- return segment.replace(UriEncoderSegmentRegex, function (str) {
302
- return encodeURIComponent(str);
303
- });
333
+ return segment.replace(UriEncoderSegmentRegex, (str) => encodeURIComponent(str));
304
334
  }
305
335
  is_optional_node(node) {
306
336
  return [NodeTypes.STAR, NodeTypes.SYMBOL, NodeTypes.CAT].includes(node);
@@ -342,7 +372,9 @@ RubyVariables.WRAPPER((that) => {
342
372
  value = value.join("/");
343
373
  }
344
374
  const result = this.path_identifier(value);
345
- return DeprecatedGlobbingBehavior ? result : encodeURI(result);
375
+ return RubyVariables.DEPRECATED_GLOBBING_BEHAVIOR
376
+ ? result
377
+ : encodeURI(result);
346
378
  }
347
379
  get_prefix() {
348
380
  const prefix = this.configuration.prefix;
@@ -386,32 +418,17 @@ RubyVariables.WRAPPER((that) => {
386
418
  port = port ? ":" + port : "";
387
419
  return protocol + "://" + subdomain + hostname + port;
388
420
  }
389
- has_location() {
390
- return this.is_not_nullable(window) && !!window.location;
391
- }
392
421
  current_host() {
393
- if (this.has_location()) {
394
- return window.location.hostname;
395
- }
396
- else {
397
- return null;
398
- }
422
+ var _a;
423
+ return (isBroswer && ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.hostname)) || "";
399
424
  }
400
425
  current_protocol() {
401
- if (this.has_location() && window.location.protocol !== "") {
402
- return window.location.protocol.replace(/:$/, "");
403
- }
404
- else {
405
- return "http";
406
- }
426
+ var _a, _b;
427
+ return ((isBroswer && ((_b = (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.protocol) === null || _b === void 0 ? void 0 : _b.replace(/:$/, ""))) || "http");
407
428
  }
408
429
  current_port() {
409
- if (this.has_location() && window.location.port !== "") {
410
- return window.location.port;
411
- }
412
- else {
413
- return "";
414
- }
430
+ var _a;
431
+ return (isBroswer && ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.port)) || "";
415
432
  }
416
433
  is_object(value) {
417
434
  return (typeof value === "object" &&
@@ -449,7 +466,7 @@ RubyVariables.WRAPPER((that) => {
449
466
  return { ...this.configuration };
450
467
  }
451
468
  is_module_supported(name) {
452
- return ModuleReferences[name].support();
469
+ return ModuleReferences[name].isSupported();
453
470
  }
454
471
  ensure_module_supported(name) {
455
472
  if (!this.is_module_supported(name)) {
@@ -457,9 +474,6 @@ RubyVariables.WRAPPER((that) => {
457
474
  }
458
475
  }
459
476
  define_module(name, module) {
460
- if (!name) {
461
- return;
462
- }
463
477
  this.ensure_module_supported(name);
464
478
  ModuleReferences[name].define(module);
465
479
  }
@@ -484,9 +498,6 @@ RubyVariables.WRAPPER((that) => {
484
498
  },
485
499
  ...RubyVariables.ROUTES_OBJECT,
486
500
  };
487
- Utils.namespace(Root, RubyVariables.NAMESPACE, result);
488
- if (RubyVariables.MODULE_TYPE) {
489
- Utils.define_module(RubyVariables.MODULE_TYPE, result);
490
- }
501
+ Utils.define_module(RubyVariables.MODULE_TYPE, result);
491
502
  return result;
492
503
  })(this);