diff --git a/frameworks/keyed/wasm-bindgen/.gitignore b/frameworks/keyed/wasm-bindgen/.gitignore index 97602aa62..047278d56 100644 --- a/frameworks/keyed/wasm-bindgen/.gitignore +++ b/frameworks/keyed/wasm-bindgen/.gitignore @@ -1,2 +1,5 @@ -js_framework_benchmark_wasm_bindgen.* -js_framework_benchmark_wasm_bindgen_bg.* +node_modules +/target +/pkg +/wasm-pack.log +/yarn-error.log diff --git a/frameworks/keyed/wasm-bindgen/Cargo.toml b/frameworks/keyed/wasm-bindgen/Cargo.toml index d5cfb8ecd..8f685b7f7 100644 --- a/frameworks/keyed/wasm-bindgen/Cargo.toml +++ b/frameworks/keyed/wasm-bindgen/Cargo.toml @@ -7,11 +7,11 @@ edition = "2018" crate-type = ["cdylib"] [dependencies] -wasm-bindgen = "0.2.31" -js-sys = "0.3.5" +wasm-bindgen = "0.2.46" +js-sys = "0.3.23" [dependencies.web-sys] -version = "0.3.4" +version = "0.3.23" features = [ 'Document', 'DomTokenList', @@ -25,6 +25,4 @@ features = [ [profile.release] lto = true -opt-level = "z" -debug = false panic = "abort" diff --git a/frameworks/keyed/wasm-bindgen/README.md b/frameworks/keyed/wasm-bindgen/README.md new file mode 100644 index 000000000..65f2ccc6f --- /dev/null +++ b/frameworks/keyed/wasm-bindgen/README.md @@ -0,0 +1,14 @@ +Because of the heavy amount of Rust dependencies, this example is pre-compiled, so you don't need to compile anything. + +However, if you do want to compile it, you will need the following: + +* [Rust](https://www.rust-lang.org/tools/install) + +* [wasm-pack](https://rustwasm.github.io/wasm-pack/) + +After installing those, run these commands: + +``` +npm install +npm run build-prod-force +``` diff --git a/frameworks/keyed/wasm-bindgen/build.js b/frameworks/keyed/wasm-bindgen/build.js deleted file mode 100644 index 9e5a04299..000000000 --- a/frameworks/keyed/wasm-bindgen/build.js +++ /dev/null @@ -1,187 +0,0 @@ -(async () => { - const wasmBindgenVersion = "0.2.31"; - - const fs = require("fs"); - const https = require("https"); - const os = require("os"); - const path = require("path"); - const spawnSync = require("child_process").spawnSync; - - function spawnSyncOrThrow() { - const result = spawnSync(...arguments); - if (result.error) { - throw result.error; - } else if (result.status !== 0) { - const args = Array.from(arguments); - throw new Error( - args[0] + " " + args[1].join(" ") + ": exit status=" + result.status - ); - } - return result; - } - - const projectDir = spawnSyncOrThrow("git", ["rev-parse", "--show-toplevel"], { - encoding: "utf8" - }).stdout.trim(); - const localCargoDir = path.join(__dirname, ".cargo"); - - process.env["RUSTUP_HOME"] = path.join(projectDir, ".rustup"); - process.env["CARGO_HOME"] = path.join(projectDir, ".cargo"); - process.env["PATH"] = - path.join(localCargoDir, "bin") + - path.delimiter + - path.join(process.env["CARGO_HOME"], "bin") + - path.delimiter + - process.env.PATH; - - [ - process.env["RUSTUP_HOME"], - path.join(process.env["RUSTUP_HOME"], "tmp") - ].forEach(dir => { - fs.existsSync(dir) || fs.mkdirSync(dir); - }); - - const rustup = path.join(process.env["CARGO_HOME"], "bin", "rustup"); - const cargo = path.join(process.env["CARGO_HOME"], "bin", "cargo"); - - if (spawnSync(rustup, ["--version"], { stdio: "inherit" }).status !== 0) { - const isWindows = os.platform() === "win32"; - const [rustupInitExt, rustupInitUrl] = isWindows - ? ["exe", "https://win.rustup.rs/x86_64"] - : ["sh", "https://sh.rustup.rs/"]; - const rustupInit = path.join( - process.env["RUSTUP_HOME"], - "tmp", - "rustup-init." + rustupInitExt - ); - - await new Promise((resolve, reject) => { - const rustupInitFile = fs - .createWriteStream(rustupInit) - .on("error", reject) - .on("finish", resolve); - https - .get(rustupInitUrl, response => { - response.pipe(rustupInitFile); - }) - .on("error", reject); - }); - - const rustupInitArgs = [ - "--no-modify-path", - "--default-toolchain", - "wasm32-unknown-unknown", - "-y" - ]; - if (isWindows) { - spawnSyncOrThrow(rustupInit, rustupInitArgs, { stdio: "inherit" }); - } else { - spawnSyncOrThrow("sh", [rustupInit, ...rustupInitArgs], { - stdio: "inherit" - }); - } - } - - if ( - spawnSync(rustup, ["run", "stable", "rustc", "--version"], { - stdio: "inherit" - }).status !== 0 - ) { - spawnSyncOrThrow(rustup, ["self", "update"], { stdio: "inherit" }); - spawnSyncOrThrow(rustup, ["install", "stable"], { stdio: "inherit" }); - } - - spawnSyncOrThrow( - rustup, - ["target", "add", "wasm32-unknown-unknown", "--toolchain", "stable"], - { - stdio: "inherit" - } - ); - - const wasmBindgen = path.join(localCargoDir, "bin", "wasm-bindgen"); - const wasmBindgenVersionOut = spawnSync(wasmBindgen, ["--version"]); - const wasmBindgenVersionInstalled = String(wasmBindgenVersionOut.stdout); - const shouldInstallWasmBindgen = - wasmBindgenVersionOut.status !== 0 || - !wasmBindgenVersionInstalled.includes(wasmBindgenVersion); - if (shouldInstallWasmBindgen) { - spawnSyncOrThrow( - cargo, - [ - "+stable", - "install", - "-f", - "wasm-bindgen-cli", - "--version", - wasmBindgenVersion, - "--root", - localCargoDir - ], - { stdio: "inherit" } - ); - } - - // const wasmGc = path.join(localCargoDir, 'bin', 'wasm-gc') - // if (spawnSync(wasmGc, ['-h'], { stdio: 'inherit' }).status !== 0) { - // spawnSyncOrThrow(cargo, ['+stable', 'install', 'wasm-gc'], { stdio: 'inherit' }) - // } - - if (spawnSync("which", ["wasm-opt"], { stdio: "inherit" }).status !== 0) { - console.error("Please install binaryen/wasm-opt"); - return process.exit(1); - } - - if ( - spawnSyncOrThrow( - cargo, - [ - "+stable", - "build", - "-vv", - "--release", - "--target=wasm32-unknown-unknown" - ], - { stdio: "inherit" } - ).status !== 0 - ) { - return process.exit(1); - } - - const wasmInputPath = path.join( - "target", - "wasm32-unknown-unknown", - "release", - "js_framework_benchmark_wasm_bindgen.wasm" - ); - spawnSyncOrThrow(wasmBindgen, [wasmInputPath, "--out-dir", "."], { - stdio: "inherit" - }); - - spawnSyncOrThrow( - "wasm-gc", - [ - "js_framework_benchmark_wasm_bindgen_bg.wasm", - "js_framework_benchmark_wasm_bindgen_bg_gc.wasm" - ], - { stdio: "inherit" } - ); - spawnSyncOrThrow( - "wasm-opt", - [ - "--output", - "js_framework_benchmark_wasm_bindgen_bg_gc_opt.wasm", - "js_framework_benchmark_wasm_bindgen_bg_gc.wasm" - ], - { stdio: "inherit" } - ); - spawnSyncOrThrow( - "cp", - [ - "-f", - "js_framework_benchmark_wasm_bindgen_bg_gc_opt.wasm", - "js_framework_benchmark_wasm_bindgen_bg.wasm" - ], - { stdio: "inherit" } - ); -})().catch(console.dir); diff --git a/frameworks/keyed/wasm-bindgen/bundled-dist/1.js b/frameworks/keyed/wasm-bindgen/bundled-dist/1.js deleted file mode 100644 index 7aa0237ed..000000000 --- a/frameworks/keyed/wasm-bindgen/bundled-dist/1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[,function(n,t,e){"use strict";e.r(t),e.d(t,"run",function(){return o}),e.d(t,"__widl_f_contains_DOMTokenList",function(){return a}),e.d(t,"__widl_f_create_element_Document",function(){return y}),e.d(t,"__widl_f_get_element_by_id_Document",function(){return w}),e.d(t,"__widl_f_get_attribute_Element",function(){return E}),e.d(t,"__widl_f_set_attribute_Element",function(){return x}),e.d(t,"__widl_f_tag_name_Element",function(){return j}),e.d(t,"__widl_f_id_Element",function(){return T}),e.d(t,"__widl_f_set_class_name_Element",function(){return O}),e.d(t,"__widl_f_class_list_Element",function(){return S}),e.d(t,"__widl_f_set_inner_html_Element",function(){return z}),e.d(t,"__widl_f_remove_Element",function(){return D}),e.d(t,"__widl_f_prevent_default_Event",function(){return N}),e.d(t,"__widl_f_target_Event",function(){return A}),e.d(t,"__widl_f_add_event_listener_with_callback_EventTarget",function(){return k}),e.d(t,"__widl_f_append_child_Node",function(){return L}),e.d(t,"__widl_f_clone_node_with_deep_Node",function(){return J}),e.d(t,"__widl_f_insert_before_Node",function(){return U}),e.d(t,"__widl_f_parent_element_Node",function(){return C}),e.d(t,"__widl_f_first_child_Node",function(){return M}),e.d(t,"__widl_f_next_sibling_Node",function(){return F}),e.d(t,"__widl_f_set_text_content_Node",function(){return H}),e.d(t,"__widl_instanceof_Window",function(){return R}),e.d(t,"__widl_f_document_Window",function(){return B}),e.d(t,"__wbg_newnoargs_a6ad1b52f5989ea9",function(){return I}),e.d(t,"__wbg_call_720151a19a4c6808",function(){return P}),e.d(t,"__wbg_random_acb9bafd226853d8",function(){return $}),e.d(t,"__wbindgen_object_clone_ref",function(){return G}),e.d(t,"__wbindgen_object_drop_ref",function(){return Z}),e.d(t,"__wbindgen_cb_drop",function(){return q}),e.d(t,"__wbindgen_cb_forget",function(){return K}),e.d(t,"__wbindgen_rethrow",function(){return Q}),e.d(t,"__wbindgen_closure_wrapper48",function(){return V}),e.d(t,"__wbindgen_defer_start",function(){return X}),e.d(t,"__wbindgen_throw",function(){return Y});var r=e(3);function o(){return r.e()}const i=new Array(32);function u(n){return i[n]}i.fill(void 0),i.push(void 0,null,!0,!1);let c=new("undefined"==typeof TextDecoder?e(2).TextDecoder:TextDecoder)("utf-8"),f=null;function l(){return null!==f&&f.buffer===r.d.buffer||(f=new Uint8Array(r.d.buffer)),f}function s(n,t){return c.decode(l().subarray(n,n+t))}function a(n,t,e){let r=s(t,e);return u(n).contains(r)}let d=i.length;function _(n){d===i.length&&i.push(i.length+1);const t=d;return d=i[t],i[t]=n,t}let p=null;function g(){return null!==p&&p.buffer===r.d.buffer||(p=new Uint32Array(r.d.buffer)),p}function y(n,t,e,r){let o=s(t,e);try{return _(u(n).createElement(o))}catch(n){const t=g();t[r/4]=1,t[r/4+1]=_(n)}}function h(n){return null==n}function w(n,t,e){let r=s(t,e);const o=u(n).getElementById(r);return h(o)?0:_(o)}let b=new("undefined"==typeof TextEncoder?e(2).TextEncoder:TextEncoder)("utf-8"),m=0;function v(n){const t=b.encode(n),e=r.b(t.length);return l().set(t,e),m=t.length,e}function E(n,t,e,r){let o=s(e,r);const i=u(t).getAttribute(o),c=h(i)?[0,0]:v(i),f=m,l=g();l[n/4]=c,l[n/4+1]=f}function x(n,t,e,r,o,i){let c=s(t,e),f=s(r,o);try{u(n).setAttribute(c,f)}catch(n){const t=g();t[i/4]=1,t[i/4+1]=_(n)}}function j(n,t){const e=v(u(t).tagName),r=m,o=g();o[n/4]=e,o[n/4+1]=r}function T(n,t){const e=v(u(t).id),r=m,o=g();o[n/4]=e,o[n/4+1]=r}function O(n,t,e){let r=s(t,e);u(n).className=r}function S(n){return _(u(n).classList)}function z(n,t,e){let r=s(t,e);u(n).innerHTML=r}function D(n){u(n).remove()}function N(n){u(n).preventDefault()}function A(n){const t=u(n).target;return h(t)?0:_(t)}function k(n,t,e,r,o){let i=s(t,e);try{u(n).addEventListener(i,u(r))}catch(n){const t=g();t[o/4]=1,t[o/4+1]=_(n)}}function L(n,t,e){try{return _(u(n).appendChild(u(t)))}catch(n){const t=g();t[e/4]=1,t[e/4+1]=_(n)}}function J(n,t,e){try{return _(u(n).cloneNode(0!==t))}catch(n){const t=g();t[e/4]=1,t[e/4+1]=_(n)}}function U(n,t,e,r){try{return _(u(n).insertBefore(u(t),u(e)))}catch(n){const t=g();t[r/4]=1,t[r/4+1]=_(n)}}function C(n){const t=u(n).parentElement;return h(t)?0:_(t)}function M(n){const t=u(n).firstChild;return h(t)?0:_(t)}function F(n){const t=u(n).nextSibling;return h(t)?0:_(t)}function H(n,t,e){let r=0==t?void 0:s(t,e);u(n).textContent=r}function R(n){return u(n)instanceof Window?1:0}function B(n){const t=u(n).document;return h(t)?0:_(t)}function I(n,t){let e=s(n,t);return _(new Function(e))}function P(n,t,e){try{return _(u(n).call(u(t)))}catch(n){const t=g();t[e/4]=1,t[e/4+1]=_(n)}}function $(){return Math.random()}function G(n){return _(u(n))}function W(n){n<36||(i[n]=d,d=n)}function Z(n){W(n)}function q(n){const t=u(n).original;return W(n),1==t.cnt--?(t.a=0,1):0}const K=W;function Q(n){throw function(n){const t=u(n);return W(n),t}(n)}function V(n,t,e){const o=r.a.get(30),i=r.a.get(31),u=function(n){this.cnt++;let e=this.a;this.a=0;try{return o(e,t,_(n))}finally{this.a=e,1==this.cnt--&&i(this.a,t)}};u.a=n,u.cnt=1;let c=u.bind(u);return c.original=u,_(c)}function X(){Promise.resolve().then(()=>r.c())}function Y(n,t){throw new Error(s(n,t))}},function(n,t,e){(function(n,r){var o=/%[sdj%]/g;t.format=function(n){if(!h(n)){for(var t=[],e=0;e=i)return n;switch(n){case"%s":return String(r[e++]);case"%d":return Number(r[e++]);case"%j":try{return JSON.stringify(r[e++])}catch(n){return"[Circular]"}default:return n}}),f=r[e];e=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),p(e)?r.showHidden=e:e&&t._extend(r,e),w(r.showHidden)&&(r.showHidden=!1),w(r.depth)&&(r.depth=2),w(r.colors)&&(r.colors=!1),w(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=f),s(r,n,r.depth)}function f(n,t){var e=c.styles[t];return e?"["+c.colors[e][0]+"m"+n+"["+c.colors[e][1]+"m":n}function l(n,t){return n}function s(n,e,r){if(n.customInspect&&e&&x(e.inspect)&&e.inspect!==t.inspect&&(!e.constructor||e.constructor.prototype!==e)){var o=e.inspect(r,n);return h(o)||(o=s(n,o,r)),o}var i=function(n,t){if(w(t))return n.stylize("undefined","undefined");if(h(t)){var e="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(e,"string")}if(y(t))return n.stylize(""+t,"number");if(p(t))return n.stylize(""+t,"boolean");if(g(t))return n.stylize("null","null")}(n,e);if(i)return i;var u=Object.keys(e),c=function(n){var t={};return n.forEach(function(n,e){t[n]=!0}),t}(u);if(n.showHidden&&(u=Object.getOwnPropertyNames(e)),E(e)&&(u.indexOf("message")>=0||u.indexOf("description")>=0))return a(e);if(0===u.length){if(x(e)){var f=e.name?": "+e.name:"";return n.stylize("[Function"+f+"]","special")}if(b(e))return n.stylize(RegExp.prototype.toString.call(e),"regexp");if(v(e))return n.stylize(Date.prototype.toString.call(e),"date");if(E(e))return a(e)}var l,m="",j=!1,T=["{","}"];(_(e)&&(j=!0,T=["[","]"]),x(e))&&(m=" [Function"+(e.name?": "+e.name:"")+"]");return b(e)&&(m=" "+RegExp.prototype.toString.call(e)),v(e)&&(m=" "+Date.prototype.toUTCString.call(e)),E(e)&&(m=" "+a(e)),0!==u.length||j&&0!=e.length?r<0?b(e)?n.stylize(RegExp.prototype.toString.call(e),"regexp"):n.stylize("[Object]","special"):(n.seen.push(e),l=j?function(n,t,e,r,o){for(var i=[],u=0,c=t.length;u=0&&0,n+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return e[0]+(""===t?"":t+"\n ")+" "+n.join(",\n ")+" "+e[1];return e[0]+t+" "+n.join(", ")+" "+e[1]}(l,m,T)):T[0]+m+T[1]}function a(n){return"["+Error.prototype.toString.call(n)+"]"}function d(n,t,e,r,o,i){var u,c,f;if((f=Object.getOwnPropertyDescriptor(t,o)||{value:t[o]}).get?c=f.set?n.stylize("[Getter/Setter]","special"):n.stylize("[Getter]","special"):f.set&&(c=n.stylize("[Setter]","special")),S(r,o)||(u="["+o+"]"),c||(n.seen.indexOf(f.value)<0?(c=g(e)?s(n,f.value,null):s(n,f.value,e-1)).indexOf("\n")>-1&&(c=i?c.split("\n").map(function(n){return" "+n}).join("\n").substr(2):"\n"+c.split("\n").map(function(n){return" "+n}).join("\n")):c=n.stylize("[Circular]","special")),w(u)){if(i&&o.match(/^\d+$/))return c;(u=JSON.stringify(""+o)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(u=u.substr(1,u.length-2),u=n.stylize(u,"name")):(u=u.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),u=n.stylize(u,"string"))}return u+": "+c}function _(n){return Array.isArray(n)}function p(n){return"boolean"==typeof n}function g(n){return null===n}function y(n){return"number"==typeof n}function h(n){return"string"==typeof n}function w(n){return void 0===n}function b(n){return m(n)&&"[object RegExp]"===j(n)}function m(n){return"object"==typeof n&&null!==n}function v(n){return m(n)&&"[object Date]"===j(n)}function E(n){return m(n)&&("[object Error]"===j(n)||n instanceof Error)}function x(n){return"function"==typeof n}function j(n){return Object.prototype.toString.call(n)}function T(n){return n<10?"0"+n.toString(10):n.toString(10)}t.debuglog=function(n){if(w(i)&&(i=r.env.NODE_DEBUG||""),n=n.toUpperCase(),!u[n])if(new RegExp("\\b"+n+"\\b","i").test(i)){var e=r.pid;u[n]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",n,e,r)}}else u[n]=function(){};return u[n]},t.inspect=c,c.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},c.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=_,t.isBoolean=p,t.isNull=g,t.isNullOrUndefined=function(n){return null==n},t.isNumber=y,t.isString=h,t.isSymbol=function(n){return"symbol"==typeof n},t.isUndefined=w,t.isRegExp=b,t.isObject=m,t.isDate=v,t.isError=E,t.isFunction=x,t.isPrimitive=function(n){return null===n||"boolean"==typeof n||"number"==typeof n||"string"==typeof n||"symbol"==typeof n||void 0===n},t.isBuffer=e(6);var O=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function S(n,t){return Object.prototype.hasOwnProperty.call(n,t)}t.log=function(){var n,e;console.log("%s - %s",(n=new Date,e=[T(n.getHours()),T(n.getMinutes()),T(n.getSeconds())].join(":"),[n.getDate(),O[n.getMonth()],e].join(" ")),t.format.apply(t,arguments))},t.inherits=e(7),t._extend=function(n,t){if(!t||!m(t))return n;for(var e=Object.keys(t),r=e.length;r--;)n[e[r]]=t[e[r]];return n}}).call(this,e(4),e(5))},function(n,t,e){"use strict";var r=e.w[n.i];n.exports=r;e(1);r.f()},function(n,t){var e;e=function(){return this}();try{e=e||new Function("return this")()}catch(n){"object"==typeof window&&(e=window)}n.exports=e},function(n,t){var e,r,o=n.exports={};function i(){throw new Error("setTimeout has not been defined")}function u(){throw new Error("clearTimeout has not been defined")}function c(n){if(e===setTimeout)return setTimeout(n,0);if((e===i||!e)&&setTimeout)return e=setTimeout,setTimeout(n,0);try{return e(n,0)}catch(t){try{return e.call(null,n,0)}catch(t){return e.call(this,n,0)}}}!function(){try{e="function"==typeof setTimeout?setTimeout:i}catch(n){e=i}try{r="function"==typeof clearTimeout?clearTimeout:u}catch(n){r=u}}();var f,l=[],s=!1,a=-1;function d(){s&&f&&(s=!1,f.length?l=f.concat(l):a=-1,l.length&&_())}function _(){if(!s){var n=c(d);s=!0;for(var t=l.length;t;){for(f=l,l=[];++a1)for(var e=1;e - - wasm-bindgen-"keyed" - + + wasm-bindgen-"keyed" + -
-
+
+
@@ -42,7 +42,7 @@

wasm-bindgen-"keyed"

-
- +
+ diff --git a/frameworks/keyed/wasm-bindgen/index.js b/frameworks/keyed/wasm-bindgen/index.js index fbb3a2dde..0e6099488 100644 --- a/frameworks/keyed/wasm-bindgen/index.js +++ b/frameworks/keyed/wasm-bindgen/index.js @@ -1,2 +1 @@ -import('./js_framework_benchmark_wasm_bindgen') - .catch(console.error); +import("./pkg/index.js").catch(console.error); diff --git a/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc.wasm b/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc.wasm deleted file mode 100644 index ad57eef7d..000000000 Binary files a/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc.wasm and /dev/null differ diff --git a/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc_opt.wasm b/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc_opt.wasm deleted file mode 100644 index fc91e0cb3..000000000 Binary files a/frameworks/keyed/wasm-bindgen/js_framework_benchmark_wasm_bindgen_bg_gc_opt.wasm and /dev/null differ diff --git a/frameworks/keyed/wasm-bindgen/package.json b/frameworks/keyed/wasm-bindgen/package.json index 96d411df0..0b3fef4f4 100644 --- a/frameworks/keyed/wasm-bindgen/package.json +++ b/frameworks/keyed/wasm-bindgen/package.json @@ -8,15 +8,16 @@ }, "scripts": { "build-prod": "echo This is a no-op. && echo Due to heavy dependencies, the generated javascript is already provided. && echo If you really want to rebuild from source use: && echo npm run build-prod-force", - "build-dev-force": "npm run build-prod-force", - "build-prod-force": "node build.js && webpack-cli" + "build-prod-force": "rimraf bundled-dist pkg && webpack" }, "repository": { "type": "git", "url": "https://github.com/krausest/js-framework-benchmark.git" }, "devDependencies": { - "webpack": "^4.28.4", - "webpack-cli": "^3.1.2" + "@wasm-tool/wasm-pack-plugin": "^0.4.2", + "webpack": "^4.33.0", + "webpack-cli": "^3.3.3", + "rimraf": "^2.6.3" } } diff --git a/frameworks/keyed/wasm-bindgen/src/lib.rs b/frameworks/keyed/wasm-bindgen/src/lib.rs index e8cb169a7..813bf8ccd 100644 --- a/frameworks/keyed/wasm-bindgen/src/lib.rs +++ b/frameworks/keyed/wasm-bindgen/src/lib.rs @@ -1,9 +1,9 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; use js_sys::Math; use std::cell::RefCell; use std::rc::Rc; -use wasm_bindgen::prelude::*; -use wasm_bindgen::JsCast; -use web_sys::{Document, Element, Event, HtmlElement, Node, Window}; +use web_sys::{Element, Event, Node}; const ADJECTIVES_LEN: usize = 25; const ADJECTIVES_LEN_F64: f64 = ADJECTIVES_LEN as f64; @@ -63,8 +63,6 @@ struct Row { const ROW_TEMPLATE: &str = ""; struct Main { - window: Window, - document: Document, data: Vec, row_template: Node, tbody: Node, @@ -77,7 +75,7 @@ fn get_parent_id(el: Element) -> Option { while let Some(e) = current { if e.tag_name() == "TR" { return match e.get_attribute("data-id") { - Some(id) => Some(id.parse::().unwrap()), + Some(id) => Some(id.parse::().unwrap_throw()), None => None, }; } @@ -98,9 +96,9 @@ impl Main { fn update(&mut self) { let mut i = 0; - let mut l = self.data.len(); + let l = self.data.len(); while i < l { - let mut row = &mut self.data[i]; + let row = &mut self.data[i]; row.label.push_str(" !!!"); row.label_node.set_text_content(Some(row.label.as_str())); i += 10; @@ -150,9 +148,9 @@ impl Main { let row1 = &self.data[1]; let row998 = &self.data[998]; let a = &row1.el; - let b = a.next_sibling().unwrap(); + let b = a.next_sibling().unwrap_throw(); let c = &row998.el; - let d = c.next_sibling().unwrap(); + let d = c.next_sibling().unwrap_throw(); self.tbody.insert_before(&c, Some(&b))?; self.tbody.insert_before(&a, Some(&d))?; self.data.swap(1, 998); @@ -176,8 +174,8 @@ impl Main { label.push_str(noun); let node = self.row_template.clone_node_with_deep(true)?; - let id_node = node.first_child().unwrap(); - let label_node = id_node.next_sibling().unwrap().first_child().unwrap(); + let id_node = node.first_child().unwrap_throw(); + let label_node = id_node.next_sibling().unwrap_throw().first_child().unwrap_throw(); let id_string = id.to_string(); let id_str = id_string.as_str(); id_node.set_text_content(Some(id_str)); @@ -198,22 +196,30 @@ impl Main { self.last_id += count; Ok(()) } +} +fn document() -> web_sys::Document { + web_sys::window().unwrap_throw().document().unwrap_throw() } -#[wasm_bindgen(start)] -pub fn run() -> Result<(), JsValue> { - let window = web_sys::window().unwrap(); - let document = window.document().unwrap(); +fn on(id: &str, name: &str, callback: F) where F: FnMut(web_sys::Event) + 'static { + let target = document().get_element_by_id(id).unwrap_throw(); + + let closure = Closure::wrap(Box::new(callback) as Box); + + target.add_event_listener_with_callback(name, closure.as_ref().unchecked_ref()).unwrap_throw(); + + closure.forget(); +} - let row_template = document.create_element("tr")?; +#[wasm_bindgen(start)] +pub fn main_js() -> Result<(), JsValue> { + let row_template = document().create_element("tr")?; row_template.set_inner_html(ROW_TEMPLATE); - let tbody = document.get_element_by_id("tbody").unwrap(); + let tbody = document().get_element_by_id("tbody").unwrap_throw(); - let mut main = RefCell::new(Rc::new(Main { - window, - document, + let main = Rc::new(RefCell::new(Main { data: Vec::new(), row_template: row_template.into(), tbody: tbody.into(), @@ -221,27 +227,20 @@ pub fn run() -> Result<(), JsValue> { selected: None, })); - let main2 = main.clone(); - let onclick = Closure::wrap(Box::new(move |e: Event| { - let target = match e.target() { - Some(target) => target, - None => return, - }; - let el = JsCast::unchecked_ref::(&target); - let mut m = main2.borrow_mut(); - let main = match Rc::get_mut(&mut m) { - Some(main) => main, - None => return, - }; + on("main", "click", move |e: Event| { + let target = e.target().unwrap_throw(); + let el: &Element = target.unchecked_ref(); + + let mut main = main.borrow_mut(); match el.id().as_str() { "add" => { e.prevent_default(); - main.add(); + main.add().unwrap_throw(); } "run" => { e.prevent_default(); - main.run(); + main.run().unwrap_throw(); } "update" => { e.prevent_default(); @@ -249,7 +248,7 @@ pub fn run() -> Result<(), JsValue> { } "runlots" => { e.prevent_default(); - main.run_lots(); + main.run_lots().unwrap_throw(); } "clear" => { e.prevent_default(); @@ -257,34 +256,24 @@ pub fn run() -> Result<(), JsValue> { } "swaprows" => { e.prevent_default(); - main.swap_rows(); + main.swap_rows().unwrap_throw(); } _ => { let class_list = el.class_list(); + if class_list.contains("remove") { e.prevent_default(); - let parent_id = match get_parent_id(el.clone()) { - Some(id) => id, - None => return, - }; + let parent_id = get_parent_id(el.clone()).unwrap_throw(); main.delete(parent_id); + } else if class_list.contains("lbl") { e.prevent_default(); - let parent_id = match get_parent_id(el.clone()) { - Some(id) => id, - None => return, - }; + let parent_id = get_parent_id(el.clone()).unwrap_throw(); main.select(parent_id); } } } - }) as Box); - - if let Ok(m) = &(main.try_borrow()) { - let main_el = m.document.get_element_by_id("main").unwrap(); - main_el.add_event_listener_with_callback("click", onclick.as_ref().unchecked_ref())?; - onclick.forget(); - } + }); Ok(()) } diff --git a/frameworks/keyed/wasm-bindgen/webpack.config.js b/frameworks/keyed/wasm-bindgen/webpack.config.js index 68bb8fa22..444d81923 100644 --- a/frameworks/keyed/wasm-bindgen/webpack.config.js +++ b/frameworks/keyed/wasm-bindgen/webpack.config.js @@ -1,17 +1,23 @@ -'use strict'; +const path = require("path"); +const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); -const path = require('path'); - -var cache = {}; +const dist = path.resolve(__dirname, "bundled-dist"); module.exports = { - cache: cache, - entry: './index.js', - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js', - publicPath: 'dist/' - }, - plugins: [ ], - mode: 'production' + mode: "production", + stats: "errors-warnings", + entry: { + index: "./index.js" + }, + output: { + path: dist, + publicPath: "bundled-dist/", + filename: "[name].js" + }, + plugins: [ + new WasmPackPlugin({ + crateDirectory: __dirname, + extraArgs: "--out-name index" + }) + ] };