nanoc-webpack.rb 0.5.5 → 0.5.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: c3e798ff00aa45852e59880aac435054ddf29b3682655e8a9935de50300cfc72
4
- data.tar.gz: 1acef686fc1ff408aa5681d307c7879a9c1aada3a85c51912a6adc25a4fd5480
3
+ metadata.gz: 22ee6ae13d75181d02e95948c6f00446a7f92effe96fcc87c8e017f95c707a3e
4
+ data.tar.gz: bccc782d822fe1b6f843204a45b6eff75f677979bc7f4c68c853a71351f649ce
5
5
  SHA512:
6
- metadata.gz: c47e5a09a5a71e485eedb9a9a6e781d89067c3b86d7128fcb3b8a08ec51cfbb0c851c61b6709b1e7ec332573ea8209a467b2f64eb1d84082562def20920ec3b1
7
- data.tar.gz: c3cd143a1b31f035c30339d5c434b1859a4d450a313879a517c843009f9f109419b5632d87650070c20be2c971234ed8820be52213fe1f5f418377fc76d575c7
6
+ metadata.gz: 6dc66a6c40e1cadcdd50de9acd480ec69d80364bcd1b61e31345fdf4ab817fa7bb51c31fdd0790971b6915cbcce80c372b600b932cb450fac4caf947aa113579
7
+ data.tar.gz: 6509714bfa75b8d55b7030736a94f8ea66226bd7a86ceecc958c1749d08abc58618940a4cb1c009924bc76a172dedab0ccb6956facfb9e77145c222c6de73211
data/.rubocop.yml CHANGED
@@ -45,6 +45,10 @@ RSpec/DescribeClass:
45
45
  Enabled: false
46
46
  RSpec/ImplicitSubject:
47
47
  Enabled: false
48
+ RSpec/MessageSpies:
49
+ Enabled: false
50
+ RSpec/MultipleMemoizedHelpers:
51
+ Enabled: false
48
52
  Style/LambdaCall:
49
53
  Enabled: false
50
54
  Layout/MultilineMethodCallIndentation:
data/README.md CHANGED
@@ -10,21 +10,27 @@ connects nanoc, and the JavaScript, TypeScript, and nodejs ecosystems.
10
10
 
11
11
  ## Examples
12
12
 
13
- __app.ts__
13
+ ### Defaults
14
14
 
15
- The following example forwards the entry point `app.ts` to webpack, and
16
- then writes the result of the webpack compilation to `app.js`:
15
+ #### /js/main/App.tsx
16
+
17
+ The following example forwards the entry point `/js/main/App.tsx` to webpack,
18
+ and then writes the result to `/js/app.js`. This example and all the other
19
+ examples assume that the files `webpack.config.js`, `tsconfig.json`, and
20
+ `package.json` already exist at the root of the project:
17
21
 
18
22
  ``` ruby
19
23
  # Rules
20
24
  require "nanoc-webpack"
21
- compile "/js/app.ts" do
25
+ compile "/js/main/App.tsx" do
22
26
  filter(:webpack)
23
27
  write("/js/app.js")
24
28
  end
25
29
  ```
26
30
 
27
- __Option: "depend_on"__
31
+ ### Options
32
+
33
+ #### Option: "depend_on"
28
34
 
29
35
  The `depend_on` option tells nanoc what files an entry point imports or requires.
30
36
  When a file being tracked by the `depend_on` option undergoes a change, nanoc
@@ -33,13 +39,13 @@ will initiate a recompilation of the entry point:
33
39
  ```ruby
34
40
  # Rules
35
41
  require "nanoc-webpack"
36
- compile "/js/ReactApp.jsx" do
42
+ compile "/js/main/App.tsx" do
37
43
  filter(:webpack, depend_on: ["/js/lib", "/js/components", "/js/hooks"])
38
44
  write("/js/app.js")
39
45
  end
40
46
  ```
41
47
 
