minipack 0.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: ee2181b4e3046ef5d0bff95897d0f270f5693f611270d7a0a83fbe6b89b369af
4
- data.tar.gz: e8f7dd5422f6d05fb47524cae3bf7e6c30bbdf055be7bf047358379b18d761fb
3
+ metadata.gz: be2ebfb0d6964abdaa84f7f95b525d69dfdc1a2c2229f5acb1f9d50951042358
4
+ data.tar.gz: f847d5b248c873b7d0897f46734a1ca6b2191fec5ed139b876a32fb012d6b111
5
5
  SHA512:
6
- metadata.gz: 0a83558f3ee2f90469e8d7eaa9d80e2c14c55813e5b2657601e092e3c1c1249c0aa8514f93335a5a4ee8963bfbf610fff17605b0dcf3d12170d03844c284beed
7
- data.tar.gz: da77a9a3b187fdc59d4ed0849349d4bb0758de7a859229993ce34e6cda3c8589bb9179e1d6ff75478371d09bb1e603f00eff7118b91e31af55bcf0d006ab91e2
6
+ metadata.gz: 28f87f19304affa8867ddb3a45afe4f8a273ab4156208ef87de626a2de23d671232d5ddf011149a5296bf52191a3e8dfe686dc4e337884623d9087cba0dfc323
7
+ data.tar.gz: f8a35530ba477d50ee25dde27761848447cada20f053730215af543291408519ff1420800c6081db039f9513ff9440505ad9ad7c96607c9b760a1c2017ee8f2f
@@ -1,3 +1,37 @@
1
+ # 0.3.6 / 2020-08-21
2
+
3
+ ## Bug fixes
4
+
5
+ * Fix duplicated shared chunks issue (#38) by @thiagobrandam
6
+
7
+ # 0.3.5 / 2020-03-21
8
+
9
+ ## Bug fixes
10
+
11
+ * change name of method to fix conflict with ransack (#32) by @sadgb
12
+
13
+ # 0.3.4 / 2020-01-26
14
+
15
+ ## Bug fixes
16
+
17
+ * Add support for integrity attribute when using experimental splitChunks (#27) by @Jukejc
18
+
19
+ # 0.3.3 / 2019-09-12
20
+
21
+ ## Enhancements:
22
+
23
+ * Support manifest files that have integrity hashes in them (#24) by @HellRok
24
+
25
+ ## Breaking changes(internal apis only)
26
+
27
+ * Return value of `Minipack::Manifest#lookup!` and `Minipack::Manifest#find`, now changed from String to `Minipack::Manifest::Entry`.
28
+
29
+ # 0.3.2 / 2019-07-22
30
+
31
+ ## Enhancements:
32
+
33
+ * Add ability to instruct minipack if CSS will be in the manifest (#22) by @jmortlock
34
+
1
35
  # 0.3.1 / 2019-06-06
2
36
 
3
37
  ## Bug fixes
data/README.md CHANGED
@@ -4,7 +4,7 @@ Minipack, a gem for minimalists, which can integrates Rails with [webpack](https
4
4
 
5
5
  Minipack provides view helpers through a manifest, which resolve paths of assets build by a webpack configured by you as you like.
6
6
 
7
- **Note:** Before Minipack v0.3.0, it was called WebpackManifest. Please refer to [the migration guide](./docs/migrate_from_webpack_manifest.md') from WebpackManifest.
7
+ **Note:** Before Minipack v0.3.0, it was called WebpackManifest. Please refer to [the migration guide](./docs/migrate_from_webpack_manifest.md) from WebpackManifest.
8
8
 
9
9
  ## Features
10
10
 
@@ -48,6 +48,9 @@ Minipack.configuration do |c|
48
48
  # Register a path to a manifest file here. Right now you have to specify an absolute path.
49
49
  c.manifest = Rails.root.join('public', 'assets', 'manifest.json')
50
50
 
51
+ # If you are not extracting CSS in your webpack config you should set this flag to false
52
+ # c.extract_css = !Rails.env.development?
53
+
51
54
  # The base directory for the frontend system. By default, it will be
52
55
  # `Rails.root`.
53
56
  # c.base_path = Rails.root
@@ -295,10 +298,6 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
295
298
 
296
299
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
297
300
 
298
- **v0.2.x-trunk**
299
-
300
- v0.2.x-trunk is made from the latest released version v0.2.4. I will not intend to actively maintain v0.2.x anymore, except security fixes or bug fixes.
301
-
302
301
  ## Contributing
303
302
 
304
303
  Bug reports and pull requests are welcome on GitHub at https://github.com/nikushi/minipack.
@@ -79,6 +79,9 @@ module Minipack
79
79
  # The command for installation of npm packages
80
80
  config_attr :pkg_install_command, default: 'npm install'
81
81
 
82
+ # Disable if you're webpack configuration is not extracting CSS files
83
+ config_attr :extract_css, default: true
84
+
82
85
  # Let me leave this line for remember the indea of post pkg install hooks
83
86
  # config_attr :post_install_hooks, default: []
84
87
 
@@ -164,6 +167,13 @@ module Minipack
164
167
  File.join(root_path, 'tmp', 'cache', 'minipack')
165
168
  end
166
169
 
170
+ # CSS is extracted in the webpack build
171
+ #
172
+ # @return [Boolean]
173
+ def extract_css?
174
+ extract_css
175
+ end
176
+
167
177
  private
168
178
 
169
179
  def root?
@@ -9,7 +9,7 @@ module Minipack::Helper
9
9
  # <%= asset_bundle_path 'icon/favicon.ico' %> # => "/assets/web/pack/icon/favicon-1016838bab065ae1e122.ico"
10
10
  def asset_bundle_path(name, manifest: nil, **options)
11
11
  manifest = get_manifest_by_key(manifest)
12
- asset_path(manifest.lookup!(name.to_s), **options)
12
+ asset_path(manifest.lookup!(name.to_s).path, **options)
13
13
  end
14
14
 
15
15
  # Example:
@@ -20,7 +20,9 @@ module Minipack::Helper
20
20
  # <%= javascript_bundle_tag 'orders/app' %> # =>
21
21
  # <script src="/assets/web/pack/orders/app-1016838bab065ae1e314.js"></script>
22
22
  def javascript_bundle_tag(*names, manifest: nil, **options)
23
- javascript_include_tag(*sources_from_manifest(names, 'js', key: manifest), **options)
23
+ entries_from_manifest(names, 'js', key: manifest).map { |entry|
24
+ javascript_include_tag(entry.path, **minipack_options_for(entry, options))
25
+ }.join("\n").html_safe
24
26
  end
25
27
 
26
28
  # Creates script tags that references the js chunks from entrypoints when using split chunks API.
@@ -39,7 +41,9 @@ module Minipack::Helper
39
41
  # <%= javascript_bundles_with_chunks_tag 'calendar' %>
40
42
  # <%= javascript_bundles_with_chunks_tag 'map' %>
41
43
  def javascript_bundles_with_chunks_tag(*names, manifest: nil, **options)
42
- javascript_include_tag(*sources_from_manifest_entrypoints(names, 'js', key: manifest), **options)
44
+ sources_from_manifest_entrypoints(names, 'js', key: manifest).map { |entry|
45
+ javascript_include_tag(entry.path, **minipack_options_for(entry, options))
46
+ }.join("\n").html_safe
43
47
  end
44
48
 
45
49
  # Examples:
@@ -52,7 +56,11 @@ module Minipack::Helper
52
56
  # <link rel="stylesheet" media="screen"
53
57
  # href="/assets/web/pack/orders/style-1016838bab065ae1e122.css" />
54
58
  def stylesheet_bundle_tag(*names, manifest: nil, **options)
55
- stylesheet_link_tag(*sources_from_manifest(names, 'css', key: manifest), **options)
59
+ if Minipack.configuration.extract_css?
60
+ entries_from_manifest(names, 'css', key: manifest).map { |entry|
61
+ stylesheet_link_tag(entry.path, **minipack_options_for(entry, options))
62
+ }.join("\n").html_safe
63
+ end
56
64
  end
57
65
 
58
66
  # Creates link tags that references the css chunks from entrypoints when using split chunks API.
@@ -69,7 +77,11 @@ module Minipack::Helper
69
77
  # <%= stylesheet_bundles_with_chunks_tag 'calendar' %>
70
78
  # <%= stylesheet_bundles_with_chunks_tag 'map' %>
71
79
  def stylesheet_bundles_with_chunks_tag(*names, manifest: nil, **options)
72
- stylesheet_link_tag(*sources_from_manifest_entrypoints(names, 'css', key: manifest), **options)
80
+ if Minipack.configuration.extract_css?
81
+ sources_from_manifest_entrypoints(names, 'css', key: manifest).map { |entry|
82
+ stylesheet_link_tag(entry.path, **minipack_options_for(entry, options))
83
+ }.join("\n").html_safe
84
+ end
73
85
  end
74
86
 
75
87
  # Examples:
@@ -81,23 +93,30 @@ module Minipack::Helper
81
93
  # <img src="/assets/pack/icon-1016838bab065ae1e314.png" width="16" height="10" alt="Edit Entry" />
82
94
  def image_bundle_tag(name, manifest: nil, **options)
83
95
  manifest = get_manifest_by_key(manifest)
84
- image_tag(manifest.lookup!(name.to_s), **options)
96
+ image_tag(manifest.lookup!(name.to_s).path, **options)
85
97
  end
86
98
 
87
99
  private
88
100
 
89
- def sources_from_manifest(names, ext, key: nil)
101
+ def entries_from_manifest(names, ext, key: nil)
90
102
  manifest = get_manifest_by_key(key)
91
103
  names.map { |name| manifest.lookup!(name.to_s + '.' + ext) }
92
104
  end
93
105
 
94
106
  def sources_from_manifest_entrypoints(names, type, key: nil)
95
107
  manifest = get_manifest_by_key(key)
96
- names.map { |name| manifest.lookup_pack_with_chunks!(name, type: type) }.flatten.uniq
108
+ names.map { |name| manifest.lookup_pack_with_chunks!(name, type: type).entries }.flatten.uniq(&:path)
97
109
  end
98
110
 
99
111
  def get_manifest_by_key(key = nil)
100
112
  repository = Minipack.configuration.manifests
101
113
  key.nil? ? repository.default : repository.get(key)
102
114
  end
115
+
116
+ # @param [Minipack::Manifest::Entry] entry
117
+ # @param [Hash] options
118
+ def minipack_options_for(entry, options)
119
+ return options unless entry.integrity
120
+ options.merge(integrity: entry.integrity)
121
+ end
103
122
  end
@@ -6,6 +6,36 @@ require 'uri'
6
6
 
7
7
  module Minipack
8
8
  class Manifest
9
+ # A class that represents a single entry in a manifest
10
+ class Entry
11
+ attr_reader :path, :integrity
12
+
13
+ # @param [String] path single path of a single entry
14
+ # @param [String,nil] integrity optional value for subresource integrity of script tags
15
+ def initialize(path, integrity: nil)
16
+ @path = path
17
+ @integrity = integrity
18
+ end
19
+
20
+ def ==(other)
21
+ @path == other.path && @integrity == other.integrity
22
+ end
23
+ end
24
+
25
+ # A class that represents a group of chunked entries in a manifest
26
+ class ChunkGroup
27
+ attr_reader :entries
28
+
29
+ # @param [Array<Minipack::Manifest::Entry>] entries paths of chunked group
30
+ def initialize(entries)
31
+ @entries = Array(entries).map { |entry| entry.is_a?(String) ? Entry.new(entry) : entry }
32
+ end
33
+
34
+ def ==(other)
35
+ @entries == other.entries
36
+ end
37
+ end
38
+
9
39
  class MissingEntryError < StandardError; end
10
40
  class FileNotFoundError < StandardError; end
11
41
 
@@ -20,15 +50,30 @@ module Minipack
20
50
  def lookup_pack_with_chunks!(name, type: nil)
21
51
  manifest_pack_type = manifest_type(name, type)
22
52
  manifest_pack_name = manifest_name(name, manifest_pack_type)
23
- find('entrypoints')&.dig(manifest_pack_name, manifest_pack_type) || handle_missing_entry(name)
53
+ paths = data['entrypoints']&.dig(manifest_pack_name, manifest_pack_type) || handle_missing_entry(name)
54
+
55
+ entries = data['entrypoints']&.dig(manifest_pack_name, manifest_pack_type).map do |source|
56
+ entry_from_source(source) || handle_missing_entry(name)
57
+ end
58
+
59
+ ChunkGroup.new(entries)
24
60
  end
25
61
 
26
62
  def lookup!(name)
27
63
  find(name) || handle_missing_entry(name)
28
64
  end
29
65
 
66
+ # Find an entry by it's name
67
+ #
68
+ # @param [Symbol] name entry name
69
+ # @return [Minipack::Entry]
30
70
  def find(name)
31
- data[name.to_s]
71
+ path = data[name.to_s] || return
72
+ if path.is_a? Hash
73
+ integrity = path['integrity']
74
+ path = path['src']
75
+ end
76
+ Entry.new(path, integrity: integrity)
32
77
  end
33
78
 
34
79
  def assets
@@ -82,5 +127,16 @@ module Minipack
82
127
  #{JSON.pretty_generate(@data)}
83
128
  MSG
84
129
  end
130
+
131
+ # Find an entry by its source
132
+ #
133
+ # @param [String] source
134
+ # @return [Minipack::Entry,nil]
135
+ def entry_from_source(source)
136
+ entry = assets.find { |entry| entry.is_a?(String) ? entry == source : entry['src'] == source }
137
+ return unless entry
138
+ entry.is_a?(String) ? Entry.new(entry) : Entry.new(entry['src'], integrity: entry['integrity'])
139
+ end
85
140
  end
86
141
  end
142
+
@@ -17,7 +17,7 @@ module Minipack
17
17
 
18
18
  # @private
19
19
  def add(key, path, **options)
20
- manifest = Minipack::Manifest.new(path, options)
20
+ manifest = Minipack::Manifest.new(path, **options)
21
21
  # Mark a first one as a default
22
22
  @default = manifest if @manifests.empty?
23
23
  @manifests[key.to_sym] = manifest
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minipack
4
- VERSION = "0.3.1"
4
+ VERSION = "0.3.6"
5
5
  end
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'actionview'
28
28
  spec.add_dependency "railties", ">= 4.2"
29
29
  spec.add_development_dependency "bundler", "~> 2.0"
30
- spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rake", ">= 12.3.3"
31
31
  spec.add_development_dependency "rspec", "~> 3.0"
32
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minipack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nobuhiro Nikushi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-06 00:00:00.000000000 Z
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement