js-routes 2.2.7 → 2.2.8
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 +6 -0
- data/Readme.md +7 -6
- data/lib/js_routes/configuration.rb +1 -1
- data/lib/js_routes/generators/base.rb +1 -1
- data/lib/js_routes/generators/webpacker.rb +1 -1
- data/lib/js_routes/version.rb +1 -1
- data/lib/routes.js +25 -3
- data/lib/routes.ts +30 -6
- data/spec/js_routes/default_serializer_spec.rb +1 -1
- data/spec/js_routes/module_types/umd_spec.rb +1 -1
- data/spec/js_routes/rails_routes_compatibility_spec.rb +17 -12
- data/spec/js_routes/route_specification_spec.rb +1 -4
- data/spec/js_routes/{zzz_last_post_rails_init_spec.rb → zzz_sprockets_spec.rb} +1 -1
- data/spec/spec_helper.rb +4 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dfe30c594c24cf044d0f19342e17cd6b23857da7ec68a0bf68d8f8be9f33def
|
4
|
+
data.tar.gz: 3aefa8fc04221f07996ada7c57f35b22d2ae519575a6df0e20c6d860fe6203ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652fa60215a5c812e3a0cb0284870bfa63c6eeb1d249940388ade48a3f90a7209559d7cf66750e697ffc317bfcd1bec87e57fed44cad375795ead64fb1bcd254
|
7
|
+
data.tar.gz: a68bdb295fb704a5ed753d0576e700668aecfe30d5ec6d425ed458d029eb084de66ff26e0789c808e655574146973db02226a1a48f2cd81fa6ebda3379b7bc8c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## master
|
2
2
|
|
3
|
+
## v2.2.8
|
4
|
+
|
5
|
+
* Leave emoji symbols intact when encoding URI fragment [#312](https://github.com/railsware/js-routes/issues/312)
|
6
|
+
* Use webpacker config variable instead of hardcode [#309](https://github.com/railsware/js-routes/issues/309)
|
7
|
+
* Use `File.exist?` to be compatible with all versions of ruby [#310](https://github.com/railsware/js-routes/issues/310)
|
8
|
+
|
3
9
|
## v2.2.7
|
4
10
|
|
5
11
|
* Fix ESM Tree Shaking [#306](https://github.com/railsware/js-routes/issues/306)
|
data/Readme.md
CHANGED
@@ -16,16 +16,17 @@ gem "js-routes"
|
|
16
16
|
|
17
17
|
There are several possible ways to setup JsRoutes:
|
18
18
|
|
19
|
-
* [Quick and easy](#quick-start)
|
19
|
+
* [Quick and easy](#quick-start) - Recommended
|
20
20
|
* Uses Rack Middleware to automatically update routes locally
|
21
21
|
* Automatically generates routes files on javascript build
|
22
22
|
* Works great for a simple Rails application
|
23
|
-
* [Webpacker ERB Loader](#webpacker)
|
24
|
-
* Requires ESM module system (the default)
|
25
|
-
* Doesn't support typescript definitions
|
26
23
|
* [Advanced Setup](#advanced-setup)
|
27
24
|
* Allows very custom setups
|
28
|
-
*
|
25
|
+
* Automatic updates need to be customized
|
26
|
+
* [Webpacker ERB Loader](#webpacker) - Legacy
|
27
|
+
* Requires ESM module system (the default)
|
28
|
+
* Doesn't support typescript definitions
|
29
|
+
* [Sprockets](#sprockets) - Legacy
|
29
30
|
* Deprecated and not recommended for modern apps
|
30
31
|
|
31
32
|
<div id='quick-start'></div>
|
@@ -80,7 +81,7 @@ Add js-routes files to `.gitignore`:
|
|
80
81
|
|
81
82
|
### Webpacker ERB loader
|
82
83
|
|
83
|
-
**IMPORTANT**:
|
84
|
+
**IMPORTANT**: the setup doesn't support IDE autocompletion with [Typescript](https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html)
|
84
85
|
|
85
86
|
|
86
87
|
#### Use a Generator
|
@@ -75,7 +75,7 @@ module JsRoutes
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def output_file
|
78
|
-
webpacker_dir = pathname('app', 'javascript')
|
78
|
+
webpacker_dir = defined?(Webpacker) ? Webpacker.config.source_path : pathname('app', 'javascript')
|
79
79
|
sprockets_dir = pathname('app','assets','javascripts')
|
80
80
|
file_name = file || default_file_name
|
81
81
|
sprockets_file = sprockets_dir.join(file_name)
|
@@ -10,7 +10,7 @@ class JsRoutes::Generators::Base < Rails::Generators::Base
|
|
10
10
|
"app/javascript/packs/application.js",
|
11
11
|
"app/javascript/controllers/application.js",
|
12
12
|
].find do |path|
|
13
|
-
File.
|
13
|
+
File.exist?(Rails.root.join(path))
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -7,7 +7,7 @@ class JsRoutes::Generators::Webpacker < Rails::Generators::Base
|
|
7
7
|
def create_webpack
|
8
8
|
copy_file "initializer.rb", "config/initializers/js_routes.rb"
|
9
9
|
copy_file "erb.js", "config/webpack/loaders/erb.js"
|
10
|
-
copy_file "routes.js.erb", "
|
10
|
+
copy_file "routes.js.erb", "#{Webpacker.config.source_path}/routes.js.erb"
|
11
11
|
inject_into_file "config/webpack/environment.js", loader_content
|
12
12
|
if path = application_js_path
|
13
13
|
inject_into_file path, pack_content
|
data/lib/js_routes/version.rb
CHANGED
data/lib/routes.js
CHANGED
@@ -19,6 +19,14 @@ RubyVariables.WRAPPER(
|
|
19
19
|
NodeTypes[NodeTypes["DOT"] = 8] = "DOT";
|
20
20
|
})(NodeTypes || (NodeTypes = {}));
|
21
21
|
const isBrowser = typeof window !== "undefined";
|
22
|
+
const UnescapedSpecials = "-._~!$&'()*+,;=:@"
|
23
|
+
.split("")
|
24
|
+
.map((s) => s.charCodeAt(0));
|
25
|
+
const UnescapedRanges = [
|
26
|
+
["a", "z"],
|
27
|
+
["A", "Z"],
|
28
|
+
["0", "9"],
|
29
|
+
].map((range) => range.map((s) => s.charCodeAt(0)));
|
22
30
|
const ModuleReferences = {
|
23
31
|
CJS: {
|
24
32
|
define(routes) {
|
@@ -97,7 +105,6 @@ RubyVariables.WRAPPER(
|
|
97
105
|
this.name = ParametersMissing.name;
|
98
106
|
}
|
99
107
|
}
|
100
|
-
const UriEncoderSegmentRegex = /[^a-zA-Z0-9\-._~!$&'()*+,;=:@]/g;
|
101
108
|
const ReservedOptions = [
|
102
109
|
"anchor",
|
103
110
|
"trailing_slash",
|
@@ -349,7 +356,22 @@ RubyVariables.WRAPPER(
|
|
349
356
|
}
|
350
357
|
}
|
351
358
|
encode_segment(segment) {
|
352
|
-
|
359
|
+
if (segment.match(/^[a-zA-Z0-9-]$/)) {
|
360
|
+
// Performance optimization for 99% of cases
|
361
|
+
return segment;
|
362
|
+
}
|
363
|
+
return (segment.match(/./gu) || [])
|
364
|
+
.map((ch) => {
|
365
|
+
const code = ch.charCodeAt(0);
|
366
|
+
if (UnescapedRanges.find((range) => code >= range[0] && code <= range[1]) ||
|
367
|
+
UnescapedSpecials.includes(code)) {
|
368
|
+
return ch;
|
369
|
+
}
|
370
|
+
else {
|
371
|
+
return encodeURIComponent(ch);
|
372
|
+
}
|
373
|
+
})
|
374
|
+
.join("");
|
353
375
|
}
|
354
376
|
is_optional_node(node) {
|
355
377
|
return [NodeTypes.STAR, NodeTypes.SYMBOL, NodeTypes.CAT].includes(node);
|
@@ -358,7 +380,7 @@ RubyVariables.WRAPPER(
|
|
358
380
|
let key;
|
359
381
|
switch (route[0]) {
|
360
382
|
case NodeTypes.GROUP:
|
361
|
-
return
|
383
|
+
return `(${this.build_path_spec(route[1])})`;
|
362
384
|
case NodeTypes.CAT:
|
363
385
|
return (this.build_path_spec(route[1]) + this.build_path_spec(route[2]));
|
364
386
|
case NodeTypes.STAR:
|
data/lib/routes.ts
CHANGED
@@ -100,7 +100,7 @@ declare const module: { exports: any } | undefined;
|
|
100
100
|
RubyVariables.WRAPPER(
|
101
101
|
// eslint-disable-next-line
|
102
102
|
(): RouterExposedMethods => {
|
103
|
-
const hasProp = (value: unknown, key: string) =>
|
103
|
+
const hasProp = (value: unknown, key: string): boolean =>
|
104
104
|
Object.prototype.hasOwnProperty.call(value, key);
|
105
105
|
enum NodeTypes {
|
106
106
|
GROUP = 1,
|
@@ -135,6 +135,16 @@ RubyVariables.WRAPPER(
|
|
135
135
|
define: (routes: RouterExposedMethods) => void;
|
136
136
|
isSupported: () => boolean;
|
137
137
|
};
|
138
|
+
|
139
|
+
const UnescapedSpecials = "-._~!$&'()*+,;=:@"
|
140
|
+
.split("")
|
141
|
+
.map((s) => s.charCodeAt(0));
|
142
|
+
const UnescapedRanges = [
|
143
|
+
["a", "z"],
|
144
|
+
["A", "Z"],
|
145
|
+
["0", "9"],
|
146
|
+
].map((range) => range.map((s) => s.charCodeAt(0)));
|
147
|
+
|
138
148
|
const ModuleReferences: Record<ModuleType, ModuleDefinition> = {
|
139
149
|
CJS: {
|
140
150
|
define(routes) {
|
@@ -215,8 +225,6 @@ RubyVariables.WRAPPER(
|
|
215
225
|
}
|
216
226
|
}
|
217
227
|
|
218
|
-
const UriEncoderSegmentRegex = /[^a-zA-Z0-9\-._~!$&'()*+,;=:@]/g;
|
219
|
-
|
220
228
|
const ReservedOptions = [
|
221
229
|
"anchor",
|
222
230
|
"trailing_slash",
|
@@ -525,9 +533,25 @@ RubyVariables.WRAPPER(
|
|
525
533
|
}
|
526
534
|
|
527
535
|
encode_segment(segment: string): string {
|
528
|
-
|
529
|
-
|
530
|
-
|
536
|
+
if (segment.match(/^[a-zA-Z0-9-]$/)) {
|
537
|
+
// Performance optimization for 99% of cases
|
538
|
+
return segment;
|
539
|
+
}
|
540
|
+
return (segment.match(/./gu) || [])
|
541
|
+
.map((ch) => {
|
542
|
+
const code = ch.charCodeAt(0);
|
543
|
+
if (
|
544
|
+
UnescapedRanges.find(
|
545
|
+
(range) => code >= range[0] && code <= range[1]
|
546
|
+
) ||
|
547
|
+
UnescapedSpecials.includes(code)
|
548
|
+
) {
|
549
|
+
return ch;
|
550
|
+
} else {
|
551
|
+
return encodeURIComponent(ch);
|
552
|
+
}
|
553
|
+
})
|
554
|
+
.join("");
|
531
555
|
}
|
532
556
|
|
533
557
|
is_optional_node(node: NodeTypes): boolean {
|
@@ -2,11 +2,8 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe JsRoutes, "compatibility with Rails" do
|
4
4
|
|
5
|
-
let(:generated_js) do
|
6
|
-
JsRoutes.generate(module_type: nil, namespace: 'Routes')
|
7
|
-
end
|
8
5
|
before(:each) do
|
9
|
-
|
6
|
+
evallib(module_type: nil, namespace: 'Routes')
|
10
7
|
end
|
11
8
|
|
12
9
|
it "should generate collection routing" do
|
@@ -87,14 +84,22 @@ describe JsRoutes, "compatibility with Rails" do
|
|
87
84
|
expectjs("Routes.budgie_descendents_path(1)").to eq(test_routes.budgie_descendents_path(1))
|
88
85
|
end
|
89
86
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
87
|
+
describe "url parameters encoding" do
|
88
|
+
|
89
|
+
it "should support route with parameters containing symbols that need URI-encoding", :aggregate_failures do
|
90
|
+
expectjs("Routes.inbox_path('#hello')").to eq(test_routes.inbox_path('#hello'))
|
91
|
+
expectjs("Routes.inbox_path('some param')").to eq(test_routes.inbox_path('some param'))
|
92
|
+
expectjs("Routes.inbox_path('some param with more & more encode symbols')").to eq(test_routes.inbox_path('some param with more & more encode symbols'))
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should support route with parameters containing symbols not need URI-encoding", :aggregate_failures do
|
96
|
+
expectjs("Routes.inbox_path(':some_id')").to eq(test_routes.inbox_path(':some_id'))
|
97
|
+
expectjs("Routes.inbox_path('.+')").to eq(test_routes.inbox_path('.+'))
|
98
|
+
end
|
99
|
+
|
100
|
+
it "supports emoji characters", :aggregate_failures do
|
101
|
+
expectjs("Routes.inbox_path('💗')").to eq(test_routes.inbox_path('💗'))
|
102
|
+
end
|
98
103
|
end
|
99
104
|
|
100
105
|
describe "when route has defaults" do
|
@@ -3,11 +3,8 @@ require "spec_helper"
|
|
3
3
|
|
4
4
|
describe JsRoutes, "compatibility with Rails" do
|
5
5
|
|
6
|
-
let(:generated_js) do
|
7
|
-
JsRoutes.generate(module_type: nil, namespace: 'Routes')
|
8
|
-
end
|
9
6
|
before(:each) do
|
10
|
-
|
7
|
+
evallib(module_type: nil, namespace: 'Routes')
|
11
8
|
end
|
12
9
|
|
13
10
|
context "when specs" do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: js-routes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdan Gusiev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -197,7 +197,7 @@ files:
|
|
197
197
|
- spec/js_routes/options_spec.rb
|
198
198
|
- spec/js_routes/rails_routes_compatibility_spec.rb
|
199
199
|
- spec/js_routes/route_specification_spec.rb
|
200
|
-
- spec/js_routes/
|
200
|
+
- spec/js_routes/zzz_sprockets_spec.rb
|
201
201
|
- spec/spec_helper.rb
|
202
202
|
- spec/support/routes.rb
|
203
203
|
- spec/tsconfig.json
|