hanami-assets 1.3.4 → 2.1.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/LICENSE.md +1 -1
- data/README.md +92 -315
- data/bin/hanami-assets +7 -6
- data/hanami-assets.gemspec +23 -28
- data/lib/hanami/assets/asset.rb +83 -0
- data/lib/hanami/assets/base_url.rb +64 -0
- data/lib/hanami/assets/config.rb +106 -0
- data/lib/hanami/assets/errors.rb +46 -0
- data/lib/hanami/assets/version.rb +4 -2
- data/lib/hanami/assets.rb +63 -143
- data/lib/hanami-assets.rb +3 -0
- metadata +36 -104
- data/lib/hanami/assets/bundler/asset.rb +0 -98
- data/lib/hanami/assets/bundler/compressor.rb +0 -61
- data/lib/hanami/assets/bundler/manifest_entry.rb +0 -62
- data/lib/hanami/assets/bundler.rb +0 -152
- data/lib/hanami/assets/cache.rb +0 -100
- data/lib/hanami/assets/compiler.rb +0 -285
- data/lib/hanami/assets/compilers/less.rb +0 -29
- data/lib/hanami/assets/compilers/sass.rb +0 -59
- data/lib/hanami/assets/compressors/abstract.rb +0 -119
- data/lib/hanami/assets/compressors/builtin_javascript.rb +0 -36
- data/lib/hanami/assets/compressors/builtin_stylesheet.rb +0 -57
- data/lib/hanami/assets/compressors/closure_javascript.rb +0 -25
- data/lib/hanami/assets/compressors/javascript.rb +0 -77
- data/lib/hanami/assets/compressors/jsmin.rb +0 -284
- data/lib/hanami/assets/compressors/null_compressor.rb +0 -19
- data/lib/hanami/assets/compressors/sass_stylesheet.rb +0 -36
- data/lib/hanami/assets/compressors/stylesheet.rb +0 -77
- data/lib/hanami/assets/compressors/uglifier_javascript.rb +0 -25
- data/lib/hanami/assets/compressors/yui_javascript.rb +0 -25
- data/lib/hanami/assets/compressors/yui_stylesheet.rb +0 -25
- data/lib/hanami/assets/config/global_sources.rb +0 -50
- data/lib/hanami/assets/config/manifest.rb +0 -140
- data/lib/hanami/assets/config/sources.rb +0 -78
- data/lib/hanami/assets/configuration.rb +0 -652
- data/lib/hanami/assets/helpers.rb +0 -935
- data/lib/hanami/assets/precompiler.rb +0 -95
@@ -1,140 +0,0 @@
|
|
1
|
-
module Hanami
|
2
|
-
module Assets
|
3
|
-
# This error is raised when the application starts but can't be load the
|
4
|
-
# manifest file.
|
5
|
-
#
|
6
|
-
# @since 0.1.0
|
7
|
-
# @api private
|
8
|
-
class MissingManifestFileError < Error
|
9
|
-
def initialize(path)
|
10
|
-
super("Can't read manifest: #{path}")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
# This error is raised when an asset is referenced from the DOM, but it's
|
15
|
-
# not present in the manifest
|
16
|
-
#
|
17
|
-
# @since 0.1.0
|
18
|
-
# @api private
|
19
|
-
class MissingManifestAssetError < Error
|
20
|
-
def initialize(asset, manifest_path)
|
21
|
-
super("Can't find asset `#{asset}' in manifest (#{manifest_path})")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Configuration settings
|
26
|
-
#
|
27
|
-
# @since 0.1.0
|
28
|
-
# @api private
|
29
|
-
module Config
|
30
|
-
# Default value for configuration's manifest.
|
31
|
-
#
|
32
|
-
# It indicates that the manifest wasn't loaded yet.
|
33
|
-
#
|
34
|
-
# At the load time, this should be replaced by an instance of
|
35
|
-
# <tt>Hanami::Assets::Config::Manifest</tt>.
|
36
|
-
#
|
37
|
-
# If for some reason that won't happen, the instance of this class is
|
38
|
-
# still referenced by the configuration and all the method invocations
|
39
|
-
# will raise a <tt>Hanami::Assets::MissingManifestFileError</tt>.
|
40
|
-
#
|
41
|
-
# @since 0.1.0
|
42
|
-
# @api private
|
43
|
-
#
|
44
|
-
# @see Hanami::Assets::Configuration#manifest
|
45
|
-
# @see Hanami::Assets::Configuration#manifest_path
|
46
|
-
# @see Hanami::Assets::Configuration#fingerprint
|
47
|
-
class NullManifest < Utils::BasicObject
|
48
|
-
# Return a new instance
|
49
|
-
#
|
50
|
-
# @param configuration [Hanami::Assets::Configuration]
|
51
|
-
#
|
52
|
-
# @return [Hanami::Assets::Config::NullManifest] a new instance
|
53
|
-
#
|
54
|
-
# @since 0.1.0
|
55
|
-
# @api private
|
56
|
-
def initialize(configuration)
|
57
|
-
@configuration = configuration
|
58
|
-
end
|
59
|
-
|
60
|
-
# @raise [Hanami::Assets::MissingManifestFileError]
|
61
|
-
#
|
62
|
-
# @since 0.1.0
|
63
|
-
# @api private
|
64
|
-
def method_missing(*) # rubocop:disable Style/MethodMissingSuper
|
65
|
-
::Kernel.raise(
|
66
|
-
::Hanami::Assets::MissingManifestFileError.new(@configuration.manifest_path)
|
67
|
-
)
|
68
|
-
end
|
69
|
-
|
70
|
-
# @return [FalseClass] returns false
|
71
|
-
#
|
72
|
-
# @since 1.1.0
|
73
|
-
# @api private
|
74
|
-
def respond_to_missing?(*)
|
75
|
-
false
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Manifest file
|
80
|
-
#
|
81
|
-
# @since 0.1.0
|
82
|
-
# @api private
|
83
|
-
class Manifest
|
84
|
-
# @since 0.4.0
|
85
|
-
# @api private
|
86
|
-
TARGET = 'target'.freeze
|
87
|
-
|
88
|
-
# @since 0.3.0
|
89
|
-
# @api private
|
90
|
-
SUBRESOURCE_INTEGRITY = 'sri'.freeze
|
91
|
-
|
92
|
-
# Return a new instance
|
93
|
-
#
|
94
|
-
# @param assets [Hash] the content of the manifest
|
95
|
-
# @param manifest_path [Pathname] the path to the manifest
|
96
|
-
#
|
97
|
-
# @return [Hanami::Assets::Config::Manifest] a new instance
|
98
|
-
#
|
99
|
-
# @since 0.1.0
|
100
|
-
# @api private
|
101
|
-
#
|
102
|
-
# @see Hanami::Assets::Configuration#manifest
|
103
|
-
# @see Hanami::Assets::Configuration#manifest_path
|
104
|
-
def initialize(assets, manifest_path)
|
105
|
-
@assets = assets
|
106
|
-
@manifest_path = manifest_path
|
107
|
-
end
|
108
|
-
|
109
|
-
# Resolve the given asset into a fingerprinted path
|
110
|
-
#
|
111
|
-
# For a given path <tt>/assets/application.js</tt> it will return
|
112
|
-
# <tt>/assets/application-28a6b886de2372ee3922fcaf3f78f2d8.js</tt>
|
113
|
-
#
|
114
|
-
# @param asset [#to_s] the relative asset path
|
115
|
-
#
|
116
|
-
# @return [String] the fingerprinted path
|
117
|
-
#
|
118
|
-
# @raise [Hanami::Assets::MissingManifestAssetError] when the asset can't be
|
119
|
-
# found in manifest
|
120
|
-
def resolve(asset)
|
121
|
-
@assets.fetch(asset.to_s) do
|
122
|
-
raise Hanami::Assets::MissingManifestAssetError.new(asset, @manifest_path)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
# @since 0.3.0
|
127
|
-
# @api private
|
128
|
-
def target(path)
|
129
|
-
resolve(path).fetch(TARGET)
|
130
|
-
end
|
131
|
-
|
132
|
-
# @since 0.3.0
|
133
|
-
# @api private
|
134
|
-
def subresource_integrity_values(path)
|
135
|
-
resolve(path).fetch(SUBRESOURCE_INTEGRITY)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'hanami/utils/load_paths'
|
2
|
-
require 'hanami/utils/file_list'
|
3
|
-
|
4
|
-
module Hanami
|
5
|
-
module Assets
|
6
|
-
# Configuration settings
|
7
|
-
#
|
8
|
-
# @since 0.1.0
|
9
|
-
# @api private
|
10
|
-
module Config
|
11
|
-
# Source directories for a specific application
|
12
|
-
#
|
13
|
-
# @since 0.1.0
|
14
|
-
# @api private
|
15
|
-
#
|
16
|
-
# @see Hanami::Assets.duplicate
|
17
|
-
# @see http://www.rubydoc.info/gems/hanami-utils/Hanami/Utils/LoadPaths
|
18
|
-
#
|
19
|
-
# TODO The perf of this class is poor, consider to improve it.
|
20
|
-
class Sources < Utils::LoadPaths
|
21
|
-
# @since 0.3.0
|
22
|
-
# @api private
|
23
|
-
SKIPPED_FILE_PREFIX = '_'.freeze
|
24
|
-
|
25
|
-
# @since 0.1.0
|
26
|
-
# @api private
|
27
|
-
attr_writer :root
|
28
|
-
|
29
|
-
# @since 0.1.0
|
30
|
-
# @api private
|
31
|
-
def initialize(root)
|
32
|
-
super()
|
33
|
-
@root = root
|
34
|
-
end
|
35
|
-
|
36
|
-
# @since 0.1.0
|
37
|
-
# @api private
|
38
|
-
def map
|
39
|
-
[].tap do |result|
|
40
|
-
each do |source|
|
41
|
-
result << yield(source)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# @since 0.1.0
|
47
|
-
# @api private
|
48
|
-
def find(filename)
|
49
|
-
result = files(filename).first
|
50
|
-
result = Pathname.new(result) unless result.nil?
|
51
|
-
result
|
52
|
-
end
|
53
|
-
|
54
|
-
# @since 0.1.0
|
55
|
-
# @api private
|
56
|
-
def files(name = nil)
|
57
|
-
result = []
|
58
|
-
|
59
|
-
Utils::FileList[map { |source| "#{source}#{::File::SEPARATOR}**#{::File::SEPARATOR}#{name}*" }].each do |file|
|
60
|
-
next if ::File.directory?(file) || ::File.basename(file).start_with?(SKIPPED_FILE_PREFIX)
|
61
|
-
|
62
|
-
result << file
|
63
|
-
end
|
64
|
-
|
65
|
-
result
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
# @since 0.1.0
|
71
|
-
# @api private
|
72
|
-
def realpath(path)
|
73
|
-
@root.join(path).realpath
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|