js_dependency 0.3.4 → 0.3.7
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/.rubocop_todo.yml +8 -8
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +6 -6
- data/README.md +18 -1
- data/lib/js_dependency/cli.rb +38 -0
- data/lib/js_dependency/extractor/extract_import_path.rb +80 -0
- data/lib/js_dependency/extractor/extract_script_tag.rb +28 -0
- data/lib/js_dependency/extractor/extract_src_path.rb +38 -0
- data/lib/js_dependency/index_creator.rb +17 -4
- data/lib/js_dependency/mermaid/target_pathname.rb +44 -0
- data/lib/js_dependency/pathname_utility.rb +15 -0
- data/lib/js_dependency/source_analysis/leave.rb +43 -0
- data/lib/js_dependency/source_analysis/orphan.rb +71 -0
- data/lib/js_dependency/target_pathname.rb +1 -24
- data/lib/js_dependency/version.rb +1 -1
- data/lib/js_dependency.rb +24 -4
- metadata +8 -4
- data/lib/js_dependency/extract_import_path.rb +0 -77
- data/lib/js_dependency/extract_script_tag.rb +0 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eed9f17f75fff9405d112f14ac2cccffffa9ecce728c718ff9a14eda3396c5ba
|
|
4
|
+
data.tar.gz: 645a8b5ab4363e2d1c4d7f6b25c79c0908d3f4a8ed78a928590c8d25e841c0e4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2b1160dfd6319369750cf8d10feffd4b703aa72ba1d0199e5e1e9bb341316beda0a07e7982f83675435e9642edd29fd999d5953c32c5f90aa95b2b81322f8ed8
|
|
7
|
+
data.tar.gz: ff0eb122ee309e0ba743c5c422e6ff21641e04131d5ec3da650781ec2e22f6878cbeaf2e006e03fc68dd170d64b80ca5d91471fa3259d4b4384bb67d9853782a
|
data/.rubocop_todo.yml
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
# This configuration was generated by
|
|
2
2
|
# `rubocop --auto-gen-config`
|
|
3
|
-
# on 2022-
|
|
3
|
+
# on 2022-08-11 04:37:50 UTC using RuboCop version 1.34.1.
|
|
4
4
|
# The point is for the user to remove these configuration records
|
|
5
5
|
# one by one as the offenses are removed from the code base.
|
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
|
8
8
|
|
|
9
|
-
# Offense count:
|
|
10
|
-
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
|
|
9
|
+
# Offense count: 5
|
|
10
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods, CountRepeatedAttributes.
|
|
11
11
|
Metrics/AbcSize:
|
|
12
12
|
Max: 42
|
|
13
13
|
|
|
14
14
|
# Offense count: 1
|
|
15
15
|
# Configuration parameters: CountComments, CountAsOne.
|
|
16
16
|
Metrics/ClassLength:
|
|
17
|
-
Max:
|
|
17
|
+
Max: 129
|
|
18
18
|
|
|
19
19
|
# Offense count: 5
|
|
20
|
-
# Configuration parameters: IgnoredMethods.
|
|
20
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
|
|
21
21
|
Metrics/CyclomaticComplexity:
|
|
22
22
|
Max: 18
|
|
23
23
|
|
|
24
24
|
# Offense count: 9
|
|
25
|
-
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
25
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
|
|
26
26
|
Metrics/MethodLength:
|
|
27
27
|
Max: 26
|
|
28
28
|
|
|
@@ -32,7 +32,7 @@ Metrics/ParameterLists:
|
|
|
32
32
|
Max: 9
|
|
33
33
|
|
|
34
34
|
# Offense count: 5
|
|
35
|
-
# Configuration parameters: IgnoredMethods.
|
|
35
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
|
|
36
36
|
Metrics/PerceivedComplexity:
|
|
37
37
|
Max: 19
|
|
38
38
|
|
|
@@ -41,7 +41,7 @@ Style/MultilineBlockChain:
|
|
|
41
41
|
Exclude:
|
|
42
42
|
- 'lib/js_dependency/mermaid/root.rb'
|
|
43
43
|
|
|
44
|
-
# Offense count:
|
|
44
|
+
# Offense count: 4
|
|
45
45
|
# This cop supports safe autocorrection (--autocorrect).
|
|
46
46
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
|
|
47
47
|
# URISchemes: http, https
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.3.7] - 2022-08-11
|
|
4
|
+
|
|
5
|
+
- If target is index.js, orphan include in analysis.
|
|
6
|
+
|
|
7
|
+
## [0.3.6] - 2022-08-11
|
|
8
|
+
|
|
9
|
+
- Add src path in script tag for create index.
|
|
10
|
+
|
|
11
|
+
## [0.3.5] - 2022-07-27
|
|
12
|
+
|
|
13
|
+
- Export orphan components list.
|
|
14
|
+
- Export left components list.
|
|
15
|
+
|
|
3
16
|
## [0.3.4] - 2022-07-26
|
|
4
17
|
|
|
5
18
|
- Add version CLI command
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
js_dependency (0.3.
|
|
4
|
+
js_dependency (0.3.7)
|
|
5
5
|
pathname
|
|
6
6
|
thor
|
|
7
7
|
yaml
|
|
@@ -18,7 +18,7 @@ GEM
|
|
|
18
18
|
docile (1.4.0)
|
|
19
19
|
json (2.6.2)
|
|
20
20
|
parallel (1.22.1)
|
|
21
|
-
parser (3.1.2.
|
|
21
|
+
parser (3.1.2.1)
|
|
22
22
|
ast (~> 2.4.1)
|
|
23
23
|
parslet (2.0.0)
|
|
24
24
|
pathname (0.2.0)
|
|
@@ -50,17 +50,17 @@ GEM
|
|
|
50
50
|
rspec (>= 2.13, < 4)
|
|
51
51
|
unparser
|
|
52
52
|
rspec-support (3.11.0)
|
|
53
|
-
rubocop (1.
|
|
53
|
+
rubocop (1.34.1)
|
|
54
54
|
json (~> 2.3)
|
|
55
55
|
parallel (~> 1.10)
|
|
56
|
-
parser (>= 3.1.
|
|
56
|
+
parser (>= 3.1.2.1)
|
|
57
57
|
rainbow (>= 2.2.2, < 4.0)
|
|
58
58
|
regexp_parser (>= 1.8, < 3.0)
|
|
59
59
|
rexml (>= 3.2.5, < 4.0)
|
|
60
|
-
rubocop-ast (>= 1.
|
|
60
|
+
rubocop-ast (>= 1.20.0, < 2.0)
|
|
61
61
|
ruby-progressbar (~> 1.7)
|
|
62
62
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
63
|
-
rubocop-ast (1.
|
|
63
|
+
rubocop-ast (1.21.0)
|
|
64
64
|
parser (>= 3.1.1.0)
|
|
65
65
|
rubocop-performance (1.14.3)
|
|
66
66
|
rubocop (>= 1.7.0, < 2.0)
|
data/README.md
CHANGED
|
@@ -6,6 +6,8 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
|
|
|
6
6
|
|
|
7
7
|
Analyze import dependency of JavaScript code and export mermaid format.
|
|
8
8
|
|
|
9
|
+
"import dependency" is analyzed from import statement of JavaScript code and src path that is added to script tag.
|
|
10
|
+
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
11
13
|
Install the gem and add to the application's Gemfile by executing:
|
|
@@ -19,7 +21,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
|
19
21
|
## Usage
|
|
20
22
|
### By Command Line
|
|
21
23
|
|
|
22
|
-
####
|
|
24
|
+
#### Show version
|
|
23
25
|
|
|
24
26
|
```shell
|
|
25
27
|
js_dependency version
|
|
@@ -88,6 +90,21 @@ js_dependency parents -s ./src -t ./src/App.vue -o ./parents.txt -p 2
|
|
|
88
90
|
js_dependency childrent -s ./src -t ./src/App.vue -o ./children.txt -c 2
|
|
89
91
|
```
|
|
90
92
|
|
|
93
|
+
#### Export orphan components list
|
|
94
|
+
|
|
95
|
+
Components that are not used in other components.
|
|
96
|
+
|
|
97
|
+
```shell
|
|
98
|
+
js_dependency orphan -s ./src
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Export left components list
|
|
102
|
+
|
|
103
|
+
Components that do not import other components.
|
|
104
|
+
|
|
105
|
+
```shell
|
|
106
|
+
js_dependency leave -s ./src
|
|
107
|
+
```
|
|
91
108
|
|
|
92
109
|
### By ruby code
|
|
93
110
|
If your javascript code is in `./src` and `./src/App.vue` is in the directory, you can analyze `./src/App.vue` dependency like this:
|
data/lib/js_dependency/cli.rb
CHANGED
|
@@ -118,6 +118,44 @@ module JsDependency
|
|
|
118
118
|
puts str
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
+
desc "orphan", "export components than is not depended by others"
|
|
122
|
+
option :src_path, type: :string, aliases: "-s", desc: "Root folder."
|
|
123
|
+
|
|
124
|
+
def orphan
|
|
125
|
+
pathname = Pathname.new(".js_dependency.yml")
|
|
126
|
+
args = {}
|
|
127
|
+
args = YAML.safe_load(pathname.read) if pathname.exist?
|
|
128
|
+
|
|
129
|
+
src_path = options[:src_path] || args["src_path"]
|
|
130
|
+
alias_paths = args["alias_paths"] || nil
|
|
131
|
+
|
|
132
|
+
str = JsDependency.orphan(
|
|
133
|
+
src_path,
|
|
134
|
+
alias_paths: alias_paths
|
|
135
|
+
).join("\n")
|
|
136
|
+
|
|
137
|
+
puts str
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
desc "leave", "export components than is not depended by others"
|
|
141
|
+
option :src_path, type: :string, aliases: "-s", desc: "Root folder."
|
|
142
|
+
|
|
143
|
+
def leave
|
|
144
|
+
pathname = Pathname.new(".js_dependency.yml")
|
|
145
|
+
args = {}
|
|
146
|
+
args = YAML.safe_load(pathname.read) if pathname.exist?
|
|
147
|
+
|
|
148
|
+
src_path = options[:src_path] || args["src_path"]
|
|
149
|
+
alias_paths = args["alias_paths"] || nil
|
|
150
|
+
|
|
151
|
+
str = JsDependency.leave(
|
|
152
|
+
src_path,
|
|
153
|
+
alias_paths: alias_paths
|
|
154
|
+
).join("\n")
|
|
155
|
+
|
|
156
|
+
puts str
|
|
157
|
+
end
|
|
158
|
+
|
|
121
159
|
desc "version", "show version"
|
|
122
160
|
def version
|
|
123
161
|
puts JsDependency::VERSION
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module JsDependency
|
|
4
|
+
module Extractor
|
|
5
|
+
class ExtractImportPath
|
|
6
|
+
# @param [String] str
|
|
7
|
+
def initialize(str)
|
|
8
|
+
@str = str
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
12
|
+
# @return [Array<String>]
|
|
13
|
+
def call
|
|
14
|
+
str = @str
|
|
15
|
+
# import defaultExport from 'module-name';
|
|
16
|
+
paths = str.gsub(/import\s+\S+\s+from\s+"([^"]+)"/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
17
|
+
paths += str.gsub(/import\s+\S+\s+from\s+'([^']+)'/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
18
|
+
|
|
19
|
+
# import * as name from \"module-name\";
|
|
20
|
+
paths += str.gsub(/import\s+\S+\s+as\s+\S+\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
21
|
+
list << Regexp.last_match(1)
|
|
22
|
+
end
|
|
23
|
+
paths += str.gsub(/import\s+\S+\s+as\s+\S+\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
24
|
+
list << Regexp.last_match(1)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# import { export1 } from \"module-name\";
|
|
28
|
+
# import { export1 as alias1 } from "module-name";
|
|
29
|
+
# import { export1 , export2 } from "module-name";
|
|
30
|
+
# import { foo , bar } from "module-name/path/to/specific/un-exported/file";
|
|
31
|
+
# import { export1 , export2 as alias2 , [...] } from "module-name";
|
|
32
|
+
paths += str.gsub(/import\s+\{\s+.+\s+\}\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
33
|
+
list << Regexp.last_match(1)
|
|
34
|
+
end
|
|
35
|
+
paths += str.gsub(/import\s+\{\s+.+\s+\}\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
36
|
+
list << Regexp.last_match(1)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# import defaultExport, { export1 [ , [...] ] } from "module-name";
|
|
40
|
+
paths += str.gsub(/import\s+\S+,\s+\{\s+.+\s+\}\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
41
|
+
list << Regexp.last_match(1)
|
|
42
|
+
end
|
|
43
|
+
paths += str.gsub(/import\s+\S+,\s+\{\s+.+\s+\}\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
44
|
+
list << Regexp.last_match(1)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# import defaultExport, * as name from "module-name";
|
|
48
|
+
paths += str.gsub(/import\s+\S+,\s+.+\s+as\s+\S+\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
49
|
+
list << Regexp.last_match(1)
|
|
50
|
+
end
|
|
51
|
+
paths += str.gsub(/import\s+\S+,\s+.+\s+as\s+\S+\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
52
|
+
list << Regexp.last_match(1)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# import "module-name";
|
|
56
|
+
paths += str.gsub(/import\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
57
|
+
list << Regexp.last_match(1)
|
|
58
|
+
end
|
|
59
|
+
paths += str.gsub(/import\s+'([^']+)'/).with_object([]) do |_, list|
|
|
60
|
+
list << Regexp.last_match(1)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# var promise = import("module-name");
|
|
64
|
+
paths += str.gsub(/import\("([^"]+)"\)/).with_object([]) do |_, list|
|
|
65
|
+
list << Regexp.last_match(1)
|
|
66
|
+
end
|
|
67
|
+
paths += str.gsub(/import\('([^']+)'\)/).with_object([]) do |_, list|
|
|
68
|
+
list << Regexp.last_match(1)
|
|
69
|
+
end
|
|
70
|
+
paths.uniq.sort
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
74
|
+
|
|
75
|
+
def self.call(str)
|
|
76
|
+
new(str).call
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module JsDependency
|
|
4
|
+
module Extractor
|
|
5
|
+
class ExtractScriptTag
|
|
6
|
+
# @param [String] str
|
|
7
|
+
def initialize(str)
|
|
8
|
+
@str = str
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @return [Array<String>]
|
|
12
|
+
def call
|
|
13
|
+
str = @str
|
|
14
|
+
scripts = str.gsub(%r{<script>(.+)</script>}m).with_object([]) do |_, list|
|
|
15
|
+
list << Regexp.last_match(1)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
scripts.uniq.sort.join("\n")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param [String] str
|
|
22
|
+
# @return [String]
|
|
23
|
+
def self.call(str)
|
|
24
|
+
new(str).call
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module JsDependency
|
|
4
|
+
module Extractor
|
|
5
|
+
class ExtractSrcPath
|
|
6
|
+
# @param [String] str
|
|
7
|
+
def initialize(str)
|
|
8
|
+
@str = str
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Extract JavaScript file (.js) in src path
|
|
12
|
+
# @return [Array<String>]
|
|
13
|
+
def call
|
|
14
|
+
str = @str
|
|
15
|
+
# <script src="module-name.js">
|
|
16
|
+
paths = str.gsub(/<script\s+src="([^']+)">/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
17
|
+
paths += str.gsub(/<script\s+src='([^']+)'>/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
18
|
+
|
|
19
|
+
filter_javascript_paths(paths).uniq.sort
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.call(str)
|
|
23
|
+
new(str).call
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# Filter JavaScript file (.js) from Array of String
|
|
29
|
+
# @param [Array<String>] paths
|
|
30
|
+
# @return [Array<String>]
|
|
31
|
+
def filter_javascript_paths(paths)
|
|
32
|
+
paths.filter do |path|
|
|
33
|
+
path.end_with?(".js")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "extract_script_tag"
|
|
4
|
-
require_relative "extract_import_path"
|
|
3
|
+
require_relative "extractor/extract_script_tag"
|
|
4
|
+
require_relative "extractor/extract_import_path"
|
|
5
|
+
require_relative "extractor/extract_src_path"
|
|
5
6
|
require_relative "replace_path_alias"
|
|
6
7
|
require_relative "pathname_utility"
|
|
7
8
|
|
|
@@ -45,6 +46,7 @@ module JsDependency
|
|
|
45
46
|
|
|
46
47
|
src_pathname.glob(pattern).each_with_object({}) do |component_pathname, obj|
|
|
47
48
|
import_pathnames = import_pathnames_from(component_pathname, alias_paths)
|
|
49
|
+
import_pathnames += src_javascript_pathnames_from(component_pathname, alias_paths)
|
|
48
50
|
|
|
49
51
|
obj[component_pathname.to_s] = import_pathnames.map(&:to_s)
|
|
50
52
|
if component_pathname.basename.to_s == "index.js"
|
|
@@ -60,11 +62,22 @@ module JsDependency
|
|
|
60
62
|
def import_pathnames_from(component_pathname, alias_paths)
|
|
61
63
|
component_dirname = component_pathname.dirname
|
|
62
64
|
script_str = extract_script_string(component_pathname)
|
|
63
|
-
JsDependency::ExtractImportPath.call(script_str).map do |import_path|
|
|
65
|
+
JsDependency::Extractor::ExtractImportPath.call(script_str).map do |import_path|
|
|
64
66
|
standardize_path(import_path, alias_paths, component_dirname)
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
69
|
|
|
70
|
+
# @param [Pathname] component_pathname
|
|
71
|
+
# @param [Array<String>] alias_paths
|
|
72
|
+
# @return [Array<Pathname>]
|
|
73
|
+
def src_javascript_pathnames_from(component_pathname, alias_paths)
|
|
74
|
+
component_dirname = component_pathname.dirname
|
|
75
|
+
str = component_pathname.read
|
|
76
|
+
JsDependency::Extractor::ExtractSrcPath.call(str).map do |src_path|
|
|
77
|
+
standardize_path(src_path, alias_paths, component_dirname)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
68
81
|
# @param [String] import_path
|
|
69
82
|
# @param [Array<String>] alias_paths
|
|
70
83
|
# @param [Pathname] component_dirname
|
|
@@ -91,7 +104,7 @@ module JsDependency
|
|
|
91
104
|
extname = pathname.extname
|
|
92
105
|
return str unless extname == ".vue"
|
|
93
106
|
|
|
94
|
-
JsDependency::ExtractScriptTag.call(str)
|
|
107
|
+
JsDependency::Extractor::ExtractScriptTag.call(str)
|
|
95
108
|
end
|
|
96
109
|
|
|
97
110
|
# @param [String] path
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../pathname_utility"
|
|
4
|
+
module JsDependency
|
|
5
|
+
module Mermaid
|
|
6
|
+
class TargetPathname
|
|
7
|
+
attr_accessor :color_css, :font_size_css
|
|
8
|
+
|
|
9
|
+
# @param [String] target_path
|
|
10
|
+
def initialize(target_path)
|
|
11
|
+
@pathname = to_target_pathname(target_path)
|
|
12
|
+
@color_css = "#f9f"
|
|
13
|
+
@font_size_css = "4px"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @param [String] src_path
|
|
17
|
+
# @return [String]
|
|
18
|
+
def mermaid_style(src_path)
|
|
19
|
+
src_pathname = Pathname.new(src_path).realpath
|
|
20
|
+
export_style(parse(@pathname.exist? ? @pathname.relative_path_from(src_pathname) : @pathname).join("_"))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# @param [String] path
|
|
26
|
+
# @return [String]
|
|
27
|
+
def export_style(path)
|
|
28
|
+
"style #{path} stroke:#{@color_css},stroke-width:#{@font_size_css}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @param [Pathname] pathname
|
|
32
|
+
# @param [Integer] level
|
|
33
|
+
def parse(pathname, level = -1)
|
|
34
|
+
JsDependency::PathnameUtility.parse(pathname, level)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @param [String] target_path
|
|
38
|
+
# @return [Pathname]
|
|
39
|
+
def to_target_pathname(target_path)
|
|
40
|
+
JsDependency::PathnameUtility.to_target_pathname(target_path)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -28,8 +28,23 @@ module JsDependency
|
|
|
28
28
|
|
|
29
29
|
# @param [Pathname] pathname
|
|
30
30
|
# @param [Integer] level
|
|
31
|
+
# @return [Array]
|
|
31
32
|
def self.parse(pathname, level = -1)
|
|
32
33
|
pathname.each_filename.with_object([]) { |filename, array| array << filename }.reverse[0..level].reverse
|
|
33
34
|
end
|
|
35
|
+
|
|
36
|
+
# @param [String] path
|
|
37
|
+
# @param [String] src_path
|
|
38
|
+
# @return [String]
|
|
39
|
+
def self.relative_path_or_external_path(path, src_path)
|
|
40
|
+
pathname = Pathname.new(path)
|
|
41
|
+
src_pathname = Pathname.new(src_path)
|
|
42
|
+
|
|
43
|
+
if pathname.exist?
|
|
44
|
+
pathname.realpath.relative_path_from(src_pathname.realpath.to_s).to_s
|
|
45
|
+
else
|
|
46
|
+
pathname.to_s
|
|
47
|
+
end
|
|
48
|
+
end
|
|
34
49
|
end
|
|
35
50
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../pathname_utility"
|
|
4
|
+
module JsDependency
|
|
5
|
+
module SourceAnalysis
|
|
6
|
+
# Components have no dependencies.
|
|
7
|
+
class Leave
|
|
8
|
+
# @param [Hash] index
|
|
9
|
+
# @param [String] src_path
|
|
10
|
+
def initialize(index, src_path)
|
|
11
|
+
@index = index
|
|
12
|
+
@src_path = src_path
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @return [Array<String>]
|
|
16
|
+
def call
|
|
17
|
+
left_index = @index.filter do |_target_path, child_paths|
|
|
18
|
+
blank?(child_paths)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
left_index = left_index.transform_keys do |target_path|
|
|
22
|
+
relative_path_or_external_path(target_path, @src_path)
|
|
23
|
+
end
|
|
24
|
+
left_index.keys.uniq.sort
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# @param [Array<String>] paths
|
|
30
|
+
# @return [TrueClass, FalseClass]
|
|
31
|
+
def blank?(paths)
|
|
32
|
+
paths.nil? || paths.empty?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param [String] path
|
|
36
|
+
# @param [String] src_path
|
|
37
|
+
# @return [String]
|
|
38
|
+
def relative_path_or_external_path(path, src_path)
|
|
39
|
+
JsDependency::PathnameUtility.relative_path_or_external_path(path, src_path)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../pathname_utility"
|
|
4
|
+
|
|
5
|
+
module JsDependency
|
|
6
|
+
module SourceAnalysis
|
|
7
|
+
# Components is not depended on.
|
|
8
|
+
class Orphan
|
|
9
|
+
# @param [Hash] index
|
|
10
|
+
# @param [String] src_path
|
|
11
|
+
def initialize(index, src_path)
|
|
12
|
+
@index = index
|
|
13
|
+
@src_path = src_path
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Array<String>]
|
|
17
|
+
def call
|
|
18
|
+
orphan_index = @index.filter do |target_path, _child_paths|
|
|
19
|
+
orphan?(target_path)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
orphan_index = orphan_index.transform_keys do |target_path|
|
|
23
|
+
relative_path_or_external_path(target_path, @src_path)
|
|
24
|
+
end
|
|
25
|
+
orphan_index.keys.uniq.sort
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# @param [String] target_path
|
|
31
|
+
# @return [TrueClass, FalseClass]
|
|
32
|
+
def orphan?(target_path)
|
|
33
|
+
paths = parent_paths(target_path)
|
|
34
|
+
paths += dir_parent_paths(target_path) if target_path.include?("index.js")
|
|
35
|
+
|
|
36
|
+
paths.size.zero?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param [String] path
|
|
40
|
+
# @param [String] src_path
|
|
41
|
+
# @return [String]
|
|
42
|
+
def relative_path_or_external_path(path, src_path)
|
|
43
|
+
JsDependency::PathnameUtility.relative_path_or_external_path(path, src_path)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Parent paths.
|
|
47
|
+
# @param [String] target_path
|
|
48
|
+
# @return [Array<String>]
|
|
49
|
+
def parent_paths(target_path)
|
|
50
|
+
target_pathname = JsDependency::TargetPathname.new(target_path)
|
|
51
|
+
paths = []
|
|
52
|
+
target_pathname.each_parent_path(1, @index) do |parent_path, _child_path|
|
|
53
|
+
paths << parent_path
|
|
54
|
+
end
|
|
55
|
+
paths
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Directory parent paths.
|
|
59
|
+
# @param [String] target_path
|
|
60
|
+
# @return [Array<String>]
|
|
61
|
+
def dir_parent_paths(target_path)
|
|
62
|
+
paths = []
|
|
63
|
+
target_pathname_dir = JsDependency::TargetPathname.new(Pathname.new(target_path).dirname.to_s)
|
|
64
|
+
target_pathname_dir.each_parent_path(1, @index) do |parent_path, _child_path|
|
|
65
|
+
paths << parent_path
|
|
66
|
+
end
|
|
67
|
+
paths
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -7,13 +7,7 @@ module JsDependency
|
|
|
7
7
|
|
|
8
8
|
# @param [String] target_path
|
|
9
9
|
def initialize(target_path)
|
|
10
|
-
@pathname =
|
|
11
|
-
Pathname.new(target_path).realpath
|
|
12
|
-
else
|
|
13
|
-
Pathname.new(target_path)
|
|
14
|
-
end
|
|
15
|
-
@color_css = "#f9f"
|
|
16
|
-
@font_size_css = "4px"
|
|
10
|
+
@pathname = to_target_pathname(target_path)
|
|
17
11
|
end
|
|
18
12
|
|
|
19
13
|
# @param [Integer] analyze_level
|
|
@@ -50,19 +44,8 @@ module JsDependency
|
|
|
50
44
|
end
|
|
51
45
|
end
|
|
52
46
|
|
|
53
|
-
def mermaid_style(src_path)
|
|
54
|
-
src_pathname = Pathname.new(src_path).realpath
|
|
55
|
-
export_style(parse(@pathname.exist? ? @pathname.relative_path_from(src_pathname) : @pathname).join("_"))
|
|
56
|
-
end
|
|
57
|
-
|
|
58
47
|
private
|
|
59
48
|
|
|
60
|
-
# @param [String] path
|
|
61
|
-
# @return [String]
|
|
62
|
-
def export_style(path)
|
|
63
|
-
"style #{path} stroke:#{@color_css},stroke-width:#{@font_size_css}"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
49
|
# @param [String] target_path
|
|
67
50
|
# @param [Hash] index
|
|
68
51
|
# @return [Array]
|
|
@@ -84,11 +67,5 @@ module JsDependency
|
|
|
84
67
|
def to_target_pathname(target_path)
|
|
85
68
|
JsDependency::PathnameUtility.to_target_pathname(target_path)
|
|
86
69
|
end
|
|
87
|
-
|
|
88
|
-
# @param [Pathname] pathname
|
|
89
|
-
# @param [Integer] level
|
|
90
|
-
def parse(pathname, level = -1)
|
|
91
|
-
JsDependency::PathnameUtility.parse(pathname, level)
|
|
92
|
-
end
|
|
93
70
|
end
|
|
94
71
|
end
|
data/lib/js_dependency.rb
CHANGED
|
@@ -5,6 +5,10 @@ require_relative "js_dependency/index_creator"
|
|
|
5
5
|
require_relative "js_dependency/mermaid/root"
|
|
6
6
|
require_relative "js_dependency/cli"
|
|
7
7
|
require_relative "js_dependency/target_pathname"
|
|
8
|
+
require_relative "js_dependency/mermaid/target_pathname"
|
|
9
|
+
require_relative "js_dependency/source_analysis/leave"
|
|
10
|
+
require_relative "js_dependency/source_analysis/orphan"
|
|
11
|
+
require_relative "js_dependency/pathname_utility"
|
|
8
12
|
require "pathname"
|
|
9
13
|
|
|
10
14
|
module JsDependency
|
|
@@ -18,6 +22,22 @@ module JsDependency
|
|
|
18
22
|
JsDependency::IndexCreator.call(src_path, alias_paths: alias_paths, excludes: excludes)
|
|
19
23
|
end
|
|
20
24
|
|
|
25
|
+
# @param [String] src_path
|
|
26
|
+
# @param [Hash, nil] alias_paths
|
|
27
|
+
# @return [Array<String>]
|
|
28
|
+
def self.leave(src_path, alias_paths: nil)
|
|
29
|
+
index = JsDependency::IndexCreator.call(src_path, alias_paths: alias_paths)
|
|
30
|
+
JsDependency::SourceAnalysis::Leave.new(index, src_path).call
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @param [String] src_path
|
|
34
|
+
# @param [Hash, nil] alias_paths
|
|
35
|
+
# @return [Array<String>]
|
|
36
|
+
def self.orphan(src_path, alias_paths: nil)
|
|
37
|
+
index = JsDependency::IndexCreator.call(src_path, alias_paths: alias_paths)
|
|
38
|
+
JsDependency::SourceAnalysis::Orphan.new(index, src_path).call
|
|
39
|
+
end
|
|
40
|
+
|
|
21
41
|
# @param [String] src_path
|
|
22
42
|
# @param [Array<String>] target_paths
|
|
23
43
|
# @param [String] orientation
|
|
@@ -35,10 +55,10 @@ module JsDependency
|
|
|
35
55
|
nodes = []
|
|
36
56
|
styles = []
|
|
37
57
|
target_paths.each do |target_path|
|
|
38
|
-
|
|
39
|
-
styles += [target_pathname.mermaid_style(src_path)]
|
|
58
|
+
styles += [JsDependency::Mermaid::TargetPathname.new(target_path).mermaid_style(src_path)]
|
|
40
59
|
mermaid_root = JsDependency::Mermaid::Root.new(orientation)
|
|
41
60
|
|
|
61
|
+
target_pathname = JsDependency::TargetPathname.new(target_path)
|
|
42
62
|
target_pathname.each_parent_path(parent_analyze_level, index) do |parent_path, child_path|
|
|
43
63
|
mermaid_root.add(parent_path, child_path)
|
|
44
64
|
end
|
|
@@ -72,7 +92,7 @@ module JsDependency
|
|
|
72
92
|
paths << parent_path
|
|
73
93
|
end
|
|
74
94
|
output = paths.uniq.sort.map do |path|
|
|
75
|
-
|
|
95
|
+
JsDependency::PathnameUtility.relative_path_or_external_path(path, src_path)
|
|
76
96
|
end
|
|
77
97
|
output_pathname&.write(output.sort.join("\n"))
|
|
78
98
|
output
|
|
@@ -96,7 +116,7 @@ module JsDependency
|
|
|
96
116
|
paths << child_path
|
|
97
117
|
end
|
|
98
118
|
output = paths.uniq.sort.map do |path|
|
|
99
|
-
|
|
119
|
+
JsDependency::PathnameUtility.relative_path_or_external_path(path, src_path)
|
|
100
120
|
end
|
|
101
121
|
output_pathname&.write(output.sort.join("\n"))
|
|
102
122
|
output
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: js_dependency
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- junara
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-08-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: pathname
|
|
@@ -159,13 +159,17 @@ files:
|
|
|
159
159
|
- js_dependency.gemspec
|
|
160
160
|
- lib/js_dependency.rb
|
|
161
161
|
- lib/js_dependency/cli.rb
|
|
162
|
-
- lib/js_dependency/extract_import_path.rb
|
|
163
|
-
- lib/js_dependency/extract_script_tag.rb
|
|
162
|
+
- lib/js_dependency/extractor/extract_import_path.rb
|
|
163
|
+
- lib/js_dependency/extractor/extract_script_tag.rb
|
|
164
|
+
- lib/js_dependency/extractor/extract_src_path.rb
|
|
164
165
|
- lib/js_dependency/index_creator.rb
|
|
165
166
|
- lib/js_dependency/mermaid/nodes_link.rb
|
|
166
167
|
- lib/js_dependency/mermaid/root.rb
|
|
168
|
+
- lib/js_dependency/mermaid/target_pathname.rb
|
|
167
169
|
- lib/js_dependency/pathname_utility.rb
|
|
168
170
|
- lib/js_dependency/replace_path_alias.rb
|
|
171
|
+
- lib/js_dependency/source_analysis/leave.rb
|
|
172
|
+
- lib/js_dependency/source_analysis/orphan.rb
|
|
169
173
|
- lib/js_dependency/target_pathname.rb
|
|
170
174
|
- lib/js_dependency/version.rb
|
|
171
175
|
- sig/js_dependency.rbs
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module JsDependency
|
|
4
|
-
class ExtractImportPath
|
|
5
|
-
# @param [String] str
|
|
6
|
-
def initialize(str)
|
|
7
|
-
@str = str
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
11
|
-
# @return [Array<String>]
|
|
12
|
-
def call
|
|
13
|
-
str = @str
|
|
14
|
-
# import defaultExport from 'module-name';
|
|
15
|
-
paths = str.gsub(/import\s+\S+\s+from\s+"([^"]+)"/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
16
|
-
paths += str.gsub(/import\s+\S+\s+from\s+'([^']+)'/).with_object([]) { |_, list| list << Regexp.last_match(1) }
|
|
17
|
-
|
|
18
|
-
# import * as name from \"module-name\";
|
|
19
|
-
paths += str.gsub(/import\s+\S+\s+as\s+\S+\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
20
|
-
list << Regexp.last_match(1)
|
|
21
|
-
end
|
|
22
|
-
paths += str.gsub(/import\s+\S+\s+as\s+\S+\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
23
|
-
list << Regexp.last_match(1)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# import { export1 } from \"module-name\";
|
|
27
|
-
# import { export1 as alias1 } from "module-name";
|
|
28
|
-
# import { export1 , export2 } from "module-name";
|
|
29
|
-
# import { foo , bar } from "module-name/path/to/specific/un-exported/file";
|
|
30
|
-
# import { export1 , export2 as alias2 , [...] } from "module-name";
|
|
31
|
-
paths += str.gsub(/import\s+\{\s+.+\s+\}\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
32
|
-
list << Regexp.last_match(1)
|
|
33
|
-
end
|
|
34
|
-
paths += str.gsub(/import\s+\{\s+.+\s+\}\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
35
|
-
list << Regexp.last_match(1)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# import defaultExport, { export1 [ , [...] ] } from "module-name";
|
|
39
|
-
paths += str.gsub(/import\s+\S+,\s+\{\s+.+\s+\}\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
40
|
-
list << Regexp.last_match(1)
|
|
41
|
-
end
|
|
42
|
-
paths += str.gsub(/import\s+\S+,\s+\{\s+.+\s+\}\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
43
|
-
list << Regexp.last_match(1)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# import defaultExport, * as name from "module-name";
|
|
47
|
-
paths += str.gsub(/import\s+\S+,\s+.+\s+as\s+\S+\s+from\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
48
|
-
list << Regexp.last_match(1)
|
|
49
|
-
end
|
|
50
|
-
paths += str.gsub(/import\s+\S+,\s+.+\s+as\s+\S+\s+from\s+'([^']+)'/).with_object([]) do |_, list|
|
|
51
|
-
list << Regexp.last_match(1)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# import "module-name";
|
|
55
|
-
paths += str.gsub(/import\s+"([^"]+)"/).with_object([]) do |_, list|
|
|
56
|
-
list << Regexp.last_match(1)
|
|
57
|
-
end
|
|
58
|
-
paths += str.gsub(/import\s+'([^']+)'/).with_object([]) do |_, list|
|
|
59
|
-
list << Regexp.last_match(1)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# var promise = import("module-name");
|
|
63
|
-
paths += str.gsub(/import\("([^"]+)"\)/).with_object([]) do |_, list|
|
|
64
|
-
list << Regexp.last_match(1)
|
|
65
|
-
end
|
|
66
|
-
paths += str.gsub(/import\('([^']+)'\)/).with_object([]) do |_, list|
|
|
67
|
-
list << Regexp.last_match(1)
|
|
68
|
-
end
|
|
69
|
-
paths.uniq.sort
|
|
70
|
-
end
|
|
71
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
72
|
-
|
|
73
|
-
def self.call(str)
|
|
74
|
-
new(str).call
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module JsDependency
|
|
4
|
-
class ExtractScriptTag
|
|
5
|
-
# @param [String] str
|
|
6
|
-
def initialize(str)
|
|
7
|
-
@str = str
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# @return [Array<String>]
|
|
11
|
-
def call
|
|
12
|
-
str = @str
|
|
13
|
-
scripts = str.gsub(%r{<script>(.+)</script>}m).with_object([]) do |_, list|
|
|
14
|
-
list << Regexp.last_match(1)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
scripts.uniq.sort.join("\n")
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# @param [String] str
|
|
21
|
-
# @return [String]
|
|
22
|
-
def self.call(str)
|
|
23
|
-
new(str).call
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|