jekyll-simple-assets 0.3.1 → 0.4.0

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: 066a9158d842b14dd87beb951baa1012dc97eb74e68009b97ebce1fc75d114dd
4
- data.tar.gz: a78b84504fdff45054e89b9b3f017692460d9c74c3ed0017df0c45d4605f6950
3
+ metadata.gz: 5cb1966e7b454db1edfa880583d7ae1e9342cde2614435f1d297f0e8f7dd280a
4
+ data.tar.gz: aa8d28e89449c5af18e1cb43f22723d7cc0be644991bcac971fa5b7786de66c4
5
5
  SHA512:
6
- metadata.gz: 556175bc3e9f81311e942242ac3b00574fdb6ac1fd979fe37cb74bd392b170ac14e49c893e917a870ed9714951e65a53e560bb1a76855bb647c2c945a8513528
7
- data.tar.gz: 2e081620199cdf8ec5330678311d260da6b9405c25b7121324955be887018180c643a5e87cb80d2c1abb8b23fe3d28ae39233d20b00e07e0a9fc78d6549e213a
6
+ metadata.gz: 434b43a8291227d93d6f385e364101a226abd6405147f0dec9e98219093aa0c55f4ccde0a0a5680946e44bdb38513f0196da1287121dd777a7838201bcb2e1fd
7
+ data.tar.gz: c38b73fd7c9efbfa362221367bcd3362792f5377682161ecff673d0da2d9fda03fc0349163a47bbbe43ea7df6759a9b6dd221fe4c1b9017f0b3d2cce23782833
data/README.md CHANGED
@@ -77,6 +77,38 @@ This plugin can also be used to generate critical css stylesheets. See
77
77
  configuration for more information on doing this. To generate critical css,
