From 8df1a00ade0c82a72e5f08134b8ab1a525a3ec92 Mon Sep 17 00:00:00 2001 From: okoala Date: Thu, 30 Aug 2018 18:56:17 +0800 Subject: [PATCH] feat: add wasm unit test --- packages/af-webpack/src/getConfig/index.js | 2 +- .../test/fixtures/wasm/expected/1.async.js | 20 ++ .../expected/272656dc1982c4117425.module.wasm | Bin 0 -> 118 bytes .../test/fixtures/wasm/expected/index.js | 267 ++++++++++++++++++ .../af-webpack/test/fixtures/wasm/index.js | 3 + .../af-webpack/test/fixtures/wasm/popcnt.wasm | Bin 0 -> 120 bytes 6 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 packages/af-webpack/test/fixtures/wasm/expected/1.async.js create mode 100644 packages/af-webpack/test/fixtures/wasm/expected/272656dc1982c4117425.module.wasm create mode 100644 packages/af-webpack/test/fixtures/wasm/expected/index.js create mode 100644 packages/af-webpack/test/fixtures/wasm/index.js create mode 100644 packages/af-webpack/test/fixtures/wasm/popcnt.wasm diff --git a/packages/af-webpack/src/getConfig/index.js b/packages/af-webpack/src/getConfig/index.js index 9c2558dfd66d..ebfc57c653c0 100644 --- a/packages/af-webpack/src/getConfig/index.js +++ b/packages/af-webpack/src/getConfig/index.js @@ -90,7 +90,7 @@ export default function(opts) { const rule = webpackConfig.module .rule('exclude') .exclude.add(/\.json$/) - .add(/\.(js|jsx|ts|tsx|mjs)$/) + .add(/\.(js|jsx|ts|tsx|mjs|wasm)$/) .add(/\.(css|less|scss|sass)$/); if (opts.urlLoaderExcludes) { opts.urlLoaderExcludes.forEach(exclude => { diff --git a/packages/af-webpack/test/fixtures/wasm/expected/1.async.js b/packages/af-webpack/test/fixtures/wasm/expected/1.async.js new file mode 100644 index 000000000000..ca43e9687072 --- /dev/null +++ b/packages/af-webpack/test/fixtures/wasm/expected/1.async.js @@ -0,0 +1,20 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],{ + +/***/ 2: +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Instantiate WebAssembly module +var wasmExports = __webpack_require__.w[module.i]; +__webpack_require__.r(exports); +// export exports from WebAssembly module +for(var name in wasmExports) if(name != "__webpack_init__") exports[name] = wasmExports[name]; +// exec imports from WebAssembly module (for esm order) + + +// exec wasm module +wasmExports["__webpack_init__"]() + +/***/ }) + +}]); \ No newline at end of file diff --git a/packages/af-webpack/test/fixtures/wasm/expected/272656dc1982c4117425.module.wasm b/packages/af-webpack/test/fixtures/wasm/expected/272656dc1982c4117425.module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1cd9a537cc662e161674b96b183c157d05496be0 GIT binary patch literal 118 zcmXxXF%H5o5Cp(o`v@{_=xOqVG(3QB&|FNE!XP_QFhW#ugT%9;VY)%MCjy`|Jy)(h zV8#9}!Wr0Df(^0lq)B6%mY0E~5HsNPd>p1nE?01``W!EF7;YMKEUGZOgZUl literal 0 HcmV?d00001 diff --git a/packages/af-webpack/test/fixtures/wasm/expected/index.js b/packages/af-webpack/test/fixtures/wasm/expected/index.js new file mode 100644 index 000000000000..027f9fc56efa --- /dev/null +++ b/packages/af-webpack/test/fixtures/wasm/expected/index.js @@ -0,0 +1,267 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ }; +/******/ +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 0: 0 +/******/ }; +/******/ +/******/ +/******/ +/******/ // script path function +/******/ function jsonpScriptSrc(chunkId) { +/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".async.js" +/******/ } +/******/ +/******/ // object to store loaded and loading wasm modules +/******/ var installedWasmModules = {}; +/******/ +/******/ function promiseResolve() { return Promise.resolve(); } +/******/ +/******/ var wasmImportObjects = { +/******/ 2: function() { +/******/ return { +/******/ +/******/ }; +/******/ }, +/******/ }; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId) { +/******/ var promises = []; +/******/ +/******/ +/******/ // JSONP chunk loading for javascript +/******/ +/******/ var installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise(function(resolve, reject) { +/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; +/******/ }); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var head = document.getElementsByTagName('head')[0]; +/******/ var script = document.createElement('script'); +/******/ var onScriptComplete; +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.src = jsonpScriptSrc(chunkId); +/******/ +/******/ onScriptComplete = function (event) { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var chunk = installedChunks[chunkId]; +/******/ if(chunk !== 0) { +/******/ if(chunk) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ chunk[1](error); +/******/ } +/******/ installedChunks[chunkId] = undefined; +/******/ } +/******/ }; +/******/ var timeout = setTimeout(function(){ +/******/ onScriptComplete({ type: 'timeout', target: script }); +/******/ }, 120000); +/******/ script.onerror = script.onload = onScriptComplete; +/******/ head.appendChild(script); +/******/ } +/******/ } +/******/ +/******/ // Fetch + compile chunk loading for webassembly +/******/ +/******/ var wasmModules = {"1":[2]}[chunkId] || []; +/******/ +/******/ wasmModules.forEach(function(wasmModuleId) { +/******/ var installedWasmModuleData = installedWasmModules[wasmModuleId]; +/******/ +/******/ // a Promise means "currently loading" or "already loaded". +/******/ if(installedWasmModuleData) +/******/ promises.push(installedWasmModuleData); +/******/ else { +/******/ var importObject = wasmImportObjects[wasmModuleId](); +/******/ var req = fetch(__webpack_require__.p + "" + {"2":"272656dc1982c4117425"}[wasmModuleId] + ".module.wasm"); +/******/ var promise; +/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { +/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { +/******/ return WebAssembly.instantiate(items[0], items[1]); +/******/ }); +/******/ } else if(typeof WebAssembly.instantiateStreaming === 'function') { +/******/ promise = WebAssembly.instantiateStreaming(req, importObject); +/******/ } else { +/******/ var bytesPromise = req.then(function(x) { return x.arrayBuffer(); }); +/******/ promise = bytesPromise.then(function(bytes) { +/******/ return WebAssembly.instantiate(bytes, importObject); +/******/ }); +/******/ } +/******/ promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) { +/******/ return __webpack_require__.w[wasmModuleId] = (res.instance || res).exports; +/******/ })); +/******/ } +/******/ }); +/******/ return Promise.all(promises); +/******/ }; +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; +/******/ +/******/ // object with all WebAssembly.instance exports +/******/ __webpack_require__.w = {}; +/******/ +/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(1); + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +__webpack_require__.e(/* import() */ 1).then(__webpack_require__.bind(null, 2)).then(function (popcnt) { + console.log(popcnt.main(0xF0F)); +}); + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/packages/af-webpack/test/fixtures/wasm/index.js b/packages/af-webpack/test/fixtures/wasm/index.js new file mode 100644 index 000000000000..fc79518f9161 --- /dev/null +++ b/packages/af-webpack/test/fixtures/wasm/index.js @@ -0,0 +1,3 @@ +import("./popcnt.wasm").then(popcnt => { + console.log(popcnt.main(0xF0F)); +}) \ No newline at end of file diff --git a/packages/af-webpack/test/fixtures/wasm/popcnt.wasm b/packages/af-webpack/test/fixtures/wasm/popcnt.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f605a5a95f78d673d3586e2007b781a3511552db GIT binary patch literal 120 zcmZQbEY4+QU|?WuYiMX-U`$}FXRK##2C~ ymYbTJUsTD&z>=Gona9Au86RbuoL`z(lEuKtH3Mu)2UxuVL#88R33n@u!wmpEmLEs} literal 0 HcmV?d00001