isomorfeus-asset-manager 0.14.8 → 0.14.12

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: c0f39c837b3ec72e3d9fee92fc4eeb65b283015a32dce4552f20757e7a1a9b74
4
- data.tar.gz: 59c41bdbb567a2932c9a0649e2b6d2a3a099404e77a4c8c2deb6a4bc75af76e0
3
+ metadata.gz: 0d50c569569e02ba08898b07c244ad40c2be45d190e98635383f53932391d725
4
+ data.tar.gz: 5c662d03177f4ab834d3667b34e44f20e485822a5474143be29171e63755c5d6
5
5
  SHA512:
6
- metadata.gz: d641b821399571e961ffb9f55a1437585ab51761ffcb6531ec291a4bf62976993a55ea988061eef909fa6052aa8156cbeb938a575d946bcf9c0df822a3105b4c
7
- data.tar.gz: 481be082b3e9715e7548124ee0428c4cde8a61bbc945170276806331bd66d226050058e3ebc2303e167b50d8c148c85fae308b435738b854eb6eb2eb34d982c3
6
+ metadata.gz: c186995284e3e0bffddcf3aee7c7af958ba68af4d2f724c725d030a0098a9ebaa7c02e7fd5df43c61192e4784b78c6aa65e01ac372266dca0ed3ae3916da68b0
7
+ data.tar.gz: f92d390b1703c40b1141197dd0ee34445951139f4535bae6491e47d784045c60b673f42deeb21504a3f4de2c3c43bdbf324f9f30f4471a1c44bdada62d3a364d
data/README.md CHANGED
@@ -12,4 +12,4 @@ No need to install esbuild separately, everything bundled ready to go.
12
12
  However, if within the project the 'esbuild' npm package is installed in node_modules, that version will be used instead.
13
13
 
14
14
  ### Community and Support