78
78
  [critical](https://github.com/addyosmani/critical) must be installed.
79
79
 
80
+ ## Javascript/Typescript bundling
81
+
82
+ This plugin can also be used to bundle javascript and typescript files and
83
+ modules using esbuild. Node modules can be included just by requiring them.
84
+ Local modules can be required under the `@simple-assets` namespace, which
85
+ will look for js files in the `_js` and `_ts` directories.
86
+
87
+ For example:
88
+ ```javascript
89
+ // assets/js/main.js
90
+
91
+ // require node_module
92
+ var leftpad = require('left-pad');
93
+
94
+ // will look for left-pad.js or left-pad.ts at _js/ or _ts/ in the
95
+ // project root
96
+ var rightpad = require('@simple-assets/right-pad');
97
+ ```
98
+
99
+ You can also put variables in the liquid frontmatter of a js/ts file (that is
100
+ not under `_js` or `_ts`) to configure esbuild.
101
+
102
+ ```liquid
103
+ ---
104
+ bundle: false # don't bundle or run esbuild on this file
105
+ esbuild_flags: --target=es5 # pass any flags to esbuild for this file
106
+ ---
107
+ ```
108
+
109
+ To bundle javascript [esbuild](https://github.com/evanw/esbuild) must be
110
+ installed.
111
+
80
112
  ## Configuration
81
113
 
82
114
  ```
@@ -109,4 +141,8 @@ simple_assets:
109
141
  layout: post
110
142
  # If the rules should be removed from the original source css files
111
143
  extract: true
144
+
145
+ # Options for bundling javascript/typescript with the `esbuild` npm module
146
+ # Set to true to enable
147
+ bundle: true
112
148
  ```
@@ -7,10 +7,11 @@ require 'shellwords'
7
7
 
8
8
  require 'jekyll-simple-assets/content-hash'
9
9
  require 'jekyll-simple-assets/critical'
10
+ require 'jekyll-simple-assets/esbuild'
10
11
 
11
12
  module Jekyll
12
13
  module SimpleAssets
13
- def self.site (site)
14
+ def self.site (site = nil)
14
15
  @@site ||= site
15
16
  end
16
17
 
@@ -26,6 +27,14 @@ module Jekyll
26
27
  config.key?('critical_css')
27
28
  end
28
29
 
30
+ def self.esbuild_enabled?
31
+ config.key?('bundle') && config['bundle'] != false
32
+ end
33
+
34
+ def self.esbuild_config_file (file = nil)
35
+ @@esbuild_config_file ||= file
36
+ end
37
+
29
38
  module SimpleAssetsFilters
30
39
  def md5 (input)
31
40
  Digest::MD5.hexdigest(input)
@@ -110,6 +119,18 @@ Jekyll::Hooks.register :site, :post_render, priority: :low do |site, payload|
110
119
  end
111
120
  end
112
121
 
122
+ Jekyll::Hooks.register :pages, :post_render do |page, payload|
123
+ next unless Jekyll::SimpleAssets::esbuild_enabled?
124
+
125
+ unless Jekyll::SimpleAssets::esbuild_config_file
126
+ Jekyll::SimpleAssets::generate_esbuild_config_file()
127
+ end
128
+
129
+ if page.extname =~ /^\.(j|t)s$/i
130
+ Jekyll::SimpleAssets::esbuild_bundle_file(page, payload, Jekyll::SimpleAssets::esbuild_config_file.path)
131
+ end
132
+ end
133
+
113
134
  Jekyll::Hooks.register :site, :post_read do |site|
114
135
  css_pages = [];
115
136
 
@@ -60,13 +60,16 @@ def self.generate_critical_css (site)
60
60
  stdin.write(html)
61
61
  stdin.close
62
62
 
63
- err = stderr.read
64
- unless wait_thr.value.success?
65
- Jekyll.logger.error("SimpleAssets:", 'Critical:' + err || stdout.read)
66
-
67
- next
68
- else
69
- Jekyll.logger.warn("SimpleAssets:", 'Critical:' + err) if err
63
+ if !wait_thr.value.success? || stderr.read != ''
64
+ Jekyll.logger.error("SimpleAssets:", 'Critical (css) error:')
65
+ stderr.each do |line|
66
+ Jekyll.logger.error("", line)
67
+ end
68
+ elsif stderr.read != ''
69
+ Jekyll.logger.error("SimpleAssets:", 'Critical (css) error:')
70
+ stderr.each do |line|
71
+ Jekyll.logger.error("", line)
72
+ end
70
73
  end
71
74
 
72
75
  critical_css_str = stdout.read
@@ -0,0 +1,84 @@
1
+ module Jekyll
2
+ module SimpleAssets
3
+
4
+ def self.generate_esbuild_config_file ()
5
+ source_path = Jekyll::SimpleAssets::site.config['source']
6
+
7
+ tsconfig_path = File.join(source_path, 'jsconfig.json')
8
+ jsconfig_path = File.join(source_path, 'tsconfig.json')
9
+
10
+ config = {}
11
+
12
+ if File.file?(tsconfig_path)
13
+ config = JSON.parse(File.read(tsconfig_path))
14
+ elsif File.file?(jsconfig_path)
15
+ config = JSON.parse(File.read(jsconfig_path))
16
+ end
17
+
18
+ f = Tempfile.new([ 'jsconfig.esbuild.', '.json' ])
19
+
20
+ config['compilerOptions'] = {} unless config['compilerOptions']
21
+
22
+ base_url = source_path
23
+ if config['compilerOptions']['baseUrl']
24
+ base_url = File.join(source_path, config['compilerOptions']['baseUrl'])
25
+ end
26
+ config['compilerOptions']['baseUrl'] = Pathname.new(base_url).relative_path_from(Pathname.new(f.path))
27
+
28
+ config['compilerOptions']['paths'] = {} unless config['compilerOptions']['paths']
29
+
30
+ relative_path = Pathname.new(source_path).relative_path_from(Pathname.new(base_url))
31
+
32
+ config['compilerOptions']['paths']['@simple-assets/*'] = [
33
+ File.join(relative_path, '_js/*'),
34
+ File.join(relative_path, '_ts/*'),
35
+ ]
36
+
37
+ f.write config.to_json
38
+ f.close
39
+
40
+ Jekyll::SimpleAssets::esbuild_config_file(f)
41
+
42
+ Jekyll.logger.debug("SimpleAssets:", "esbuild: using tsconfig #{ f.path }")
43
+ end
44
+
45
+ def self.esbuild_bundle_file (page, payload, config_path)
46
+ if page.data['bundle'] == false
47
+ return
48
+ end
49
+
50
+ bundle_cmd = "npx esbuild --bundle --tsconfig=#{ config_path }"
51
+
52
+ if page.data['esbuild_flags']
53
+ bundle_cmd = "#{ bundle_cmd } #{ page.data['esbuild_flags'] }"
54
+ end
55
+
56
+ dir = File.dirname(page.path)
57
+
58
+ Jekyll.logger.info("SimpleAssets:", 'bundling: ' + page.path)
59
+ Jekyll.logger.debug("SimpleAssets:", 'running command: ' + bundle_cmd)
60
+
61
+ Open3.popen3(bundle_cmd, :chdir => dir) do |stdin, stdout, stderr, wait_thr|
62
+ stdin.write(page.output)
63
+ stdin.close
64
+
65
+ bundled = stdout.read
66
+
67
+ if !wait_thr.value.success? || stderr.read != ''
68
+ Jekyll.logger.error("SimpleAssets:", 'esbuild error:')
69
+ stderr.each do |line|
70
+ Jekyll.logger.error("", line)
71
+ end
72
+ elsif stderr.read != ''
73
+ Jekyll.logger.error("SimpleAssets:", 'esbuild error:')
74
+ stderr.each do |line|
75
+ Jekyll.logger.error("", line)
76
+ end
77
+ end
78
+
79
+ page.output = bundled
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module SimpleAssets
5
- VERSION = "0.3.1"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-simple-assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sophie Askew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-21 00:00:00.000000000 Z
11
+ date: 2020-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -68,6 +68,7 @@ files:
68
68
  - lib/jekyll-simple-assets.rb
69
69
  - lib/jekyll-simple-assets/content-hash.rb
70
70
  - lib/jekyll-simple-assets/critical.rb
71
+ - lib/jekyll-simple-assets/esbuild.rb
71
72
  - lib/jekyll-simple-assets/version.rb
72
73
  homepage: https://github.com/syldexiahime/jekyll-simple-assets
73
74
  licenses: