js_dependency 0.3.3.1 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 213b92143fa1ae05bd0c3ab2a94351fc6b1d990d82ff560dc4ac1f4d737a8201
4
- data.tar.gz: 8ce2ca6a8858adef25577702be473c50fcb56e7c5f5987cd934480bff5d2cfab
3
+ metadata.gz: 201aa2538971ea1e938c32236410e2b31ada21abbcd9f90141b84b08b132e7bb
4
+ data.tar.gz: fd6c9eb934ea1f884f885e0bce39c989ab2536a10faa33f900bcc95418f41fa6
5
5
  SHA512:
6
- metadata.gz: ede1bf2786104d0e6246d8becdc27ea0b57332fd93ce0db9ff258f63f6550cdf2ee44759852bb751fcf83e08dce759e6c1d4ed3c2836629826ace1eb95bbfc89
7
- data.tar.gz: ccc8d0a032339c59cd745f34e5ec9d3461d96f1fad35981034f6746ab31f05e7936320347fca67c1dde28f99913d2c4b5700a98c047b35cfa45ef8bb0c8bc5bb
6
+ metadata.gz: 0641c8506997b0bf21e4ec9cede06096fbc9b523e8e4e39954bb4a63eb73d551772945efa73c7e1098b0481cf70b0fc87eb291140f57db6b7599901b958a1b78
7
+ data.tar.gz: c0c38b6e23cb29d54a40009aba2290543d9706366eb45a092cbbd4e47817972e161e0830bbc51081e76bbd85899247d02bf851345030126c715e2e4e6e2d6e8e
data/.rubocop_todo.yml CHANGED
@@ -1,23 +1,28 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2022-07-26 00:36:01 UTC using RuboCop version 1.31.2.
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: 7
10
- # Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
9
+ # Offense count: 5
10
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods, CountRepeatedAttributes.
11
11
  Metrics/AbcSize:
12
- Max: 41
12
+ Max: 42
13
+
14
+ # Offense count: 1
15
+ # Configuration parameters: CountComments, CountAsOne.
16
+ Metrics/ClassLength:
17
+ Max: 129
13
18
 
14
19
  # Offense count: 5
15
- # Configuration parameters: IgnoredMethods.
20
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
16
21
  Metrics/CyclomaticComplexity:
17
- Max: 16
22
+ Max: 18
18
23
 
19
24
  # Offense count: 9
20
- # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
25
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
21
26
  Metrics/MethodLength:
22
27
  Max: 26
23
28
 
@@ -27,16 +32,16 @@ Metrics/ParameterLists:
27
32
  Max: 9
28
33
 
29
34
  # Offense count: 5
30
- # Configuration parameters: IgnoredMethods.
35
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
31
36
  Metrics/PerceivedComplexity:
32
- Max: 17
37
+ Max: 19
33
38
 
34
39
  # Offense count: 1
35
40
  Style/MultilineBlockChain:
36
41
  Exclude:
37
42
  - 'lib/js_dependency/mermaid/root.rb'
38
43
 
39
- # Offense count: 6
44
+ # Offense count: 4
40
45
  # This cop supports safe autocorrection (--autocorrect).
41
46
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
42
47
  # URISchemes: http, https
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.6] - 2022-08-11
4
+
5
+ - Add src path in script tag for create index.
6
+
7
+ ## [0.3.5] - 2022-07-27
8
+
9
+ - Export orphan components list.
10
+ - Export left components list.
11
+
12
+ ## [0.3.4] - 2022-07-26
13
+
14
+ - Add version CLI command
15
+ - Bug fix excludes option in parents and children commands.
16
+
3
17
  ## [0.3.3] - 2022-07-26
4
18
 
5
19
  - Add special style to target_paths in mermaid output CLI.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- js_dependency (0.3.3.1)
4
+ js_dependency (0.3.6)
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.0)
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.31.2)
53
+ rubocop (1.34.1)
54
54
  json (~> 2.3)
55
55
  parallel (~> 1.10)
56
- parser (>= 3.1.0.0)
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.18.0, < 2.0)
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.19.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,6 +21,15 @@ If bundler is not being used to manage dependencies, install the gem by executin
19
21
  ## Usage
20
22
  ### By Command Line
21
23
 
24
+ #### Show version
25
+
26
+ ```shell
27
+ js_dependency version
28
+ # => "X.X.X"
29
+ ```
30
+
31
+ #### yaml configuration file
32
+
22
33
  Configuration file is `./.js_dependency.yml`. This file includes parameters for the analysis.
23
34
 
24
35
  ```yaml
@@ -79,6 +90,21 @@ js_dependency parents -s ./src -t ./src/App.vue -o ./parents.txt -p 2
79
90
  js_dependency childrent -s ./src -t ./src/App.vue -o ./children.txt -c 2
80
91
  ```
81
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
+ ```
82
108
 
83
109
  ### By ruby code
84
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:
@@ -65,7 +65,7 @@ module JsDependency
65
65
  parent_analyze_level = options[:parent_analyze_level] || args["parent_analyze_level"] || 1
66
66
  output_path = options[:output_path] || args["output_path"] || nil
67
67
  alias_paths = args["alias_paths"] || nil
68
- excludes = if options[:excludes].length.positive?
68
+ excludes = if options[:excludes]&.length&.positive?
69
69
  options[:excludes]
70
70
  elsif args["excludes"]
71
71
  args["excludes"]
@@ -100,7 +100,7 @@ module JsDependency
100
100
  child_analyze_level = options[:child_analyze_level] || args["child_analyze_level"] || 1
101
101
  output_path = options[:output_path] || args["output_path"] || nil
102
102
  alias_paths = args["alias_paths"] || nil
103
- excludes = if options[:excludes].length.positive?
103
+ excludes = if options[:excludes]&.length&.positive?
104
104
  options[:excludes]
105
105
  elsif args["excludes"]
106
106
  args["excludes"]
@@ -117,5 +117,48 @@ module JsDependency
117
117
 
118
118
  puts str
119
119
  end
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
+
159
+ desc "version", "show version"
160
+ def version
161
+ puts JsDependency::VERSION
162
+ end
120
163
  end
121
164
  end
@@ -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,49 @@
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
+ target_pathname = JsDependency::TargetPathname.new(target_path)
34
+ paths = []
35
+ target_pathname.each_parent_path(1, @index) do |parent_path, _child_path|
36
+ paths << parent_path
37
+ end
38
+ paths.size.zero?
39
+ end
40
+
41
+ # @param [String] path
42
+ # @param [String] src_path
43
+ # @return [String]
44
+ def relative_path_or_external_path(path, src_path)
45
+ JsDependency::PathnameUtility.relative_path_or_external_path(path, src_path)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -7,13 +7,7 @@ module JsDependency
7
7
 
8
8
  # @param [String] target_path
9
9
  def initialize(target_path)
10
- @pathname = if Pathname.new(target_path).relative? && Pathname.new(target_path).exist?
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JsDependency
4
- VERSION = "0.3.3.1"
4
+ VERSION = "0.3.6"
5
5
  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
- target_pathname = JsDependency::TargetPathname.new(target_path)
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
- Pathname.new(path).exist? ? Pathname.new(path).relative_path_from(Pathname.new(src_path).realpath.to_s).to_s : Pathname.new(path).to_s
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
- Pathname.new(path).exist? ? Pathname.new(path).relative_path_from(Pathname.new(src_path).realpath.to_s).to_s : Pathname.new(path).to_s
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.3.1
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - junara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-26 00:00:00.000000000 Z
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