pakyow-assets 1.0.0.rc5 → 1.0.0
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 +5 -0
- data/lib/pakyow/application/actions/assets/process.rb +65 -0
- data/lib/pakyow/application/actions/assets/public.rb +77 -0
- data/lib/pakyow/{assets → application}/behavior/assets.rb +2 -2
- data/lib/pakyow/application/behavior/assets/externals.rb +61 -0
- data/lib/pakyow/application/behavior/assets/packs.rb +164 -0
- data/lib/pakyow/application/behavior/assets/prelaunching.rb +21 -0
- data/lib/pakyow/application/behavior/assets/processing.rb +29 -0
- data/lib/pakyow/application/behavior/assets/silencing.rb +37 -0
- data/lib/pakyow/application/behavior/assets/watching.rb +27 -0
- data/lib/pakyow/{assets/behavior/config.rb → application/config/assets.rb} +3 -3
- data/lib/pakyow/assets.rb +3 -3
- data/lib/pakyow/assets/framework.rb +20 -20
- data/lib/pakyow/presenter/renderer/behavior/assets/install_assets.rb +41 -0
- data/lib/pakyow/{assets/tasks → tasks/assets}/precompile.rake +0 -0
- data/lib/pakyow/{assets/tasks → tasks/assets}/update.rake +0 -0
- metadata +28 -27
- data/lib/pakyow/actions/assets/process.rb +0 -63
- data/lib/pakyow/actions/assets/public.rb +0 -75
- data/lib/pakyow/assets/behavior/externals.rb +0 -59
- data/lib/pakyow/assets/behavior/packs.rb +0 -162
- data/lib/pakyow/assets/behavior/prelaunching.rb +0 -19
- data/lib/pakyow/assets/behavior/processing.rb +0 -27
- data/lib/pakyow/assets/behavior/rendering/install_assets.rb +0 -39
- data/lib/pakyow/assets/behavior/silencing.rb +0 -35
- data/lib/pakyow/assets/behavior/watching.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7357562921c8d3675d55cbb3f8a4cfee62703be2f32ecad38812ade2e279df78
|
4
|
+
data.tar.gz: c93e8b3c23a969ea6fb01fb9771d593da48babad12d0844e3b14ea7ae15ab667
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d1fafecd727a1e6155a154ea95d1bad80d0b40399f1f8c7e73411d460990739bdae381d4e0800223d2839663aae8a18608616ea12ae1ddf211b5488d94251a9
|
7
|
+
data.tar.gz: 3eb3b99bf5d6d9e9eb28cd4a7462649f0e6424078d7b8b740917c0df87d4c17e95e32dbfacc8f5892aca5bb3e0db56a7b40be9fe6f497c8a4c699707c481fcee
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
class Application
|
5
|
+
module Actions
|
6
|
+
module Assets
|
7
|
+
# Pipeline Action that processes assets at request time.
|
8
|
+
#
|
9
|
+
# This is intended for development use, please don't use it in production.
|
10
|
+
# Instead, precompile assets into the public directory.
|
11
|
+
#
|
12
|
+
class Process
|
13
|
+
def call(connection)
|
14
|
+
if connection.app.config.assets.process
|
15
|
+
# TODO: can we short circuit if the request path doesn't match the connection?
|
16
|
+
if asset = find_asset(connection) || find_pack(connection) || find_asset_map(connection) || find_pack_map(connection)
|
17
|
+
connection.set_header("content-type", asset.mime_type)
|
18
|
+
connection.body = asset
|
19
|
+
connection.halt
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def find_asset(connection, path = connection.path)
|
27
|
+
connection.app.state(:asset).find { |asset|
|
28
|
+
asset.public_path == path
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def find_pack(connection, path = connection.path)
|
33
|
+
connection.app.state(:pack).lazy.map { |pack|
|
34
|
+
pack.packed(path)
|
35
|
+
}.find { |packed| !packed.nil? && packed.any? }
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_asset_map(connection)
|
39
|
+
if wants_map?(connection)
|
40
|
+
if (asset = find_asset(connection, unmapped(connection))) && asset.source_map?
|
41
|
+
asset.source_map
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_pack_map(connection)
|
47
|
+
if (pack = find_pack(connection, unmapped(connection))) && pack.source_map?
|
48
|
+
pack.source_map
|
49
|
+
else
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def wants_map?(connection)
|
55
|
+
connection.path.end_with?(".map")
|
56
|
+
end
|
57
|
+
|
58
|
+
def unmapped(connection)
|
59
|
+
File.join(File.dirname(connection.path), File.basename(connection.path, ".map"))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mini_mime"
|
4
|
+
|
5
|
+
require "pakyow/support/core_refinements/string/normalization"
|
6
|
+
|
7
|
+
module Pakyow
|
8
|
+
class Application
|
9
|
+
module Actions
|
10
|
+
module Assets
|
11
|
+
class Public
|
12
|
+
using Support::Refinements::String::Normalization
|
13
|
+
|
14
|
+
# Pipeline Action that serves files out of your public directory.
|
15
|
+
#
|
16
|
+
def initialize(app)
|
17
|
+
@asset_paths = app.state(:asset).map(&:public_path) + app.state(:pack).flat_map { |pack|
|
18
|
+
[pack.public_css_path, pack.public_js_path]
|
19
|
+
}
|
20
|
+
|
21
|
+
@prefix = if app.is_a?(Plugin)
|
22
|
+
Pathname.new(app.class.mount_path)
|
23
|
+
else
|
24
|
+
Pathname.new("/")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def call(connection)
|
29
|
+
if connection.app.config.assets.public
|
30
|
+
public_path = public_path(connection)
|
31
|
+
|
32
|
+
if public?(public_path)
|
33
|
+
if mime = MiniMime.lookup_by_filename(public_path)
|
34
|
+
connection.set_header("content-type", mime.content_type)
|
35
|
+
end
|
36
|
+
|
37
|
+
if connection.app.config.assets.cache && asset?(connection)
|
38
|
+
set_cache_headers(connection, public_path)
|
39
|
+
end
|
40
|
+
|
41
|
+
connection.body = File.open(public_path)
|
42
|
+
connection.halt
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def public?(path)
|
50
|
+
File.file?(path)
|
51
|
+
end
|
52
|
+
|
53
|
+
def public_path(connection)
|
54
|
+
File.join(
|
55
|
+
connection.app.config.assets.public_path,
|
56
|
+
String.normalize_path(
|
57
|
+
Pathname.new(connection.path).relative_path_from(@prefix).to_s
|
58
|
+
)
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def asset?(connection)
|
63
|
+
@asset_paths.include?(connection.path)
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_cache_headers(connection, public_path)
|
67
|
+
mtime = File.mtime(public_path)
|
68
|
+
connection.set_header("age", (Time.now - mtime).to_i.to_s)
|
69
|
+
connection.set_header("cache-control", "public, max-age=31536000")
|
70
|
+
connection.set_header("vary", "accept-encoding")
|
71
|
+
connection.set_header("last-modified", mtime.httpdate)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -5,7 +5,7 @@ require "pakyow/support/extension"
|
|
5
5
|
require "pakyow/assets/asset"
|
6
6
|
|
7
7
|
module Pakyow
|
8
|
-
|
8
|
+
class Application
|
9
9
|
module Behavior
|
10
10
|
# Registers assets from the app's frontend/assets directory.
|
11
11
|
#
|
@@ -27,7 +27,7 @@ module Pakyow
|
|
27
27
|
"/"
|
28
28
|
end
|
29
29
|
|
30
|
-
self.class.asset << Asset.new_from_path(
|
30
|
+
self.class.asset << Pakyow::Assets::Asset.new_from_path(
|
31
31
|
path,
|
32
32
|
config: config.assets,
|
33
33
|
source_location: assets_path,
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
require "pakyow/assets/external"
|
6
|
+
|
7
|
+
module Pakyow
|
8
|
+
class Application
|
9
|
+
module Behavior
|
10
|
+
module Assets
|
11
|
+
module Externals
|
12
|
+
extend Support::Extension
|
13
|
+
|
14
|
+
def external_script(name, version = nil, package: nil, files: nil)
|
15
|
+
assets_config = if is_a?(Plugin)
|
16
|
+
parent.config.assets
|
17
|
+
else
|
18
|
+
config.assets
|
19
|
+
end
|
20
|
+
|
21
|
+
assets_config.externals.scripts << Pakyow::Assets::External.new(
|
22
|
+
name, version: version, package: package, files: files, config: assets_config
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
apply_extension do
|
27
|
+
after "boot", "fetch.assets.externals" do
|
28
|
+
if config.assets.externals.pakyow
|
29
|
+
external_script :pakyow, "^1.0.0", package: "@pakyow/js", files: [
|
30
|
+
"dist/pakyow.js",
|
31
|
+
"dist/components/confirmable.js",
|
32
|
+
"dist/components/form.js",
|
33
|
+
"dist/components/freshener.js",
|
34
|
+
"dist/components/navigator.js",
|
35
|
+
"dist/components/socket.js",
|
36
|
+
"dist/components/submittable.js"
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
if config.assets.externals.fetch
|
41
|
+
fetched = false
|
42
|
+
|
43
|
+
config.assets.externals.scripts.each do |external_script|
|
44
|
+
unless external_script.exist?
|
45
|
+
external_script.fetch!
|
46
|
+
fetched = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if fetched
|
51
|
+
FileUtils.mkdir_p "./tmp"
|
52
|
+
FileUtils.touch "./tmp/restart.txt"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Assets
|
9
|
+
module Packs
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
after "initialize", "initialize.assets.packs", priority: :high do
|
14
|
+
config.assets.packs.paths.each do |packs_path|
|
15
|
+
Pathname.glob(File.join(packs_path, "*.*")).group_by { |path|
|
16
|
+
File.join(File.dirname(path), File.basename(path, File.extname(path)))
|
17
|
+
}.to_a.sort { |pack_a, pack_b|
|
18
|
+
pack_b[1] <=> pack_a[1]
|
19
|
+
}.uniq { |pack_path, _|
|
20
|
+
accessible_pack_path(pack_path)
|
21
|
+
}.map { |pack_path, pack_asset_paths|
|
22
|
+
[accessible_pack_path(pack_path), pack_asset_paths]
|
23
|
+
}.reverse.each do |pack_path, pack_asset_paths|
|
24
|
+
prefix = if is_a?(Plugin)
|
25
|
+
self.class.mount_path
|
26
|
+
else
|
27
|
+
"/"
|
28
|
+
end
|
29
|
+
|
30
|
+
asset_pack = Pakyow::Assets::Pack.new(File.basename(pack_path).to_sym, config.assets, prefix: prefix)
|
31
|
+
|
32
|
+
pack_asset_paths.each do |pack_asset_path|
|
33
|
+
if config.assets.extensions.include?(File.extname(pack_asset_path))
|
34
|
+
asset_pack << Pakyow::Assets::Asset.new_from_path(
|
35
|
+
pack_asset_path,
|
36
|
+
config: config.assets,
|
37
|
+
related: state(:asset)
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
self.pack << asset_pack.finalize
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
state(:templates).each do |template_store|
|
47
|
+
build_layout_packs(template_store)
|
48
|
+
build_page_packs(template_store)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def packs(view)
|
54
|
+
(autoloaded_packs + view_packs(view) + component_packs(view)).uniq.each_with_object([]) { |pack_name, packs|
|
55
|
+
if found_pack = state(:pack).find { |pack| pack.name == pack_name.to_sym }
|
56
|
+
packs << found_pack
|
57
|
+
end
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def accessible_pack_path(pack_path)
|
64
|
+
pack_path_parts = pack_path.split("/")
|
65
|
+
pack_path_parts[-1] = if pack_path_parts[-1].include?("__")
|
66
|
+
pack_path_parts[-1].split("__", 2)[1]
|
67
|
+
elsif pack_path_parts[-1].include?("@")
|
68
|
+
pack_path_parts[-1].split("@", 2)[0]
|
69
|
+
else
|
70
|
+
pack_path_parts[-1]
|
71
|
+
end
|
72
|
+
|
73
|
+
pack_path_parts.join("/")
|
74
|
+
end
|
75
|
+
|
76
|
+
def autoloaded_packs
|
77
|
+
config.assets.packs.autoload
|
78
|
+
end
|
79
|
+
|
80
|
+
def view_packs(view)
|
81
|
+
view.info(:packs).to_a
|
82
|
+
end
|
83
|
+
|
84
|
+
def component_packs(view)
|
85
|
+
view.object.each_significant_node(:component, descend: true).flat_map { |node|
|
86
|
+
node.label(:components).map { |component|
|
87
|
+
component[:name]
|
88
|
+
}
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def build_layout_packs(template_store)
|
93
|
+
template_store.layouts.each do |layout_name, layout|
|
94
|
+
layout_pack = Pakyow::Assets::Pack.new(:"layouts/#{layout_name}", config.assets)
|
95
|
+
register_pack_with_view(layout_pack, layout)
|
96
|
+
|
97
|
+
Pathname.glob(File.join(template_store.layouts_path, "#{layout_name}.*")) do |potential_asset_path|
|
98
|
+
next if template_store.template?(potential_asset_path)
|
99
|
+
layout_pack << Pakyow::Assets::Asset.new_from_path(
|
100
|
+
potential_asset_path,
|
101
|
+
config: config.assets,
|
102
|
+
related: state(:asset)
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
self.pack << layout_pack.finalize
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def build_page_packs(template_store)
|
111
|
+
template_store.paths.each do |view_path|
|
112
|
+
template_info = template_store.info(view_path)
|
113
|
+
|
114
|
+
page_pack = Pakyow::Assets::Pack.new(:"#{template_info[:page].logical_path[1..-1]}", config.assets)
|
115
|
+
register_pack_with_view(page_pack, template_info[:page])
|
116
|
+
|
117
|
+
# Find all partials used by the page.
|
118
|
+
#
|
119
|
+
partials = template_info[:page].container_views.each_with_object([]) { |page_container, page_container_partials|
|
120
|
+
page_container_partials.concat(page_container.find_partials(template_info[:partials]))
|
121
|
+
} + template_info[:layout].find_partials(template_info[:partials])
|
122
|
+
|
123
|
+
# Include assets for partials used by the page into the page pack.
|
124
|
+
#
|
125
|
+
partials.each do |partial_name|
|
126
|
+
if partial = template_info[:partials][partial_name]
|
127
|
+
Pathname.glob(File.join(config.presenter.path, "#{partial.logical_path}.*")) do |potential_asset_path|
|
128
|
+
next if template_store.template?(potential_asset_path)
|
129
|
+
page_pack << Pakyow::Assets::Asset.new_from_path(
|
130
|
+
potential_asset_path,
|
131
|
+
config: config.assets,
|
132
|
+
related: state(:asset)
|
133
|
+
)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Include assets defined for the page itself.
|
139
|
+
#
|
140
|
+
Pathname.glob(File.join(template_info[:page].path.dirname, "#{template_info[:page].path.basename(template_info[:page].path.extname)}.*")) do |potential_asset_path|
|
141
|
+
next if template_store.template?(potential_asset_path)
|
142
|
+
page_pack << Pakyow::Assets::Asset.new_from_path(
|
143
|
+
potential_asset_path,
|
144
|
+
config: config.assets,
|
145
|
+
related: state(:asset)
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
self.pack << page_pack.finalize
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def register_pack_with_view(pack, view)
|
154
|
+
unless view.info(:packs)
|
155
|
+
view.add_info(packs: [])
|
156
|
+
end
|
157
|
+
|
158
|
+
view.info(:packs) << pack.name
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Assets
|
9
|
+
module Prelaunching
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
on "configure" do
|
14
|
+
config.tasks.prelaunch << "assets:precompile"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Assets
|
9
|
+
module Processing
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
on "load" do
|
14
|
+
if self.class.includes_framework?(:presenter)
|
15
|
+
self.class.processor :html do |content|
|
16
|
+
state(:asset).each do |asset|
|
17
|
+
content.gsub!(asset.logical_path, File.join(config.assets.host, asset.public_path))
|
18
|
+
end
|
19
|
+
|
20
|
+
content
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|