js_rails_routes 0.7.1 → 0.8.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +11 -2
- data/README.md +12 -9
- data/lib/js_rails_routes.rb +15 -2
- data/lib/js_rails_routes/builder.rb +10 -3
- data/lib/js_rails_routes/configuration.rb +8 -1
- data/lib/js_rails_routes/generator.rb +3 -9
- data/lib/js_rails_routes/language/base.rb +5 -0
- data/lib/js_rails_routes/language/javascript.rb +6 -1
- data/lib/js_rails_routes/language/typescript.rb +36 -0
- data/lib/js_rails_routes/route.rb +5 -1
- data/lib/js_rails_routes/route_set.rb +5 -1
- data/lib/js_rails_routes/version.rb +1 -1
- data/lib/tasks/js_rails_routes.rake +1 -1
- data/spec/js_rails_routes/builder_spec.rb +6 -3
- data/spec/js_rails_routes/generator_spec.rb +6 -1
- data/spec/js_rails_routes/language/base_spec.rb +6 -0
- data/spec/js_rails_routes/language/javascript_spec.rb +6 -0
- data/spec/js_rails_routes/language/typescript_spec.rb +157 -0
- data/spec/js_rails_routes/route_set_spec.rb +20 -0
- data/spec/js_rails_routes/route_spec.rb +20 -0
- data/spec/js_rails_routes_spec.rb +86 -30
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a39fd7ffc8b9d7c33679acfc90ac9df033880e9795ab6c3a312c038a8ca22313
|
4
|
+
data.tar.gz: 30defa0fff6b4a834106f109f9f07e2122c74ed69a6137b64cf0362968dfd50d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 446e25f72d627356b9b592ef2cc368ac5f6d16f02f1b6274f66d11ef35471307df3ab29b16a2a53e2cc383a18054b6ba39ec7d19cf1c5cfd984e4d9c7b424033
|
7
|
+
data.tar.gz: 12e2923b66465a669d2ab162a56ff041d573c4a7d605ba7e5bc0931ca22fb0b8b3b661263872d833ff623a64cb8bcb1b32cb89725d1a9ef5f34e27a55d49bcfe
|
data/CHANGELOG.md
CHANGED
@@ -6,9 +6,17 @@ This change log adheres to [keepachangelog.com](http://keepachangelog.com).
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.8.0] - 2018-08-21
|
10
|
+
### Added
|
11
|
+
- Support TypeScript
|
12
|
+
- Add `route_filter` and `route_set_filter` options
|
13
|
+
|
9
14
|
## [0.7.1] - 2018-07-26
|
10
15
|
- Refactor whole code base
|
11
16
|
|
17
|
+
### Fixed
|
18
|
+
- Enable to math engine name in case-sensitive way.
|
19
|
+
|
12
20
|
## [0.7.0] - 2018-07-11
|
13
21
|
### Added
|
14
22
|
- Support `camelize` option
|
@@ -29,7 +37,7 @@ This change log adheres to [keepachangelog.com](http://keepachangelog.com).
|
|
29
37
|
|
30
38
|
## [0.4.0] - 2017-04-05
|
31
39
|
### Added
|
32
|
-
- Add `include_names` and `exclude_names`
|
40
|
+
- Add `include_names` and `exclude_names` options
|
33
41
|
|
34
42
|
### Changed
|
35
43
|
- Rename `includes` and `excludes` as `include_paths` and `exclude_paths` respectively
|
@@ -54,7 +62,8 @@ This change log adheres to [keepachangelog.com](http://keepachangelog.com).
|
|
54
62
|
### Added
|
55
63
|
- Implement "js:rails:routes" task
|
56
64
|
|
57
|
-
[Unreleased]: https://github.com/yuku-t/js_rails_routes/compare/v0.
|
65
|
+
[Unreleased]: https://github.com/yuku-t/js_rails_routes/compare/v0.8.0...HEAD
|
66
|
+
[0.8.0]: https://github.com/yuku-t/js_rails_routes/compare/v0.7.1...v0.8.0
|
58
67
|
[0.7.1]: https://github.com/yuku-t/js_rails_routes/compare/v0.7.0...v0.7.1
|
59
68
|
[0.7.0]: https://github.com/yuku-t/js_rails_routes/compare/v0.6.0...v0.7.0
|
60
69
|
[0.6.0]: https://github.com/yuku-t/js_rails_routes/compare/v0.5.0...v0.6.0
|
data/README.md
CHANGED
@@ -75,15 +75,18 @@ rake js:routes
|
|
75
75
|
|
76
76
|
JSRailsRoutes supports several parameters:
|
77
77
|
|
78
|
-
Name
|
79
|
-
|
80
|
-
`include_paths`
|
81
|
-
`exclude_paths`
|
82
|
-
`include_names`
|
83
|
-
`exclude_names`
|
84
|
-
`exclude_engines`
|
85
|
-
`output_dir`
|
86
|
-
`camelize`
|
78
|
+
Name | Type | Description | Default
|
79
|
+
-------------------|-----------|---------------------------------------------------------------------------------------|----------------------------------------
|
80
|
+
`include_paths` | `Regexp` | Paths match to the regexp are included | `/.*/`
|
81
|
+
`exclude_paths` | `Regexp` | Paths match to the regexp are excluded | `/^$/`
|
82
|
+
`include_names` | `Regexp` | Names match to the regexp are included | `/.*/`
|
83
|
+
`exclude_names` | `Regexp` | Names match to the regexp are excluded | `/^$/`
|
84
|
+
`exclude_engines` | `Regexp` | Rails engines match to the regexp are excluded | `/^$/`
|
85
|
+
`output_dir` | `String` | Output JS file into the specified directory | `Rails.root.join("app", "assets", "javascripts")`
|
86
|
+
`camelize` | `Symbol` | Output JS file with chosen camelcase type it also avaliable for `:lower` and `:upper` | `nil`
|
87
|
+
`target` | `String` | Target type. `"js"` or `"ts"` | `"js"`
|
88
|
+
`route_filter` | `Proc` | Fully customizable filter on `JSRails::Route` | `->(route) { true }`
|
89
|
+
`route_set_filter` | `Proc` | Fully customizable filter on `JSRails::RouteSet` | `->(route_set) { true }`
|
87
90
|
|
88
91
|
You can configure via `JSRailsRoutes.configure`.
|
89
92
|
|
data/lib/js_rails_routes.rb
CHANGED
@@ -5,6 +5,7 @@ require 'js_rails_routes/configuration'
|
|
5
5
|
require 'js_rails_routes/generator'
|
6
6
|
require 'js_rails_routes/version'
|
7
7
|
require 'js_rails_routes/language/javascript'
|
8
|
+
require 'js_rails_routes/language/typescript'
|
8
9
|
|
9
10
|
module JSRailsRoutes
|
10
11
|
PARAM_REGEXP = %r{:(.*?)(/|$)}
|
@@ -24,8 +25,8 @@ module JSRailsRoutes
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# @param task [String]
|
27
|
-
def
|
28
|
-
builder = Builder.new(
|
28
|
+
def generate(task)
|
29
|
+
builder = Builder.new(JSRailsRoutes.language)
|
29
30
|
Generator.new(builder).generate(task)
|
30
31
|
end
|
31
32
|
|
@@ -44,4 +45,16 @@ module JSRailsRoutes
|
|
44
45
|
@sandbox = nil
|
45
46
|
end
|
46
47
|
end
|
48
|
+
|
49
|
+
# @return [JSRailsRoutes::Language::Base]
|
50
|
+
def language
|
51
|
+
case config.target
|
52
|
+
when 'js'
|
53
|
+
Language::JavaScript.new
|
54
|
+
when 'ts'
|
55
|
+
Language::TypeScript.new
|
56
|
+
else
|
57
|
+
raise NotImplementedError, config.target
|
58
|
+
end
|
59
|
+
end
|
47
60
|
end
|
@@ -4,6 +4,13 @@ require 'js_rails_routes/route_set'
|
|
4
4
|
|
5
5
|
module JSRailsRoutes
|
6
6
|
class Builder
|
7
|
+
Artifact = Struct.new(:engine_name, :ext, :body) do
|
8
|
+
# @return [String]
|
9
|
+
def file_name
|
10
|
+
"#{engine_name.gsub('::Engine', '').underscore.tr('/', '-')}-routes.#{ext}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
# @return [Array<JSRailsRoutes::RouteSet>]
|
8
15
|
attr_reader :route_set_list
|
9
16
|
|
@@ -17,10 +24,10 @@ module JSRailsRoutes
|
|
17
24
|
@route_set_list = route_set_list
|
18
25
|
end
|
19
26
|
|
20
|
-
# @return [
|
27
|
+
# @return [Array<Artifact>]
|
21
28
|
def build
|
22
|
-
route_set_list.
|
23
|
-
|
29
|
+
route_set_list.map do |route_set|
|
30
|
+
Artifact.new(route_set.name, language.ext, language.handle_route_set(route_set))
|
24
31
|
end
|
25
32
|
end
|
26
33
|
end
|
@@ -8,7 +8,10 @@ module JSRailsRoutes
|
|
8
8
|
:exclude_names,
|
9
9
|
:exclude_engines,
|
10
10
|
:output_dir,
|
11
|
-
:camelize
|
11
|
+
:camelize,
|
12
|
+
:target,
|
13
|
+
:route_filter,
|
14
|
+
:route_set_filter
|
12
15
|
|
13
16
|
def initialize
|
14
17
|
self.include_paths = /.*/
|
@@ -18,6 +21,9 @@ module JSRailsRoutes
|
|
18
21
|
self.exclude_engines = /^$/
|
19
22
|
self.camelize = nil
|
20
23
|
self.output_dir = Rails.root.join('app', 'assets', 'javascripts')
|
24
|
+
self.target = 'js'
|
25
|
+
self.route_filter = ->(_route) { true }
|
26
|
+
self.route_set_filter = ->(_route_set) { true }
|
21
27
|
end
|
22
28
|
|
23
29
|
# @param env [Hash{String=>String}]
|
@@ -27,6 +33,7 @@ module JSRailsRoutes
|
|
27
33
|
end
|
28
34
|
self.output_dir = env['output_dir'] if env['output_dir']
|
29
35
|
self.camelize = env['camelize'].presence.to_sym if env['camelize']
|
36
|
+
self.target = env['target'] if env['target']
|
30
37
|
end
|
31
38
|
end
|
32
39
|
end
|
@@ -15,9 +15,9 @@ module JSRailsRoutes
|
|
15
15
|
# @param task [String]
|
16
16
|
# @return [Hash{String => String}]
|
17
17
|
def generate(task)
|
18
|
-
builder.build.each do |
|
19
|
-
file_name = File.join(config.output_dir,
|
20
|
-
file_body = "// Don't edit manually. `rake #{task}` generates this file.\n#{body}"
|
18
|
+
builder.build.each do |artifact|
|
19
|
+
file_name = File.join(config.output_dir, artifact.file_name)
|
20
|
+
file_body = "// Don't edit manually. `rake #{task}` generates this file.\n#{artifact.body}"
|
21
21
|
writable.write(file_name, file_body)
|
22
22
|
end
|
23
23
|
end
|
@@ -30,11 +30,5 @@ module JSRailsRoutes
|
|
30
30
|
def config
|
31
31
|
JSRailsRoutes.config
|
32
32
|
end
|
33
|
-
|
34
|
-
# @param engine_name [String]
|
35
|
-
# @return [String]
|
36
|
-
def convert(engine_name)
|
37
|
-
engine_name.gsub('::Engine', '').underscore.tr('/', '-')
|
38
|
-
end
|
39
33
|
end
|
40
34
|
end
|
@@ -20,7 +20,7 @@ module JSRailsRoutes
|
|
20
20
|
|
21
21
|
# @note Implementation for {JSRailsRoutes::Language::Base#generate}
|
22
22
|
def handle_route_set(routes)
|
23
|
-
routes.each_with_object([PROCESS_FUNC]) do |route, lines|
|
23
|
+
routes.each_with_object([self.class::PROCESS_FUNC]) do |route, lines|
|
24
24
|
lines.push(handle_route(route))
|
25
25
|
end.join("\n") + "\n"
|
26
26
|
end
|
@@ -33,6 +33,11 @@ module JSRailsRoutes
|
|
33
33
|
"export function #{name}(params) { return process('#{path}', params, [#{keys.join(',')}]); }"
|
34
34
|
end
|
35
35
|
|
36
|
+
# @note Implementation for {JSRailsRoutes::Language::Base#ext}
|
37
|
+
def ext
|
38
|
+
'js'
|
39
|
+
end
|
40
|
+
|
36
41
|
private
|
37
42
|
|
38
43
|
# @param route_path [String]
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'js_rails_routes/route'
|
4
|
+
require 'js_rails_routes/language/javascript'
|
5
|
+
|
6
|
+
module JSRailsRoutes
|
7
|
+
module Language
|
8
|
+
class TypeScript < JavaScript
|
9
|
+
PROCESS_FUNC = <<~TYPESCRIPT
|
10
|
+
type Params = Record<string, string | number>
|
11
|
+
function process(route: string, params: Params, keys: string[]): string {
|
12
|
+
var query = [];
|
13
|
+
for (var param in params) if (params.hasOwnProperty(param)) {
|
14
|
+
if (keys.indexOf(param) === -1) {
|
15
|
+
query.push(param + "=" + encodeURIComponent(params[param].toString()));
|
16
|
+
}
|
17
|
+
}
|
18
|
+
return query.length ? route + "?" + query.join("&") : route;
|
19
|
+
}
|
20
|
+
TYPESCRIPT
|
21
|
+
|
22
|
+
# @param route [JSRailsRoutes::Route]
|
23
|
+
# @return [String]
|
24
|
+
def handle_route(route)
|
25
|
+
path, keys = parse(route.path)
|
26
|
+
name = function_name(route.name)
|
27
|
+
"export function #{name}(params: Params) { return process('#{path}', params, [#{keys.join(',')}]); }"
|
28
|
+
end
|
29
|
+
|
30
|
+
# @note Implementation for {JSRailsRoutes::Language::Base#ext}
|
31
|
+
def ext
|
32
|
+
'ts'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -9,8 +9,12 @@ module JSRailsRoutes
|
|
9
9
|
# @return [String]
|
10
10
|
attr_reader :path
|
11
11
|
|
12
|
+
# @return [ActionDispatch::Journey::Route]
|
13
|
+
attr_reader :route
|
14
|
+
|
12
15
|
# @param route [ActionDispatch::Journey::Route]
|
13
16
|
def initialize(route)
|
17
|
+
@route = route
|
14
18
|
@name = route.name
|
15
19
|
@path = route.path.spec.to_s.split('(').first
|
16
20
|
end
|
@@ -21,7 +25,7 @@ module JSRailsRoutes
|
|
21
25
|
return false if config.exclude_paths =~ path
|
22
26
|
return false if config.include_names !~ name
|
23
27
|
return false if config.exclude_names =~ name
|
24
|
-
|
28
|
+
config.route_filter.call(self)
|
25
29
|
end
|
26
30
|
|
27
31
|
private
|
@@ -25,6 +25,9 @@ module JSRailsRoutes
|
|
25
25
|
# @return [String]
|
26
26
|
attr_reader :name
|
27
27
|
|
28
|
+
# @return [ActionDispatch::Routing::RouteSet]
|
29
|
+
attr_reader :route_set
|
30
|
+
|
28
31
|
# @return [Array<JSRailsRoutes::Route>]
|
29
32
|
attr_reader :routes
|
30
33
|
|
@@ -32,6 +35,7 @@ module JSRailsRoutes
|
|
32
35
|
# @param routes [ActionDispatch::Routing::RouteSet]
|
33
36
|
def initialize(name, routes)
|
34
37
|
@name = name
|
38
|
+
@route_set = route_set
|
35
39
|
@routes = routes.routes
|
36
40
|
.select(&:name)
|
37
41
|
.map { |route| Route.new(route) }
|
@@ -40,7 +44,7 @@ module JSRailsRoutes
|
|
40
44
|
|
41
45
|
# @return [Boolean]
|
42
46
|
def match?
|
43
|
-
name !~ config.exclude_engines && routes.present?
|
47
|
+
name !~ config.exclude_engines && routes.present? && config.route_set_filter.call(self)
|
44
48
|
end
|
45
49
|
|
46
50
|
private
|
@@ -4,7 +4,7 @@ desc 'Generate a ES6 module that contains Rails routes'
|
|
4
4
|
namespace :js do
|
5
5
|
task routes: :environment do |task|
|
6
6
|
JSRailsRoutes.config.configure_with_env_vars
|
7
|
-
JSRailsRoutes.
|
7
|
+
JSRailsRoutes.generate(task)
|
8
8
|
puts "Routes saved into #{JSRailsRoutes.config.output_dir}."
|
9
9
|
end
|
10
10
|
end
|
@@ -5,7 +5,7 @@ RSpec.describe JSRailsRoutes::Builder do
|
|
5
5
|
|
6
6
|
include_context 'run in a sandbox'
|
7
7
|
|
8
|
-
let(:language) { instance_double('JSRailsRoutes::Language::Base', handle_route_set: body) }
|
8
|
+
let(:language) { instance_double('JSRailsRoutes::Language::Base', handle_route_set: body, ext: %w[js ts].sample) }
|
9
9
|
let(:body) { 'hello' }
|
10
10
|
let(:route_set_list) { [rails_route_set, engine_route_set] }
|
11
11
|
|
@@ -30,8 +30,11 @@ RSpec.describe JSRailsRoutes::Builder do
|
|
30
30
|
describe '#build' do
|
31
31
|
subject { builder.build }
|
32
32
|
|
33
|
-
it 'returns
|
34
|
-
is_expected.to
|
33
|
+
it 'returns an array of artifacts' do
|
34
|
+
is_expected.to contain_exactly(
|
35
|
+
an_object_having_attributes(engine_name: rails_route_set.name, body: body),
|
36
|
+
an_object_having_attributes(engine_name: engine_route_set.name, body: body)
|
37
|
+
)
|
35
38
|
expect(language).to have_received(:handle_route_set).twice
|
36
39
|
end
|
37
40
|
end
|
@@ -7,7 +7,12 @@ RSpec.describe JSRailsRoutes::Generator do
|
|
7
7
|
|
8
8
|
let(:writable) { spy('writable') }
|
9
9
|
let(:builder) { double('builder', build: result) }
|
10
|
-
let(:result)
|
10
|
+
let(:result) do
|
11
|
+
[
|
12
|
+
JSRailsRoutes::Builder::Artifact.new('Rails', 'js', 'rails body'),
|
13
|
+
JSRailsRoutes::Builder::Artifact.new('Admin::Engine', 'js', 'admin body')
|
14
|
+
]
|
15
|
+
end
|
11
16
|
|
12
17
|
describe '#generate' do
|
13
18
|
subject { generator.generate(task) }
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe JSRailsRoutes::Language::TypeScript do
|
4
|
+
subject(:language) { described_class.new }
|
5
|
+
|
6
|
+
include_context 'run in a sandbox'
|
7
|
+
|
8
|
+
describe '::PROCESS_FUNC' do
|
9
|
+
subject { described_class::PROCESS_FUNC }
|
10
|
+
|
11
|
+
it 'returns a typescript function' do
|
12
|
+
is_expected.to eq <<~TYPESCRIPT
|
13
|
+
type Params = Record<string, string | number>
|
14
|
+
function process(route: string, params: Params, keys: string[]): string {
|
15
|
+
var query = [];
|
16
|
+
for (var param in params) if (params.hasOwnProperty(param)) {
|
17
|
+
if (keys.indexOf(param) === -1) {
|
18
|
+
query.push(param + "=" + encodeURIComponent(params[param].toString()));
|
19
|
+
}
|
20
|
+
}
|
21
|
+
return query.length ? route + "?" + query.join("&") : route;
|
22
|
+
}
|
23
|
+
TYPESCRIPT
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#handle_route_set' do
|
28
|
+
subject { language.handle_route_set(route_set) }
|
29
|
+
|
30
|
+
let(:route_set) do
|
31
|
+
rails_route_set = ActionDispatch::Routing::RouteSet.new.tap do |routes|
|
32
|
+
routes.draw do
|
33
|
+
resources :articles
|
34
|
+
end
|
35
|
+
end
|
36
|
+
JSRailsRoutes::RouteSet.new('Rails', rails_route_set)
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'without camelize option' do
|
40
|
+
it 'returns a typescript with snake_case functions' do
|
41
|
+
is_expected.to eq <<~TYPESCRIPT
|
42
|
+
#{described_class::PROCESS_FUNC}
|
43
|
+
export function articles_path(params: Params) { return process('/articles', params, []); }
|
44
|
+
export function new_article_path(params: Params) { return process('/articles/new', params, []); }
|
45
|
+
export function edit_article_path(params: Params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
|
46
|
+
export function article_path(params: Params) { return process('/articles/' + params.id + '', params, ['id']); }
|
47
|
+
TYPESCRIPT
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with camelize = :lower option' do
|
52
|
+
before do
|
53
|
+
JSRailsRoutes.configure do |c|
|
54
|
+
c.camelize = :lower
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'returns a javascript with lowerCamelCase functions' do
|
59
|
+
is_expected.to eq <<~TYPESCRIPT
|
60
|
+
#{described_class::PROCESS_FUNC}
|
61
|
+
export function articlesPath(params: Params) { return process('/articles', params, []); }
|
62
|
+
export function newArticlePath(params: Params) { return process('/articles/new', params, []); }
|
63
|
+
export function editArticlePath(params: Params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
|
64
|
+
export function articlePath(params: Params) { return process('/articles/' + params.id + '', params, ['id']); }
|
65
|
+
TYPESCRIPT
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with camelize = :upper option' do
|
70
|
+
before do
|
71
|
+
JSRailsRoutes.configure do |c|
|
72
|
+
c.camelize = :upper
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns a javascript with UpperCamelCase functions' do
|
77
|
+
is_expected.to eq <<~TYPESCRIPT
|
78
|
+
#{described_class::PROCESS_FUNC}
|
79
|
+
export function ArticlesPath(params: Params) { return process('/articles', params, []); }
|
80
|
+
export function NewArticlePath(params: Params) { return process('/articles/new', params, []); }
|
81
|
+
export function EditArticlePath(params: Params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
|
82
|
+
export function ArticlePath(params: Params) { return process('/articles/' + params.id + '', params, ['id']); }
|
83
|
+
TYPESCRIPT
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with include_paths option' do
|
88
|
+
before do
|
89
|
+
JSRailsRoutes.configure do |c|
|
90
|
+
c.include_paths = /new/
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'returns a javascript matching to the regexp' do
|
95
|
+
is_expected.to eq <<~TYPESCRIPT
|
96
|
+
#{described_class::PROCESS_FUNC}
|
97
|
+
export function new_article_path(params: Params) { return process('/articles/new', params, []); }
|
98
|
+
TYPESCRIPT
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'with exclude_paths option' do
|
103
|
+
before do
|
104
|
+
JSRailsRoutes.configure do |c|
|
105
|
+
c.exclude_paths = /new/
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'returns a javascript not matching to the regexp' do
|
110
|
+
is_expected.to eq <<~TYPESCRIPT
|
111
|
+
#{described_class::PROCESS_FUNC}
|
112
|
+
export function articles_path(params: Params) { return process('/articles', params, []); }
|
113
|
+
export function edit_article_path(params: Params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
|
114
|
+
export function article_path(params: Params) { return process('/articles/' + params.id + '', params, ['id']); }
|
115
|
+
TYPESCRIPT
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'with include_names option' do
|
120
|
+
before do
|
121
|
+
JSRailsRoutes.configure do |c|
|
122
|
+
c.include_names = /new/
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'returns a javascript matching to the regexp' do
|
127
|
+
is_expected.to eq <<~TYPESCRIPT
|
128
|
+
#{described_class::PROCESS_FUNC}
|
129
|
+
export function new_article_path(params: Params) { return process('/articles/new', params, []); }
|
130
|
+
TYPESCRIPT
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'with exclude_names option' do
|
135
|
+
before do
|
136
|
+
JSRailsRoutes.configure do |c|
|
137
|
+
c.exclude_names = /new/
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'returns a javascript not matching to the regexp' do
|
142
|
+
is_expected.to eq <<~TYPESCRIPT
|
143
|
+
#{described_class::PROCESS_FUNC}
|
144
|
+
export function articles_path(params: Params) { return process('/articles', params, []); }
|
145
|
+
export function edit_article_path(params: Params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
|
146
|
+
export function article_path(params: Params) { return process('/articles/' + params.id + '', params, ['id']); }
|
147
|
+
TYPESCRIPT
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe '#ext' do
|
153
|
+
subject { language.ext }
|
154
|
+
|
155
|
+
it { is_expected.to eq 'ts' }
|
156
|
+
end
|
157
|
+
end
|
@@ -82,5 +82,25 @@ RSpec.describe JSRailsRoutes::RouteSet do
|
|
82
82
|
|
83
83
|
it { is_expected.to be false }
|
84
84
|
end
|
85
|
+
|
86
|
+
context 'when route_set_filter option is specified' do
|
87
|
+
before do
|
88
|
+
JSRailsRoutes.configure do |c|
|
89
|
+
c.route_set_filter = ->(_route) { result }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'and it returns true' do
|
94
|
+
let(:result) { true }
|
95
|
+
|
96
|
+
it { is_expected.to be true }
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'and it returns false' do
|
100
|
+
let(:result) { false }
|
101
|
+
|
102
|
+
it { is_expected.to be false }
|
103
|
+
end
|
104
|
+
end
|
85
105
|
end
|
86
106
|
end
|
@@ -109,5 +109,25 @@ RSpec.describe JSRailsRoutes::Route do
|
|
109
109
|
it { is_expected.to be true }
|
110
110
|
end
|
111
111
|
end
|
112
|
+
|
113
|
+
context 'when route_filter option is specified' do
|
114
|
+
before do
|
115
|
+
JSRailsRoutes.configure do |c|
|
116
|
+
c.route_filter = ->(_route) { result }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'and it returns true' do
|
121
|
+
let(:result) { true }
|
122
|
+
|
123
|
+
it { is_expected.to be true }
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'and it returns false' do
|
127
|
+
let(:result) { false }
|
128
|
+
|
129
|
+
it { is_expected.to be false }
|
130
|
+
end
|
131
|
+
end
|
112
132
|
end
|
113
133
|
end
|
@@ -24,8 +24,10 @@ RSpec.describe JSRailsRoutes do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
describe '.
|
28
|
-
|
27
|
+
describe '.generate' do
|
28
|
+
include_context 'run in a sandbox'
|
29
|
+
|
30
|
+
subject { described_class.generate(task) }
|
29
31
|
|
30
32
|
let(:task) { 'js:routes' }
|
31
33
|
let(:app_root) { JSRailsRoutes::SpecHelper::TestApp.root }
|
@@ -35,34 +37,88 @@ RSpec.describe JSRailsRoutes do
|
|
35
37
|
FileUtils.mkdir_p(app_root.join('app/assets/javascripts'))
|
36
38
|
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
40
|
+
shared_examples_for 'javascript target' do
|
41
|
+
it 'generates javascript files' do
|
42
|
+
subject
|
43
|
+
|
44
|
+
expect(File.read(app_root.join('app/assets/javascripts/rails-routes.js'))).to eq <<~JAVASCRIPT
|
45
|
+
// Don't edit manually. `rake #{task}` generates this file.
|
46
|
+
#{JSRailsRoutes::Language::JavaScript::PROCESS_FUNC}
|
47
|
+
export function blogs_path(params) { return process('/blogs', params, []); }
|
48
|
+
export function new_blog_path(params) { return process('/blogs/new', params, []); }
|
49
|
+
export function edit_blog_path(params) { return process('/blogs/' + params.id + '/edit', params, ['id']); }
|
50
|
+
export function blog_path(params) { return process('/blogs/' + params.id + '', params, ['id']); }
|
51
|
+
export function users_path(params) { return process('/users', params, []); }
|
52
|
+
export function new_user_path(params) { return process('/users/new', params, []); }
|
53
|
+
export function edit_user_path(params) { return process('/users/' + params.id + '/edit', params, ['id']); }
|
54
|
+
export function user_path(params) { return process('/users/' + params.id + '', params, ['id']); }
|
55
|
+
JAVASCRIPT
|
56
|
+
|
57
|
+
expect(File.read(app_root.join('app/assets/javascripts/admin-routes.js'))).to eq <<~JAVASCRIPT
|
58
|
+
// Don't edit manually. `rake #{task}` generates this file.
|
59
|
+
#{JSRailsRoutes::Language::JavaScript::PROCESS_FUNC}
|
60
|
+
export function notes_path(params) { return process('/notes', params, []); }
|
61
|
+
export function new_note_path(params) { return process('/notes/new', params, []); }
|
62
|
+
export function edit_note_path(params) { return process('/notes/' + params.id + '/edit', params, ['id']); }
|
63
|
+
export function note_path(params) { return process('/notes/' + params.id + '', params, ['id']); }
|
64
|
+
export function photos_path(params) { return process('/photos', params, []); }
|
65
|
+
export function new_photo_path(params) { return process('/photos/new', params, []); }
|
66
|
+
export function edit_photo_path(params) { return process('/photos/' + params.id + '/edit', params, ['id']); }
|
67
|
+
export function photo_path(params) { return process('/photos/' + params.id + '', params, ['id']); }
|
68
|
+
JAVASCRIPT
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'without target config' do
|
73
|
+
include_examples 'javascript target'
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'with target="js"' do
|
77
|
+
before do
|
78
|
+
described_class.configure do |c|
|
79
|
+
c.target = 'js'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
include_examples 'javascript target'
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with target="ts"' do
|
87
|
+
before do
|
88
|
+
described_class.configure do |c|
|
89
|
+
c.target = 'ts'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'generates typescript files' do
|
94
|
+
subject
|
95
|
+
|
96
|
+
expect(File.read(app_root.join('app/assets/javascripts/rails-routes.ts'))).to eq <<~JAVASCRIPT
|
97
|
+
// Don't edit manually. `rake #{task}` generates this file.
|
98
|
+
#{JSRailsRoutes::Language::TypeScript::PROCESS_FUNC}
|
99
|
+
export function blogs_path(params: Params) { return process('/blogs', params, []); }
|
100
|
+
export function new_blog_path(params: Params) { return process('/blogs/new', params, []); }
|
101
|
+
export function edit_blog_path(params: Params) { return process('/blogs/' + params.id + '/edit', params, ['id']); }
|
102
|
+
export function blog_path(params: Params) { return process('/blogs/' + params.id + '', params, ['id']); }
|
103
|
+
export function users_path(params: Params) { return process('/users', params, []); }
|
104
|
+
export function new_user_path(params: Params) { return process('/users/new', params, []); }
|
105
|
+
export function edit_user_path(params: Params) { return process('/users/' + params.id + '/edit', params, ['id']); }
|
106
|
+
export function user_path(params: Params) { return process('/users/' + params.id + '', params, ['id']); }
|
107
|
+
JAVASCRIPT
|
108
|
+
|
109
|
+
expect(File.read(app_root.join('app/assets/javascripts/admin-routes.ts'))).to eq <<~JAVASCRIPT
|
110
|
+
// Don't edit manually. `rake #{task}` generates this file.
|
111
|
+
#{JSRailsRoutes::Language::TypeScript::PROCESS_FUNC}
|
112
|
+
export function notes_path(params: Params) { return process('/notes', params, []); }
|
113
|
+
export function new_note_path(params: Params) { return process('/notes/new', params, []); }
|
114
|
+
export function edit_note_path(params: Params) { return process('/notes/' + params.id + '/edit', params, ['id']); }
|
115
|
+
export function note_path(params: Params) { return process('/notes/' + params.id + '', params, ['id']); }
|
116
|
+
export function photos_path(params: Params) { return process('/photos', params, []); }
|
117
|
+
export function new_photo_path(params: Params) { return process('/photos/new', params, []); }
|
118
|
+
export function edit_photo_path(params: Params) { return process('/photos/' + params.id + '/edit', params, ['id']); }
|
119
|
+
export function photo_path(params: Params) { return process('/photos/' + params.id + '', params, ['id']); }
|
120
|
+
JAVASCRIPT
|
121
|
+
end
|
66
122
|
end
|
67
123
|
end
|
68
124
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: js_rails_routes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuku Takahashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- lib/js_rails_routes/generator.rb
|
148
148
|
- lib/js_rails_routes/language/base.rb
|
149
149
|
- lib/js_rails_routes/language/javascript.rb
|
150
|
+
- lib/js_rails_routes/language/typescript.rb
|
150
151
|
- lib/js_rails_routes/route.rb
|
151
152
|
- lib/js_rails_routes/route_set.rb
|
152
153
|
- lib/js_rails_routes/version.rb
|
@@ -156,6 +157,7 @@ files:
|
|
156
157
|
- spec/js_rails_routes/generator_spec.rb
|
157
158
|
- spec/js_rails_routes/language/base_spec.rb
|
158
159
|
- spec/js_rails_routes/language/javascript_spec.rb
|
160
|
+
- spec/js_rails_routes/language/typescript_spec.rb
|
159
161
|
- spec/js_rails_routes/route_set_spec.rb
|
160
162
|
- spec/js_rails_routes/route_spec.rb
|
161
163
|
- spec/js_rails_routes_spec.rb
|
@@ -184,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
186
|
version: '0'
|
185
187
|
requirements: []
|
186
188
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.6
|
189
|
+
rubygems_version: 2.7.6
|
188
190
|
signing_key:
|
189
191
|
specification_version: 4
|
190
192
|
summary: Generate a ES6 module that contains Rails routes.
|