lux_assets 0.1.4
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 +7 -0
- data/README.md +140 -0
- data/bin/lux_assets +77 -0
- data/lib/lux_assets/asset.rb +74 -0
- data/lib/lux_assets/base.rb +170 -0
- data/lib/lux_assets/element.rb +69 -0
- data/lib/lux_assets/manifest.rb +30 -0
- data/lib/lux_assets.rb +29 -0
- data/lib/vendor/lux/assets_helper.rb +61 -0
- data/lib/vendor/lux/assets_plugin.rb +13 -0
- data/lib/vendor/lux/assets_routes.rb +34 -0
- data/lib/vendor/tasks.rb +36 -0
- data/misc/assets.rb +25 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cf0499416784b64eb2a3fc814ee2d8fc41a44695c053343a731f15ddcb44e682
|
4
|
+
data.tar.gz: ec17806130acc118a8401efaa522cb423ebef09727768343eec92214debf28b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c887341980224009f77a1261fbcdac1805d370082fc3808f3de564a2d5dabfc75ef3cfd9ee6028a55268695bd65bd5b4134eaa5f51554e959b00bdb882e39d47
|
7
|
+
data.tar.gz: e3af40781f0d76e3f005bbf1fa10fd487ae4801d56078157205518e98f73a5205c24d1047eacbfa93a30eeb57d403157ef0a76a94544b2fa70f53dab9408f97c
|
data/README.md
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
# Web assets
|
2
|
+
|
3
|
+
Lightweight web assets packer that loves simplicity.
|
4
|
+
|
5
|
+
* framework agnostic, use anywhere
|
6
|
+
* compiles js, coffee, typescript, css, sass "out of the box"
|
7
|
+
* keeps manifest in a single file
|
8
|
+
* plugable to handle any other extension
|
9
|
+
* update manifest file for production
|
10
|
+
* autoprefixer, minify, gzip the output
|
11
|
+
* add rake tasks
|
12
|
+
|
13
|
+
## Instalation
|
14
|
+
|
15
|
+
Add `lux_assets` gem to `Gemfile` and then `bundle install`
|
16
|
+
```
|
17
|
+
gem 'lux_assets'
|
18
|
+
```
|
19
|
+
|
20
|
+
## Using
|
21
|
+
|
22
|
+
To use the gem we have bin file in a path (build with Thor gem) named `lux_assets`.
|
23
|
+
|
24
|
+
```
|
25
|
+
~/dev/app $ lux_assets
|
26
|
+
Commands:
|
27
|
+
lux_assets clear # Clear all caches
|
28
|
+
lux_assets compile # Compile assets for production
|
29
|
+
lux_assets help [COMMAND] # Describe available commands or one specific command
|
30
|
+
lux_assets install # Install all needed packages via yarn
|
31
|
+
lux_assets show # Show all files/data in manifest
|
32
|
+
```
|
33
|
+
|
34
|
+
1. Start with `lux_assets install`
|
35
|
+
2. Modify ./config/assets.rb
|
36
|
+
3. Compile with `lux_assets compile`
|
37
|
+
4. Inspect added files with `lux_assets show`
|
38
|
+
|
39
|
+
### To compile
|
40
|
+
|
41
|
+
```
|
42
|
+
~/dev/app $ lux_assets compile
|
43
|
+
~/dev/app $ rake assets:compile
|
44
|
+
Compile js/admin -> /assets/js-admin-d1b55490e6327ba81e60b24539c6086ee1fe5d48.js
|
45
|
+
Compile js/main -> /assets/js-main-a72368758567e466aa01643b1e7426120dbca65b.js
|
46
|
+
Compile css/admin -> /assets/css-admin-f486d0d464932a9da584289007d170695dce23ce.css
|
47
|
+
Compile css/main -> /assets/css-main-1b6d66a32ad6af5fd34edbe4369585be351790cd.css
|
48
|
+
```
|
49
|
+
|
50
|
+
### To get list of all added files
|
51
|
+
|
52
|
+
`lux_assets show`
|
53
|
+
|
54
|
+
or
|
55
|
+
|
56
|
+
```
|
57
|
+
require 'lux_assets'
|
58
|
+
|
59
|
+
ap LuxAssets.to_h
|
60
|
+
```
|
61
|
+
|
62
|
+
|
63
|
+
## Example ./config/assets.rb
|
64
|
+
|
65
|
+
```
|
66
|
+
# relative_root './app/assets'
|
67
|
+
|
68
|
+
asset :admin do
|
69
|
+
js do
|
70
|
+
add 'js/admin/js_vendor/*' # will add all files from a folder
|
71
|
+
add 'js/shared/**' # will add all files from a folder + subfolders
|
72
|
+
add '/Used/foo/app/bar/asssets/admin.js'
|
73
|
+
add ['list', 'of', 'files']
|
74
|
+
add proc { 'js string' }
|
75
|
+
plugin :foo
|
76
|
+
end
|
77
|
+
|
78
|
+
css do
|
79
|
+
add 'css/admin/index.scss'
|
80
|
+
add proc { 'css string' }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
asset :main do
|
85
|
+
js do
|
86
|
+
# ...
|
87
|
+
end
|
88
|
+
|
89
|
+
css do
|
90
|
+
# ...
|
91
|
+
end
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
### What can you add
|
96
|
+
|
97
|
+
* relative file
|
98
|
+
* absolute file
|
99
|
+
* list of files
|
100
|
+
* proc
|
101
|
+
|
102
|
+
If you add proc, proc retun must be a string, not a file
|
103
|
+
|
104
|
+
|
105
|
+
## Extending
|
106
|
+
|
107
|
+
### Adding processor for new file type
|
108
|
+
|
109
|
+
This is all that is needed to add support for TypeScript compilation.
|
110
|
+
|
111
|
+
```
|
112
|
+
class LuxAssets::Element
|
113
|
+
def compile_ts
|
114
|
+
LuxAssets.run "node_modules/typescript/.bin/tsc --outFile '#{@cache}' '#{@source}'"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
119
|
+
### Added new plugin for file adder
|
120
|
+
|
121
|
+
You need to extend `LuxAssets` class and call method `add` with list of files or a proc.
|
122
|
+
|
123
|
+
```
|
124
|
+
module LuxAssets
|
125
|
+
# include files from a plugin
|
126
|
+
def plugin name
|
127
|
+
plugin = Lux.plugin.get name
|
128
|
+
add '%s/**' % plugin[:folder]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
## Rakefile
|
134
|
+
|
135
|
+
If you want to use `Rake` tasks and not `lux_assets` bin, there is a wrapper.
|
136
|
+
|
137
|
+
In `Rakefile` just add `require 'lux_assets'` and tasks will automaticly be added to your list of tasks.
|
138
|
+
|
139
|
+
Rake taks will call :env task to set up environment.
|
140
|
+
|
data/bin/lux_assets
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'colorize'
|
5
|
+
require 'awesome_print'
|
6
|
+
|
7
|
+
require_relative '../lib/lux_assets'
|
8
|
+
|
9
|
+
###
|
10
|
+
|
11
|
+
module Cli
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def run what
|
15
|
+
puts what.green
|
16
|
+
system what
|
17
|
+
end
|
18
|
+
|
19
|
+
def die text
|
20
|
+
puts text.red
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
def info text
|
25
|
+
puts '* %s' % text.magenta
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
###
|
30
|
+
|
31
|
+
class AssetsCli < Thor
|
32
|
+
|
33
|
+
desc :install, 'Install all needed packages via yarn'
|
34
|
+
def install
|
35
|
+
packages = ["coffee-script", "minifier", "node-sass", "typescript", "babel-cli", "autoprefixer-cli"]
|
36
|
+
|
37
|
+
if `which yarn`.empty?
|
38
|
+
Cli.die('yarn not found -> install with "npm install yarn -g"')
|
39
|
+
end
|
40
|
+
|
41
|
+
for pkg in packages
|
42
|
+
Cli.run 'yarn add %s' % pkg
|
43
|
+
end
|
44
|
+
|
45
|
+
puts '* Installed: %s' % packages.map(&:green).join(', ')
|
46
|
+
|
47
|
+
unless LuxAssets::CONFIG_PATH.exist?
|
48
|
+
source = Pathname.new(__FILE__).join("../../misc/assets.rb")
|
49
|
+
LuxAssets::CONFIG_PATH.write source.read
|
50
|
+
puts '* Added template %s' % LuxAssets::CONFIG_PATH.to_s.green
|
51
|
+
end
|
52
|
+
|
53
|
+
puts "* To include LuxAssets rake tasks in Rakefile, just require 'lux_assets'".green
|
54
|
+
end
|
55
|
+
|
56
|
+
desc :show, 'Show all files/data in manifest'
|
57
|
+
def show
|
58
|
+
ap LuxAssets.to_h
|
59
|
+
end
|
60
|
+
|
61
|
+
desc :compile, 'Compile assets for production'
|
62
|
+
def compile
|
63
|
+
LuxAssets.compile_all do |name, path|
|
64
|
+
puts "Compile #{name.green} -> #{path}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
desc :clear, 'Clear all caches'
|
69
|
+
def clear
|
70
|
+
Cli.run 'rm -rf ./tmp/assets'
|
71
|
+
Cli.run 'rm -rf ./public/assets'
|
72
|
+
Cli.run 'rm ./public/manifest.json'
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
AssetsCli.start ARGV
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Asset group, single asset that produces target css or js
|
2
|
+
|
3
|
+
class LuxAssets::Asset
|
4
|
+
PUBLIC_ASSETS = './public/assets'
|
5
|
+
|
6
|
+
def initialize ext, name
|
7
|
+
@ext = ext == :js ? :js : :css
|
8
|
+
@name = name
|
9
|
+
@files = LuxAssets.to_h[ext][name]
|
10
|
+
@target = "#{@ext}/#{@name}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def js?
|
14
|
+
@ext == :js
|
15
|
+
end
|
16
|
+
|
17
|
+
def css?
|
18
|
+
@ext == :css
|
19
|
+
end
|
20
|
+
|
21
|
+
def compile
|
22
|
+
@data = []
|
23
|
+
|
24
|
+
die "No files found for [#{@ext}/#{@name}]" unless @files[0]
|
25
|
+
|
26
|
+
for file in @files
|
27
|
+
if file.is_a?(Proc)
|
28
|
+
@data.push file.call
|
29
|
+
else
|
30
|
+
@data.push LuxAssets::Element.new(file, production: true).compile
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
send 'compile_%s' % @ext
|
35
|
+
|
36
|
+
@asset_file
|
37
|
+
end
|
38
|
+
|
39
|
+
def files
|
40
|
+
@files
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def save_data data
|
48
|
+
@asset_file = '/assets/%s' % (@target.sub('/', '-') + '-' + Digest::SHA1.hexdigest(data) + '.' + @ext.to_s)
|
49
|
+
@asset_path = "./public#{@asset_file}"
|
50
|
+
|
51
|
+
File.write(@asset_path, data)
|
52
|
+
|
53
|
+
if LuxAssets::Manifest.add(@target, @asset_file)
|
54
|
+
yield
|
55
|
+
|
56
|
+
LuxAssets.run 'touch -t 201001010101 %s' % @asset_path
|
57
|
+
LuxAssets.run 'gzip -k %s' % @asset_path
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def compile_js
|
62
|
+
save_data @data.join(";\n") do
|
63
|
+
# minify
|
64
|
+
LuxAssets.run './node_modules/minifier/index.js --no-comments -o "%{file}" "%{file}"' % { file: @asset_path }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def compile_css
|
69
|
+
save_data @data.join($/) do
|
70
|
+
#autoprefixer
|
71
|
+
LuxAssets.run './node_modules/.bin/autoprefixer-cli %s' % @asset_path
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# LuxAssets.configure do
|
2
|
+
# asset :admin do
|
3
|
+
# js do
|
4
|
+
# add 'js/admin/js_vendor/*'
|
5
|
+
# add 'js/admin/js/*'
|
6
|
+
# add 'js/shared/*'
|
7
|
+
# add 'js/admin/index.coffee'
|
8
|
+
# end
|
9
|
+
# css do
|
10
|
+
# add 'css/admin/index.scss'
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
# ...
|
15
|
+
|
16
|
+
# LuxAssets.css('admin').files
|
17
|
+
# LuxAssets.css(:admin).compile
|
18
|
+
|
19
|
+
# LuxAssets.css(:admin).compile_all do |name, path|
|
20
|
+
# puts "Compile #{name} -> #{path}"
|
21
|
+
# end
|
22
|
+
|
23
|
+
module LuxAssets
|
24
|
+
extend self
|
25
|
+
|
26
|
+
CONFIG_PATH = Pathname.new ENV.fetch('ASSET_CONFIG') { './config/assets.rb' }
|
27
|
+
|
28
|
+
ASSET_TYPES ||= {
|
29
|
+
js: ['js', 'coffee', 'ts'],
|
30
|
+
css: ['css', 'scss']
|
31
|
+
}
|
32
|
+
|
33
|
+
@assets ||= { js: {}, css: {} }
|
34
|
+
|
35
|
+
@relative_root = './app/assets'
|
36
|
+
def relative_root name=nil
|
37
|
+
@relative_root = name if name
|
38
|
+
@relative_root
|
39
|
+
end
|
40
|
+
|
41
|
+
def die text
|
42
|
+
puts text
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
|
46
|
+
def asset name
|
47
|
+
@name = name.to_s
|
48
|
+
yield
|
49
|
+
end
|
50
|
+
|
51
|
+
def configure &block
|
52
|
+
class_eval &block
|
53
|
+
end
|
54
|
+
|
55
|
+
def run what, cache_file=nil
|
56
|
+
puts what.yellow
|
57
|
+
|
58
|
+
stdin, stdout, stderr, wait_thread = Open3.popen3(what)
|
59
|
+
|
60
|
+
error = stderr.gets
|
61
|
+
while line = stderr.gets do
|
62
|
+
error += line
|
63
|
+
end
|
64
|
+
|
65
|
+
# node-sass prints to stderror on complete
|
66
|
+
error = nil if error && error.index('Rendering Complete, saving .css file...')
|
67
|
+
|
68
|
+
if error
|
69
|
+
cache_file.unlink if cache_file && cache_file.exist?
|
70
|
+
|
71
|
+
puts error.red
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def js name=nil, &block
|
76
|
+
add_files :js, name, block
|
77
|
+
end
|
78
|
+
|
79
|
+
def css name=nil, &block
|
80
|
+
add_files :css, name, block
|
81
|
+
end
|
82
|
+
|
83
|
+
# adds file or list of files
|
84
|
+
# add 'plugin:js_widgets/*'
|
85
|
+
# add 'js/vendor/*'
|
86
|
+
# add 'index.coffee'
|
87
|
+
# add proc { ... }
|
88
|
+
def add added
|
89
|
+
case added
|
90
|
+
when Array
|
91
|
+
add_local_files added
|
92
|
+
return
|
93
|
+
when Proc
|
94
|
+
@files += [added]
|
95
|
+
else
|
96
|
+
files =
|
97
|
+
if added[0,1] == '/' || added[0,2] == './'
|
98
|
+
added
|
99
|
+
else
|
100
|
+
"#{@relative_root}/#{added}"
|
101
|
+
end
|
102
|
+
|
103
|
+
files =
|
104
|
+
if files.include?('*')
|
105
|
+
files += '/*' if files =~ %r{\/\*\*$}
|
106
|
+
Dir[files].sort
|
107
|
+
else
|
108
|
+
[files]
|
109
|
+
end
|
110
|
+
|
111
|
+
files = files.select { |it| File.file?(it) }
|
112
|
+
|
113
|
+
if files[0]
|
114
|
+
add_local_files files
|
115
|
+
else
|
116
|
+
die 'No files found in "%s -> :%s" (%s)'.red % [@ext, @name, added]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# get list of files in the resource
|
122
|
+
def files name
|
123
|
+
parts = name.split('/', 2)
|
124
|
+
to_h[parts.first.to_sym][parts[1]]
|
125
|
+
end
|
126
|
+
|
127
|
+
def compile_all
|
128
|
+
for ext in [:js, :css]
|
129
|
+
for name in to_h[ext].keys
|
130
|
+
path = LuxAssets.send(ext, name).compile
|
131
|
+
|
132
|
+
yield "#{ext}/#{name}", path if block_given?
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def to_h
|
138
|
+
unless @assets_loaded
|
139
|
+
die 'Assets file not found in %s' % CONFIG_PATH unless CONFIG_PATH.exist?
|
140
|
+
@assets_loaded = true
|
141
|
+
eval CONFIG_PATH.read
|
142
|
+
end
|
143
|
+
|
144
|
+
@assets
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def add_local_files files
|
150
|
+
files = files.select { |it| ASSET_TYPES[@ext].include?(it.split('.').last) }
|
151
|
+
|
152
|
+
files = files.select do |f|
|
153
|
+
name = f.split('/').last
|
154
|
+
name.include?('.') && !name[0, 1] != '!'
|
155
|
+
end
|
156
|
+
|
157
|
+
@files += files
|
158
|
+
files
|
159
|
+
end
|
160
|
+
|
161
|
+
def add_files ext, name, block
|
162
|
+
@name = name.to_s if name
|
163
|
+
return Asset.new ext, @name unless block
|
164
|
+
|
165
|
+
@files = []
|
166
|
+
@ext = ext
|
167
|
+
class_eval &block
|
168
|
+
@assets[ext][@name] = @files
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# One file that can be scss, js, coffee, ts, etc...
|
2
|
+
class LuxAssets::Element
|
3
|
+
TMP_ASSETS = './tmp/assets'
|
4
|
+
|
5
|
+
def initialize source, opts={}
|
6
|
+
@source = Pathname.new source
|
7
|
+
@opts = opts
|
8
|
+
@cache = Pathname.new './tmp/assets/%s' % source.gsub('/','-')
|
9
|
+
end
|
10
|
+
|
11
|
+
def compile
|
12
|
+
method_name = 'compile_%s' % @source.to_s.split('.').last.downcase
|
13
|
+
|
14
|
+
if respond_to?(method_name, true)
|
15
|
+
cached || send(method_name)
|
16
|
+
else
|
17
|
+
@source.read
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def content_type
|
22
|
+
@ext ||= @source.to_s.split('.').last.to_sym
|
23
|
+
|
24
|
+
[:css, :scss].include?(@ext) ? 'text/css' : 'text/javascript'
|
25
|
+
end
|
26
|
+
|
27
|
+
###
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def production?
|
32
|
+
defined?(Rake)
|
33
|
+
end
|
34
|
+
|
35
|
+
def cached
|
36
|
+
@cache.exist? && (@cache.ctime > @source.ctime) ? @cache.read : false
|
37
|
+
end
|
38
|
+
|
39
|
+
def compile_coffee
|
40
|
+
coffee_path = './node_modules/coffee-script/bin/coffee'
|
41
|
+
coffee_opts = production? ? '-cp' : '-Mcp --no-header'
|
42
|
+
|
43
|
+
LuxAssets.run "#{coffee_path} #{coffee_opts} '#{@source}' > '#{@cache}'", @cache
|
44
|
+
|
45
|
+
data = @cache.read
|
46
|
+
data = data.gsub(%r{//#\ssourceURL=[\w\-\.\/]+/app/assets/}, '//# sourceURL=/raw_asset/')
|
47
|
+
|
48
|
+
@cache.write data
|
49
|
+
|
50
|
+
data
|
51
|
+
end
|
52
|
+
|
53
|
+
def compile_scss
|
54
|
+
node_sass = './node_modules/node-sass/bin/node-sass'
|
55
|
+
node_opts = production? ? '--output-style compressed' : '--source-comments'
|
56
|
+
LuxAssets.run "#{node_sass} #{node_opts} '#{@source}' '#{@cache}'", @cache
|
57
|
+
@cache.read
|
58
|
+
end
|
59
|
+
alias :compile_sass :compile_scss
|
60
|
+
|
61
|
+
def compile_js
|
62
|
+
";\n%s\n;" % @source.read
|
63
|
+
end
|
64
|
+
|
65
|
+
def compile_ts
|
66
|
+
LuxAssets.run "node_modules/typescript/.bin/tsc --outFile '#{@cache}' '#{@source}'"
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# manifest file
|
2
|
+
|
3
|
+
module LuxAssets::Manifest
|
4
|
+
MANIFEST = Pathname.new('./public/manifest.json')
|
5
|
+
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def add name, path
|
9
|
+
json = JSON.load MANIFEST.read
|
10
|
+
|
11
|
+
return false if json['files'][name] == path
|
12
|
+
|
13
|
+
json['files'][name] = path
|
14
|
+
|
15
|
+
MANIFEST.write JSON.pretty_generate(json)
|
16
|
+
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def get name
|
21
|
+
json = JSON.load MANIFEST.read
|
22
|
+
json['files'][name]
|
23
|
+
end
|
24
|
+
|
25
|
+
###
|
26
|
+
|
27
|
+
MANIFEST.write '{"files":{}}' unless MANIFEST.exist?
|
28
|
+
end
|
29
|
+
|
30
|
+
|
data/lib/lux_assets.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# libs
|
2
|
+
require 'digest/sha1'
|
3
|
+
require 'json'
|
4
|
+
require 'pathname'
|
5
|
+
require 'open3'
|
6
|
+
|
7
|
+
# gem files
|
8
|
+
require_relative './lux_assets/base'
|
9
|
+
require_relative './lux_assets/asset'
|
10
|
+
require_relative './lux_assets/element'
|
11
|
+
require_relative './lux_assets/manifest'
|
12
|
+
|
13
|
+
# lux framework bindings
|
14
|
+
if defined?(Lux)
|
15
|
+
require_relative './vendor/lux/assets_helper'
|
16
|
+
require_relative './vendor/lux/assets_plugin'
|
17
|
+
require_relative './vendor/lux/assets_routes'
|
18
|
+
end
|
19
|
+
|
20
|
+
# rake bindings
|
21
|
+
if defined?(Rake)
|
22
|
+
require_relative './vendor/tasks.rb'
|
23
|
+
end
|
24
|
+
|
25
|
+
# create needed dirs unless found
|
26
|
+
for dir in ['./tmp/', './tmp/assets', './public', './public/assets']
|
27
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# export to all templates
|
2
|
+
# = asset 'www/index.scss'
|
3
|
+
# = asset 'www/index.coffee'
|
4
|
+
module HtmlHelper
|
5
|
+
def asset_include path, opts={}
|
6
|
+
raise ArgumentError.new("Asset path can't be empty") if path.empty?
|
7
|
+
|
8
|
+
ext = path.split('?').first.split('.').last
|
9
|
+
type = ['css', 'sass', 'scss'].include?(ext) ? :style : :script
|
10
|
+
type = :style if path.include?('fonts.googleapis.com')
|
11
|
+
|
12
|
+
current.response.early_hints path, type
|
13
|
+
|
14
|
+
if type == :style
|
15
|
+
%[<link rel="stylesheet" href="#{path}" />]
|
16
|
+
else
|
17
|
+
%[<script src="#{path}"></script>]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# builds full asset path based on resource extension
|
22
|
+
# asset('js/main')
|
23
|
+
# will render 'app/assets/js/main/index.coffee' as http://aset.path/assets/main-index-md5hash.js
|
24
|
+
def asset file, opts={}
|
25
|
+
opts = { dev_file: opts } unless opts.class == Hash
|
26
|
+
|
27
|
+
# return joined assets if symbol given
|
28
|
+
# = asset :main -> asset("css/main") + asset("js/main")
|
29
|
+
return [asset("css/#{file}"), asset("js/#{file}")].join($/) if
|
30
|
+
file.is_a?(Symbol)
|
31
|
+
|
32
|
+
# return second link if it is defined and we are in dev mode
|
33
|
+
return asset_include opts[:dev_file] if opts[:dev_file] && Lux.config(:compile_assets)
|
34
|
+
|
35
|
+
# return internet links
|
36
|
+
return asset_include file if file.starts_with?('/') || file.starts_with?('http')
|
37
|
+
|
38
|
+
# return asset link in production or fail unless able
|
39
|
+
unless Lux.config(:compile_assets)
|
40
|
+
manifest = Lux.ram_cache('asset-manifest') { JSON.load Lux.root.join('public/manifest.json').read }
|
41
|
+
mfile = manifest['files'][file]
|
42
|
+
|
43
|
+
raise 'Compiled asset link for "%s" not found in manifest.json' % file if mfile.empty?
|
44
|
+
|
45
|
+
return asset_include(Lux.config.assets_root.to_s + mfile, opts)
|
46
|
+
end
|
47
|
+
|
48
|
+
# try to create list of incuded files and show every one of them
|
49
|
+
data = LuxAssets.files(file).inject([]) do |total, asset|
|
50
|
+
if asset.is_a?(Proc)
|
51
|
+
tag_name = file.include?('css') ? :style : :script
|
52
|
+
total.push({}.tag tag_name, asset.call)
|
53
|
+
else
|
54
|
+
total.push asset_include '/compiled_asset/' + asset
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
data.map{ |it| it.sub(/^\s\s/,'') }.join("\n")
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# /compiled_asset/www/js/pjax.coffee
|
2
|
+
# /raw_asset/www/js/pjax.coffee
|
3
|
+
Lux.app.before do
|
4
|
+
# skip /favicon.ico that forces refresh
|
5
|
+
next unless nav.path[1]
|
6
|
+
next unless Lux.config(:compile_assets)
|
7
|
+
|
8
|
+
# only allow clear in dev
|
9
|
+
# clear assets every 4 seconds max
|
10
|
+
if Lux.current.no_cache?
|
11
|
+
Lux.cache.fetch('lux-clear-assets', ttl: 4, log: false, force: false) do
|
12
|
+
puts '* Clearing assets from ./tmp/assets'.yellow
|
13
|
+
`rm -rf ./tmp/assets && mkdir ./tmp/assets`
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
case nav.root
|
19
|
+
when 'compiled_asset'
|
20
|
+
path = nav.reset.drop(1).join('/')
|
21
|
+
|
22
|
+
asset = LuxAssets::Element.new path
|
23
|
+
current.response.content_type asset.content_type
|
24
|
+
current.response.body asset.compile
|
25
|
+
|
26
|
+
when 'raw_asset'
|
27
|
+
path = nav.reset.drop(1).join('/')
|
28
|
+
|
29
|
+
Lux.error "You can watch raw files only in development" unless Lux.dev?
|
30
|
+
|
31
|
+
file = Pathname.new path
|
32
|
+
body file.exist? ? file.read : "error: File not found"
|
33
|
+
end
|
34
|
+
end
|
data/lib/vendor/tasks.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
$lux_assets_bin ||= proc do |command|
|
4
|
+
bin = Pathname.new(__dir__).join('../../bin/lux_assets').to_s
|
5
|
+
system '%s %s' % [bin, command]
|
6
|
+
end
|
7
|
+
|
8
|
+
namespace :assets do
|
9
|
+
desc 'Clear all assets'
|
10
|
+
task :clear do
|
11
|
+
$lux_assets_bin.call :clear
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Install all needed packages via yarn'
|
15
|
+
task :install do
|
16
|
+
$lux_assets_bin.call :install
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Compile assets to public/assets and generate mainifest.json'
|
20
|
+
task compile: :env do
|
21
|
+
LuxAssets.compile_all do |name, path|
|
22
|
+
puts "Compile #{name.green} -> #{path}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Show all files/data in manifest'
|
27
|
+
task show: :env do
|
28
|
+
ap LuxAssets.to_h
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Upload assets to S3'
|
32
|
+
task :s3_upload do
|
33
|
+
puts 'aws s3 sync ./public s3://bucket.location --cache-control "max-age=31536000, public"'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
data/misc/assets.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# relative_root './app/assets' # default root for relative assets
|
2
|
+
|
3
|
+
asset :admin do
|
4
|
+
js do
|
5
|
+
# add 'js/admin/js_vendor/*'
|
6
|
+
# add '/Used/foo/app/bar/asssets/admin.js'
|
7
|
+
# add ['list', 'of', 'files']
|
8
|
+
# add proc { 'js string' }
|
9
|
+
end
|
10
|
+
|
11
|
+
css do
|
12
|
+
# add 'css/admin/index.scss'
|
13
|
+
# add proc { 'css string' }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
asset :main do
|
18
|
+
js do
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
css do
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lux_assets
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dino Reic
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: awesome_print
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Web assets packer, convenience over configuration, simplified webpack
|
56
|
+
or sprockets with cleaner configuration
|
57
|
+
email: rejotl@gmail.com
|
58
|
+
executables:
|
59
|
+
- lux_assets
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- "./README.md"
|
64
|
+
- "./bin/lux_assets"
|
65
|
+
- "./lib/lux_assets.rb"
|
66
|
+
- "./lib/lux_assets/asset.rb"
|
67
|
+
- "./lib/lux_assets/base.rb"
|
68
|
+
- "./lib/lux_assets/element.rb"
|
69
|
+
- "./lib/lux_assets/manifest.rb"
|
70
|
+
- "./lib/vendor/lux/assets_helper.rb"
|
71
|
+
- "./lib/vendor/lux/assets_plugin.rb"
|
72
|
+
- "./lib/vendor/lux/assets_routes.rb"
|
73
|
+
- "./lib/vendor/tasks.rb"
|
74
|
+
- "./misc/assets.rb"
|
75
|
+
- bin/lux_assets
|
76
|
+
homepage: https://github.com/dux/lux_assets
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata: {}
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 2.7.5
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: Web assets
|
100
|
+
test_files: []
|