js_dependency 0.3.3.1 → 0.3.6

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 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