42
- __Option: "reject"__
48
+ #### Option: "reject"
43
49
 
44
50
  The `depend_on` option can be combined with the `reject` option to exclude
45
51
  certain files or directories from being tracked. For example, maybe you want
@@ -48,7 +54,7 @@ to track `/js/lib/` but not `/js/lib/foo/`:
48
54
  ```ruby
49
55
  # Rules
50
56
  require "nanoc-webpack"
51
- compile "/js/ReactApp.jsx" do
57
+ compile "/js/main/App.tsx" do
52
58
  filter :webpack,
53
59
  depend_on: ["/js/lib", "/js/components", "/js/hooks"],
54
60
  reject: proc { |path| path.start_with?("/js/lib/foo/") }
@@ -56,16 +62,20 @@ compile "/js/ReactApp.jsx" do
56
62
  end
57
63
  ```
58
64
 
59
- __Option: "args"__
65
+ #### Option: "args"
60
66
 
61
67
  The `args` option can be used to forward command-line options directly
62
- to the webpack executable. See `$ webpack build --help` for the list of
63
- options that are available:
68
+ to the webpack executable.
69
+ <br>
70
+ `$ webpack build --help verbose` provides a list of all available options,
71
+ and
72
+ [Nanoc::Webpack.default_options](https://0x1eef.github.io/x/nanoc-webpack.rb/Nanoc/Webpack.html#default_options-class_method)
73
+ returns the default options nanoc-webpack.rb will forward to webpack:
64
74
 
65
75
  ```ruby
66
76
  # Rules
67
77
  require "nanoc-webpack"
68
- compile "/js/ReactApp.jsx" do
78
+ compile "/js/main/App.tsx" do
69
79
  filter :webpack, args: {"--no-stats" => true}
70
80
  write("/js/app.js")
71
81
  end
@@ -77,8 +87,6 @@ end
77
87
  nanoc-webpack.rb assumes that:
78
88
 
79
89
  * A "node" executable is available in $PATH.
80
- * [npm](https://www.npmjs.com) or [yarn](https://yarnpkg.com/) are used for
81
- package management.
82
90
  * "webpack" / "webpack-cli" exist as dependencies in package.json.
83
91
 
84
92
  ## Sources
@@ -98,7 +106,7 @@ are available as sources.
98
106
 
99
107
  ```ruby
100
108
  # Gemfile
101
- gem "nanoc-webpack.rb", github: "0x1eef/nanoc-webpack.rb", tag: "v0.5.4"
109
+ gem "nanoc-webpack.rb", github: "0x1eef/nanoc-webpack.rb", tag: "v0.5.6"
102
110
  ```
103
111
 
104
112
  **Rubygems.org**
@@ -12,18 +12,23 @@ class Nanoc::Webpack::Filter < Nanoc::Filter
12
12
  type :text
13
13
 
14
14
  ##
15
+ # @example
16
+ # Nanoc::Webpack.default_options.merge!(
17
+ # "--cache-type" => "memory"
18
+ # )
19
+ #
15
20
  # @return [Hash]
16
- # Returns the default command-line options given
17
- # to the webpack executable.
21
+ # Returns the default command-line options given to webpack.
18
22
  def self.default_options
19
- @default_options ||= {}
23
+ @default_options ||= {"--cache-type" => "filesystem"}
20
24
  end
21
25
 
22
26
  def run(content, options = {})
27
+ args = options[:args] || options["args"] || {}
23
28
  depend_on dependable(paths: options[:depend_on], reject: options[:reject])
24
29
  .map { items[_1] }
25
30
  webpack temporary_file_for(content),
26
- args: self.class.default_options.merge(options[:args] || {})
31
+ args: self.class.default_options.merge(args)
27
32
  end
28
33
 
29
34
  private
@@ -57,7 +62,7 @@ class Nanoc::Webpack::Filter < Nanoc::Filter
57
62
  def temporary_file_for(content)
58
63
  dir = File.join(Dir.getwd, "tmp", "nanoc-webpack.rb")
59
64
  mkdir_p(dir) unless Dir.exist?(dir)
60
- file = Tempfile.new(File.basename(item.identifier.to_s), dir)
65
+ file = Tempfile.new(File.basename(@item.identifier.to_s), dir)
61
66
  file.write(content)
62
67
  file.tap(&:flush)
63
68
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Nanoc
4
4
  module Webpack
5
- VERSION = "0.5.5"
5
+ VERSION = "0.5.6"
6
6
  end
7
7
  end
data/lib/nanoc/webpack.rb CHANGED
@@ -1,7 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "nanoc"
4
- require "ryo"
5
4
  module Nanoc::Webpack
5
+ require "ryo"
6
6
  require_relative "webpack/filter"
7
+ ##
8
+ # @example (see Nanoc::Webpack::Filter.default_options)
9
+ # @return (see Nanoc::Webpack::Filter.default_options)
10
+ def self.default_options
11
+ Nanoc::Webpack::Filter.default_options
12
+ end
7
13
  end
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "setup"
4
+ RSpec.describe Nanoc::Webpack::Filter do
5
+ let(:paths) { ["/1", "/1/1.txt", "/1/2", "/1/2/1.txt"] }
6
+ let(:root) { File.join("spec", "fakefs", "content") }
7
+ let(:reject) { nil }
8
+ let(:item) do
9
+ Ryo.from(
10
+ identifier: {to_s: "test.ts"},
11
+ attributes: {content_filename: "test.ts"}
12
+ )
13
+ end
14
+ let(:items) do
15
+ paths.each_with_object({}) { _2[_1] = _1 }
16
+ end
17
+ let(:config) do
18
+ Ryo.from(
19
+ each: {to_h: {data_sources: [{content_dir: root}]}},
20
+ data_sources: [{content_dir: root}]
21
+ )
22
+ end
23
+ let(:filter) do
24
+ Nanoc::Filter
25
+ .named!(:webpack)
26
+ .new(item:, items:, config:)
27
+ end
28
+ include FileUtils
29
+
30
+ context "when given dependables" do
31
+ subject { filter.dependable(paths: target, reject:) }
32
+
33
+ before do
34
+ mkdir_p(root)
35
+ paths.each do
36
+ path = File.join(root, _1)
37
+ File.extname(path).empty? ? mkdir_p(path) : touch(path)
38
+ end
39
+ end
40
+
41
+ after { rm_rf(root) }
42
+
43
+ context "when the directory depth is 2" do
44
+ context "when given /1 as a path" do
45
+ let(:target) { "/1" }
46
+ it { is_expected.to contain_exactly("/1/1.txt", "/1/2/1.txt") }
47
+ end
48
+
49
+ context "when given /1/2 as a path" do
50
+ let(:target) { "/1/2" }
51
+ it { is_expected.to contain_exactly("/1/2/1.txt") }
52
+ end
53
+ end
54
+
55
+ context "when the directory depth is 5" do
56
+ let(:paths) { super().concat(["/1/2/3/4/5", "/1/2/3/4/5/1.txt"]) }
57
+
58
+ context "when given /1 as a path" do
59
+ let(:target) { "/1" }
60
+ it do
61
+ is_expected.to contain_exactly(
62
+ "/1/1.txt",
63
+ "/1/2/1.txt",
64
+ "/1/2/3/4/5/1.txt"
65
+ )
66
+ end
67
+ end
68
+
69
+ context "when given /1/2 as a path" do
70
+ let(:target) { "/1/2" }
71
+ it { is_expected.to contain_exactly("/1/2/1.txt", "/1/2/3/4/5/1.txt") }
72
+ end
73
+
74
+ context "when given /1/2/3 as a path" do
75
+ let(:target) { "/1/2/3" }
76
+ it { is_expected.to contain_exactly("/1/2/3/4/5/1.txt") }
77
+ end
78
+
79
+ context "when depth 5 has descendant directories" do
80
+ let(:paths) do
81
+ super().concat([
82
+ "/1/2/3/4/5/a", "/1/2/3/4/5/a/a.txt",
83
+ "/1/2/3/4/5/b", "/1/2/3/4/5/b/b.txt",
84
+ "/1/2/3/4/5/c", "/1/2/3/4/5/c/c.txt"
85
+ ])
86
+ end
87
+
88
+ context "when given /1 as a path" do
89
+ let(:target) { "/1" }
90
+ it do
91
+ is_expected.to contain_exactly(
92
+ "/1/1.txt", "/1/2/1.txt", "/1/2/3/4/5/1.txt",
93
+ "/1/2/3/4/5/a/a.txt", "/1/2/3/4/5/b/b.txt",
94
+ "/1/2/3/4/5/c/c.txt"
95
+ )
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ context "when one or more directories are excluded" do
102
+ let(:paths) { super().concat(["/2/3", "/2/3/1.txt", "/3/4", "/3/4/1.txt"]) }
103
+
104
+ context "when the target is [!12]" do
105
+ let(:target) { "/[!12]/" }
106
+ it { is_expected.to contain_exactly("/3/4/1.txt") }
107
+ end
108
+
109
+ context "when the reject filter is used" do
110
+ let(:paths) do
111
+ ["/lib/WebPackage/", "/lib/WebPackage/foo.ts",
112
+ "/lib/Web/", "/lib/Web/foo.ts",
113
+ "/lib/foo/", "/lib/foo/foo.ts"]
114
+ end
115
+ let(:target) { "/lib/" }
116
+ let(:reject) { proc { |path| path.include?("WebPackage") } }
117
+
118
+ it do
119
+ is_expected.to contain_exactly("/lib/Web/foo.ts", "/lib/foo/foo.ts")
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ context "when nodejs is executed" do
126
+ let(:cmdline) do
127
+ [
128
+ "node",
129
+ "./node_modules/webpack/bin/webpack.js",
130
+ "--entry", File.join(Dir.getwd, "test.ts"),
131
+ "--output-path", instance_of(String),
132
+ "--output-filename", instance_of(String),
133
+ "--cache-type", "filesystem"
134
+ ]
135
+ end
136
+
137
+ context "with default arguments" do
138
+ it "executes nodejs" do
139
+ expect(filter).to receive(:system).with(*cmdline)
140
+ filter.run(item)
141
+ end
142
+ end
143
+
144
+ context "with --no-cache" do
145
+ let(:cmdline) { super().concat(["--no-cache"]) }
146
+
147
+ it "executes nodejs with an argument" do
148
+ expect(filter).to receive(:system).with(*cmdline)
149
+ filter.run(item, args: {"--no-cache" => true})
150
+ end
151
+ end
152
+ end
153
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc-webpack.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - '0x1eef'
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-11 00:00:00.000000000 Z
11
+ date: 2024-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ryo.rb
@@ -116,7 +116,7 @@ files:
116
116
  - lib/nanoc/webpack/filter/dependable.rb
117
117
  - lib/nanoc/webpack/version.rb
118
118
  - nanoc-webpack.rb.gemspec
119
- - spec/dependable_spec.rb
119
+ - spec/filter_spec.rb
120
120
  - spec/setup.rb
121
121
  homepage: https://github.com/0x1eef/nanoc-webpack.rb#readme
122
122
  licenses:
@@ -1,110 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "setup"
4
-
5
- RSpec.describe Nanoc::Webpack::Filter::Dependable do
6
- subject { filter.dependable(paths: target, reject:) }
7
- let(:paths) { ["/1", "/1/1.txt", "/1/2", "/1/2/1.txt"] }
8
- let(:root) { File.join("spec", "fakefs", "content") }
9
- let(:reject) { nil }
10
- let(:filter) do
11
- Object.new.instance_exec(root, paths) do |root, paths|
12
- extend Nanoc::Webpack::Filter::Dependable
13
- define_singleton_method(:items) { paths.each_with_object({}) { _2[_1] = _1 } }
14
- define_singleton_method(:root) { root }
15
- self
16
- end
17
- end
18
- include FileUtils
19
-
20
- before do
21
- mkdir_p(root)
22
- paths.each do
23
- path = File.join(root, _1)
24
- File.extname(path).empty? ? mkdir_p(path) : touch(path)
25
- end
26
- end
27
-
28
- after { rm_rf(root) }
29
-
30
- context "when the directory depth is 2" do
31
- context "when given /1 as a path" do
32
- let(:target) { "/1" }
33
- it { is_expected.to contain_exactly("/1/1.txt", "/1/2/1.txt") }
34
- end
35
-
36
- context "when given /1/2 as a path" do
37
- let(:target) { "/1/2" }
38
- it { is_expected.to contain_exactly("/1/2/1.txt") }
39
- end
40
- end
41
-
42
- context "when the directory depth is 5" do
43
- let(:paths) { super().concat(["/1/2/3/4/5", "/1/2/3/4/5/1.txt"]) }
44
-
45
- context "when given /1 as a path" do
46
- let(:target) { "/1" }
47
- it do
48
- is_expected.to contain_exactly(
49
- "/1/1.txt",
50
- "/1/2/1.txt",
51
- "/1/2/3/4/5/1.txt"
52
- )
53
- end
54
- end
55
-
56
- context "when given /1/2 as a path" do
57
- let(:target) { "/1/2" }
58
- it { is_expected.to contain_exactly("/1/2/1.txt", "/1/2/3/4/5/1.txt") }
59
- end
60
-
61
- context "when given /1/2/3 as a path" do
62
- let(:target) { "/1/2/3" }
63
- it { is_expected.to contain_exactly("/1/2/3/4/5/1.txt") }
64
- end
65
-
66
- context "when depth 5 has descendant directories" do
67
- let(:paths) do
68
- super().concat([
69
- "/1/2/3/4/5/a", "/1/2/3/4/5/a/a.txt",
70
- "/1/2/3/4/5/b", "/1/2/3/4/5/b/b.txt",
71
- "/1/2/3/4/5/c", "/1/2/3/4/5/c/c.txt"
72
- ])
73
- end
74
-
75
- context "when given /1 as a path" do
76
- let(:target) { "/1" }
77
- it do
78
- is_expected.to contain_exactly(
79
- "/1/1.txt", "/1/2/1.txt", "/1/2/3/4/5/1.txt",
80
- "/1/2/3/4/5/a/a.txt", "/1/2/3/4/5/b/b.txt",
81
- "/1/2/3/4/5/c/c.txt"
82
- )
83
- end
84
- end
85
- end
86
- end
87
-
88
- context "when one or more directories are excluded" do
89
- let(:paths) { super().concat(["/2/3", "/2/3/1.txt", "/3/4", "/3/4/1.txt"]) }
90
-
91
- context "when the target is [!12]" do
92
- let(:target) { "/[!12]/" }
93
- it { is_expected.to contain_exactly("/3/4/1.txt") }
94
- end
95
-
96
- context "when the reject filter is used" do
97
- let(:paths) do
98
- ["/lib/WebPackage/", "/lib/WebPackage/foo.ts",
99
- "/lib/Web/", "/lib/Web/foo.ts",
100
- "/lib/foo/", "/lib/foo/foo.ts"]
101
- end
102
- let(:target) { "/lib/" }
103
- let(:reject) { proc { |path| path.include?("WebPackage") } }
104
-
105
- it do
106
- is_expected.to contain_exactly("/lib/Web/foo.ts", "/lib/foo/foo.ts")
107
- end
108
- end
109
- end
110
- end