|
61 | 61 |
|
62 | 62 | // When code is sent to Espruino, search it for modules and add extra code required to load them |
63 | 63 | Espruino.addProcessor("transformForEspruino", function(code, callback) { |
| 64 | + if (Espruino.Config.ROLLUP) { |
| 65 | + return loadModulesRollup(code, callback); |
| 66 | + } |
64 | 67 | loadModules(code, callback); |
65 | 68 | }); |
| 69 | + |
| 70 | + // Append the 'getModule' processor as the last (plugins get initialized after Espruino.Core modules) |
| 71 | + Espruino.Plugins.CoreModules = { |
| 72 | + init: function() { |
| 73 | + Espruino.addProcessor("getModule", function(data, callback) { |
| 74 | + if (data.moduleCode!==undefined) { // already provided be previous getModule processor |
| 75 | + return callback(data); |
| 76 | + } |
| 77 | + |
| 78 | + fetchGetModule(data, callback); |
| 79 | + }); |
| 80 | + } |
| 81 | + }; |
66 | 82 | } |
67 | 83 |
|
68 | 84 | function isBuiltIn(module) { |
|
105 | 121 | return modules; |
106 | 122 | }; |
107 | 123 |
|
| 124 | + /** Download modules from MODULE_URL/.. */ |
| 125 | + function fetchGetModule(data, callback) { |
| 126 | + var fullModuleName = data.moduleName; |
| 127 | + |
| 128 | + // try and load the module the old way... |
| 129 | + console.log("loadModule("+fullModuleName+")"); |
| 130 | + |
| 131 | + var urls = []; // Array of where to look for this module |
| 132 | + var modName; // Simple name of the module |
| 133 | + if(Espruino.Core.Utils.isURL(fullModuleName)) { |
| 134 | + modName = fullModuleName.substr(fullModuleName.lastIndexOf("/") + 1).split(".")[0]; |
| 135 | + urls = [ fullModuleName ]; |
| 136 | + } else { |
| 137 | + modName = fullModuleName; |
| 138 | + Espruino.Config.MODULE_URL.split("|").forEach(function (url) { |
| 139 | + url = url.trim(); |
| 140 | + if (url.length!=0) |
| 141 | + Espruino.Config.MODULE_EXTENSIONS.split("|").forEach(function (extension) { |
| 142 | + urls.push(url + "/" + fullModuleName + extension); |
| 143 | + }) |
| 144 | + }); |
| 145 | + }; |
| 146 | + |
| 147 | + // Recursively go through all the urls |
| 148 | + (function download(urls) { |
| 149 | + if (urls.length==0) { |
| 150 | + return callback(data); |
| 151 | + } |
| 152 | + var dlUrl = urls[0]; |
| 153 | + Espruino.Core.Utils.getURL(dlUrl, function (code) { |
| 154 | + if (code!==undefined) { |
| 155 | + // we got it! |
| 156 | + data.moduleCode = code; |
| 157 | + data.isMinified = dlUrl.substr(-7)==".min.js"; |
| 158 | + return callback(data); |
| 159 | + } else { |
| 160 | + // else try next |
| 161 | + download(urls.slice(1)); |
| 162 | + } |
| 163 | + }); |
| 164 | + })(urls); |
| 165 | + } |
| 166 | + |
| 167 | + |
108 | 168 | /** Called from loadModule when a module is loaded. Parse it for other modules it might use |
109 | 169 | * and resolve dfd after all submodules have been loaded */ |
110 | 170 | function moduleLoaded(resolve, requires, modName, data, loadedModuleData, alreadyMinified){ |
|
144 | 204 | return new Promise(function(resolve, reject) { |
145 | 205 | // First off, try and find this module using callProcessor |
146 | 206 | Espruino.callProcessor("getModule", |
147 | | - { moduleName:fullModuleName, moduleCode:undefined }, |
| 207 | + { moduleName:fullModuleName, moduleCode:undefined, isMinified:false }, |
148 | 208 | function(data) { |
149 | | - if (data.moduleCode!==undefined) { |
150 | | - // great! it found something. Use it. |
151 | | - moduleLoaded(resolve, requires, fullModuleName, data.moduleCode, loadedModuleData, false); |
152 | | - } else { |
153 | | - // otherwise try and load the module the old way... |
154 | | - console.log("loadModule("+fullModuleName+")"); |
155 | | - |
156 | | - var urls = []; // Array of where to look for this module |
157 | | - var modName; // Simple name of the module |
158 | | - if(Espruino.Core.Utils.isURL(fullModuleName)) { |
159 | | - modName = fullModuleName.substr(fullModuleName.lastIndexOf("/") + 1).split(".")[0]; |
160 | | - urls = [ fullModuleName ]; |
161 | | - } else { |
162 | | - modName = fullModuleName; |
163 | | - Espruino.Config.MODULE_URL.split("|").forEach(function (url) { |
164 | | - url = url.trim(); |
165 | | - if (url.length!=0) |
166 | | - Espruino.Config.MODULE_EXTENSIONS.split("|").forEach(function (extension) { |
167 | | - urls.push(url + "/" + fullModuleName + extension); |
168 | | - }) |
169 | | - }); |
170 | | - }; |
171 | | - |
172 | | - // Recursively go through all the urls |
173 | | - (function download(urls) { |
174 | | - if (urls.length==0) { |
175 | | - Espruino.Core.Notifications.warning("Module "+fullModuleName+" not found"); |
176 | | - return resolve(); |
177 | | - } |
178 | | - var dlUrl = urls[0]; |
179 | | - Espruino.Core.Utils.getURL(dlUrl, function (data) { |
180 | | - if (data!==undefined) { |
181 | | - // we got it! |
182 | | - moduleLoaded(resolve, requires, fullModuleName, data, loadedModuleData, dlUrl.substr(-7)==".min.js"); |
183 | | - } else { |
184 | | - // else try next |
185 | | - download(urls.slice(1)); |
186 | | - } |
187 | | - }); |
188 | | - })(urls); |
| 209 | + if (data.moduleCode===undefined) { |
| 210 | + Espruino.Core.Notifications.warning("Module "+fullModuleName+" not found"); |
| 211 | + return resolve(); |
189 | 212 | } |
190 | | - }); |
191 | 213 |
|
| 214 | + // great! it found something. Use it. |
| 215 | + moduleLoaded(resolve, requires, fullModuleName, data.moduleCode, loadedModuleData, data.isMinified); |
| 216 | + }); |
192 | 217 | }); |
193 | 218 | } |
194 | 219 |
|
|
211 | 236 | callback(loadedModuleData.join("\n") + "\n" + code); |
212 | 237 | }); |
213 | 238 | } |
214 | | - }; |
| 239 | + } |
| 240 | + |
| 241 | + function loadModulesRollup(code, callback) { |
| 242 | + rollupTools.loadModulesRollup(code) |
| 243 | + .then(generated => { |
| 244 | + const minified = generated.code; |
| 245 | + console.log('rollup: '+minified.length+' bytes'); |
215 | 246 |
|
| 247 | + // FIXME: needs warnings? |
| 248 | + Espruino.Core.Notifications.info('Rollup no errors. Bundling ' + code.length + ' bytes to ' + minified.length + ' bytes'); |
| 249 | + callback(minified); |
| 250 | + }) |
| 251 | + .catch(err => { |
| 252 | + console.log('rollup:error', err); |
| 253 | + Espruino.Core.Notifications.error("Rollup errors - Bundling failed: " + String(err).trim()); |
| 254 | + callback(code); |
| 255 | + }); |
| 256 | + } |
216 | 257 |
|
217 | 258 | Espruino.Core.Modules = { |
218 | 259 | init : init |
|
0 commit comments