15
- At the [Isomorfeus Framework Project](http://isomorfeus.com)
15
+ At the [Isomorfeus Framework Project](https://isomorfeus.com)
@@ -5,6 +5,7 @@ module Isomorfeus
5
5
  attr_reader :bundle_gz, :bundle_gz_size
6
6
  attr_reader :bundle_map, :bundle_map_size
7
7
  attr_reader :bundle_map_gz, :bundle_map_gz_size
8
+ attr_reader :bundle_ruby_modules
8
9
  attr_reader :css, :css_size
9
10
  attr_reader :css_gz, :css_gz_size
10
11
  attr_reader :css_map, :css_map_size
@@ -52,6 +53,22 @@ module Isomorfeus
52
53
  @bundle_map
53
54
  end
54
55
 
56
+ def bundle_ruby_modules=(m)
57
+ @bundled = true
58
+ @bundle_ruby_modules = m
59
+ if !Isomorfeus.production? && @target != :node
60
+ @bundle_ruby_modules.each do |key, mod_hash|
61
+ mod_hash[:js_size] = mod_hash[:js].size
62
+ mod_hash[:js_gz] = Zlib::gzip(mod_hash[:js], level: Zlib::BEST_COMPRESSION)
63
+ mod_hash[:js_gz_size] = mod_hash[:js_gz].size
64
+ mod_hash[:map_size] = mod_hash[:map].size
65
+ mod_hash[:map_gz] = Zlib::gzip(mod_hash[:map], level: Zlib::BEST_COMPRESSION)
66
+ mod_hash[:map_gz_size] = mod_hash[:map_gz].size
67
+ end
68
+ end
69
+ @bundle_ruby_modules
70
+ end
71
+
55
72
  def bundled?
56
73
  @bundled
57
74
  end
@@ -92,6 +109,16 @@ module Isomorfeus
92
109
  @ruby_imports.map(&:module_name)
93
110
  end
94
111
 
112
+ def ruby_imports_to_s(asset_name)
113
+ s = @ruby_imports.size - 1
114
+ return '' if s < 0
115
+ js = "async function iam_load_ruby_modules() {\n"
116
+ @ruby_imports.each do |import|
117
+ js << ' await ' << import.to_dev_s(asset_name)
118
+ end
119
+ js << "}\niam_load_ruby_modules();\n"
120
+ end
121
+
95
122
  def touch
96
123
  @mtime = (Time.now.to_f * (10 ** 9)).to_i
97
124
  end
@@ -108,33 +135,43 @@ module Isomorfeus
108
135
  // Isomorfeus Asset Manager HMR code begin
109
136
  let ws_protocol = (window.location.protocol == 'https:') ? 'wss:' : 'ws:';
110
137
  let ws_url = ws_protocol + '//' + window.location.host + "#{Isomorfeus.assets_websocket_path}";
111
- let hmr_ws = new WebSocket(ws_url);
112
- hmr_ws.onmessage = function(event) {
113
- let update = JSON.parse(event.data);
114
- if (typeof update.error !== 'undefined') { console.error(update.error); return; }
115
- if (typeof update.locale !== 'undefined') {
116
- console.log('Updating locale ', update.locale);
117
- try { Opal.Isomorfeus.I18n.Init.$reload_from_server(); }
118
- catch { console.log('Coulnt update locale ', update.locale) }
119
- return;
120
- }
121
- let start_index = 'Opal.modules[\\"'.length;
122
- let end_index = update.javascript.indexOf('"', start_index);
123
- let opal_module_name = update.javascript.substr(start_index, end_index - start_index);
124
- console.log('Updating ', opal_module_name);
125
- if (typeof Opal !== 'undefined' && typeof Opal.require_table !== "undefined" && Opal.require_table['corelib/module']) {
126
- try {
127
- eval(update.javascript);
128
- if (Opal.require_table[opal_module_name]) { Opal.load.call(Opal, opal_module_name); }
129
- else { Opal.require.call(Opal, opal_module_name); }
130
- Opal.Isomorfeus.$force_render();
131
- } catch (e) { console.error(e); return; }
132
- }
138
+ let hmr_ws_fun = function() {
139
+ let hmr_ws = new WebSocket(ws_url);
140
+ hmr_ws.onopen = function(event) { console.log("Isomorfeus Asset Manager HMR socket connected"); }
141
+ hmr_ws.onmessage = function(event) {
142
+ let update = JSON.parse(event.data);
143
+ if (typeof update.error !== 'undefined') { console.error(update.error); return; }
144
+ if (typeof update.locale !== 'undefined') {
145
+ console.log('Isomorfeus Asset Manager updating locale ', update.locale);
146
+ try { Opal.Isomorfeus.I18n.Init.$reload_from_server(); }
147
+ catch { console.log('Isomorfeus Asset Manager could not update locale ', update.locale) }
148
+ return;
149
+ }
150
+ let start_index = 'Opal.modules[\\"'.length;
151
+ let end_index = update.javascript.indexOf('"', start_index);
152
+ let opal_module_name = update.javascript.substr(start_index, end_index - start_index);
153
+ console.log('Isomorfeus Asset Manager updating ', opal_module_name);
154
+ if (typeof Opal !== 'undefined' && typeof Opal.require_table !== "undefined" && Opal.require_table['corelib/module']) {
155
+ try {
156
+ eval(update.javascript);
157
+ if (Opal.require_table[opal_module_name]) { Opal.load.call(Opal, opal_module_name); }
158
+ else { Opal.require.call(Opal, opal_module_name); }
159
+ Opal.Isomorfeus.$force_render();
160
+ } catch (e) { console.error(e); return; }
161
+ }
162
+ };
163
+ hmr_ws.onclose = function(event) {
164
+ setTimeout(function() {
165
+ console.log("Isomorfeus Asset Manager reconnecting HMR socket");
166
+ hmr_ws_fun();
167
+ }, 2000);
168
+ };
133
169
  }
170
+ hmr_ws_fun()
134
171
  // Isomorfeus Asset Manager HMR code end
135
172
  JAVASCRIPT
136
173
  end
137
- js << "#{@ruby_imports.map(&:to_s).join("\n")}"
174
+ js << "#{@ruby_imports.map(&:to_s).join("\n")}" if Isomorfeus.production? || target == :node
138
175
  end
139
176
  js
140
177
  end
@@ -67,7 +67,7 @@ module Isomorfeus
67
67
  self.hmr_listener = nil
68
68
  self.asset_manager_hmr_channel = :isomorfeus_asset_manager_module_updates
69
69
  self.asset_manager_hmr_dirs = %w[channels components data locales operations policies]
70
- self.assets_websocket_path = '/_assets_websocket'
70
+ self.assets_websocket_path = '/_asset_manager_hmr_websocket'
71
71
  self.assets_path = '/assets'
72
72
  self.assets = {
73
73
  'web.js' => Isomorfeus::AssetManager::Asset.new(:browser),
@@ -25,8 +25,93 @@ module Isomorfeus
25
25
  path_info = env['PATH_INFO']
26
26
  if path_info.start_with?(@assets_path)
27
27
 
28
+ if !Isomorfeus.production?
29
+ if path_info.end_with?('.rb.js')
30
+ asset_key_module_name = path_info[@assets_path_size..-7]
31
+ asset_key, module_name = asset_key_module_name.split('/')
32
+ asset_key += '.js'
33
+ if Isomorfeus.assets.key?(asset_key)
34
+ asset = Isomorfeus.assets[asset_key]
35
+ if asset && asset.target != :node
36
+ asset_manager.transition(asset_key, asset) unless asset.bundled?
37
+ if asset.bundle_ruby_modules.key?(module_name)
38
+ headers = {}
39
+ headers['Last-Modified'] = asset.mtime
40
+ headers[Rack::CONTENT_TYPE] = 'application/javascript'
41
+ if should_gzip?(env)
42
+ headers['Content-Encoding'] = "gzip"
43
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_ruby_modules[module_name][:js_gz_size]
44
+ return [200, headers, asset.bundle_ruby_modules[module_name][:js_gz]]
45
+ else
46
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_ruby_modules[module_name][:js_size]
47
+ return [200, headers, asset.bundle_ruby_modules[module_name][:js]]
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ elsif path_info.end_with?('.rb.js.map')
54
+ asset_key_module_name = path_info[@assets_path_size..-11]
55
+ asset_key, module_name = asset_key_module_name.split('/')
56
+ asset_key += '.js'
57
+ asset = Isomorfeus.assets[asset_key]
58
+ if asset && asset.target != :node
59
+ asset_manager.transition(asset_key, asset) unless asset.bundled?
60
+ if asset.bundle_ruby_modules.key?(module_name)
61
+ headers = {}
62
+ headers['Last-Modified'] = asset.mtime
63
+ headers[Rack::CONTENT_TYPE] = 'application/json'
64
+ if should_gzip?(env)
65
+ headers['Content-Encoding'] = "gzip"
66
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_ruby_modules[module_name][:map_gz_size]
67
+ return [200, headers, asset.bundle_ruby_modules[module_name][:map_gz]]
68
+ else
69
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_ruby_modules[module_name][:map_size]
70
+ return [200, headers, asset.bundle_ruby_modules[module_name][:map]]
71
+ end
72
+ end
73
+ end
74
+
75
+ elsif path_info.end_with?('.js.map')
76
+ asset_key = path_info[@assets_path_size..-5]
77
+ asset = Isomorfeus.assets[asset_key]
78
+ if asset && asset.target != :node
79
+ asset_manager.transition(asset_key, asset) unless asset.bundled?
80
+ headers = {}
81
+ headers['Last-Modified'] = asset.mtime
82
+ headers[Rack::CONTENT_TYPE] = 'application/json'
83
+ if should_gzip?(env)
84
+ headers['Content-Encoding'] = "gzip"
85
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_map_gz_size
86
+ return [200, headers, asset.bundle_map_gz]
87
+ else
88
+ headers[Rack::CONTENT_LENGTH] = asset.bundle_map_size
89
+ return [200, headers, asset.bundle_map]
90
+ end
91
+ end
92
+
93
+ elsif path_info.end_with?('.css.map')
94
+ # get css source map
95
+ asset_key = path_info[@assets_path_size..-9] + '.js'
96
+ asset = Isomorfeus.assets[asset_key]
97
+ if asset && asset.target != :node
98
+ asset_manager.transition(asset_key, asset) unless asset.bundled?
99
+ headers = {}
100
+ headers['Last-Modified'] = asset.mtime
101
+ headers[Rack::CONTENT_TYPE] = 'application/json'
102
+ if should_gzip?(env)
103
+ headers['Content-Encoding'] = "gzip"
104
+ headers[Rack::CONTENT_LENGTH] = asset.css_map_gz_size
105
+ return [200, headers, asset.css_map_gz]
106
+ else
107
+ headers[Rack::CONTENT_LENGTH] = asset.css_map_size
108
+ return [200, headers, asset.css_map]
109
+ end
110
+ end
111
+ end
112
+ end
113
+
28
114
  if path_info.end_with?('.js')
29
- # get js
30
115
  asset_key = path_info[@assets_path_size..-1]
31
116
  if Isomorfeus.assets.key?(asset_key)
32
117
  asset = Isomorfeus.assets[asset_key]
@@ -46,25 +131,6 @@ module Isomorfeus
46
131
  end
47
132
  end
48
133
 
49
- elsif path_info.end_with?('.js.map')
50
- # get js source map
51
- asset_key = path_info[@assets_path_size..-5]
52
- asset = Isomorfeus.assets[asset_key]
53
- if asset && asset.target != :node
54
- asset_manager.transition(asset_key, asset) unless asset.bundled?
55
- headers = {}
56
- headers['Last-Modified'] = asset.mtime
57
- headers[Rack::CONTENT_TYPE] = 'application/json'
58
- if should_gzip?(env)
59
- headers['Content-Encoding'] = "gzip"
60
- headers[Rack::CONTENT_LENGTH] = asset.bundle_map_gz_size
61
- return [200, headers, asset.bundle_map_gz]
62
- else
63
- headers[Rack::CONTENT_LENGTH] = asset.bundle_map_size
64
- return [200, headers, asset.bundle_map]
65
- end
66
- end
67
-
68
134
  elsif path_info.end_with?('.css')
69
135
  # get css
70
136
  asset_key = path_info[@assets_path_size..-5] + '.js'
@@ -83,25 +149,6 @@ module Isomorfeus
83
149
  return [200, headers, asset.css]
84
150
  end
85
151
  end
86
-
87
- elsif path_info.end_with?('.css.map')
88
- # get css source map
89
- asset_key = path_info[@assets_path_size..-9] + '.js'
90
- asset = Isomorfeus.assets[asset_key]
91
- if asset && asset.target != :node
92
- asset_manager.transition(asset_key, asset) unless asset.bundled?
93
- headers = {}
94
- headers['Last-Modified'] = asset.mtime
95
- headers[Rack::CONTENT_TYPE] = 'application/json'
96
- if should_gzip?(env)
97
- headers['Content-Encoding'] = "gzip"
98
- headers[Rack::CONTENT_LENGTH] = asset.css_map_gz_size
99
- return [200, headers, asset.css_map_gz]
100
- else
101
- headers[Rack::CONTENT_LENGTH] = asset.css_map_size
102
- return [200, headers, asset.css_map]
103
- end
104
- end
105
152
  end
106
153
 
107
154
  return [404, {}, 'not found']
@@ -14,7 +14,11 @@ module Isomorfeus
14
14
  end
15
15
 
16
16
  def to_s
17
- "import(\"./#{@module_name}.js\");\n"
17
+ "import(\"./#{@module_name}.rb.js\");\n"
18
+ end
19
+
20
+ def to_dev_s(asset_name)
21
+ "import(\"#{Isomorfeus.assets_path}/#{asset_name}/#{@module_name}.rb.js\");\n"
18
22
  end
19
23
 
20
24
  private
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  class AssetManager
3
- VERSION = '0.14.8'
3
+ VERSION = '0.14.12'
4
4
  end
5
5
  end
@@ -60,21 +60,29 @@ module Isomorfeus
60
60
  asset.mutex.synchronize do
61
61
  return if !Isomorfeus.development? && asset.bundled?
62
62
  return if Isomorfeus.development? && asset.bundled? && (self.class.last_updated.nil? || (asset.mtime > self.class.last_updated))
63
+ start = Time.now
64
+ puts "Isomorfeus Asset Manager bundling #{asset_key} ..."
63
65
  asset.touch
64
- build_ruby_and_save(asset_key, asset)
66
+ asset_name = asset_key[0..-4]
67
+ asset.bundle_ruby_modules = build_ruby_and_save(asset_key, asset_name, asset)
65
68
  save_imports(asset_key, asset)
66
69
  run_esbuild(asset_key, asset, analyze)
67
- asset.bundle = bundled_asset(asset_key)
68
- asset.bundle_map = bundled_asset_map(asset_key) unless Isomorfeus.production?
70
+ asset.bundle = bundled_asset(asset_key, asset_name, asset)
69
71
  asset.css = bundled_css(asset_key)
70
- asset.css_map = bundled_css_map(asset_key) unless Isomorfeus.production?
72
+ unless Isomorfeus.production?
73
+ asset.bundle_map = bundled_asset_map(asset_key)
74
+ asset.css_map = bundled_css_map(asset_key)
75
+ end
76
+ puts "Isomorfeus Asset Manager bundling #{asset_key} took #{Time.now - start}s"
71
77
  end
72
78
  end
73
79
 
74
80
  private
75
81
 
76
- def bundled_asset(asset_key)
77
- File.read(File.join(@output_path, asset_key))
82
+ def bundled_asset(asset_key, asset_name, asset)
83
+ res = File.read(File.join(@output_path, asset_key))
84
+ res << asset.ruby_imports_to_s(asset_name) if !Isomorfeus.production? && asset.target != :node
85
+ res
78
86
  end
79
87
 
80
88
  def bundled_asset_map(asset_key)
@@ -95,20 +103,24 @@ module Isomorfeus
95
103
  File.write(File.join(@imports_path, asset_key), asset.to_s)
96
104
  end
97
105
 
98
- def build_ruby_and_save(asset_key, asset)
106
+ def build_ruby_and_save(asset_key, asset_name, asset)
107
+ rb = {}
99
108
  asset.ruby_imports.each do |ruby_import|
100
- out_file = File.join(@imports_path, ruby_import.module_name + '.js')
101
- next if !Isomorfeus.development? && File.exist?(out_file)
102
- js_map_path = File.join(@imports_path, ruby_import.module_name + '.js.map')
109
+ module_name = ruby_import.module_name
110
+ out_file = File.join(@imports_path, module_name + '.rb.js')
111
+ next if Isomorfeus.production? && File.exist?(out_file)
103
112
  result = Opal::Builder.build(ruby_import.resolved_path, { esm: true })
104
- FileUtils.mkdir_p(File.join(*[@imports_path].concat(ruby_import.module_name.split('/')[0...-1]))) if ruby_import.module_name.include?('/')
105
- js = result.to_s
106
- unless Isomorfeus.production?
107
- js << "\n//# sourceMappingURL=file://#{js_map_path}\n"
108
- File.write(js_map_path, result.source_map)
113
+ rb[module_name] = { js: result.to_s }
114
+ if !Isomorfeus.production? && asset.target != :node
115
+ rb[module_name][:js] << "\n//# sourceMappingURL=#{Isomorfeus.assets_path}/#{asset_name}/#{module_name}.rb.js.map\n"
116
+ rb[module_name][:map] = Oj.dump(result.source_map.as_json, mode: :strict)
117
+ else
118
+ FileUtils.mkdir_p(File.join(*[@imports_path].concat(module_name.split('/')[0...-1]))) if module_name.include?('/')
119
+ File.write(out_file, rb[module_name][:js])
120
+ rb[module_name][:js] = nil if Isomorfeus.production?
109
121
  end
110
- File.write(out_file, js)
111
122
  end
123
+ rb
112
124
  end
113
125
 
114
126
  def compile_ruby(file)
@@ -142,7 +154,7 @@ module Isomorfeus
142
154
  <<~JAVASCRIPT
143
155
  'use strict';
144
156
  const path = require('path');
145
- var esbuild_r;
157
+ let esbuild_r;
146
158
  try { esbuild_r = require('esbuild'); }
147
159
  catch { esbuild_r = require('esbuild-wasm'); }
148
160
  const esbuild = esbuild_r;
@@ -190,7 +202,6 @@ module Isomorfeus
190
202
  # possible future improvement
191
203
  # loader: {
192
204
  # '.png': 'dataurl',
193
- # '.svg': 'text',
194
205
  # },
195
206
  def run_esbuild(asset_key, asset, analyze = false)
196
207
  resolve_paths = ENV['NODE_PATH'].split(Gem.win_platform? ? ';' : ':')
@@ -205,7 +216,7 @@ module Isomorfeus
205
216
  format: '#{asset.target == :node ? 'cjs' : 'iife'}',
206
217
  legalComments: 'linked',
207
218
  loader: { '.svg': 'text' },
208
- metafile: true,
219
+ metafile: #{analyze ? 'true' : 'false'},
209
220
  minify: #{Isomorfeus.production? ? 'true' : 'false'},
210
221
  nodePaths: #{resolve_paths},
211
222
  outdir: global.output_path,
@@ -4,9 +4,9 @@
4
4
  "requires": true,
5
5
  "packages": {
6
6
  "node_modules/esbuild-wasm": {
7
- "version": "0.14.16",
8
- "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.16.tgz",
9
- "integrity": "sha512-0TnQyxKeNqdnKYEQwf475WkthvVL1aK9p/WaZsHY56Ek1jaxDuciEKRyqZhNZqWvBdjbkaFC46O19+HkIoppJQ==",
7
+ "version": "0.14.21",
8
+ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.21.tgz",
9
+ "integrity": "sha512-sPMyljBiKxXjW1wLd5dQnrUJR1PAt8ybSidXoZWJnMuB1mpdLju57LtstDWWkCgcaE+TGJJ6NqP/OtGyeDdEAA==",
10
10
  "bin": {
11
11
  "esbuild": "bin/esbuild"
12
12
  },
Binary file
@@ -26,6 +26,8 @@ interface CommonOptions {
26
26
  mangleProps?: RegExp;
27
27
  /** Documentation: https://esbuild.github.io/api/#mangle-props */
28
28
  reserveProps?: RegExp;
29
+ /** Documentation: https://esbuild.github.io/api/#mangle-props */
30
+ mangleCache?: Record<string, string | false>;
29
31
  /** Documentation: https://esbuild.github.io/api/#drop */
30
32
  drop?: Drop[];
31
33
  /** Documentation: https://esbuild.github.io/api/#minify */
@@ -200,6 +202,8 @@ export interface BuildResult {
200
202
  stop?: () => void;
201
203
  /** Only when "metafile: true" */
202
204
  metafile?: Metafile;
205
+ /** Only when "mangleCache" is present */
206
+ mangleCache?: Record<string, string | false>;
203
207
  }
204
208
 
205
209
  export interface BuildFailure extends Error {
@@ -253,6 +257,8 @@ export interface TransformResult {
253
257
  code: string;
254
258
  map: string;
255
259
  warnings: Message[];
260
+ /** Only when "mangleCache" is present */
261
+ mangleCache?: Record<string, string | false>;
256
262
  }
257
263
 
258
264
  export interface TransformFailure extends Error {
@@ -251,6 +251,21 @@ function validateInitializeOptions(options) {
251
251
  worker
252
252
  };
253
253
  }
254
+ function validateMangleCache(mangleCache) {
255
+ let validated;
256
+ if (mangleCache !== void 0) {
257
+ validated = /* @__PURE__ */ Object.create(null);
258
+ for (let key of Object.keys(mangleCache)) {
259
+ let value = mangleCache[key];
260
+ if (typeof value === "string" || value === false) {
261
+ validated[key] = value;
262
+ } else {
263
+ throw new Error(`Expected ${JSON.stringify(key)} in mangle cache to map to either a string or false`);
264
+ }
265
+ }
266
+ }
267
+ return validated;
268
+ }
254
269
  function pushLogFlags(flags, options, keys, isTTY, logLevelDefault) {
255
270
  let color = getFlag(options, keys, "color", mustBeBoolean);
256
271
  let logLevel = getFlag(options, keys, "logLevel", mustBeString);
@@ -382,6 +397,7 @@ function flagsForBuildOptions(callName, options, isTTY, logLevelDefault, writeDe
382
397
  let write = (_a = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a : writeDefault;
383
398
  let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean);
384
399
  let incremental = getFlag(options, keys, "incremental", mustBeBoolean) === true;
400
+ let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
385
401
  keys.plugins = true;
386
402
  checkForInvalidFlags(options, keys, `in ${callName}() call`);
387
403
  if (sourcemap)
@@ -531,7 +547,8 @@ function flagsForBuildOptions(callName, options, isTTY, logLevelDefault, writeDe
531
547
  absWorkingDir,
532
548
  incremental,
533
549
  nodePaths,
534
- watch: watchMode
550
+ watch: watchMode,
551
+ mangleCache: validateMangleCache(mangleCache)
535
552
  };
536
553
  }
537
554
  function flagsForTransformOptions(callName, options, isTTY, logLevelDefault) {
@@ -545,6 +562,7 @@ function flagsForTransformOptions(callName, options, isTTY, logLevelDefault) {
545
562
  let loader = getFlag(options, keys, "loader", mustBeString);
546
563
  let banner = getFlag(options, keys, "banner", mustBeString);
547
564
  let footer = getFlag(options, keys, "footer", mustBeString);
565
+ let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
548
566
  checkForInvalidFlags(options, keys, `in ${callName}() call`);
549
567
  if (sourcemap)
550
568
  flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`);
@@ -558,7 +576,10 @@ function flagsForTransformOptions(callName, options, isTTY, logLevelDefault) {
558
576
  flags.push(`--banner=${banner}`);
559
577
  if (footer)
560
578
  flags.push(`--footer=${footer}`);
561
- return flags;
579
+ return {
580
+ flags,
581
+ mangleCache: validateMangleCache(mangleCache)
582
+ };
562
583
  }
563
584
  function createChannel(streamIn) {
564
585
  let responseCallbacks = /* @__PURE__ */ new Map();
@@ -702,8 +723,8 @@ function createChannel(streamIn) {
702
723
  if (isFirstPacket) {
703
724
  isFirstPacket = false;
704
725
  let binaryVersion = String.fromCharCode(...bytes);
705
- if (binaryVersion !== "0.14.16") {
706
- throw new Error(`Cannot start service: Host version "${"0.14.16"}" does not match binary version ${JSON.stringify(binaryVersion)}`);
726
+ if (binaryVersion !== "0.14.21") {
727
+ throw new Error(`Cannot start service: Host version "${"0.14.21"}" does not match binary version ${JSON.stringify(binaryVersion)}`);
707
728
  }
708
729
  return;
709
730
  }
@@ -1162,7 +1183,8 @@ function createChannel(streamIn) {
1162
1183
  absWorkingDir,
1163
1184
  incremental,
1164
1185
  nodePaths,
1165
- watch
1186
+ watch,
1187
+ mangleCache
1166
1188
  } = flagsForBuildOptions(callName, options, isTTY, buildLogLevelDefault, writeDefault);
1167
1189
  let request = {
1168
1190
  command: "build",
@@ -1178,6 +1200,8 @@ function createChannel(streamIn) {
1178
1200
  };
1179
1201
  if (requestPlugins)
1180
1202
  request.plugins = requestPlugins;
1203
+ if (mangleCache)
1204
+ request.mangleCache = mangleCache;
1181
1205
  let serve2 = serveOptions && buildServeData(refs, serveOptions, request, key);
1182
1206
  let rebuild;
1183
1207
  let stop;
@@ -1186,6 +1210,8 @@ function createChannel(streamIn) {
1186
1210
  result.outputFiles = response.outputFiles.map(convertOutputFiles);
1187
1211
  if (response.metafile)
1188
1212
  result.metafile = JSON.parse(response.metafile);
1213
+ if (response.mangleCache)
1214
+ result.mangleCache = response.mangleCache;
1189
1215
  if (response.writeToStdout !== void 0)
1190
1216
  console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, ""));
1191
1217
  };
@@ -1313,20 +1339,32 @@ function createChannel(streamIn) {
1313
1339
  try {
1314
1340
  if (typeof input !== "string")
1315
1341
  throw new Error('The input to "transform" must be a string');
1316
- let flags = flagsForTransformOptions(callName, options, isTTY, transformLogLevelDefault);
1342
+ let {
1343
+ flags,
1344
+ mangleCache
1345
+ } = flagsForTransformOptions(callName, options, isTTY, transformLogLevelDefault);
1317
1346
  let request = {
1318
1347
  command: "transform",
1319
1348
  flags,
1320
1349
  inputFS: inputPath !== null,
1321
1350
  input: inputPath !== null ? inputPath : input
1322
1351
  };
1352
+ if (mangleCache)
1353
+ request.mangleCache = mangleCache;
1323
1354
  sendRequest(refs, request, (error, response) => {
1324
1355
  if (error)
1325
1356
  return callback(new Error(error), null);
1326
1357
  let errors = replaceDetailsInMessages(response.errors, details);
1327
1358
  let warnings = replaceDetailsInMessages(response.warnings, details);
1328
1359
  let outstanding = 1;
1329
- let next = () => --outstanding === 0 && callback(null, { warnings, code: response.code, map: response.map });
1360
+ let next = () => {
1361
+ if (--outstanding === 0) {
1362
+ let result = { warnings, code: response.code, map: response.map };
1363
+ if (response.mangleCache)
1364
+ result.mangleCache = response == null ? void 0 : response.mangleCache;
1365
+ callback(null, result);
1366
+ }
1367
+ };
1330
1368
  if (errors.length > 0)
1331
1369
  return callback(failureErrorWithLog("Transform failed", errors, warnings), null);
1332
1370
  if (response.codeFS) {
@@ -1631,7 +1669,7 @@ function convertOutputFiles({ path, contents }) {
1631
1669
  }
1632
1670
 
1633
1671
  // lib/npm/browser.ts
1634
- var version = "0.14.16";
1672
+ var version = "0.14.21";
1635
1673
  var build = (options) => ensureServiceIsRunning().build(options);
1636
1674
  var serve = () => {
1637
1675
  throw new Error(`The "serve" API only works in node`);
@@ -2388,7 +2426,7 @@ onmessage = ({ data: wasm }) => {
2388
2426
  callback(null, count);
2389
2427
  };
2390
2428
  let go = new global.Go();
2391
- go.argv = ["", \`--service=\${"0.14.16"}\`];
2429
+ go.argv = ["", \`--service=\${"0.14.21"}\`];
2392
2430
  WebAssembly.instantiate(wasm, go.importObject).then(({ instance }) => go.run(instance));
2393
2431
  };}`;
2394
2432
  let worker;