hanami-assets 2.1.0.rc1 → 2.1.0.rc2
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/CHANGELOG.md +2 -0
- data/README.md +13 -22
- data/lib/hanami/assets/config.rb +42 -38
- data/lib/hanami/assets/errors.rb +5 -6
- data/lib/hanami/assets/version.rb +1 -1
- data/lib/hanami/assets.rb +21 -8
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 71f6b2236cb6f96e86f9bbf25453b179685db554ef87faa5c64a09457aaefea3
|
|
4
|
+
data.tar.gz: 513533d8e23d48cc02dbaad76188724c934ddc4bf51bcd31b706fa61ef611a35
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b47ce4c26181b7f0bb21ec64522162fd212ba33ab9284bdbfafd7c8b96bb983ca90a220266f1a5608dd0b990ca4ed40dd0a130445aab6de60f824ca018423347
|
|
7
|
+
data.tar.gz: 4df3a64885b684132af03c206ae224ad1f3855180aac4b6f15fb323dba8199f5195a4a0c5f6123854427888e96ff2b3201d037a6035b5a396b5561f9c2a5d26a
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
|
@@ -66,13 +66,13 @@ Given the following template:
|
|
|
66
66
|
<html>
|
|
67
67
|
<head>
|
|
68
68
|
<title>Assets example</title>
|
|
69
|
-
<%=
|
|
69
|
+
<%= stylesheet_tag "reset", "app" %>
|
|
70
70
|
</head>
|
|
71
71
|
|
|
72
72
|
<body>
|
|
73
73
|
<!-- ... -->
|
|
74
|
-
<%=
|
|
75
|
-
<%=
|
|
74
|
+
<%= javascript_tag "app" %>
|
|
75
|
+
<%= javascript_tag "https://cdn.somethirdparty.script/foo.js", async: true %>
|
|
76
76
|
</body>
|
|
77
77
|
</html>
|
|
78
78
|
```
|
|
@@ -98,15 +98,16 @@ It will output this markup:
|
|
|
98
98
|
|
|
99
99
|
### Available Helpers
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
The `hanami` gem ships with the following helpers for assets:
|
|
102
102
|
|
|
103
|
-
* `
|
|
104
|
-
* `
|
|
105
|
-
* `
|
|
106
|
-
* `
|
|
107
|
-
* `
|
|
108
|
-
* `
|
|
109
|
-
* `
|
|
103
|
+
* `asset_url`
|
|
104
|
+
* `javascript_tag`
|
|
105
|
+
* `stylesheet_tag`
|
|
106
|
+
* `favicon_tag`
|
|
107
|
+
* `image_tag`
|
|
108
|
+
* `video_tag`
|
|
109
|
+
* `audio_tag`
|
|
110
|
+
* `path_tag`
|
|
110
111
|
|
|
111
112
|
## App Structure
|
|
112
113
|
|
|
@@ -153,16 +154,6 @@ If you have a custom directory `app/assets/fonts`, all the fonts are copied to t
|
|
|
153
154
|
|
|
154
155
|
The destination directory is `public/assets`.
|
|
155
156
|
|
|
156
|
-
### Sources
|
|
157
|
-
|
|
158
|
-
Hanami Assets works with [Yarn](https://yarnpkg.com/).
|
|
159
|
-
|
|
160
|
-
In order to add/remove a source to your application, you should follow Yarn's dependencies management.
|
|
161
|
-
|
|
162
|
-
### Preprocessors
|
|
163
|
-
|
|
164
|
-
Hanami Assets is able to preprocess any kind of JavaScript and CSS flavor.
|
|
165
|
-
|
|
166
157
|
### Deployment
|
|
167
158
|
|
|
168
159
|
To process the assets during deployment run `bundle exec hanami assets compile`.
|
|
@@ -265,7 +256,7 @@ __Hanami::Assets__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
|
265
256
|
|
|
266
257
|
## Contributing
|
|
267
258
|
|
|
268
|
-
1. Fork it (
|
|
259
|
+
1. Fork it (https://github.com/hanami/assets/fork)
|
|
269
260
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
270
261
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
271
262
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/hanami/assets/config.rb
CHANGED
|
@@ -5,51 +5,61 @@ require_relative "base_url"
|
|
|
5
5
|
|
|
6
6
|
module Hanami
|
|
7
7
|
class Assets
|
|
8
|
-
#
|
|
8
|
+
# Hanami assets configuration.
|
|
9
9
|
#
|
|
10
|
+
# @api public
|
|
10
11
|
# @since 0.1.0
|
|
11
12
|
class Config
|
|
12
13
|
include Dry::Configurable
|
|
13
14
|
|
|
15
|
+
# @api public
|
|
14
16
|
# @since 2.1.0
|
|
15
|
-
# @api private
|
|
16
17
|
BASE_URL = ""
|
|
17
18
|
private_constant :BASE_URL
|
|
18
19
|
|
|
19
|
-
#
|
|
20
|
-
#
|
|
20
|
+
# @!attribute [rw] package_manager_run_command
|
|
21
|
+
# @return [String]
|
|
22
|
+
#
|
|
23
|
+
# @api public
|
|
24
|
+
# @since 2.1.0
|
|
21
25
|
setting :package_manager_run_command, default: "npm run --silent"
|
|
22
26
|
|
|
23
|
-
#
|
|
24
|
-
#
|
|
27
|
+
# @!attribute [rw] path_prefix
|
|
28
|
+
# @return [String]
|
|
29
|
+
#
|
|
30
|
+
# @api public
|
|
31
|
+
# @since 2.1.0
|
|
25
32
|
setting :path_prefix, default: "/assets"
|
|
26
33
|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
#
|
|
34
|
+
# @!attribute [rw] subresource_integrity
|
|
35
|
+
# @return [Array<Symbol>]
|
|
36
|
+
#
|
|
37
|
+
# @example
|
|
38
|
+
# config.subresource_integrity # => [:sha256, :sha512]
|
|
39
|
+
#
|
|
40
|
+
# @api public
|
|
41
|
+
# @since 2.1.0
|
|
33
42
|
setting :subresource_integrity, default: []
|
|
34
43
|
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
#
|
|
40
|
-
#
|
|
44
|
+
# @!attribute [rw] base_url
|
|
45
|
+
# @return [BaseUrl]
|
|
46
|
+
#
|
|
47
|
+
# @example
|
|
48
|
+
# config.base_url = "http://some-cdn.com/assets"
|
|
49
|
+
#
|
|
50
|
+
# @api public
|
|
51
|
+
# @since 2.1.0
|
|
41
52
|
setting :base_url, constructor: -> url { BaseUrl.new(url.to_s) }
|
|
42
53
|
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
# @api private
|
|
54
|
+
# @!attribute [rw] manifest_path
|
|
55
|
+
# @return [String, nil]
|
|
56
|
+
#
|
|
57
|
+
# @api public
|
|
58
|
+
# @since 2.1.0
|
|
49
59
|
setting :manifest_path
|
|
50
60
|
|
|
61
|
+
# @api public
|
|
51
62
|
# @since 2.1.0
|
|
52
|
-
# @api private
|
|
53
63
|
def initialize(**values)
|
|
54
64
|
super()
|
|
55
65
|
|
|
@@ -58,29 +68,24 @@ module Hanami
|
|
|
58
68
|
yield(config) if block_given?
|
|
59
69
|
end
|
|
60
70
|
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Check if the given source is linked via Cross-Origin policy.
|
|
70
|
-
# In other words, the given source, doesn't satisfy the Same-Origin policy.
|
|
71
|
+
# Returns true if the given source is linked via Cross-Origin policy (or in other words, if
|
|
72
|
+
# the given source does not satisfy the Same-Origin policy).
|
|
73
|
+
#
|
|
74
|
+
# @param source [String]
|
|
75
|
+
#
|
|
76
|
+
# @return [Boolean]
|
|
71
77
|
#
|
|
72
78
|
# @see https://en.wikipedia.org/wiki/Same-origin_policy#Origin_determination_rules
|
|
73
79
|
# @see https://en.wikipedia.org/wiki/Same-origin_policy#document.domain_property
|
|
74
80
|
#
|
|
75
|
-
# @since 1.2.0
|
|
76
81
|
# @api private
|
|
82
|
+
# @since 1.2.0
|
|
77
83
|
def crossorigin?(source)
|
|
78
84
|
base_url.crossorigin?(source)
|
|
79
85
|
end
|
|
80
86
|
|
|
81
87
|
private
|
|
82
88
|
|
|
83
|
-
# @api private
|
|
84
89
|
def method_missing(name, ...)
|
|
85
90
|
if config.respond_to?(name)
|
|
86
91
|
config.public_send(name, ...)
|
|
@@ -89,7 +94,6 @@ module Hanami
|
|
|
89
94
|
end
|
|
90
95
|
end
|
|
91
96
|
|
|
92
|
-
# @api private
|
|
93
97
|
def respond_to_missing?(name, _incude_all = false)
|
|
94
98
|
config.respond_to?(name) || super
|
|
95
99
|
end
|
data/lib/hanami/assets/errors.rb
CHANGED
|
@@ -2,25 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
module Hanami
|
|
4
4
|
class Assets
|
|
5
|
-
# Base error for Hanami::Assets
|
|
6
|
-
#
|
|
7
|
-
# All the errors defined in this framework MUST inherit from it.
|
|
5
|
+
# Base error for Hanami::Assets.
|
|
8
6
|
#
|
|
7
|
+
# @api public
|
|
9
8
|
# @since 0.1.0
|
|
10
9
|
class Error < ::StandardError
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
# Error raised when assets config is not valid.
|
|
14
13
|
#
|
|
15
|
-
# @since 2.1.0
|
|
16
14
|
# @api public
|
|
15
|
+
# @since 2.1.0
|
|
17
16
|
class ConfigError < Error
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
# Error returned when the assets manifest file is missing.
|
|
21
20
|
#
|
|
22
|
-
# @since 2.1.0
|
|
23
21
|
# @api public
|
|
22
|
+
# @since 2.1.0
|
|
24
23
|
class ManifestMissingError < Error
|
|
25
24
|
def initialize(manifest_path)
|
|
26
25
|
super(<<~TEXT)
|
|
@@ -33,8 +32,8 @@ module Hanami
|
|
|
33
32
|
|
|
34
33
|
# Error raised when no asset can be found for a source path.
|
|
35
34
|
#
|
|
36
|
-
# @since 2.1.0
|
|
37
35
|
# @api public
|
|
36
|
+
# @since 2.1.0
|
|
38
37
|
class AssetMissingError < Error
|
|
39
38
|
def initialize(source_path)
|
|
40
39
|
super(<<~TEXT)
|
data/lib/hanami/assets.rb
CHANGED
|
@@ -3,9 +3,6 @@
|
|
|
3
3
|
require "json"
|
|
4
4
|
require "zeitwerk"
|
|
5
5
|
|
|
6
|
-
# Hanami
|
|
7
|
-
#
|
|
8
|
-
# @since 0.1.0
|
|
9
6
|
module Hanami
|
|
10
7
|
# Assets management for Ruby web applications
|
|
11
8
|
#
|
|
@@ -31,21 +28,29 @@ module Hanami
|
|
|
31
28
|
require_relative "assets/version"
|
|
32
29
|
require_relative "assets/errors"
|
|
33
30
|
|
|
34
|
-
# @since 2.1.0
|
|
35
31
|
# @api private
|
|
32
|
+
# @since 2.1.0
|
|
36
33
|
SEPARATOR = "/"
|
|
37
34
|
private_constant :SEPARATOR
|
|
38
35
|
|
|
36
|
+
# @api private
|
|
37
|
+
# @since 2.1.0
|
|
39
38
|
attr_reader :config
|
|
40
39
|
|
|
41
|
-
# @since 2.1.0
|
|
42
40
|
# @api public
|
|
41
|
+
# @since 2.1.0
|
|
43
42
|
def initialize(config:)
|
|
44
43
|
@config = config
|
|
45
44
|
end
|
|
46
45
|
|
|
47
|
-
#
|
|
46
|
+
# Returns the asset at the given path.
|
|
47
|
+
#
|
|
48
|
+
# @return [Hanami::Assets::Asset] the asset
|
|
49
|
+
#
|
|
50
|
+
# @raise AssetMissingError if no asset can be found at the path
|
|
51
|
+
#
|
|
48
52
|
# @api public
|
|
53
|
+
# @since 2.1.0
|
|
49
54
|
def [](path)
|
|
50
55
|
asset_attrs = manifest
|
|
51
56
|
.fetch(path) { raise AssetMissingError.new(path) }
|
|
@@ -62,14 +67,22 @@ module Hanami
|
|
|
62
67
|
)
|
|
63
68
|
end
|
|
64
69
|
|
|
65
|
-
#
|
|
70
|
+
# Returns true if subresource integrity is configured.
|
|
71
|
+
#
|
|
72
|
+
# @return [Boolean]
|
|
73
|
+
#
|
|
66
74
|
# @api public
|
|
75
|
+
# @since 2.1.0
|
|
67
76
|
def subresource_integrity?
|
|
68
77
|
config.subresource_integrity.any?
|
|
69
78
|
end
|
|
70
79
|
|
|
71
|
-
#
|
|
80
|
+
# Returns true if the given source path is a cross-origin request.
|
|
81
|
+
#
|
|
82
|
+
# @return [Boolean]
|
|
83
|
+
#
|
|
72
84
|
# @api public
|
|
85
|
+
# @since 2.1.0
|
|
73
86
|
def crossorigin?(source_path)
|
|
74
87
|
config.crossorigin?(source_path)
|
|
75
88
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hanami-assets
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.1.0.
|
|
4
|
+
version: 2.1.0.rc2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Luca Guidi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-11-
|
|
11
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: zeitwerk
|
|
@@ -182,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
182
182
|
- !ruby/object:Gem::Version
|
|
183
183
|
version: 1.3.1
|
|
184
184
|
requirements: []
|
|
185
|
-
rubygems_version: 3.4.
|
|
185
|
+
rubygems_version: 3.4.21
|
|
186
186
|
signing_key:
|
|
187
187
|
specification_version: 4
|
|
188
188
|
summary: Assets management
|