From 88ec1cce1cb69279bc13b748233e3cdef9189962 Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Mon, 18 May 2020 11:53:18 +0800 Subject: [PATCH 01/14] Update yew project to v0.16.2 --- frameworks/non-keyed/yew/Cargo.toml | 17 +- .../non-keyed/yew/bundled-dist/index.html | 40 +- .../js-framework-benchmark-yew.js | 1071 +++++++---------- .../js-framework-benchmark-yew.wasm | Bin 271945 -> 0 bytes .../js-framework-benchmark-yew_bg.wasm | Bin 0 -> 130358 bytes frameworks/non-keyed/yew/index.html | 5 +- frameworks/non-keyed/yew/package.json | 4 +- frameworks/non-keyed/yew/src/lib.rs | 147 ++- frameworks/non-keyed/yew/src/main.rs | 20 - 9 files changed, 519 insertions(+), 785 deletions(-) delete mode 100644 frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.wasm create mode 100644 frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm delete mode 100644 frameworks/non-keyed/yew/src/main.rs diff --git a/frameworks/non-keyed/yew/Cargo.toml b/frameworks/non-keyed/yew/Cargo.toml index 86eb9ae5a..6794f1093 100644 --- a/frameworks/non-keyed/yew/Cargo.toml +++ b/frameworks/non-keyed/yew/Cargo.toml @@ -2,13 +2,20 @@ name = "js-framework-benchmark-yew" version = "1.0.0" authors = ["Isamu Mogi "] +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rand = { version = "0.7.3", features = ["wasm-bindgen", "small_rng"] } +wasm-bindgen = "0.2.62" +yew = "0.16.2" [profile.release] lto = true +codegen-units = 1 panic = "abort" -[dependencies] -byteorder = { version = "1.2.4", features = [ "i128" ] } -rand = { version = "0.5.4", features = [ "stdweb" ] } -stdweb = "0.4.17" -yew = { git = "https://github.com/DenisKolodin/yew.git", rev = "792a254acdc84b1419f2c2d6219e933ca7081c07" } +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-O4'] diff --git a/frameworks/non-keyed/yew/bundled-dist/index.html b/frameworks/non-keyed/yew/bundled-dist/index.html index 1bc2f2d96..7f4868a86 100644 --- a/frameworks/non-keyed/yew/bundled-dist/index.html +++ b/frameworks/non-keyed/yew/bundled-dist/index.html @@ -1,28 +1,16 @@ - - - - - - - - - - - \ No newline at end of file + + diff --git a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js b/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js index 0067dca2e..1914de22b 100644 --- a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js +++ b/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js @@ -1,702 +1,471 @@ -"use strict"; -if( typeof Rust === "undefined" ) { - var Rust = {}; +let wasm; + +const heap = new Array(32).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 36) return; + heap[idx] = heap_next; + heap_next = idx; } -(function( root, factory ) { - if( typeof define === "function" && define.amd ) { - define( [], factory ); - } else if( typeof module === "object" && module.exports ) { - module.exports = factory(); - } else { - Rust.js_framework_benchmark_yew = factory(); +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; } -}( this, function() { - return (function( module_factory ) { - var instance = module_factory(); - - if( typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string" ) { - var fs = require( "fs" ); - var path = require( "path" ); - var wasm_path = path.join( __dirname, "js-framework-benchmark-yew.wasm" ); - var buffer = fs.readFileSync( wasm_path ); - var mod = new WebAssembly.Module( buffer ); - var wasm_instance = new WebAssembly.Instance( mod, instance.imports ); - return instance.initialize( wasm_instance ); + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; } else { - var file = fetch( "js-framework-benchmark-yew.wasm", {credentials: "same-origin"} ); - - var wasm_instance = ( typeof WebAssembly.instantiateStreaming === "function" - ? WebAssembly.instantiateStreaming( file, instance.imports ) - .then( function( result ) { return result.instance; } ) - - : file - .then( function( response ) { return response.arrayBuffer(); } ) - .then( function( bytes ) { return WebAssembly.compile( bytes ); } ) - .then( function( mod ) { return WebAssembly.instantiate( mod, instance.imports ) } ) ); - - return wasm_instance - .then( function( wasm_instance ) { - var exports = instance.initialize( wasm_instance ); - console.log( "Finished loading Rust wasm module 'js_framework_benchmark_yew'" ); - return exports; - }) - .catch( function( error ) { - console.log( "Error loading Rust wasm module 'js_framework_benchmark_yew':", error ); - throw error; - }); - } - }( function() { - var Module = {}; - - Module.STDWEB_PRIVATE = {}; - -// This is based on code from Emscripten's preamble.js. -Module.STDWEB_PRIVATE.to_utf8 = function to_utf8( str, addr ) { - var HEAPU8 = Module.HEAPU8; - for( var i = 0; i < str.length; ++i ) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 - var u = str.charCodeAt( i ); // possibly a lead surrogate - if( u >= 0xD800 && u <= 0xDFFF ) { - u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt( ++i ) & 0x3FF); + return `Symbol(${description})`; } - - if( u <= 0x7F ) { - HEAPU8[ addr++ ] = u; - } else if( u <= 0x7FF ) { - HEAPU8[ addr++ ] = 0xC0 | (u >> 6); - HEAPU8[ addr++ ] = 0x80 | (u & 63); - } else if( u <= 0xFFFF ) { - HEAPU8[ addr++ ] = 0xE0 | (u >> 12); - HEAPU8[ addr++ ] = 0x80 | ((u >> 6) & 63); - HEAPU8[ addr++ ] = 0x80 | (u & 63); - } else if( u <= 0x1FFFFF ) { - HEAPU8[ addr++ ] = 0xF0 | (u >> 18); - HEAPU8[ addr++ ] = 0x80 | ((u >> 12) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 6) & 63); - HEAPU8[ addr++ ] = 0x80 | (u & 63); - } else if( u <= 0x3FFFFFF ) { - HEAPU8[ addr++ ] = 0xF8 | (u >> 24); - HEAPU8[ addr++ ] = 0x80 | ((u >> 18) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 12) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 6) & 63); - HEAPU8[ addr++ ] = 0x80 | (u & 63); + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; } else { - HEAPU8[ addr++ ] = 0xFC | (u >> 30); - HEAPU8[ addr++ ] = 0x80 | ((u >> 24) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 18) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 12) & 63); - HEAPU8[ addr++ ] = 0x80 | ((u >> 6) & 63); - HEAPU8[ addr++ ] = 0x80 | (u & 63); + return 'Function'; } } -}; - -Module.STDWEB_PRIVATE.noop = function() {}; -Module.STDWEB_PRIVATE.to_js = function to_js( address ) { - var kind = Module.HEAPU8[ address + 12 ]; - if( kind === 0 ) { - return undefined; - } else if( kind === 1 ) { - return null; - } else if( kind === 2 ) { - return Module.HEAP32[ address / 4 ]; - } else if( kind === 3 ) { - return Module.HEAPF64[ address / 8 ]; - } else if( kind === 4 ) { - var pointer = Module.HEAPU32[ address / 4 ]; - var length = Module.HEAPU32[ (address + 4) / 4 ]; - return Module.STDWEB_PRIVATE.to_js_string( pointer, length ); - } else if( kind === 5 ) { - return false; - } else if( kind === 6 ) { - return true; - } else if( kind === 7 ) { - var pointer = Module.STDWEB_PRIVATE.arena + Module.HEAPU32[ address / 4 ]; - var length = Module.HEAPU32[ (address + 4) / 4 ]; - var output = []; - for( var i = 0; i < length; ++i ) { - output.push( Module.STDWEB_PRIVATE.to_js( pointer + i * 16 ) ); + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); } - return output; - } else if( kind === 8 ) { - var arena = Module.STDWEB_PRIVATE.arena; - var value_array_pointer = arena + Module.HEAPU32[ address / 4 ]; - var length = Module.HEAPU32[ (address + 4) / 4 ]; - var key_array_pointer = arena + Module.HEAPU32[ (address + 8) / 4 ]; - var output = {}; - for( var i = 0; i < length; ++i ) { - var key_pointer = Module.HEAPU32[ (key_array_pointer + i * 8) / 4 ]; - var key_length = Module.HEAPU32[ (key_array_pointer + 4 + i * 8) / 4 ]; - var key = Module.STDWEB_PRIVATE.to_js_string( key_pointer, key_length ); - var value = Module.STDWEB_PRIVATE.to_js( value_array_pointer + i * 16 ); - output[ key ] = value; + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); } - return output; - } else if( kind === 9 ) { - return Module.STDWEB_PRIVATE.acquire_js_reference( Module.HEAP32[ address / 4 ] ); - } else if( kind === 10 || kind === 12 || kind === 13 ) { - var adapter_pointer = Module.HEAPU32[ address / 4 ]; - var pointer = Module.HEAPU32[ (address + 4) / 4 ]; - var deallocator_pointer = Module.HEAPU32[ (address + 8) / 4 ]; - var num_ongoing_calls = 0; - var drop_queued = false; - var output = function() { - if( pointer === 0 || drop_queued === true ) { - if (kind === 10) { - throw new ReferenceError( "Already dropped Rust function called!" ); - } else if (kind === 12) { - throw new ReferenceError( "Already dropped FnMut function called!" ); - } else { - throw new ReferenceError( "Already called or dropped FnOnce function called!" ); - } - } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} - var function_pointer = pointer; - if (kind === 13) { - output.drop = Module.STDWEB_PRIVATE.noop; - pointer = 0; - } +let WASM_VECTOR_LEN = 0; - if (num_ongoing_calls !== 0) { - if (kind === 12 || kind === 13) { - throw new ReferenceError( "FnMut function called multiple times concurrently!" ); - } - } +let cachegetUint8Memory0 = null; +function getUint8Memory0() { + if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { + cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachegetUint8Memory0; +} - var args = Module.STDWEB_PRIVATE.alloc( 16 ); - Module.STDWEB_PRIVATE.serialize_array( args, arguments ); +let cachedTextEncoder = new TextEncoder('utf-8'); - try { - num_ongoing_calls += 1; - Module.STDWEB_PRIVATE.dyncall( "vii", adapter_pointer, [function_pointer, args] ); - var result = Module.STDWEB_PRIVATE.tmp; - Module.STDWEB_PRIVATE.tmp = null; - } finally { - num_ongoing_calls -= 1; - } +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); - if( drop_queued === true && num_ongoing_calls === 0 ) { - output.drop(); - } +function passStringToWasm0(arg, malloc, realloc) { - return result; - }; + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length); + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } - output.drop = function() { - if (num_ongoing_calls !== 0) { - drop_queued = true; - return; - } + let len = arg.length; + let ptr = malloc(len); - output.drop = Module.STDWEB_PRIVATE.noop; - var function_pointer = pointer; - pointer = 0; + const mem = getUint8Memory0(); - if (function_pointer != 0) { - Module.STDWEB_PRIVATE.dyncall( "vi", deallocator_pointer, [function_pointer] ); - } - }; - - return output; - } else if( kind === 14 ) { - var pointer = Module.HEAPU32[ address / 4 ]; - var length = Module.HEAPU32[ (address + 4) / 4 ]; - var array_kind = Module.HEAPU32[ (address + 8) / 4 ]; - var pointer_end = pointer + length; - - switch( array_kind ) { - case 0: - return Module.HEAPU8.subarray( pointer, pointer_end ); - case 1: - return Module.HEAP8.subarray( pointer, pointer_end ); - case 2: - return Module.HEAPU16.subarray( pointer, pointer_end ); - case 3: - return Module.HEAP16.subarray( pointer, pointer_end ); - case 4: - return Module.HEAPU32.subarray( pointer, pointer_end ); - case 5: - return Module.HEAP32.subarray( pointer, pointer_end ); - case 6: - return Module.HEAPF32.subarray( pointer, pointer_end ); - case 7: - return Module.HEAPF64.subarray( pointer, pointer_end ); - } - } else if( kind === 15 ) { - return Module.STDWEB_PRIVATE.get_raw_value( Module.HEAPU32[ address / 4 ] ); + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; } -}; - -Module.STDWEB_PRIVATE.serialize_object = function serialize_object( address, value ) { - var keys = Object.keys( value ); - var length = keys.length; - var key_array_pointer = Module.STDWEB_PRIVATE.alloc( length * 8 ); - var value_array_pointer = Module.STDWEB_PRIVATE.alloc( length * 16 ); - Module.HEAPU8[ address + 12 ] = 8; - Module.HEAPU32[ address / 4 ] = value_array_pointer; - Module.HEAPU32[ (address + 4) / 4 ] = length; - Module.HEAPU32[ (address + 8) / 4 ] = key_array_pointer; - for( var i = 0; i < length; ++i ) { - var key = keys[ i ]; - var key_address = key_array_pointer + i * 8; - Module.STDWEB_PRIVATE.to_utf8_string( key_address, key ); - - Module.STDWEB_PRIVATE.from_js( value_array_pointer + i * 16, value[ key ] ); + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3); + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; } -}; - -Module.STDWEB_PRIVATE.serialize_array = function serialize_array( address, value ) { - var length = value.length; - var pointer = Module.STDWEB_PRIVATE.alloc( length * 16 ); - Module.HEAPU8[ address + 12 ] = 7; - Module.HEAPU32[ address / 4 ] = pointer; - Module.HEAPU32[ (address + 4) / 4 ] = length; - for( var i = 0; i < length; ++i ) { - Module.STDWEB_PRIVATE.from_js( pointer + i * 16, value[ i ] ); + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachegetInt32Memory0 = null; +function getInt32Memory0() { + if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) { + cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); } -}; - -// New browsers and recent Node -var cachedEncoder = ( typeof TextEncoder === "function" - ? new TextEncoder( "utf-8" ) - // Old Node (before v11) - : ( typeof util === "object" && util && typeof util.TextEncoder === "function" - ? new util.TextEncoder( "utf-8" ) - // Old browsers - : null ) ); - -if ( cachedEncoder != null ) { - Module.STDWEB_PRIVATE.to_utf8_string = function to_utf8_string( address, value ) { - var buffer = cachedEncoder.encode( value ); - var length = buffer.length; - var pointer = 0; - - if ( length > 0 ) { - pointer = Module.STDWEB_PRIVATE.alloc( length ); - Module.HEAPU8.set( buffer, pointer ); - } + return cachegetInt32Memory0; +} - Module.HEAPU32[ address / 4 ] = pointer; - Module.HEAPU32[ (address + 4) / 4 ] = length; - }; +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); -} else { - Module.STDWEB_PRIVATE.to_utf8_string = function to_utf8_string( address, value ) { - var length = Module.STDWEB_PRIVATE.utf8_len( value ); - var pointer = 0; +cachedTextDecoder.decode(); - if ( length > 0 ) { - pointer = Module.STDWEB_PRIVATE.alloc( length ); - Module.STDWEB_PRIVATE.to_utf8( value, pointer ); - } +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} - Module.HEAPU32[ address / 4 ] = pointer; - Module.HEAPU32[ (address + 4) / 4 ] = length; - }; +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; } -Module.STDWEB_PRIVATE.from_js = function from_js( address, value ) { - var kind = Object.prototype.toString.call( value ); - if( kind === "[object String]" ) { - Module.HEAPU8[ address + 12 ] = 4; - Module.STDWEB_PRIVATE.to_utf8_string( address, value ); - } else if( kind === "[object Number]" ) { - if( value === (value|0) ) { - Module.HEAPU8[ address + 12 ] = 2; - Module.HEAP32[ address / 4 ] = value; - } else { - Module.HEAPU8[ address + 12 ] = 3; - Module.HEAPF64[ address / 8 ] = value; - } - } else if( value === null ) { - Module.HEAPU8[ address + 12 ] = 1; - } else if( value === undefined ) { - Module.HEAPU8[ address + 12 ] = 0; - } else if( value === false ) { - Module.HEAPU8[ address + 12 ] = 5; - } else if( value === true ) { - Module.HEAPU8[ address + 12 ] = 6; - } else if( kind === "[object Symbol]" ) { - var id = Module.STDWEB_PRIVATE.register_raw_value( value ); - Module.HEAPU8[ address + 12 ] = 15; - Module.HEAP32[ address / 4 ] = id; - } else { - var refid = Module.STDWEB_PRIVATE.acquire_rust_reference( value ); - Module.HEAPU8[ address + 12 ] = 9; - Module.HEAP32[ address / 4 ] = refid; - } -}; - -// New browsers and recent Node -var cachedDecoder = ( typeof TextDecoder === "function" - ? new TextDecoder( "utf-8" ) - // Old Node (before v11) - : ( typeof util === "object" && util && typeof util.TextDecoder === "function" - ? new util.TextDecoder( "utf-8" ) - // Old browsers - : null ) ); - -if ( cachedDecoder != null ) { - Module.STDWEB_PRIVATE.to_js_string = function to_js_string( index, length ) { - return cachedDecoder.decode( Module.HEAPU8.subarray( index, index + length ) ); - }; - -} else { - // This is ported from Rust's stdlib; it's faster than - // the string conversion from Emscripten. - Module.STDWEB_PRIVATE.to_js_string = function to_js_string( index, length ) { - var HEAPU8 = Module.HEAPU8; - index = index|0; - length = length|0; - var end = (index|0) + (length|0); - var output = ""; - while( index < end ) { - var x = HEAPU8[ index++ ]; - if( x < 128 ) { - output += String.fromCharCode( x ); - continue; - } - var init = (x & (0x7F >> 2)); - var y = 0; - if( index < end ) { - y = HEAPU8[ index++ ]; - } - var ch = (init << 6) | (y & 63); - if( x >= 0xE0 ) { - var z = 0; - if( index < end ) { - z = HEAPU8[ index++ ]; - } - var y_z = ((y & 63) << 6) | (z & 63); - ch = init << 12 | y_z; - if( x >= 0xF0 ) { - var w = 0; - if( index < end ) { - w = HEAPU8[ index++ ]; - } - ch = (init & 7) << 18 | ((y_z << 6) | (w & 63)); - - output += String.fromCharCode( 0xD7C0 + (ch >> 10) ); - ch = 0xDC00 + (ch & 0x3FF); - } - } - output += String.fromCharCode( ch ); - continue; +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1 }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) wasm.__wbindgen_export_2.get(dtor)(a, state.b); + else state.a = a; } - return output; }; + real.original = state; + return real; } -Module.STDWEB_PRIVATE.id_to_ref_map = {}; -Module.STDWEB_PRIVATE.id_to_refcount_map = {}; -Module.STDWEB_PRIVATE.ref_to_id_map = new WeakMap(); -// Not all types can be stored in a WeakMap -Module.STDWEB_PRIVATE.ref_to_id_map_fallback = new Map(); -Module.STDWEB_PRIVATE.last_refid = 1; +let stack_pointer = 32; -Module.STDWEB_PRIVATE.id_to_raw_value_map = {}; -Module.STDWEB_PRIVATE.last_raw_value_id = 1; - -Module.STDWEB_PRIVATE.acquire_rust_reference = function( reference ) { - if( reference === undefined || reference === null ) { - return 0; +function addBorrowedObject(obj) { + if (stack_pointer == 1) throw new Error('out of js stack'); + heap[--stack_pointer] = obj; + return stack_pointer; +} +function __wbg_adapter_16(arg0, arg1, arg2) { + try { + wasm.wasm_bindgen__convert__closures__invoke1_mut_ref__h66b94e249be13806(arg0, arg1, addBorrowedObject(arg2)); + } finally { + heap[stack_pointer++] = undefined; } +} - var id_to_refcount_map = Module.STDWEB_PRIVATE.id_to_refcount_map; - var id_to_ref_map = Module.STDWEB_PRIVATE.id_to_ref_map; - var ref_to_id_map = Module.STDWEB_PRIVATE.ref_to_id_map; - var ref_to_id_map_fallback = Module.STDWEB_PRIVATE.ref_to_id_map_fallback; +/** +*/ +export function start() { + wasm.start(); +} - var refid = ref_to_id_map.get( reference ); - if( refid === undefined ) { - refid = ref_to_id_map_fallback.get( reference ); - } - if( refid === undefined ) { - refid = Module.STDWEB_PRIVATE.last_refid++; +function handleError(f) { + return function () { try { - ref_to_id_map.set( reference, refid ); + return f.apply(this, arguments); + } catch (e) { - ref_to_id_map_fallback.set( reference, refid ); + wasm.__wbindgen_exn_store(addHeapObject(e)); } - } + }; +} - if( refid in id_to_ref_map ) { - id_to_refcount_map[ refid ]++; - } else { - id_to_ref_map[ refid ] = reference; - id_to_refcount_map[ refid ] = 1; - } +function getArrayU8FromWasm0(ptr, len) { + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} - return refid; -}; - -Module.STDWEB_PRIVATE.acquire_js_reference = function( refid ) { - return Module.STDWEB_PRIVATE.id_to_ref_map[ refid ]; -}; - -Module.STDWEB_PRIVATE.increment_refcount = function( refid ) { - Module.STDWEB_PRIVATE.id_to_refcount_map[ refid ]++; -}; - -Module.STDWEB_PRIVATE.decrement_refcount = function( refid ) { - var id_to_refcount_map = Module.STDWEB_PRIVATE.id_to_refcount_map; - if( 0 == --id_to_refcount_map[ refid ] ) { - var id_to_ref_map = Module.STDWEB_PRIVATE.id_to_ref_map; - var ref_to_id_map_fallback = Module.STDWEB_PRIVATE.ref_to_id_map_fallback; - var reference = id_to_ref_map[ refid ]; - delete id_to_ref_map[ refid ]; - delete id_to_refcount_map[ refid ]; - ref_to_id_map_fallback.delete(reference); - } -}; - -Module.STDWEB_PRIVATE.register_raw_value = function( value ) { - var id = Module.STDWEB_PRIVATE.last_raw_value_id++; - Module.STDWEB_PRIVATE.id_to_raw_value_map[ id ] = value; - return id; -}; - -Module.STDWEB_PRIVATE.unregister_raw_value = function( id ) { - delete Module.STDWEB_PRIVATE.id_to_raw_value_map[ id ]; -}; - -Module.STDWEB_PRIVATE.get_raw_value = function( id ) { - return Module.STDWEB_PRIVATE.id_to_raw_value_map[ id ]; -}; - -Module.STDWEB_PRIVATE.alloc = function alloc( size ) { - return Module.web_malloc( size ); -}; - -Module.STDWEB_PRIVATE.dyncall = function( signature, ptr, args ) { - return Module.web_table.get( ptr ).apply( null, args ); -}; - -// This is based on code from Emscripten's preamble.js. -Module.STDWEB_PRIVATE.utf8_len = function utf8_len( str ) { - var len = 0; - for( var i = 0; i < str.length; ++i ) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var u = str.charCodeAt( i ); // possibly a lead surrogate - if( u >= 0xD800 && u <= 0xDFFF ) { - u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt( ++i ) & 0x3FF); +function isLikeNone(x) { + return x === undefined || x === null; +} + +async function load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } } - if( u <= 0x7F ) { - ++len; - } else if( u <= 0x7FF ) { - len += 2; - } else if( u <= 0xFFFF ) { - len += 3; - } else if( u <= 0x1FFFFF ) { - len += 4; - } else if( u <= 0x3FFFFFF ) { - len += 5; + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { - len += 6; + return instance; } } - return len; -}; - -Module.STDWEB_PRIVATE.prepare_any_arg = function( value ) { - var arg = Module.STDWEB_PRIVATE.alloc( 16 ); - Module.STDWEB_PRIVATE.from_js( arg, value ); - return arg; -}; - -Module.STDWEB_PRIVATE.acquire_tmp = function( dummy ) { - var value = Module.STDWEB_PRIVATE.tmp; - Module.STDWEB_PRIVATE.tmp = null; - return value; -}; - - - - var HEAP8 = null; - var HEAP16 = null; - var HEAP32 = null; - var HEAPU8 = null; - var HEAPU16 = null; - var HEAPU32 = null; - var HEAPF32 = null; - var HEAPF64 = null; - - Object.defineProperty( Module, 'exports', { value: {} } ); - - function __web_on_grow() { - var buffer = Module.instance.exports.memory.buffer; - HEAP8 = new Int8Array( buffer ); - HEAP16 = new Int16Array( buffer ); - HEAP32 = new Int32Array( buffer ); - HEAPU8 = new Uint8Array( buffer ); - HEAPU16 = new Uint16Array( buffer ); - HEAPU32 = new Uint32Array( buffer ); - HEAPF32 = new Float32Array( buffer ); - HEAPF64 = new Float64Array( buffer ); - Module.HEAP8 = HEAP8; - Module.HEAP16 = HEAP16; - Module.HEAP32 = HEAP32; - Module.HEAPU8 = HEAPU8; - Module.HEAPU16 = HEAPU16; - Module.HEAPU32 = HEAPU32; - Module.HEAPF32 = HEAPF32; - Module.HEAPF64 = HEAPF64; - } +} - return { - imports: { - env: { - "__cargo_web_snippet_08a3b15e1358700ac92bc556f9e9b8af660fc2c7": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).nodeValue=($1); - }, - "__cargo_web_snippet_0aced9e2351ced72f1ff99645a129132b16c0d3c": function($0) { - var value = Module.STDWEB_PRIVATE.get_raw_value( $0 );return Module.STDWEB_PRIVATE.register_raw_value( value ); - }, - "__cargo_web_snippet_0da47658267a7497de743e1b0892f992ba6ca6ef": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).type=($1); - }, - "__cargo_web_snippet_0e54fd9c163fcf648ce0a395fde4500fd167a40b": function($0) { - var r = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (r instanceof DOMException) && (r.name === "InvalidCharacterError"); - }, - "__cargo_web_snippet_351b27505bc97d861c3914c20421b6277babb53b": function($0) { - var o = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (o instanceof Node) | 0; - }, - "__cargo_web_snippet_352943ae98b2eeb817e36305c3531d61c7e1a52b": function($0) { - var o = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (o instanceof Element) | 0; - }, - "__cargo_web_snippet_46518012593da937dd5f35c2fc1c5e1dcade260b": function($0, $1, $2, $3) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);$3 = Module.STDWEB_PRIVATE.to_js($3);Module.STDWEB_PRIVATE.from_js($0, (function(){try{return{value:function(){return($1).insertBefore(($2),($3));}(),success:true};}catch(error){return{error:error,success:false};}})()); - }, - "__cargo_web_snippet_614a3dd2adb7e9eac4a0ec6e59d37f87e0521c3b": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).error;})()); - }, - "__cargo_web_snippet_690311d2f9134ac0983620c38a9e6460d4165607": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).nextSibling;})()); - }, - "__cargo_web_snippet_6a77b2f2accec26fefbfa0d864061d26f40f8f6f": function($0) { - $0 = Module.STDWEB_PRIVATE.to_js($0);($0).type=""; - }, - "__cargo_web_snippet_6fcce0aae651e2d748e085ff1f800f87625ff8c8": function($0) { - Module.STDWEB_PRIVATE.from_js($0, (function(){return document;})()); - }, - "__cargo_web_snippet_72fc447820458c720c68d0d8e078ede631edd723": function($0, $1, $2) { - console.error( 'Panic location:', Module.STDWEB_PRIVATE.to_js_string( $0, $1 ) + ':' + $2 ); - }, - "__cargo_web_snippet_7c8dfab835dc8a552cd9d67f27d26624590e052c": function($0) { - var r = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (r instanceof DOMException) && (r.name === "SyntaxError"); - }, - "__cargo_web_snippet_80d6d56760c65e49b7be8b6b01c1ea861b046bf0": function($0) { - Module.STDWEB_PRIVATE.decrement_refcount( $0 ); - }, - "__cargo_web_snippet_8545f3ba2883a49a2afd23c48c5d24ef3f9b0071": function($0) { - var o = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (o instanceof HTMLTextAreaElement) | 0; - }, - "__cargo_web_snippet_85b9ecbdb8513465b790546acfd0cd530441b8a4": function($0) { - $0 = Module.STDWEB_PRIVATE.to_js($0);($0).stopPropagation(); - }, - "__cargo_web_snippet_8a049af1e4867892fca647811a9472e4c5832053": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).add(($1)); - }, - "__cargo_web_snippet_906f13b1e97c3e6e6996c62d7584c4917315426d": function($0) { - var o = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (o instanceof MouseEvent && o.type === "click") | 0; - }, - "__cargo_web_snippet_91749aeb589cd0f9b17cbc01b2872ba709817982": function($0, $1, $2) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);Module.STDWEB_PRIVATE.from_js($0, (function(){try{return{value:function(){return($1).createElement(($2));}(),success:true};}catch(error){return{error:error,success:false};}})()); - }, - "__cargo_web_snippet_97495987af1720d8a9a923fa4683a7b683e3acd6": function($0, $1) { - console.error( 'Panic error message:', Module.STDWEB_PRIVATE.to_js_string( $0, $1 ) ); - }, - "__cargo_web_snippet_99c4eefdc8d4cc724135163b8c8665a1f3de99e4": function($0, $1, $2, $3) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);$3 = Module.STDWEB_PRIVATE.to_js($3);Module.STDWEB_PRIVATE.from_js($0, (function(){var listener=($1);($2).addEventListener(($3),listener);return listener;})()); - }, - "__cargo_web_snippet_9f22d4ca7bc938409787341b7db181f8dd41e6df": function($0) { - Module.STDWEB_PRIVATE.increment_refcount( $0 ); - }, - "__cargo_web_snippet_a152e8d0e8fac5476f30c1d19e4ab217dbcba73d": function($0, $1, $2) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);Module.STDWEB_PRIVATE.from_js($0, (function(){try{return{value:function(){return($1).querySelector(($2));}(),success:true};}catch(error){return{error:error,success:false};}})()); - }, - "__cargo_web_snippet_a1f43b583e011a9bbeae64030b81f677e6c29005": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).checked=($1); - }, - "__cargo_web_snippet_ab05f53189dacccf2d365ad26daa407d4f7abea9": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).value;})()); - }, - "__cargo_web_snippet_afafe9a462a05084fec65cacc7d6598e145ff3e3": function($0, $1, $2) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).createTextNode(($2));})()); - }, - "__cargo_web_snippet_b06dde4acf09433b5190a4b001259fe5d4abcbc2": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).success;})()); - }, - "__cargo_web_snippet_bb618d13cbb219642bd219af99ee1519e5658d77": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).classList;})()); - }, - "__cargo_web_snippet_c023351d5bff43ef3dd317b499821cd4e71492f0": function($0) { - var r = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (r instanceof DOMException) && (r.name === "HierarchyRequestError"); - }, - "__cargo_web_snippet_c26ddf75f581148e029dfcd95c037bb50d502e43": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).value=($1); - }, - "__cargo_web_snippet_cb392b71162553130760deeb3964fa828c078f74": function($0) { - var o = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (o instanceof HTMLInputElement) | 0; - }, - "__cargo_web_snippet_cd41a77d0178ae27c833ef2950e5f1a48a1455c1": function($0, $1, $2) { - $1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);Module.STDWEB_PRIVATE.from_js($0, (function(){try{return{value:function(){return($1).removeChild(($2));}(),success:true};}catch(error){return{error:error,success:false};}})()); - }, - "__cargo_web_snippet_da2febd72f9938d90bc2bf2905643f595b07abd9": function($0, $1, $2) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);($0).setAttribute(($1),($2)); - }, - "__cargo_web_snippet_dc2fd915bd92f9e9c6a3bd15174f1414eee3dbaf": function() { - console.error( 'Encountered a panic!' ); - }, - "__cargo_web_snippet_de2896a7ccf316486788a4d0bc433c25d2f1a12b": function($0) { - var r = Module.STDWEB_PRIVATE.acquire_js_reference( $0 );return (r instanceof DOMException) && (r.name === "NotFoundError"); - }, - "__cargo_web_snippet_e741b9d9071097746386b2c2ec044a2bc73e688c": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).appendChild(($1)); - }, - "__cargo_web_snippet_e9638d6405ab65f78daf4a5af9c9de14ecf1e2ec": function($0) { - $0 = Module.STDWEB_PRIVATE.to_js($0);Module.STDWEB_PRIVATE.unregister_raw_value(($0)); - }, - "__cargo_web_snippet_ec62bad51093fd25faa38be3170e100862e191f3": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).remove(($1)); - }, - "__cargo_web_snippet_f03767d5868baf486b51c1e3988d0ce100e850ca": function($0, $1) { - $1 = Module.STDWEB_PRIVATE.to_js($1);Module.STDWEB_PRIVATE.from_js($0, (function(){return($1).lastChild;})()); - }, - "__cargo_web_snippet_f6358c198ebcc61c9da370cca2679c0b8bc81a7b": function($0, $1) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);($0).removeAttribute(($1)); - }, - "__cargo_web_snippet_f750c7bda400081b4d7209f43f9d59214d39f6ea": function($0, $1, $2) { - $0 = Module.STDWEB_PRIVATE.to_js($0);$1 = Module.STDWEB_PRIVATE.to_js($1);$2 = Module.STDWEB_PRIVATE.to_js($2);var listener=($0);($1).removeEventListener(($2),listener);listener.drop(); - }, - "__cargo_web_snippet_f91e3759ea8e40c15404c8b089c74fe76b61421e": function($0) { - Module.STDWEB_PRIVATE.from_js($0, (function(){return Date.now();})()); - }, - "__cargo_web_snippet_ff5103e6cc179d13b4c7a785bdce2708fd559fc0": function($0) { - Module.STDWEB_PRIVATE.tmp = Module.STDWEB_PRIVATE.to_js( $0 ); - }, - "__web_on_grow": __web_on_grow - } - }, - initialize: function( instance ) { - Object.defineProperty( Module, 'instance', { value: instance } ); - Object.defineProperty( Module, 'web_malloc', { value: Module.instance.exports.__web_malloc } ); - Object.defineProperty( Module, 'web_free', { value: Module.instance.exports.__web_free } ); - Object.defineProperty( Module, 'web_table', { value: Module.instance.exports.__indirect_function_table } ); - - - __web_on_grow(); - Module.instance.exports.main(); - - return Module.exports; +async function init(input) { + if (typeof input === 'undefined') { + input = import.meta.url.replace(/\.js$/, '_bg.wasm'); + } + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbg_removeEventListener_003b13762a00969d = handleError(function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).removeEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), arg4 !== 0); + }); + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; } + var ret = false; + return ret; + }; + imports.wbg.__wbg_self_1b7a39e3a92c949c = handleError(function() { + var ret = self.self; + return addHeapObject(ret); + }); + imports.wbg.__wbg_require_604837428532a733 = function(arg0, arg1) { + var ret = require(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); }; + imports.wbg.__wbg_crypto_968f1772287e2df0 = function(arg0) { + var ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + var ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbg_getRandomValues_a3d34b4fee3c2869 = function(arg0) { + var ret = getObject(arg0).getRandomValues; + return addHeapObject(ret); + }; + imports.wbg.__wbg_randomFillSync_d5bd2d655fdf256a = function(arg0, arg1, arg2) { + getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); + }; + imports.wbg.__wbg_getRandomValues_f5e14ab7ac8e995d = function(arg0, arg1, arg2) { + getObject(arg0).getRandomValues(getArrayU8FromWasm0(arg1, arg2)); + }; + imports.wbg.__wbg_document_c26d0f423c143e0c = function(arg0) { + var ret = getObject(arg0).document; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_querySelector_9cf023db23245913 = handleError(function(arg0, arg1, arg2) { + var ret = getObject(arg0).querySelector(getStringFromWasm0(arg1, arg2)); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }); + imports.wbg.__wbg_lastChild_4add591e64b65966 = function(arg0) { + var ret = getObject(arg0).lastChild; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_removeChild_d8035999cf171601 = handleError(function(arg0, arg1) { + var ret = getObject(arg0).removeChild(getObject(arg1)); + return addHeapObject(ret); + }); + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + var ret = debugString(getObject(arg1)); + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_self_c0d3a5923e013647 = handleError(function() { + var ret = self.self; + return addHeapObject(ret); + }); + imports.wbg.__wbg_window_7ee6c8be3432927d = handleError(function() { + var ret = window.window; + return addHeapObject(ret); + }); + imports.wbg.__wbg_globalThis_c6de1d938e089cf0 = handleError(function() { + var ret = globalThis.globalThis; + return addHeapObject(ret); + }); + imports.wbg.__wbg_global_c9a01ce4680907f8 = handleError(function() { + var ret = global.global; + return addHeapObject(ret); + }); + imports.wbg.__wbg_newnoargs_8aad4a6554f38345 = function(arg0, arg1) { + var ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1f85aaa5836dfb23 = handleError(function(arg0, arg1) { + var ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }); + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + var ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_instanceof_Window_17fdb5cd280d476d = function(arg0) { + var ret = getObject(arg0) instanceof Window; + return ret; + }; + imports.wbg.__wbg_nextSibling_f1e7154ee59f6a7d = function(arg0) { + var ret = getObject(arg0).nextSibling; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_setnodeValue_ab4d09a5c9b583a3 = function(arg0, arg1, arg2) { + getObject(arg0).nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_createTextNode_756ffaca4044be42 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).createTextNode(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_appendChild_3d4ec7dbf3472d31 = handleError(function(arg0, arg1) { + var ret = getObject(arg0).appendChild(getObject(arg1)); + return addHeapObject(ret); + }); + imports.wbg.__wbg_insertBefore_e617280513985f61 = handleError(function(arg0, arg1, arg2) { + var ret = getObject(arg0).insertBefore(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }); + imports.wbg.__wbg_namespaceURI_35b1c4eab9150629 = function(arg0, arg1) { + var ret = getObject(arg1).namespaceURI; + var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_createElement_44ab59c4ad367831 = handleError(function(arg0, arg1, arg2) { + var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }); + imports.wbg.__wbg_createElementNS_74ac818c77233fe4 = handleError(function(arg0, arg1, arg2, arg3, arg4) { + var ret = getObject(arg0).createElementNS(arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + return addHeapObject(ret); + }); + imports.wbg.__wbg_instanceof_HtmlInputElement_9e9349535b986dc4 = function(arg0) { + var ret = getObject(arg0) instanceof HTMLInputElement; + return ret; + }; + imports.wbg.__wbg_instanceof_HtmlTextAreaElement_af4dc0571f10534b = function(arg0) { + var ret = getObject(arg0) instanceof HTMLTextAreaElement; + return ret; + }; + imports.wbg.__wbg_removeAttribute_ab1ad95ea7761680 = handleError(function(arg0, arg1, arg2) { + getObject(arg0).removeAttribute(getStringFromWasm0(arg1, arg2)); + }); + imports.wbg.__wbg_setAttribute_1e9980589f904db6 = handleError(function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + }); + imports.wbg.__wbg_settype_ccacb981913395e5 = function(arg0, arg1, arg2) { + getObject(arg0).type = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_setvalue_eb5415236467cd34 = function(arg0, arg1, arg2) { + getObject(arg0).value = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_setchecked_795fe0b967d5d996 = function(arg0, arg1) { + getObject(arg0).checked = arg1 !== 0; + }; + imports.wbg.__wbg_setvalue_8bb8ffbd27a7ffda = function(arg0, arg1, arg2) { + getObject(arg0).value = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_new_d6227c3c833572bb = function() { + var ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + var ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_6a666216929b0387 = handleError(function(arg0, arg1, arg2) { + var ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2)); + return ret; + }); + imports.wbg.__wbg_addEventListener_3526086a053a131e = handleError(function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), getObject(arg4)); + }); + imports.wbg.__wbg_stopPropagation_71c3dbce6a10eea7 = function(arg0) { + getObject(arg0).stopPropagation(); + }; + imports.wbg.__wbindgen_closure_wrapper1218 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 25, __wbg_adapter_16); + return addHeapObject(ret); + }; + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + const { instance, module } = await load(await input, imports); + + wasm = instance.exports; + init.__wbindgen_wasm_module = module; + wasm.__wbindgen_start(); + return wasm; } - )); -})); + +export default init; + diff --git a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.wasm b/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.wasm deleted file mode 100644 index 1600a00d98f8b7e5fb7401a193f99ca1f7df784e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271945 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 z 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

EYot>FH1QRJdjX48@IjYTQEovuJdKA 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 F|6f!5B(wkk literal 0 HcmV?d00001 diff --git a/frameworks/non-keyed/yew/index.html b/frameworks/non-keyed/yew/index.html index 9eed695c3..7f4868a86 100644 --- a/frameworks/non-keyed/yew/index.html +++ b/frameworks/non-keyed/yew/index.html @@ -8,6 +8,9 @@

- + diff --git a/frameworks/non-keyed/yew/package.json b/frameworks/non-keyed/yew/package.json index ff0f3ea38..09c76c7d3 100644 --- a/frameworks/non-keyed/yew/package.json +++ b/frameworks/non-keyed/yew/package.json @@ -4,11 +4,11 @@ "description": "Benchmark for Yew", "license": "ISC", "js-framework-benchmark": { - "frameworkVersion": "0.7.0" + "frameworkVersion": "0.16.2" }, "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-prod-force": "rimraf bundled-dist target/deploy && rustup toolchain install nightly && rustup override set nightly && rustup target add wasm32-unknown-unknown && cargo install -f cargo-web && cargo web deploy --release --target wasm32-unknown-unknown && cpr target/deploy bundled-dist" + "build-prod-force": "rimraf bundled-dist && rustup target add wasm32-unknown-unknown && cargo install wasm-pack && wasm-pack build --release --target web --no-typescript --out-name js-framework-benchmark-yew --out-dir bundled-dist && cpr index.html bundled-dist/index.html && (cd bundled-dist && rimraf .gitignore README.md package.json)" }, "repository": { "type": "git", diff --git a/frameworks/non-keyed/yew/src/lib.rs b/frameworks/non-keyed/yew/src/lib.rs index 041c779dd..82852701f 100644 --- a/frameworks/non-keyed/yew/src/lib.rs +++ b/frameworks/non-keyed/yew/src/lib.rs @@ -1,19 +1,12 @@ -#![recursion_limit = "256"] +#![recursion_limit = "1024"] -extern crate byteorder; -extern crate stdweb; -#[macro_use] -extern crate yew; -extern crate rand; - -use byteorder::{ByteOrder, LittleEndian}; -use rand::prng::XorShiftRng; -use rand::{Rng, SeedableRng}; +use rand::prelude::*; use std::cmp::min; -use stdweb::web::Date; use yew::prelude::*; +use yew::web_sys::window; +use wasm_bindgen::prelude::wasm_bindgen; -static ADJECTIVES: &[&'static str] = &[ +static ADJECTIVES: &[&str] = &[ "pretty", "large", "big", @@ -41,12 +34,12 @@ static ADJECTIVES: &[&'static str] = &[ "fancy", ]; -static COLOURS: &[&'static str] = &[ +static COLOURS: &[&str] = &[ "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange", ]; -static NOUNS: &[&'static str] = &[ +static NOUNS: &[&str] = &[ "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard", ]; @@ -57,16 +50,13 @@ struct Row { } impl Row { - fn new(id: usize, rng: &mut R) -> Row - where - R: Rng, - { + fn new(id: usize, rng: &mut SmallRng) -> Row { let mut label = String::new(); - label.push_str(rng.choose(ADJECTIVES).unwrap()); + label.push_str(ADJECTIVES.choose(rng).unwrap()); label.push(' '); - label.push_str(rng.choose(COLOURS).unwrap()); + label.push_str(COLOURS.choose(rng).unwrap()); label.push(' '); - label.push_str(rng.choose(NOUNS).unwrap()); + label.push_str(NOUNS.choose(rng).unwrap()); Row { id, label } } @@ -76,7 +66,8 @@ pub struct Model { rows: Vec, next_id: usize, selected_id: Option, - rng: XorShiftRng, + rng: SmallRng, + link: ComponentLink, } pub enum Msg { @@ -93,46 +84,42 @@ impl Component for Model { type Message = Msg; type Properties = (); - fn create(_: Self::Properties, _: ComponentLink) -> Self { - let mut seed = [0; 16]; - LittleEndian::write_u128(&mut seed, Date::now() as u128); + fn create(_: Self::Properties, link: ComponentLink) -> Self { Model { rows: Vec::new(), next_id: 1, selected_id: None, - rng: XorShiftRng::from_seed([0; 16]), + rng: SmallRng::from_entropy(), + link, } } + fn change(&mut self, _: ()) -> ShouldRender { + false + } + fn update(&mut self, msg: Self::Message) -> ShouldRender { match msg { Msg::Run(amount) => { - let next_id = self.next_id; let rng = &mut self.rng; + let next_id = self.next_id; let update_amount = min(amount, self.rows.len()); for index in 0..update_amount { self.rows[index] = Row::new(next_id + index, rng); } - self.next_id += update_amount; - self.rows.extend( - (update_amount..amount) - .map(|index| Row::new(next_id + index, rng)) - .collect::>(), - ); - self.next_id += amount - update_amount; + self.rows + .extend((update_amount..amount).map(|index| Row::new(next_id + index, rng))); + self.next_id += amount; } Msg::Add(amount) => { - let next_id = self.next_id; let rng = &mut self.rng; - self.rows.extend( - (0..amount) - .map(|index| Row::new(next_id + index, rng)) - .collect::>(), - ); + let next_id = self.next_id; + self.rows + .extend((0..amount).map(|index| Row::new(next_id + index, rng))); self.next_id += amount; } Msg::Update(step) => { - for index in (0..(self.rows.len() / step)).map(|x| x * step) { + for index in (0..self.rows.len()).step_by(step) { self.rows[index].label += " !!!"; } } @@ -145,79 +132,79 @@ impl Component for Model { } } Msg::Remove(id) => { - if let Some((index, _)) = self.rows.iter().enumerate().find(|(_, row)| row.id == id) - { + if let Some(index) = self.rows.iter().position(|row| row.id == id) { self.rows.remove(index); } } Msg::Select(id) => { - if self.selected_id == Some(id) { - self.selected_id = None; - } else { - self.selected_id = Some(id); - } + self.selected_id = Some(id); } } true } -} -impl Renderable for Model { - fn view(&self) -> Html { + fn view(&self) -> Html { html! { -
-
-
-
+
+
+
+

{ "Yew" }

-
-
-
- +
+
+
+
-
- +
+
-
- +
+
-
- +
+
-
- +
+
-
- +
+
- - +
+ { for self.rows.iter().map(|row| { let id = row.id.clone(); html! { - - - + + - - + } } ) }
{ id.to_string() } - { row.label.clone() } +
{ id.to_string() } + { row.label.clone() } - - + + +
- +
} } } + +#[wasm_bindgen(start)] +pub fn start() { + let document = window().unwrap().document().unwrap(); + let mount_el = document.query_selector("#main").unwrap().unwrap(); + App::::new().mount(mount_el); +} diff --git a/frameworks/non-keyed/yew/src/main.rs b/frameworks/non-keyed/yew/src/main.rs deleted file mode 100644 index 18c8ed453..000000000 --- a/frameworks/non-keyed/yew/src/main.rs +++ /dev/null @@ -1,20 +0,0 @@ -extern crate js_framework_benchmark_yew; -extern crate stdweb; -extern crate yew; - -use js_framework_benchmark_yew::Model; -use stdweb::web::{document, IParentNode}; -use yew::prelude::*; - -fn main() { - yew::initialize(); - let app = App::::new(); - let selector = "#main"; - app.mount( - document() - .query_selector(selector) - .expect(&format!("failed to query selector '{}'", selector)) - .expect(&format!("element '{}' not found", selector)), - ); - yew::run_loop(); -} From 804271c369326821c920db0d83f9d7192273778c Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Mon, 18 May 2020 11:57:47 +0800 Subject: [PATCH 02/14] Migrate yew from non-keyed to keyed --- .../{non-keyed => keyed}/yew/.gitignore | 0 .../{non-keyed => keyed}/yew/Cargo.toml | 2 +- frameworks/{non-keyed => keyed}/yew/README.md | 0 .../yew/bundled-dist/index.html | 0 .../js-framework-benchmark-yew.js | 27 +++++++++--------- .../js-framework-benchmark-yew_bg.wasm | Bin 0 -> 128560 bytes .../{non-keyed => keyed}/yew/index.html | 0 .../{non-keyed => keyed}/yew/package.json | 0 .../{non-keyed => keyed}/yew/src/lib.rs | 2 +- .../js-framework-benchmark-yew_bg.wasm | Bin 130358 -> 0 bytes 10 files changed, 16 insertions(+), 15 deletions(-) rename frameworks/{non-keyed => keyed}/yew/.gitignore (100%) rename frameworks/{non-keyed => keyed}/yew/Cargo.toml (80%) rename frameworks/{non-keyed => keyed}/yew/README.md (100%) rename frameworks/{non-keyed => keyed}/yew/bundled-dist/index.html (100%) rename frameworks/{non-keyed => keyed}/yew/bundled-dist/js-framework-benchmark-yew.js (97%) create mode 100644 frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm rename frameworks/{non-keyed => keyed}/yew/index.html (100%) rename frameworks/{non-keyed => keyed}/yew/package.json (100%) rename frameworks/{non-keyed => keyed}/yew/src/lib.rs (98%) delete mode 100644 frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm diff --git a/frameworks/non-keyed/yew/.gitignore b/frameworks/keyed/yew/.gitignore similarity index 100% rename from frameworks/non-keyed/yew/.gitignore rename to frameworks/keyed/yew/.gitignore diff --git a/frameworks/non-keyed/yew/Cargo.toml b/frameworks/keyed/yew/Cargo.toml similarity index 80% rename from frameworks/non-keyed/yew/Cargo.toml rename to frameworks/keyed/yew/Cargo.toml index 6794f1093..beee3fdd5 100644 --- a/frameworks/non-keyed/yew/Cargo.toml +++ b/frameworks/keyed/yew/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["cdylib"] [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen", "small_rng"] } wasm-bindgen = "0.2.62" -yew = "0.16.2" +yew = { git = "https://github.com/totorigolo/yew", branch = "bugfix/keyed-elements-reorder" } [profile.release] lto = true diff --git a/frameworks/non-keyed/yew/README.md b/frameworks/keyed/yew/README.md similarity index 100% rename from frameworks/non-keyed/yew/README.md rename to frameworks/keyed/yew/README.md diff --git a/frameworks/non-keyed/yew/bundled-dist/index.html b/frameworks/keyed/yew/bundled-dist/index.html similarity index 100% rename from frameworks/non-keyed/yew/bundled-dist/index.html rename to frameworks/keyed/yew/bundled-dist/index.html diff --git a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js b/frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew.js similarity index 97% rename from frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js rename to frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew.js index 1914de22b..1962006a1 100644 --- a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew.js +++ b/frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew.js @@ -203,7 +203,7 @@ function addBorrowedObject(obj) { } function __wbg_adapter_16(arg0, arg1, arg2) { try { - wasm.wasm_bindgen__convert__closures__invoke1_mut_ref__h66b94e249be13806(arg0, arg1, addBorrowedObject(arg2)); + wasm.wasm_bindgen__convert__closures__invoke1_mut_ref__h51d4f69569056647(arg0, arg1, addBorrowedObject(arg2)); } finally { heap[stack_pointer++] = undefined; } @@ -376,21 +376,25 @@ async function init(input) { var ret = getObject(arg0).nextSibling; return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_setnodeValue_ab4d09a5c9b583a3 = function(arg0, arg1, arg2) { - getObject(arg0).nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2); - }; - imports.wbg.__wbg_createTextNode_756ffaca4044be42 = function(arg0, arg1, arg2) { - var ret = getObject(arg0).createTextNode(getStringFromWasm0(arg1, arg2)); - return addHeapObject(ret); - }; imports.wbg.__wbg_appendChild_3d4ec7dbf3472d31 = handleError(function(arg0, arg1) { var ret = getObject(arg0).appendChild(getObject(arg1)); return addHeapObject(ret); }); + imports.wbg.__wbg_firstChild_cc345cf09851e11c = function(arg0) { + var ret = getObject(arg0).firstChild; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; imports.wbg.__wbg_insertBefore_e617280513985f61 = handleError(function(arg0, arg1, arg2) { var ret = getObject(arg0).insertBefore(getObject(arg1), getObject(arg2)); return addHeapObject(ret); }); + imports.wbg.__wbg_setnodeValue_ab4d09a5c9b583a3 = function(arg0, arg1, arg2) { + getObject(arg0).nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_createTextNode_756ffaca4044be42 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).createTextNode(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }; imports.wbg.__wbg_namespaceURI_35b1c4eab9150629 = function(arg0, arg1) { var ret = getObject(arg1).namespaceURI; var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); @@ -447,11 +451,8 @@ async function init(input) { imports.wbg.__wbg_addEventListener_3526086a053a131e = handleError(function(arg0, arg1, arg2, arg3, arg4) { getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), getObject(arg4)); }); - imports.wbg.__wbg_stopPropagation_71c3dbce6a10eea7 = function(arg0) { - getObject(arg0).stopPropagation(); - }; - imports.wbg.__wbindgen_closure_wrapper1218 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 25, __wbg_adapter_16); + imports.wbg.__wbindgen_closure_wrapper1238 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 26, __wbg_adapter_16); return addHeapObject(ret); }; diff --git a/frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm b/frameworks/keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9b5ace6895fe32f386d3f5ca92661db9e5925968 GIT binary patch literal 128560 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 literal 0 HcmV?d00001 diff --git a/frameworks/non-keyed/yew/index.html b/frameworks/keyed/yew/index.html similarity index 100% rename from frameworks/non-keyed/yew/index.html rename to frameworks/keyed/yew/index.html diff --git a/frameworks/non-keyed/yew/package.json b/frameworks/keyed/yew/package.json similarity index 100% rename from frameworks/non-keyed/yew/package.json rename to frameworks/keyed/yew/package.json diff --git a/frameworks/non-keyed/yew/src/lib.rs b/frameworks/keyed/yew/src/lib.rs similarity index 98% rename from frameworks/non-keyed/yew/src/lib.rs rename to frameworks/keyed/yew/src/lib.rs index 82852701f..ca7a160d6 100644 --- a/frameworks/non-keyed/yew/src/lib.rs +++ b/frameworks/keyed/yew/src/lib.rs @@ -180,7 +180,7 @@ impl Component for Model { { for self.rows.iter().map(|row| { let id = row.id.clone(); html! { - + { id.to_string() } { row.label.clone() } diff --git a/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm b/frameworks/non-keyed/yew/bundled-dist/js-framework-benchmark-yew_bg.wasm deleted file mode 100644 index 90f4aaced7a6b95a69505b638bd922c8d2d4a239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130358 zcmeFa3y@srb>G?dcK3A8^gJ5C;0=~NPzOvPA-v6-0bU>&3i&ca*R6ugU6m>5YR6>b&d zMXlg1RE3WA_dn;mw{Q3K3?6*RwnSlW-+RCNednHYzVrIdcW!Ctp~s_AsT6%HTKaH& zh_{5Vt4$kZ; zMQZRdHF$*c$Dep==7FbX_8a)`71*c5r6L+dnhycR%VqJTi0mM|bX@e&X@Jv~%CrW)AJxxp8{qrd^x%%*<@uypFHqNZu?Ze;Wtqy!`=HNGeY-S(y zdE(%Xt-JTE+puwZ*M^N7Hf`Rzeq*Vu(GzdFZ|9-If8o)`_D%2Dv~zlz+cT4!c1>>H zIyvb*w!;e!;RFu3PVjE+TPyX4lsq*>ULb!N>MLQYvY*rn(7? zbNJDNPdx3Hi$vbNZhGU+&09C{HtRP|Zklo;2l_qDvrjy|V`^q*a`%>9GaEN;+^}`S z)U>y0IgF3&dt%qleP4bQ67HUyo>@P=b>o(qbzAiMU441G9lN*gT(^Gr%%;gL>$a|& z+Ox&m1hnj*d3yg7I}bi`XvdbFJEu48gm#&1a{bhv>0O(5PjA?= zZhF(yWZ=UoBXjntt)ec1&$zKCR!fo5{a%Q#y${#O$QW!}`gs z8@BFRw{gpq)B9eh1j4IZ-E7>vVRGG;$(qqV)X0L$>_i@^XHeM|0(((qhIE~Uy1%+^pB&{Q7K)~SoiJdmFQDvqM6CR z75&gZi=H_f{e1MuvFO$4JJGL2-}ve1Z$>|QJo;wzm2X8q_P3+I^w*>R_W9^9{*CC% zKNtPwCw?>f?|&!yU!#8>osE7q`iIfqkG_5?8hZO5)xI75;a`vAj~*#Mdv_^4)7;yR z?ABxHQ(9Z*>_;lw(hGjlnn*ACui>a+KexwI<&xdr9_g2!vR~WdMr*Cz zNG7&N&u}l^b~FE_E7D5ye~H@V%C@AOmL}uzq`bW}71ufZ#L=Tin^SQqiPJYrv%0FE z7fQ2gr=MG9)3X2CG@HKuGiSo(w`mdmxsqB;Qn+M3z)^v{R3y7n2a@#Ho? ztn^&m75$Urpoms-d>-Izs$Y=T$)YdPnJ%O{g4gt|L8RRm9g3TOC=wY!^@F( z@{AvzgoqZhCXbfo*&4GdS)Oe>M4E(qQ1<}4pHCaEX>UpJI$Y`lQ26^aJ7r5uMarx zPlw~la6HaYL_Mk_M7<8;Mbxvp|8EDni24UQ?Ir39HShTC(BWkrkJYl*5mDb!-@M0l z-MS7@|CNYZwt4zeoX^wi#xvaSPgHK-1W`|hnY!$Ok;aEj)QiIz7SeOWIZ;pZGZ6Jv zes+j@g|k4^lbz--(n%od3ta6Y>X~83{p;a)Djc8ZD54(M5uzUDD59R%{r@=JMb!VK z(_W&!G~yj!(*qI(I-VHGUPnYdMiUYBsG6Rt&!)dGqSjsb)^nmBweGp!pQzlv38H2* zwebPW)T+d9RWCiBR9%Nwi#qgLj)nBCk({U(_!+wrJl>ro0KgZ* z@wkq!juy%LGMAF-WPCC-Ddt%|on&g!Sl6kyN}yM_DK+M6cvM0{^~eHSP?oq2)a1j#*mwcFAO_^&JPC!T^w%J4MB*RdWN8(1rT&`*bsDa zSXcpSgI0Xe!3y%BFIECh{9bDn5T7xQNx#Scq60>`H|$Dt8@;Dz?RN`4n~2ZXgPmMC z+^QR=vPMnuF3z^?=K60reIi?TM?NvQz2fgE$!tr?>UmMI`N2=#lE=l#A(yh1RF4c3Q zEF!iO;{eo-x9G2YxZRNkHxy}WJ^orYv41rjFNfnfjv}k3sK_c&F0vleocM*tY>}+Lq|;uqUQ|N> zcr_eP>UcJP9g+17E{UwK>(&L_mV%jht!iXlZe&G7c#HmI?Gp0ylJzn=MlRjR10(T= zJzM|m7>bu`v*~}3p}5El#bYK-+chJrn~JpPPu5#A6-U1hX6yW>;()XwK?-#KcW+=S zzK*>a?Em-CO6&=}+^m7fY&8Q>rq4UP2o@bdn$g)-1*;2H`@(1&k)~IDaa0pnzsu5? zGWdwUC>B)-0h%#2aJ*ba9UVIXm#j1{d11&V|DbUR77E?b0xroyCc}u$6hp^CU=NJo ztPo*~UnaaGd17H6K^Qj=3#e0L7;YSO>Hj_#c?9ZmdA5yJgrRI81n|n2%4s?8SGIO} z%I!`1#ok0tVc(aVhtpEa`n)vS#(~B-8kK?n3%tW8OC=xSWNj8hlwr(ftT0mgOWeOd zi+BM}TLv8}X(-3UYhyf=Lv*R!Mh5GB1mA^GRN+`MjFo~h*PJEpD0~hJpOx$cp)FR+ zJQ%~taE235*=YXxwC=&fp$A4rlV~EIXjj0rOli!sHn0DM5zHiE5@NN=jU-C%GlGnV zCRH`5CHPA;Nt@mqe$-e}O~xnVVGcZ8$DPVzk?DAdS3WS(1nH-a$z9@?dKl&cXI-Jo zq4XrElI07H3>{fl_Cgq$PGsW^5J|``^F)AS2s$ltKOue1`Z3Z8;j$xThd%~s%oBln znI}^1@kGoilqXU(GrK++zf9~yAfHqWgvVbB=P%ZhD!4H-yV^0cnG?C8Ee27H%YewN zYu-Qm2@lAsYy0`m0A_8Q>;P%F&mH6i_h&Q#1(jsf&74uqf@;S#8a0~H!o0`P z9`BKJSYlK(lfO0Ep&2tP_>SF!=B`nZVz@>o1^T&0%o}KmYgEo$BmA*>ea9}>2&nrw zj5p^R$wa6%?}GQDHJA(OOl?Y78tw8tq5WO}|VQ4NQGpEyN-*3GO@Q=m6t zX619MkM)c!FG$zs56rAv3C6wGW>)nEW|p*BFte&RYi11_m-I8UR=hW67816PnN`cp zEJWz`S|2m3)@5d)f85NfrvCz+K2a)>q9AdDnKhKwu;wIQWpJhEy6&U(YcjK{778iBc-yJfXFSXSqM zU|Gq=_&_Zy&DG)CQrWj+SvB3VYPx0B?6ItxU6xg|$Fkxa%c_}KRyYTFko-@$Wu++9 zO0?q?|)!fec+bW?W^otv8)!mWwqEXtHnK* z)#5J83OlQ9?x<@R?!%L+64-C9-`24~v}+xILDo*PUD@|YFtncD~Y#Hfy3Z;@;R-+xus-~sE4=QGL^+v0KwR|-Y#b;(_*J>b0$=|_5c_CgM zRs)xYnAP?7(z3du{1sLMFDo*@YT%pU{8GbL1Er=eYKbf><~@CMVphZN zn`OnK{LQTf0`+aL25MpFCM_!|UZQpHon=MjqeJ zjwG1Txt7(L(UfeQkj%9R%c|PPvZ{7jR-}BnWmQYR^{s+sh3!UYiJe0xUde8lO@EgA zT`?=I>WLarRFc?#&U~1V(Kg$ZGl3OJ!I+hiwYd39K zu|(>5R?_ZSo)xCqSVHoZ5~s`@swcI~94htXS)Iu(D|+acXEmH#R@|LySrrqpw)(n>&96is9mr%#zMG&GLAGMx5tD1zQ@~mp6rAbn{sDy7ozMyOt z9zP$>&kb6n(X_PD*0XY$2DzS=Wt9uCEV+tYm+U8Ob8C543+d@D%gUh7R|5_7b7U>v zYMzyLUfrZ+b^9uN0n4g`ypU(LGyw&bWT{(LOC?BZojj|hMl)KNWrdyH6|>?T%WA1C zE9O0YbSx|8yzkLL*4&69Nu6G8obhw)LOfoE^e{eA?raBW(^dCpo*f#Ty$N`c+{drc%BHQ=Kgf3cE zZx7C~tTg54wX8I^Wm%CO!Y}Yy*ky+_|9~y48yv4?Vrv*oLg2PsXLwB<{*U3 zEGtXD?zXICe;3l(gZ*8!tla+2(%Fla730x)p3W`^Rkc8qy_3$4jP6NiKgACCQRZk* z%<3e`_HJ3xFV3L0@YwcADc3BWz3yr9q_SJTXwdE7{ln*e@|8dQH^24W(o{*WkKsn= zm`$b)or!N?MxCs@-)0mvsysm1jZ&*(J1)^ON?&OtHtbpE1SW z)+W0aPKMMf>v)(8%wLAdZ7*z)ENPv)w`EMRQ`9V|Z+DC;i3@^_3ma3~QW31#xyICa zZI=ZX=R|Lesk7ny4E!R+46vq`f`tTD`x;aEmQc0s><+yZW2z!cLK{GCynVLYm@?4M z+-UnObh3>mHd$=zEbn%cTDp=Hj41*5F0^#EMYLeoR5F9o;vo%|oWkrb~;))SGt2O`a?EoBg~6W9k;k^j2qp zuARL7$TXr&+m&R*ZQc>tym3l;dq&0)ZLa>Z-+ze1C97vcmR6?$NfQ*bu^vw9NI@F< zV7al=1c&KbXmV9YN@37M8ArkN9+6XaHuhf5=y=Zd9b*7?nt=Eh%HHI89bY6@tYDyz zq}uAl2DB4QhGc~5Ihqul9}DLcix`m{s3HeO3OvOodTsa~k%8YD7_KSGeXKFdCKu#C zNRw2ObSh`kpnKc+iH5V;@rHUC@;&t@8ZBqBW4=Sa-=6wThq&Vt@rj1*WjWChln>cv z|B>_}wTgla%E3Gth6ftM^@i20 zO3zYVj0xQ?rBPB^y{J?wHIM-qg8gn_7WKW(QfJ@mn3MgkBU%tCCRzv~7lIya&JG0~ z;%%Km7f6Ke-DO&+c+2*D7d5~YyW$$)ZTro(CG81cep?F_S33jr?k?*HvmkocXl1XG ztZ@ynMj9Yj;xU(1n}il7RM&(z$G9?~$~i)HjfAQSZ>%W@)qFqTO|bAg^|rCd^|}|{ zxJFSOt4#7v-3p5k$*OnQ#FF&psZ8vG)JucJhe%bFo#6gO>K*wdg zb4NKY3z(s>kI|8H=(x<4W0|Kr23OEJ%Yt%@r5w)=+_Z8$Kj5T2H&9TH=LZ5=sl_$l z?C(*I=b5Gu_WXdLbmh3Lk8-rvL^v6kH^F(g4PGV`O>^hK;hhav#d`fk1ckoluwGvQ z@x1X_k@HRzIPV4f?ImAcir+=amlr$3^csqD#KdYB6RVy7R`-aB)m>s@b&r_f9QInB ziHX$(_PP}@ajfdRbkxkXIDMxQ#Kf^`;3o?9<@~gem^j8N4BT|gXw_d#P-*YRv|21- zZpHhGw7Ozff-tw=POEEK8B2?h-l9>DQ3d{Nm?Et{@ck0vSMfmqI-K*Da0JVWuc(CM zg>PylMQ4AKOE_vS6TL{+S|tZB;{tNxG?Z|x&J!NJwGxhZRJOhEHCz@Z>HGy814&iD z@pmnbV+8&aTEH<2Q8tLP5k0asT9GpkP~xEW2~gUuc*QL9dK+h`#Kuw6NV;OT zto*)A*$w%;ZEjHf_NaEj)~CvEp*mS&DPN5#yRpKS7gXezG9Ar!3;b0M&$d`AOO>S%F7 zePb|nvT|!xjx{ZBwbF6MWH+d03^Z3&U5x5DUDe2b@^46RUR1#`j#*){bD`-OUH6(- zZ-gcb)hyHU);nrP9jy~ue#RKQR8Q7)3SO;&hq=zy?)F_dhe5%9h0N63YxL4x#Vn@A zvnZORk<34SK|2Eal?O+t97wdC@XqC5Mu?W0TNK&$E6?$o=|FP}=hP$|Y%ev|@selr zt~%XZ$+I)D*Tx#7-0}NG?wrUEj4Xlwpj3Zd$&I&QY*D$ZDCW-?mCuXkX_D2)JQJF} zuIoGH^SqDz@B-CYwVS~QM#h<|^jg7kBmQUDk$_Asv4>xrP7?>!4*{`4Sf!#$!ziwiF~S{52h2M zoku;Jv+X7M^>sXfxNfh?uWZqkgjKox%C@~+nP3eqzj6+5w4APE%_>}?SZL-lSUyEo zIush&vK{9v+YJJnMHVQslgFWQm%-4ILm8q}-Lcv3MVr+N)H@xLuAC>TkY~S$R9HQI zaw%ZuIqt#(BTIXt3PYmLg`tA8z#7Dmc?uKp#UU6-Gl%-6x1O9j5nu9ti;;xh{E6=a zk#|lr7Lj*GGZu!l3ePU`UJaK{h2zQ4^hKS!$a^8&T4)cC1l2{gL*!l25s`O#IQeKt z7I?Tm>S#-&0Em8??&08rqW*&=UI_?0;8jCFCFU2mfQU~@79zpyo0iJ z@t?Giz0xpJ^dv?1(KW?d*RKzGt!vXYM3FLGW7V%IW^8rO#Kx7PzNtvxWJ;!jqDV6R zQsFBeNv2vVDXJyYDvEBh0GKNjFQW~Izly@vR5&HQ4sBl!=O?);g%T3~fS{vP@(nBI zN@VYjv!J@wNb!7$nW=j7N=1noH>*?(S^~O-C54+)Dy%3>#BYsuDU~auL8-hwimH4#1z~s)J^4*+Mb@xsuO__)LkfnRj zzGUfM?jLtuPwDR7rG9c`7a&X5Qa{Xe28hM^1+pOCZbH`^Sx%L^$nvt+kDG{JEkl;u zUO1SDPkX;bvM}|XZ39WZ4}|Se>?P^?uG-74>#qo{@XFtE6lUH{flvaF-)m&u9ka&Gz+Y*s&K9op_{&B|~qIydh$+FtBJ!jQV-^KCEb z5+gTsZZHDAACzNX+YAAU^^_^c_s2#n*k

EYot>FH1QRJdjX48@IjYTQEovuJdKA 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 F|6f!5B(wkk From 1ff24efcba2a0997d9052db567adaa6267cb345c Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Tue, 26 May 2020 15:00:18 +0800 Subject: [PATCH 03/14] Remove all frameworks except wasm-bindgen --- frameworks/keyed/angular-ng/.gitignore | 46 - frameworks/keyed/angular-ng/.npmrc | 1 - frameworks/keyed/angular-ng/README.md | 27 - frameworks/keyed/angular-ng/angular.json | 81 - frameworks/keyed/angular-ng/browserslist | 8 - frameworks/keyed/angular-ng/package.json | 39 - .../angular-ng/src/app/app.component.html | 42 - .../keyed/angular-ng/src/app/app.component.ts | 87 - .../keyed/angular-ng/src/app/app.module.ts | 16 - .../keyed/angular-ng/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 16 - frameworks/keyed/angular-ng/src/favicon.ico | Bin 948 -> 0 bytes frameworks/keyed/angular-ng/src/index.html | 15 - frameworks/keyed/angular-ng/src/main.ts | 12 - frameworks/keyed/angular-ng/src/polyfills.ts | 63 - frameworks/keyed/angular-ng/src/styles.css | 1 - frameworks/keyed/angular-ng/tsconfig.app.json | 18 - frameworks/keyed/angular-ng/tsconfig.json | 26 - frameworks/keyed/angular-noopzone/.gitignore | 3 - .../keyed/angular-noopzone/closure.conf | 40 - frameworks/keyed/angular-noopzone/index.html | 15 - .../keyed/angular-noopzone/package.json | 41 - .../keyed/angular-noopzone/rollup.config.js | 14 - frameworks/keyed/angular-noopzone/src/app.ts | 162 - frameworks/keyed/angular-noopzone/src/main.ts | 15 - .../keyed/angular-noopzone/tsconfig.json | 28 - frameworks/keyed/angular-optimized/.gitignore | 3 - .../keyed/angular-optimized/closure.conf | 43 - frameworks/keyed/angular-optimized/index.html | 15 - .../keyed/angular-optimized/package.json | 42 - .../keyed/angular-optimized/rollup.config.js | 14 - frameworks/keyed/angular-optimized/src/app.ts | 170 - .../keyed/angular-optimized/src/main.ts | 15 - .../keyed/angular-optimized/tsconfig.json | 28 - frameworks/keyed/angular/.gitignore | 3 - frameworks/keyed/angular/closure.conf | 40 - frameworks/keyed/angular/index.html | 16 - frameworks/keyed/angular/package.json | 42 - frameworks/keyed/angular/rollup.config.js | 14 - frameworks/keyed/angular/src/app.ts | 134 - frameworks/keyed/angular/src/main.ts | 6 - frameworks/keyed/angular/tsconfig.json | 29 - frameworks/keyed/angularjs/index.html | 12 - frameworks/keyed/angularjs/package.json | 33 - .../keyed/angularjs/src/home.controller.js | 62 - .../keyed/angularjs/src/home.template.html | 44 - frameworks/keyed/angularjs/src/main.js | 20 - frameworks/keyed/angularjs/webpack.config.js | 27 - frameworks/keyed/apprun/index.html | 12 - frameworks/keyed/apprun/package.json | 34 - frameworks/keyed/apprun/src/main.tsx | 139 - frameworks/keyed/apprun/src/store.ts | 72 - frameworks/keyed/apprun/tsconfig.json | 10 - frameworks/keyed/apprun/webpack.config.js | 20 - frameworks/keyed/attodom/.editorconfig | 8 - frameworks/keyed/attodom/index.html | 11 - frameworks/keyed/attodom/index.js | 8 - frameworks/keyed/attodom/package.json | 27 - frameworks/keyed/attodom/src/store.js | 87 - frameworks/keyed/attodom/src/view.js | 86 - frameworks/keyed/aurelia/.babelrc | 17 - frameworks/keyed/aurelia/.gitignore | 2 - .../aurelia/aurelia_project/aurelia.json | 127 - .../aurelia_project/environments/dev.js | 3 - .../aurelia_project/environments/prod.js | 3 - .../aurelia_project/environments/stage.js | 3 - .../aurelia_project/generators/attribute.js | 44 - .../aurelia_project/generators/attribute.json | 4 - .../generators/binding-behavior.js | 41 - .../generators/binding-behavior.json | 4 - .../aurelia_project/generators/component.js | 51 - .../aurelia_project/generators/component.json | 4 - .../aurelia_project/generators/element.js | 48 - .../aurelia_project/generators/element.json | 4 - .../aurelia_project/generators/generator.js | 73 - .../aurelia_project/generators/generator.json | 4 - .../aurelia_project/generators/task.js | 41 - .../aurelia_project/generators/task.json | 4 - .../generators/value-converter.js | 41 - .../generators/value-converter.json | 4 - .../aurelia/aurelia_project/tasks/build.js | 40 - .../aurelia/aurelia_project/tasks/build.json | 16 - .../aurelia_project/tasks/copy-files.js | 45 - .../aurelia/aurelia_project/tasks/lint.js | 10 - .../aurelia_project/tasks/process-css.js | 10 - .../aurelia_project/tasks/process-markup.js | 21 - .../aurelia/aurelia_project/tasks/run.js | 54 - .../aurelia/aurelia_project/tasks/run.json | 16 - .../aurelia_project/tasks/transpile.js | 32 - .../aurelia/aurelia_project/tasks/watch.js | 128 - frameworks/keyed/aurelia/favicon.ico | Bin 318 -> 0 bytes frameworks/keyed/aurelia/index.html | 12 - frameworks/keyed/aurelia/jsconfig.json | 11 - frameworks/keyed/aurelia/package.json | 71 - frameworks/keyed/aurelia/src/app.html | 47 - frameworks/keyed/aurelia/src/app.js | 35 - .../keyed/aurelia/src/aurelia-polyfills.js | 29 - frameworks/keyed/aurelia/src/main.js | 15 - frameworks/keyed/aurelia/src/store.js | 73 - frameworks/keyed/binding.scala/.gitignore | 2 - frameworks/keyed/binding.scala/build.sbt | 11 - frameworks/keyed/binding.scala/js/build.sbt | 7 - .../thoughtworks/binding/benchmark/Main.scala | 55 - .../binding/benchmark/Store.scala | 155 - frameworks/keyed/binding.scala/package.json | 17 - .../binding.scala/project/build.properties | 1 - .../keyed/binding.scala/project/plugins.sbt | 5 - .../binding.scala/src/main/assets/index.html | 12 - frameworks/keyed/blazor-wasm/.gitignore | 5 - .../keyed/blazor-wasm/dotnet-install.cmd | 1 - .../keyed/blazor-wasm/dotnet-install.sh | 3 - frameworks/keyed/blazor-wasm/package.json | 36 - frameworks/keyed/blazor-wasm/src/App.razor | 56 - frameworks/keyed/blazor-wasm/src/App.razor.cs | 88 - frameworks/keyed/blazor-wasm/src/Data.cs | 8 - frameworks/keyed/blazor-wasm/src/Program.cs | 16 - .../src/Properties/launchSettings.json | 29 - .../keyed/blazor-wasm/src/_Imports.razor | 8 - .../keyed/blazor-wasm/src/blazor-wasm.csproj | 15 - frameworks/keyed/blazor-wasm/src/global.json | 5 - .../keyed/blazor-wasm/src/wwwroot/index.html | 17 - frameworks/keyed/bobril/.vscode/settings.json | 3 - frameworks/keyed/bobril/index.html | 1 - frameworks/keyed/bobril/package.json | 54 - frameworks/keyed/bobril/src/app.ts | 186 - frameworks/keyed/bobril/src/store.ts | 77 - frameworks/keyed/bobril/tsconfig.json | 15 - frameworks/keyed/choo/index.html | 12 - frameworks/keyed/choo/package.json | 31 - frameworks/keyed/choo/src/index.js | 80 - frameworks/keyed/choo/src/rowsView.js | 55 - frameworks/keyed/choo/src/store.js | 57 - frameworks/keyed/choo/src/utils.js | 25 - frameworks/keyed/crui/index.html | 12 - frameworks/keyed/crui/package.json | 34 - frameworks/keyed/crui/src/app.ts | 18 - frameworks/keyed/crui/src/jumbotron.ts | 38 - frameworks/keyed/crui/src/main.ts | 9 - frameworks/keyed/crui/src/store.ts | 103 - frameworks/keyed/crui/src/table.ts | 57 - frameworks/keyed/crui/src/utils.ts | 12 - frameworks/keyed/crui/tsconfig.json | 28 - frameworks/keyed/crui/webpack.config.js | 75 - frameworks/keyed/datum/.babelrc | 3 - frameworks/keyed/datum/index.html | 57 - frameworks/keyed/datum/package.json | 27 - frameworks/keyed/datum/src/Main.js | 101 - frameworks/keyed/datum/webpack.config.js | 41 - frameworks/keyed/dojo/.dojorc | 6 - frameworks/keyed/dojo/.gitignore | 2 - frameworks/keyed/dojo/README.md | 1 - frameworks/keyed/dojo/package.json | 20 - frameworks/keyed/dojo/src/App.ts | 34 - frameworks/keyed/dojo/src/Button.ts | 21 - frameworks/keyed/dojo/src/Buttons.ts | 28 - frameworks/keyed/dojo/src/Row.ts | 41 - frameworks/keyed/dojo/src/Store.ts | 185 - frameworks/keyed/dojo/src/index.html | 10 - frameworks/keyed/dojo/src/main.css | 1 - frameworks/keyed/dojo/src/main.ts | 5 - frameworks/keyed/dojo/tsconfig.json | 27 - frameworks/keyed/domc/app.old.js | 2 - frameworks/keyed/domc/index.html | 60 - frameworks/keyed/domc/package.json | 40 - frameworks/keyed/domc/rollup.config.js | 39 - frameworks/keyed/domc/src/app.js | 74 - frameworks/keyed/domdiff/index.html | 50 - frameworks/keyed/domdiff/package.json | 35 - frameworks/keyed/domdiff/rollup.config.js | 17 - frameworks/keyed/domdiff/src/index.js | 31 - frameworks/keyed/domdiff/src/utils.js | 39 - frameworks/keyed/dominator/.gitignore | 5 - frameworks/keyed/dominator/Cargo.toml | 29 - frameworks/keyed/dominator/README.md | 16 - frameworks/keyed/dominator/bundled-dist/1.js | 1 - .../accca9b65c226d0a493c.module.wasm | Bin 128085 -> 0 bytes .../keyed/dominator/bundled-dist/index.js | 1 - frameworks/keyed/dominator/index.html | 12 - frameworks/keyed/dominator/js/index.js | 1 - frameworks/keyed/dominator/package.json | 23 - frameworks/keyed/dominator/src/lib.rs | 291 - frameworks/keyed/dominator/webpack.config.js | 23 - frameworks/keyed/domvm/build.js | 80 - frameworks/keyed/domvm/index.html | 11 - frameworks/keyed/domvm/package.json | 20 - frameworks/keyed/domvm/src/main.es6.js | 101 - frameworks/keyed/domvm/src/store.es6.js | 86 - frameworks/keyed/doz/index.html | 6 - frameworks/keyed/doz/package.json | 33 - frameworks/keyed/doz/src/index.js | 142 - frameworks/keyed/dyo/.babelrc | 8 - frameworks/keyed/dyo/index.html | 12 - frameworks/keyed/dyo/package.json | 36 - frameworks/keyed/dyo/src/main.js | 129 - frameworks/keyed/dyo/webpack.config.js | 49 - frameworks/keyed/elm/.gitignore | 6 - frameworks/keyed/elm/elm.json | 25 - frameworks/keyed/elm/index.html | 15 - frameworks/keyed/elm/package.json | 26 - frameworks/keyed/elm/src/Main.elm | 366 - frameworks/keyed/ember/.bowerrc | 4 - frameworks/keyed/ember/.editorconfig | 20 - frameworks/keyed/ember/.ember-cli | 9 - frameworks/keyed/ember/.eslintignore | 20 - frameworks/keyed/ember/.eslintrc.js | 46 - frameworks/keyed/ember/.gitignore | 25 - frameworks/keyed/ember/.template-lintrc.js | 5 - frameworks/keyed/ember/.travis.yml | 33 - frameworks/keyed/ember/.watchmanconfig | 3 - frameworks/keyed/ember/HOW_TO_UPDATE.txt | 2 - frameworks/keyed/ember/README.md | 58 - frameworks/keyed/ember/app/app.js | 12 - .../keyed/ember/app/components/my-table.js | 67 - .../app/components/table-row/template.hbs | 7 - .../keyed/ember/app/controllers/.gitkeep | 0 frameworks/keyed/ember/app/helpers/.gitkeep | 0 frameworks/keyed/ember/app/helpers/eq.js | 5 - frameworks/keyed/ember/app/index.html | 25 - frameworks/keyed/ember/app/router.js | 12 - frameworks/keyed/ember/app/routes/.gitkeep | 0 frameworks/keyed/ember/app/styles/app.css | 0 .../app/templates/components/bs-button.hbs | 6 - .../app/templates/components/my-table.hbs | 55 - .../keyed/ember/app/templates/index.hbs | 3 - .../ember/app/utils/benchmark-helpers.js | 89 - frameworks/keyed/ember/config/environment.js | 63 - .../keyed/ember/config/optional-features.json | 6 - frameworks/keyed/ember/config/targets.js | 11 - frameworks/keyed/ember/ember-cli-build.js | 35 - frameworks/keyed/ember/package.json | 63 - frameworks/keyed/ember/public/crossdomain.xml | 15 - frameworks/keyed/ember/public/robots.txt | 3 - frameworks/keyed/ember/testem.js | 24 - .../keyed/ember/tests/helpers/destroy-app.js | 5 - .../tests/helpers/module-for-acceptance.js | 21 - .../keyed/ember/tests/helpers/resolver.js | 11 - .../keyed/ember/tests/helpers/start-app.js | 17 - frameworks/keyed/ember/tests/index.html | 33 - .../keyed/ember/tests/integration/.gitkeep | 0 .../performant-each/component-test.js | 26 - .../components/table-row/component-test.js | 26 - frameworks/keyed/ember/tests/test-helper.js | 8 - frameworks/keyed/ember/tests/unit/.gitkeep | 0 frameworks/keyed/ember/vendor/.gitkeep | 0 frameworks/keyed/endorphin/index.html | 12 - frameworks/keyed/endorphin/package.json | 29 - frameworks/keyed/endorphin/rollup.config.js | 19 - .../keyed/endorphin/src/app-ui/app-ui.html | 52 - .../keyed/endorphin/src/app-ui/app-ui.js | 71 - frameworks/keyed/endorphin/src/app.js | 4 - frameworks/keyed/etch/.babelrc | 4 - frameworks/keyed/etch/index.html | 12 - frameworks/keyed/etch/package.json | 24 - frameworks/keyed/etch/src/Main.jsx | 105 - frameworks/keyed/etch/src/Row.jsx | 44 - frameworks/keyed/etch/src/Store.es6.js | 59 - frameworks/keyed/etch/src/main.es6.js | 5 - frameworks/keyed/etch/webpack.config.js | 49 - frameworks/keyed/faster-dom/index.html | 13 - frameworks/keyed/faster-dom/package.json | 34 - frameworks/keyed/faster-dom/src/Main.js | 290 - frameworks/keyed/faster-dom/src/Store.js | 124 - frameworks/keyed/faster-dom/webpack.config.js | 80 - frameworks/keyed/fidan/app.tsx | 184 - frameworks/keyed/fidan/data.ts | 83 - frameworks/keyed/fidan/index.html | 12 - frameworks/keyed/fidan/package.json | 40 - frameworks/keyed/fidan/webpack.config.js | 21 - frameworks/keyed/fntags/.gitignore | 2 - frameworks/keyed/fntags/build.js | 20 - frameworks/keyed/fntags/index.html | 11 - frameworks/keyed/fntags/package.json | 21 - frameworks/keyed/fntags/src/Main.js | 125 - frameworks/keyed/ganic/.babelrc | 24 - frameworks/keyed/ganic/index.html | 12 - frameworks/keyed/ganic/package.json | 35 - frameworks/keyed/ganic/src/Benchmark.js | 60 - frameworks/keyed/ganic/src/buildData.js | 23 - frameworks/keyed/ganic/src/main.js | 5 - frameworks/keyed/ganic/src/useStore.js | 44 - frameworks/keyed/ganic/webpack.config.js | 61 - frameworks/keyed/glasgow/.babelrc | 5 - frameworks/keyed/glasgow/index.html | 12 - frameworks/keyed/glasgow/package.json | 37 - frameworks/keyed/glasgow/readme.md | 2 - frameworks/keyed/glasgow/rollup.config.js | 42 - frameworks/keyed/glasgow/src/controller.jsx | 118 - frameworks/keyed/glasgow/src/main.es6.js | 3 - frameworks/keyed/glasgow/src/store.es6.js | 142 - frameworks/keyed/glasgow/webpack.config.js | 45 - frameworks/keyed/glimmer/.editorconfig | 20 - frameworks/keyed/glimmer/.ember-cli | 3 - frameworks/keyed/glimmer/.gitignore | 3 - frameworks/keyed/glimmer/.template-lintrc.js | 5 - frameworks/keyed/glimmer/.watchmanconfig | 3 - frameworks/keyed/glimmer/README.md | 34 - .../keyed/glimmer/config/environment.js | 10 - .../keyed/glimmer/config/module-map.d.ts | 11 - .../config/resolver-configuration.d.ts | 9 - frameworks/keyed/glimmer/config/targets.js | 9 - frameworks/keyed/glimmer/ember-cli-build.js | 11 - frameworks/keyed/glimmer/package.json | 45 - frameworks/keyed/glimmer/public/robots.txt | 3 - frameworks/keyed/glimmer/src/index.ts | 23 - frameworks/keyed/glimmer/src/main.ts | 20 - .../src/ui/components/BsButton/template.hbs | 8 - .../ui/components/Glimmer/component-test.ts | 13 - .../src/ui/components/Glimmer/component.ts | 93 - .../src/ui/components/Glimmer/template.hbs | 53 - .../ui/components/PerformantEach/component.ts | 16 - .../ui/components/PerformantEach/template.hbs | 4 - .../src/ui/components/Table/template.hbs | 6 - frameworks/keyed/glimmer/src/ui/index.html | 24 - .../keyed/glimmer/src/ui/styles/app.css | 3 - .../glimmer/src/utils/benchmark-helpers.ts | 92 - .../src/utils/test-helpers/test-helper.ts | 7 - frameworks/keyed/glimmer/testem.json | 5 - frameworks/keyed/glimmer/tests/index.html | 22 - frameworks/keyed/glimmer/tsconfig.json | 18 - frameworks/keyed/glimmer/tslint.json | 15 - frameworks/keyed/helix/.clj-kondo/config.edn | 1 - frameworks/keyed/helix/.gitignore | 4 - frameworks/keyed/helix/index-dev.html | 12 - frameworks/keyed/helix/index.html | 12 - frameworks/keyed/helix/package.json | 20 - frameworks/keyed/helix/shadow-cljs.edn | 34 - frameworks/keyed/helix/src/demo/main.cljs | 115 - frameworks/keyed/helix/src/demo/utils.cljs | 31 - frameworks/keyed/heresy/index.html | 6 - frameworks/keyed/heresy/package.json | 38 - frameworks/keyed/heresy/rollup.config.js | 39 - frameworks/keyed/heresy/src/index.js | 14 - frameworks/keyed/heresy/src/ui/app.js | 53 - frameworks/keyed/heresy/src/ui/button.js | 18 - frameworks/keyed/heresy/src/ui/row.js | 21 - frameworks/keyed/hullo/.babelrc | 3 - frameworks/keyed/hullo/.yo-rc.json | 45 - frameworks/keyed/hullo/_webpack.config.js | 32 - frameworks/keyed/hullo/index.html | 12 - frameworks/keyed/hullo/package.json | 37 - frameworks/keyed/hullo/src/index.js | 333 - frameworks/keyed/hullo/webpack.config.js | 18 - frameworks/keyed/hyperapp/index.html | 14 - frameworks/keyed/hyperapp/package.json | 27 - frameworks/keyed/hyperapp/src/index.js | 211 - frameworks/keyed/hyperapp/src/store.js | 76 - frameworks/keyed/hyperhtml/index.html | 12 - frameworks/keyed/hyperhtml/package.json | 26 - frameworks/keyed/hyperhtml/rollup.config.js | 39 - frameworks/keyed/hyperhtml/src/index.js | 60 - frameworks/keyed/hyperhtml/src/row.js | 16 - frameworks/keyed/hyperoop/index.html | 14 - frameworks/keyed/hyperoop/package.json | 31 - frameworks/keyed/hyperoop/rollup.config.js | 19 - frameworks/keyed/hyperoop/src/index.tsx | 91 - frameworks/keyed/hyperoop/src/rowsView.tsx | 18 - frameworks/keyed/hyperoop/src/store.ts | 151 - frameworks/keyed/hyperoop/tsconfig.json | 20 - frameworks/keyed/imba/index.html | 15 - frameworks/keyed/imba/package.json | 32 - frameworks/keyed/imba/src/main.imba | 116 - frameworks/keyed/imba/webpack.config.js | 70 - frameworks/keyed/inferno/.babelrc | 13 - frameworks/keyed/inferno/index.html | 12 - frameworks/keyed/inferno/package.json | 37 - frameworks/keyed/inferno/readme.md | 3 - frameworks/keyed/inferno/rollup.config.js | 74 - frameworks/keyed/inferno/src/controller.jsx | 188 - frameworks/keyed/inferno/src/main.es6.js | 1 - frameworks/keyed/inferno/src/store.es6.js | 140 - frameworks/keyed/isotope/index.html | 11 - frameworks/keyed/isotope/package.json | 30 - frameworks/keyed/isotope/rollup.config.js | 18 - frameworks/keyed/isotope/src/main.js | 116 - frameworks/keyed/isotope/src/menu.js | 32 - frameworks/keyed/isotope/src/utils.js | 72 - frameworks/keyed/ivi/.gitignore | 10 - frameworks/keyed/ivi/index.html | 15 - frameworks/keyed/ivi/package.json | 28 - frameworks/keyed/ivi/rollup.config.js | 38 - frameworks/keyed/ivi/src/main.js | 96 - frameworks/keyed/knockout/index.html | 57 - frameworks/keyed/knockout/package.json | 23 - frameworks/keyed/knockout/rollup.config.js | 23 - frameworks/keyed/knockout/src/Main.js | 91 - frameworks/keyed/ko-jsx/index.html | 12 - frameworks/keyed/ko-jsx/package.json | 32 - frameworks/keyed/ko-jsx/rollup.config.js | 34 - frameworks/keyed/ko-jsx/src/Main.js | 68 - frameworks/keyed/ko-jsx/src/template.jsx | 50 - frameworks/keyed/lighterhtml/index.html | 6 - frameworks/keyed/lighterhtml/package.json | 38 - frameworks/keyed/lighterhtml/rollup.config.js | 39 - frameworks/keyed/lighterhtml/src/index.js | 19 - frameworks/keyed/lighterhtml/src/jumbotron.js | 39 - frameworks/keyed/lighterhtml/src/table.js | 34 - frameworks/keyed/lit-element/index.html | 13 - frameworks/keyed/lit-element/package.json | 39 - frameworks/keyed/lit-element/rollup.config.js | 15 - frameworks/keyed/lit-element/src/main.ts | 112 - frameworks/keyed/lit-element/src/store.ts | 72 - frameworks/keyed/lit-element/tsconfig.json | 13 - frameworks/keyed/lit-html/index.html | 6 - frameworks/keyed/lit-html/package.json | 34 - frameworks/keyed/lit-html/rollup.config.js | 11 - frameworks/keyed/lit-html/src/index.js | 143 - frameworks/keyed/maquette/build.js | 17 - frameworks/keyed/maquette/index.html | 11 - frameworks/keyed/maquette/package.json | 22 - frameworks/keyed/maquette/src/main.es6.js | 111 - frameworks/keyed/maquette/src/store.es6.js | 86 - frameworks/keyed/marionette-jquery/.babelrc | 3 - frameworks/keyed/marionette-jquery/index.html | 49 - .../keyed/marionette-jquery/package.json | 26 - .../keyed/marionette-jquery/src/Main.js | 167 - .../keyed/marionette-jquery/src/row.tpl.js | 10 - .../keyed/marionette-jquery/webpack.config.js | 42 - frameworks/keyed/marionette/.babelrc | 3 - frameworks/keyed/marionette/index.html | 49 - frameworks/keyed/marionette/package.json | 26 - frameworks/keyed/marionette/src/Main.js | 172 - frameworks/keyed/marionette/src/mn-domapi.js | 31 - .../marionette/src/mn-morphdom-renderer.js | 7 - .../keyed/marionette/src/mn-native-view.js | 141 - .../keyed/marionette/src/rowtemplate.js | 37 - frameworks/keyed/marionette/webpack.config.js | 46 - frameworks/keyed/marko/.gitignore | 1 - frameworks/keyed/marko/index.html | 14 - frameworks/keyed/marko/package.json | 38 - frameworks/keyed/marko/rollup.config.js | 49 - frameworks/keyed/marko/src/client.js | 4 - frameworks/keyed/marko/src/main/component.js | 67 - .../keyed/marko/src/main/components/row.marko | 25 - frameworks/keyed/marko/src/main/index.marko | 43 - frameworks/keyed/mikado/index.html | 13 - frameworks/keyed/mikado/package.json | 28 - frameworks/keyed/mikado/src/data.js | 40 - frameworks/keyed/mikado/src/main.js | 32 - frameworks/keyed/mikado/src/template/app.html | 35 - .../keyed/mikado/src/template/item.html | 12 - frameworks/keyed/mikado/task/build.js | 115 - frameworks/keyed/mimbl/buildDev.bat | 6 - frameworks/keyed/mimbl/buildProd.bat | 6 - frameworks/keyed/mimbl/index.html | 12 - frameworks/keyed/mimbl/indexDev.html | 13 - frameworks/keyed/mimbl/package.json | 34 - frameworks/keyed/mimbl/src/Main.tsx | 103 - frameworks/keyed/mimbl/src/Row.tsx | 75 - frameworks/keyed/mimbl/src/Store.js | 66 - frameworks/keyed/mimbl/src/TBody.tsx | 90 - frameworks/keyed/mimbl/tsconfig.json | 21 - frameworks/keyed/mimbl/webpack.config.js | 37 - frameworks/keyed/miso/.gitignore | 5 - frameworks/keyed/miso/README.md | 29 - frameworks/keyed/miso/cabal.config | 1 - frameworks/keyed/miso/default.nix | 20 - frameworks/keyed/miso/dist-bundle/all.min.js | 897 - frameworks/keyed/miso/dist-bundle/index.html | 14 - .../keyed/miso/miso-benchmark-keyed.cabal | 22 - frameworks/keyed/miso/package.json | 31 - frameworks/keyed/miso/src/Main.hs | 325 - frameworks/keyed/misojs/.gitignore | 5 - frameworks/keyed/misojs/README.md | 21 - frameworks/keyed/misojs/delegate.js | 129 - frameworks/keyed/misojs/diff.js | 360 - frameworks/keyed/misojs/index.html | 19 - frameworks/keyed/misojs/main.js | 247 - frameworks/keyed/misojs/package.json | 28 - frameworks/keyed/mithril/.babelrc | 4 - frameworks/keyed/mithril/index.html | 12 - frameworks/keyed/mithril/package.json | 23 - frameworks/keyed/mithril/src/controller.jsx | 108 - frameworks/keyed/mithril/src/main.es6.js | 8 - frameworks/keyed/mithril/src/store.es6.js | 61 - frameworks/keyed/mithril/webpack.config.js | 48 - frameworks/keyed/mobx-jsx/index.html | 12 - frameworks/keyed/mobx-jsx/package.json | 34 - frameworks/keyed/mobx-jsx/rollup.config.js | 30 - frameworks/keyed/mobx-jsx/src/main.jsx | 108 - frameworks/keyed/naiv/.eslintrc.yml | 15 - frameworks/keyed/naiv/index.html | 11 - frameworks/keyed/naiv/package.json | 25 - frameworks/keyed/naiv/rollup.config.js | 17 - frameworks/keyed/naiv/src/index.js | 121 - frameworks/keyed/nervjs/.babelrc | 3 - frameworks/keyed/nervjs/index.html | 12 - frameworks/keyed/nervjs/package.json | 35 - frameworks/keyed/nervjs/src/Main.jsx | 217 - frameworks/keyed/nervjs/src/Store.es6.js | 143 - frameworks/keyed/nervjs/webpack.config.js | 53 - frameworks/keyed/neverland/index.html | 12 - frameworks/keyed/neverland/package.json | 38 - frameworks/keyed/neverland/rollup.config.js | 39 - frameworks/keyed/neverland/src/index.js | 90 - frameworks/keyed/petit-dom/index.html | 14 - frameworks/keyed/petit-dom/package.json | 31 - frameworks/keyed/petit-dom/rollup.config.js | 19 - frameworks/keyed/petit-dom/src/index.js | 158 - frameworks/keyed/petit-dom/src/store.js | 59 - frameworks/keyed/plastiq/index.html | 11 - frameworks/keyed/plastiq/package.json | 24 - .../keyed/plastiq/src/entry/main.es6.jsx | 86 - .../keyed/plastiq/src/entry/store.es6.js | 59 - frameworks/keyed/plastiq/webpack.config.js | 42 - frameworks/keyed/preact/.babelrc | 11 - frameworks/keyed/preact/index.html | 12 - frameworks/keyed/preact/package.json | 36 - frameworks/keyed/preact/preact.test.js | 56 - frameworks/keyed/preact/src/Main.jsx | 102 - frameworks/keyed/preact/src/Row.jsx | 36 - frameworks/keyed/preact/src/Store.es6.js | 59 - frameworks/keyed/preact/test/preact.test.js | 57 - frameworks/keyed/preact/test/setup.js | 18 - frameworks/keyed/preact/webpack.config.js | 57 - frameworks/keyed/ractive/.babelrc | 10 - frameworks/keyed/ractive/index.html | 12 - frameworks/keyed/ractive/package.json | 33 - .../keyed/ractive/src/main.ractive.html | 117 - frameworks/keyed/ractive/webpack.config.js | 46 - frameworks/keyed/rawact/index.html | 12 - frameworks/keyed/rawact/package.json | 39 - frameworks/keyed/rawact/src/main.jsx | 158 - frameworks/keyed/rawact/webpack.config.js | 81 - frameworks/keyed/rax/index.html | 15 - frameworks/keyed/rax/package.json | 37 - frameworks/keyed/rax/src/main.jsx | 160 - frameworks/keyed/rax/webpack.config.js | 78 - frameworks/keyed/react-djinn/index.html | 12 - frameworks/keyed/react-djinn/package.json | 40 - frameworks/keyed/react-djinn/src/main.jsx | 168 - .../keyed/react-djinn/webpack.config.js | 78 - frameworks/keyed/react-easy-state/index.html | 12 - .../keyed/react-easy-state/package.json | 40 - .../keyed/react-easy-state/src/Main.jsx | 50 - frameworks/keyed/react-easy-state/src/Row.jsx | 38 - .../keyed/react-easy-state/src/appStore.js | 56 - .../keyed/react-easy-state/src/index.jsx | 5 - .../react-easy-state/src/randomSentence.js | 11 - .../keyed/react-easy-state/webpack.config.js | 65 - frameworks/keyed/react-hooks/index.html | 12 - frameworks/keyed/react-hooks/package.json | 38 - frameworks/keyed/react-hooks/src/main.jsx | 109 - .../keyed/react-hooks/webpack.config.js | 78 - frameworks/keyed/react-lite/.babelrc | 4 - frameworks/keyed/react-lite/index.html | 12 - frameworks/keyed/react-lite/package.json | 33 - frameworks/keyed/react-lite/src/Main.jsx | 96 - frameworks/keyed/react-lite/src/Row.jsx | 44 - frameworks/keyed/react-lite/src/Store.es6.js | 59 - frameworks/keyed/react-lite/src/main.es6.js | 7 - frameworks/keyed/react-lite/webpack.config.js | 47 - frameworks/keyed/react-mobX/.babelrc | 4 - frameworks/keyed/react-mobX/index.html | 12 - frameworks/keyed/react-mobX/package.json | 42 - frameworks/keyed/react-mobX/src/Main.jsx | 94 - frameworks/keyed/react-mobX/src/Row.jsx | 35 - frameworks/keyed/react-mobX/src/Store.es6.js | 82 - frameworks/keyed/react-mobX/webpack.config.js | 49 - .../keyed/react-redux-combiner/index.html | 12 - .../keyed/react-redux-combiner/package.json | 42 - .../react-redux-combiner/src/controller.jsx | 155 - .../keyed/react-redux-combiner/src/main.jsx | 17 - .../keyed/react-redux-combiner/src/store.js | 99 - .../keyed/react-redux-combiner/src/utils.js | 64 - .../react-redux-combiner/webpack.config.js | 78 - frameworks/keyed/react-redux-hooks/index.html | 12 - .../keyed/react-redux-hooks/package.json | 40 - .../keyed/react-redux-hooks/src/main.jsx | 124 - .../keyed/react-redux-hooks/webpack.config.js | 78 - frameworks/keyed/react-redux/index.html | 12 - frameworks/keyed/react-redux/package.json | 40 - frameworks/keyed/react-redux/src/main.jsx | 152 - .../keyed/react-redux/webpack.config.js | 78 - frameworks/keyed/react/.vscode/settings.json | 3 - frameworks/keyed/react/index.html | 12 - frameworks/keyed/react/package.json | 38 - frameworks/keyed/react/src/main.jsx | 158 - frameworks/keyed/react/webpack.config.js | 78 - frameworks/keyed/reagent/.gitignore | 1 - frameworks/keyed/reagent/index.html | 12 - frameworks/keyed/reagent/package.json | 13 - frameworks/keyed/reagent/project.clj | 37 - frameworks/keyed/reagent/src/demo/main.cljs | 137 - frameworks/keyed/reagent/src/demo/utils.cljs | 31 - frameworks/keyed/reaml-preact/.gitignore | 4 - frameworks/keyed/reaml-preact/.ocamlformat | 6 - frameworks/keyed/reaml-preact/bsconfig.json | 20 - frameworks/keyed/reaml-preact/index.html | 12 - frameworks/keyed/reaml-preact/package.json | 26 - .../keyed/reaml-preact/rollup.config.js | 32 - frameworks/keyed/reaml-preact/src/Main.ml | 175 - frameworks/keyed/reaml-preact/src/Main.mli | 0 frameworks/keyed/reaml-react/.gitignore | 4 - frameworks/keyed/reaml-react/.ocamlformat | 6 - frameworks/keyed/reaml-react/bsconfig.json | 20 - frameworks/keyed/reaml-react/index.html | 12 - frameworks/keyed/reaml-react/package.json | 25 - frameworks/keyed/reaml-react/rollup.config.js | 28 - frameworks/keyed/reaml-react/src/Main.ml | 175 - frameworks/keyed/reaml-react/src/Main.mli | 0 frameworks/keyed/reason-react/.gitignore | 4 - frameworks/keyed/reason-react/bsconfig.json | 23 - frameworks/keyed/reason-react/index.html | 12 - frameworks/keyed/reason-react/package.json | 43 - frameworks/keyed/reason-react/src/Button.re | 8 - frameworks/keyed/reason-react/src/Index.re | 2 - .../keyed/reason-react/src/Jumbotron.re | 20 - frameworks/keyed/reason-react/src/Main.re | 138 - frameworks/keyed/reason-react/src/Row.re | 21 - frameworks/keyed/reason-react/src/Util.re | 85 - .../keyed/reason-react/webpack.config.js | 78 - frameworks/keyed/redom/index.html | 11 - frameworks/keyed/redom/package.json | 22 - frameworks/keyed/redom/rollup.config.dev.js | 9 - frameworks/keyed/redom/rollup.config.js | 11 - frameworks/keyed/redom/src/app.js | 134 - frameworks/keyed/redom/src/main.js | 10 - frameworks/keyed/redom/src/store.js | 81 - frameworks/keyed/reflex-dom/.gitignore | 5 - frameworks/keyed/reflex-dom/build.sh | 3 - .../keyed/reflex-dom/bundled-dist/all.js | 97891 ---------------- .../reflex-dom/bundled-dist/all.js.externs | 8182 -- .../keyed/reflex-dom/bundled-dist/index.html | 11 - .../keyed/reflex-dom/bundled-dist/lib.js | 6896 -- .../reflex-dom/bundled-dist/out.frefs.js | 1 - .../reflex-dom/bundled-dist/out.frefs.json | 1 - .../keyed/reflex-dom/bundled-dist/out.js | 69031 ----------- .../keyed/reflex-dom/bundled-dist/rts.js | 21962 ---- .../keyed/reflex-dom/bundled-dist/runmain.js | 2 - frameworks/keyed/reflex-dom/install.sh | 9 - frameworks/keyed/reflex-dom/package.json | 33 - frameworks/keyed/resonatejs/index.html | 56 - frameworks/keyed/resonatejs/package.json | 30 - frameworks/keyed/resonatejs/src/main.js | 79 - .../keyed/resonatejs/src/resonate.min.js | 1 - frameworks/keyed/resonatejs/webpack.config.js | 41 - frameworks/keyed/riot/index.html | 14 - frameworks/keyed/riot/package.json | 21 - frameworks/keyed/riot/src/app.riot | 110 - frameworks/keyed/riot/src/main.js | 7 - frameworks/keyed/riot/src/store.js | 75 - frameworks/keyed/riot/webpack.config.js | 33 - frameworks/keyed/san/.babelrc | 3 - frameworks/keyed/san/index.html | 15 - frameworks/keyed/san/package.json | 35 - frameworks/keyed/san/src/App.js | 124 - frameworks/keyed/san/src/main.es6.js | 4 - frameworks/keyed/san/src/store.es6.js | 153 - frameworks/keyed/san/webpack.config.js | 51 - frameworks/keyed/scarletsframe/.babelrc | 10 - frameworks/keyed/scarletsframe/index.html | 61 - frameworks/keyed/scarletsframe/package.json | 34 - frameworks/keyed/scarletsframe/src/main.js | 86 - .../keyed/scarletsframe/webpack.config.js | 37 - frameworks/keyed/sifrr/app.js | 7 - frameworks/keyed/sifrr/elements.js | 154 - frameworks/keyed/sifrr/index.html | 16 - frameworks/keyed/sifrr/package.json | 41 - frameworks/keyed/sifrr/rollup.config.js | 53 - frameworks/keyed/sinuous/.eslintrc.yml | 21 - frameworks/keyed/sinuous/index.html | 12 - frameworks/keyed/sinuous/package.json | 31 - frameworks/keyed/sinuous/rollup.config.js | 24 - frameworks/keyed/sinuous/src/main.js | 112 - frameworks/keyed/solid-state/index.html | 12 - frameworks/keyed/solid-state/package.json | 30 - frameworks/keyed/solid-state/rollup.config.js | 24 - frameworks/keyed/solid-state/src/main.jsx | 83 - frameworks/keyed/solid/index.html | 12 - frameworks/keyed/solid/package.json | 30 - frameworks/keyed/solid/rollup.config.js | 24 - frameworks/keyed/solid/src/main.jsx | 124 - frameworks/keyed/stage0/app.js | 171 - frameworks/keyed/stage0/index.html | 12 - frameworks/keyed/stage0/package.json | 43 - frameworks/keyed/stage0/rollup.config.js | 37 - frameworks/keyed/stdweb/.gitignore | 2 - frameworks/keyed/stdweb/Cargo.toml | 13 - frameworks/keyed/stdweb/README.md | 12 - .../keyed/stdweb/bundled-dist/index.html | 28 - .../js-framework-benchmark-stdweb.js | 681 - .../js-framework-benchmark-stdweb.wasm | Bin 101526 -> 0 bytes frameworks/keyed/stdweb/index.html | 50 - frameworks/keyed/stdweb/package.json | 21 - frameworks/keyed/stdweb/src/main.rs | 390 - frameworks/keyed/surplus/.gitignore | 1 - frameworks/keyed/surplus/index.html | 15 - frameworks/keyed/surplus/package.json | 39 - frameworks/keyed/surplus/rollup.config.js | 37 - frameworks/keyed/surplus/src/main.ts | 6 - frameworks/keyed/surplus/src/store.ts | 146 - frameworks/keyed/surplus/src/view.tsx | 63 - frameworks/keyed/surplus/tsconfig.json | 13 - frameworks/keyed/svelte/index.html | 12 - frameworks/keyed/svelte/package.json | 30 - frameworks/keyed/svelte/rollup.config.js | 20 - frameworks/keyed/svelte/src/Main.svelte | 93 - frameworks/keyed/svelte/src/main.js | 5 - frameworks/keyed/uhtml/index.html | 6 - frameworks/keyed/uhtml/package.json | 38 - frameworks/keyed/uhtml/rollup.config.js | 31 - frameworks/keyed/uhtml/src/index.js | 19 - frameworks/keyed/uhtml/src/jumbotron.js | 39 - frameworks/keyed/uhtml/src/table.js | 34 - frameworks/keyed/vanillajs-1/index.html | 48 - frameworks/keyed/vanillajs-1/package.json | 28 - frameworks/keyed/vanillajs-1/rollup.config.js | 25 - frameworks/keyed/vanillajs-1/src/Main.js | 210 - frameworks/keyed/vanillajs-wc/index.html | 15 - frameworks/keyed/vanillajs-wc/package.json | 14 - frameworks/keyed/vanillajs-wc/src/main.js | 370 - frameworks/keyed/vanillajs/index.html | 49 - frameworks/keyed/vanillajs/package.json | 31 - frameworks/keyed/vanillajs/src/Main.js | 316 - frameworks/keyed/vanillajs/webpack.config.js | 30 - frameworks/keyed/vidom/index.html | 12 - frameworks/keyed/vidom/package.json | 34 - frameworks/keyed/vidom/src/controller.jsx | 142 - frameworks/keyed/vidom/src/main.js | 4 - frameworks/keyed/vidom/src/store.js | 59 - frameworks/keyed/vidom/webpack.config.js | 38 - frameworks/keyed/vue-next/.babelrc | 11 - frameworks/keyed/vue-next/index.html | 12 - frameworks/keyed/vue-next/package.json | 31 - frameworks/keyed/vue-next/src/App.vue | 177 - frameworks/keyed/vue-next/src/main.js | 4 - frameworks/keyed/vue-next/webpack.config.js | 31 - frameworks/keyed/vue/.babelrc | 11 - frameworks/keyed/vue/index.html | 12 - frameworks/keyed/vue/package.json | 35 - frameworks/keyed/vue/src/App.vue | 108 - frameworks/keyed/vue/src/main.es6.js | 7 - frameworks/keyed/vue/src/store.es6.js | 73 - frameworks/keyed/vue/webpack.config.js | 56 - frameworks/non-keyed/angular/.gitignore | 3 - frameworks/non-keyed/angular/closure.conf | 40 - frameworks/non-keyed/angular/index.html | 16 - frameworks/non-keyed/angular/package.json | 39 - frameworks/non-keyed/angular/rollup.config.js | 14 - frameworks/non-keyed/angular/src/app.ts | 134 - frameworks/non-keyed/angular/src/main.ts | 6 - frameworks/non-keyed/angular/tsconfig.json | 28 - frameworks/non-keyed/apprun/index.html | 12 - frameworks/non-keyed/apprun/package.json | 34 - frameworks/non-keyed/apprun/src/main.tsx | 139 - frameworks/non-keyed/apprun/src/store.ts | 72 - frameworks/non-keyed/apprun/tsconfig.json | 10 - frameworks/non-keyed/apprun/webpack.config.js | 20 - frameworks/non-keyed/aurelia/.babelrc | 17 - frameworks/non-keyed/aurelia/.gitignore | 2 - .../aurelia/aurelia_project/aurelia.json | 127 - .../aurelia_project/environments/dev.js | 3 - .../aurelia_project/environments/prod.js | 3 - .../aurelia_project/environments/stage.js | 3 - .../aurelia_project/generators/attribute.js | 44 - .../aurelia_project/generators/attribute.json | 4 - .../generators/binding-behavior.js | 41 - .../generators/binding-behavior.json | 4 - .../aurelia_project/generators/component.js | 51 - .../aurelia_project/generators/component.json | 4 - .../aurelia_project/generators/element.js | 48 - .../aurelia_project/generators/element.json | 4 - .../aurelia_project/generators/generator.js | 73 - .../aurelia_project/generators/generator.json | 4 - .../aurelia_project/generators/task.js | 41 - .../aurelia_project/generators/task.json | 4 - .../generators/value-converter.js | 41 - .../generators/value-converter.json | 4 - .../aurelia/aurelia_project/tasks/build.js | 40 - .../aurelia/aurelia_project/tasks/build.json | 16 - .../aurelia_project/tasks/copy-files.js | 45 - .../aurelia/aurelia_project/tasks/lint.js | 10 - .../aurelia_project/tasks/process-css.js | 10 - .../aurelia_project/tasks/process-markup.js | 21 - .../aurelia/aurelia_project/tasks/run.js | 54 - .../aurelia/aurelia_project/tasks/run.json | 16 - .../aurelia_project/tasks/transpile.js | 32 - .../aurelia/aurelia_project/tasks/watch.js | 128 - frameworks/non-keyed/aurelia/favicon.ico | Bin 318 -> 0 bytes frameworks/non-keyed/aurelia/index.html | 12 - frameworks/non-keyed/aurelia/jsconfig.json | 11 - frameworks/non-keyed/aurelia/package.json | 70 - frameworks/non-keyed/aurelia/src/app.html | 47 - frameworks/non-keyed/aurelia/src/app.js | 35 - .../aurelia/src/aurelia-polyfills.js | 29 - frameworks/non-keyed/aurelia/src/main.js | 15 - frameworks/non-keyed/aurelia/src/store.js | 78 - frameworks/non-keyed/cyclejs-dom/.babelrc | 9 - frameworks/non-keyed/cyclejs-dom/index.html | 12 - frameworks/non-keyed/cyclejs-dom/package.json | 28 - frameworks/non-keyed/cyclejs-dom/src/main.jsx | 156 - .../non-keyed/cyclejs-dom/webpack.config.js | 62 - frameworks/non-keyed/dojo/.dojorc | 6 - frameworks/non-keyed/dojo/.gitignore | 2 - frameworks/non-keyed/dojo/README.md | 1 - frameworks/non-keyed/dojo/package.json | 19 - frameworks/non-keyed/dojo/src/App.ts | 39 - frameworks/non-keyed/dojo/src/Button.ts | 21 - frameworks/non-keyed/dojo/src/Buttons.ts | 28 - frameworks/non-keyed/dojo/src/Row.ts | 36 - frameworks/non-keyed/dojo/src/Store.ts | 190 - frameworks/non-keyed/dojo/src/index.html | 10 - frameworks/non-keyed/dojo/src/main.css | 1 - frameworks/non-keyed/dojo/src/main.ts | 5 - frameworks/non-keyed/dojo/tsconfig.json | 27 - frameworks/non-keyed/domc/index.html | 59 - frameworks/non-keyed/domc/package.json | 40 - frameworks/non-keyed/domc/rollup.config.js | 39 - frameworks/non-keyed/domc/src/app.js | 74 - frameworks/non-keyed/domdiff/index.html | 50 - frameworks/non-keyed/domdiff/package.json | 35 - frameworks/non-keyed/domdiff/rollup.config.js | 17 - frameworks/non-keyed/domdiff/src/index.js | 32 - frameworks/non-keyed/domdiff/src/utils.js | 34 - frameworks/non-keyed/domvm/build.js | 80 - frameworks/non-keyed/domvm/index.html | 11 - frameworks/non-keyed/domvm/package.json | 20 - frameworks/non-keyed/domvm/src/main.es6.js | 100 - frameworks/non-keyed/domvm/src/store.es6.js | 86 - frameworks/non-keyed/elm/.gitignore | 6 - frameworks/non-keyed/elm/elm.json | 25 - frameworks/non-keyed/elm/index.html | 15 - frameworks/non-keyed/elm/package.json | 26 - frameworks/non-keyed/elm/src/Main.elm | 360 - frameworks/non-keyed/endorphin/index.html | 12 - frameworks/non-keyed/endorphin/package.json | 29 - .../non-keyed/endorphin/rollup.config.js | 19 - .../endorphin/src/app-ui/app-ui.html | 52 - .../non-keyed/endorphin/src/app-ui/app-ui.js | 71 - frameworks/non-keyed/endorphin/src/app.js | 4 - frameworks/non-keyed/etch/.babelrc | 4 - frameworks/non-keyed/etch/index.html | 12 - frameworks/non-keyed/etch/package.json | 24 - frameworks/non-keyed/etch/src/Main.jsx | 105 - frameworks/non-keyed/etch/src/Row.jsx | 44 - frameworks/non-keyed/etch/src/Store.es6.js | 59 - frameworks/non-keyed/etch/src/main.es6.js | 5 - frameworks/non-keyed/etch/webpack.config.js | 49 - frameworks/non-keyed/gruu/.babelrc | 4 - frameworks/non-keyed/gruu/index.html | 12 - frameworks/non-keyed/gruu/package.json | 28 - frameworks/non-keyed/gruu/src/Store.es6.js | 59 - frameworks/non-keyed/gruu/src/main.es6.js | 96 - frameworks/non-keyed/gruu/webpack.config.js | 26 - frameworks/non-keyed/halogen/.gitignore | 11 - frameworks/non-keyed/halogen/index.html | 11 - frameworks/non-keyed/halogen/package.json | 30 - frameworks/non-keyed/halogen/packages.dhall | 11 - frameworks/non-keyed/halogen/spago.dhall | 5 - frameworks/non-keyed/halogen/src/Main.js | 24 - frameworks/non-keyed/halogen/src/Main.purs | 269 - frameworks/non-keyed/heresy/index.html | 6 - frameworks/non-keyed/heresy/package.json | 38 - frameworks/non-keyed/heresy/rollup.config.js | 39 - frameworks/non-keyed/heresy/src/index.js | 14 - frameworks/non-keyed/heresy/src/ui/app.js | 53 - frameworks/non-keyed/heresy/src/ui/button.js | 18 - frameworks/non-keyed/heresy/src/ui/row.js | 23 - frameworks/non-keyed/hullo/.babelrc | 3 - frameworks/non-keyed/hullo/.yo-rc.json | 45 - frameworks/non-keyed/hullo/_webpack.config.js | 32 - frameworks/non-keyed/hullo/index.html | 12 - frameworks/non-keyed/hullo/package.json | 37 - frameworks/non-keyed/hullo/src/index.js | 330 - frameworks/non-keyed/hullo/webpack.config.js | 18 - frameworks/non-keyed/imba/index.html | 15 - frameworks/non-keyed/imba/package.json | 32 - frameworks/non-keyed/imba/src/main.imba | 116 - frameworks/non-keyed/imba/webpack.config.js | 70 - frameworks/non-keyed/incr_dom/.gitignore | 6 - frameworks/non-keyed/incr_dom/copy.sh | 15 - frameworks/non-keyed/incr_dom/dune | 1 - frameworks/non-keyed/incr_dom/dune-project | 3 - frameworks/non-keyed/incr_dom/esy.json | 34 - .../incr_dom/esy.lock/.gitattributes | 3 - .../non-keyed/incr_dom/esy.lock/.gitignore | 3 - .../non-keyed/incr_dom/esy.lock/index.json | 3336 - .../esy.lock/opam/async_js.v0.13.0/opam | 29 - .../esy.lock/opam/async_kernel.v0.13.0/opam | 28 - .../opam/async_rpc_kernel.v0.13.0/opam | 30 - .../incr_dom/esy.lock/opam/atd.2.0.0/opam | 34 - .../esy.lock/opam/atdgen-runtime.2.0.0/opam | 29 - .../incr_dom/esy.lock/opam/atdgen.2.0.0/opam | 44 - .../esy.lock/opam/base-bytes.base/opam | 9 - .../esy.lock/opam/base-threads.base/opam | 6 - .../esy.lock/opam/base-unix.base/opam | 6 - .../incr_dom/esy.lock/opam/base.v0.13.1/opam | 36 - .../esy.lock/opam/base_bigstring.v0.13.0/opam | 25 - .../opam/base_quickcheck.v0.13.0/opam | 31 - .../esy.lock/opam/bin_prot.v0.13.0/opam | 35 - .../incr_dom/esy.lock/opam/biniou.1.2.1/opam | 45 - .../esy.lock/opam/cmdliner.1.0.4/opam | 36 - .../incr_dom/esy.lock/opam/conf-m4.1/opam | 22 - .../esy.lock/opam/core_kernel.v0.13.1/opam | 47 - .../incr_dom/esy.lock/opam/cppo.1.6.6/opam | 37 - .../opam/dune-configurator.2.3.1/opam | 43 - .../opam/dune-private-libs.2.3.1/opam | 42 - .../incr_dom/esy.lock/opam/dune.2.3.1/opam | 54 - .../esy.lock/opam/easy-format.1.3.2/opam | 46 - .../esy.lock/opam/fieldslib.v0.13.0/opam | 27 - .../incr_dom/esy.lock/opam/fix.20200131/opam | 24 - .../esy.lock/opam/incr_dom.v0.13.0/opam | 51 - .../esy.lock/opam/incr_map.v0.13.0/opam | 29 - .../esy.lock/opam/incr_select.v0.13.0/opam | 31 - .../esy.lock/opam/incremental.v0.13.0/opam | 28 - .../opam/jane-street-headers.v0.13.0/opam | 23 - .../esy.lock/opam/jbuilder.1.0+beta20.2/opam | 39 - .../opam/js_of_ocaml-compiler.3.5.2/opam | 38 - .../esy.lock/opam/js_of_ocaml-ppx.3.5.2/opam | 30 - .../esy.lock/opam/js_of_ocaml.3.5.2/opam | 33 - .../esy.lock/opam/jst-config.v0.13.0/opam | 32 - .../esy.lock/opam/menhir.20200211/opam | 27 - .../esy.lock/opam/menhirLib.20200211/opam | 25 - .../esy.lock/opam/menhirSdk.20200211/opam | 25 - .../esy.lock/opam/merlin-extend.0.5/opam | 29 - .../incr_dom/esy.lock/opam/merlin.3.3.3/opam | 71 - .../num.1.3/files/installation-warning.patch | 59 - .../incr_dom/esy.lock/opam/num.1.3/opam | 34 - .../opam/ocaml-compiler-libs.v0.12.1/opam | 23 - .../opam/ocaml-migrate-parsetree.1.6.0/opam | 37 - .../esy.lock/opam/ocamlbuild.0.14.0/opam | 36 - .../opam/ocamlfind.1.8.1/files/ocaml-stub | 4 - .../ocamlfind.1.8.1/files/ocamlfind.install | 6 - .../esy.lock/opam/ocamlfind.1.8.1/opam | 50 - .../esy.lock/opam/octavius.1.2.2/opam | 34 - .../esy.lock/opam/parsexp.v0.13.0/opam | 43 - .../esy.lock/opam/ppx_assert.v0.13.0/opam | 29 - .../esy.lock/opam/ppx_base.v0.13.0/opam | 33 - .../esy.lock/opam/ppx_bench.v0.13.0/opam | 25 - .../esy.lock/opam/ppx_bin_prot.v0.13.0/opam | 27 - .../esy.lock/opam/ppx_cold.v0.13.0/opam | 25 - .../esy.lock/opam/ppx_compare.v0.13.0/opam | 25 - .../opam/ppx_custom_printf.v0.13.0/opam | 26 - .../esy.lock/opam/ppx_derivers.1.2.1/opam | 23 - .../esy.lock/opam/ppx_enumerate.v0.13.0/opam | 25 - .../esy.lock/opam/ppx_expect.v0.13.0/opam | 35 - .../esy.lock/opam/ppx_fail.v0.13.0/opam | 26 - .../opam/ppx_fields_conv.v0.13.0/opam | 26 - .../esy.lock/opam/ppx_hash.v0.13.0/opam | 27 - .../esy.lock/opam/ppx_here.v0.13.0/opam | 25 - .../opam/ppx_inline_test.v0.13.0/opam | 25 - .../esy.lock/opam/ppx_jane.v0.13.0/opam | 46 - .../esy.lock/opam/ppx_js_style.v0.13.0/opam | 29 - .../esy.lock/opam/ppx_let.v0.13.0/opam | 25 - .../opam/ppx_module_timer.v0.13.0/opam | 28 - .../esy.lock/opam/ppx_optcomp.v0.13.0/opam | 26 - .../esy.lock/opam/ppx_optional.v0.13.0/opam | 26 - .../esy.lock/opam/ppx_pipebang.v0.13.0/opam | 24 - .../esy.lock/opam/ppx_sexp_conv.v0.13.0/opam | 26 - .../opam/ppx_sexp_message.v0.13.0/opam | 27 - .../esy.lock/opam/ppx_sexp_value.v0.13.0/opam | 27 - .../esy.lock/opam/ppx_stable.v0.13.0/opam | 26 - .../opam/ppx_tools_versioned.5.3.0/opam | 30 - .../opam/ppx_typerep_conv.v0.13.0/opam | 26 - .../opam/ppx_variants_conv.v0.13.0/opam | 26 - .../incr_dom/esy.lock/opam/ppxlib.0.12.0/opam | 46 - .../opam/protocol_version_header.v0.13.0/opam | 28 - .../incr_dom/esy.lock/opam/re.1.9.0/opam | 42 - .../incr_dom/esy.lock/opam/result.1.5/opam | 22 - .../esy.lock/opam/seq.base/files/META.seq | 4 - .../esy.lock/opam/seq.base/files/seq.install | 3 - .../incr_dom/esy.lock/opam/seq.base/opam | 15 - .../esy.lock/opam/sexplib.v0.13.0/opam | 29 - .../esy.lock/opam/sexplib0.v0.13.0/opam | 26 - .../opam/splittable_random.v0.13.0/opam | 35 - .../incr_dom/esy.lock/opam/stdio.v0.13.0/opam | 27 - .../esy.lock/opam/stringext.1.6.0/opam | 32 - .../esy.lock/opam/time_now.v0.13.0/opam | 29 - .../incr_dom/esy.lock/opam/topkg.1.0.1/opam | 48 - .../esy.lock/opam/typerep.v0.13.0/opam | 23 - .../incr_dom/esy.lock/opam/tyxml.4.3.0/opam | 45 - .../incr_dom/esy.lock/opam/uchar.0.0.2/opam | 36 - .../esy.lock/opam/uri-sexp.3.1.0/opam | 33 - .../incr_dom/esy.lock/opam/uri.3.1.0/opam | 35 - .../incr_dom/esy.lock/opam/uutf.1.0.2/opam | 40 - .../esy.lock/opam/variantslib.v0.13.0/opam | 26 - .../esy.lock/opam/virtual_dom.v0.13.0/opam | 30 - .../incr_dom/esy.lock/opam/yojson.1.7.0/opam | 38 - .../package.json | 5 - .../files/num-1.3.patch | 58 - .../package.json | 25 - .../files/ocamlbuild-0.14.0.patch | 463 - .../package.json | 27 - .../files/findlib-1.8.1.patch | 471 - .../package.json | 61 - frameworks/non-keyed/incr_dom/index.html | 12 - .../js-framework-benchmark-components.opam | 0 .../incr_dom/js-framework-benchmark.opam | 0 frameworks/non-keyed/incr_dom/package.json | 31 - frameworks/non-keyed/incr_dom/src/app/App.re | 159 - .../non-keyed/incr_dom/src/app/Entrypoint.re | 10 - frameworks/non-keyed/incr_dom/src/app/dune | 16 - .../incr_dom/src/components/Button.re | 10 - .../incr_dom/src/components/Elements.re | 61 - .../incr_dom/src/components/Jumbotron.re | 23 - .../non-keyed/incr_dom/src/components/Row.re | 22 - .../non-keyed/incr_dom/src/components/Util.re | 95 - .../non-keyed/incr_dom/src/components/dune | 9 - frameworks/non-keyed/inferno/.babelrc | 13 - frameworks/non-keyed/inferno/index.html | 12 - frameworks/non-keyed/inferno/package.json | 37 - frameworks/non-keyed/inferno/readme.md | 3 - frameworks/non-keyed/inferno/rollup.config.js | 74 - .../non-keyed/inferno/src/controller.jsx | 187 - frameworks/non-keyed/inferno/src/main.es6.js | 1 - frameworks/non-keyed/inferno/src/store.es6.js | 140 - frameworks/non-keyed/lighterhtml/index.html | 6 - frameworks/non-keyed/lighterhtml/package.json | 38 - .../non-keyed/lighterhtml/rollup.config.js | 39 - frameworks/non-keyed/lighterhtml/src/index.js | 19 - .../non-keyed/lighterhtml/src/jumbotron.js | 39 - frameworks/non-keyed/lighterhtml/src/table.js | 32 - frameworks/non-keyed/lit-element/index.html | 13 - frameworks/non-keyed/lit-element/package.json | 39 - .../non-keyed/lit-element/rollup.config.js | 15 - frameworks/non-keyed/lit-element/src/main.ts | 111 - frameworks/non-keyed/lit-element/src/store.ts | 72 - .../non-keyed/lit-element/tsconfig.json | 13 - frameworks/non-keyed/lit-html/index.html | 6 - frameworks/non-keyed/lit-html/package.json | 34 - .../non-keyed/lit-html/rollup.config.js | 11 - frameworks/non-keyed/lit-html/src/index.js | 140 - frameworks/non-keyed/lite-html/index.html | 7 - frameworks/non-keyed/lite-html/package.json | 33 - .../non-keyed/lite-html/rollup.config.js | 7 - frameworks/non-keyed/lite-html/src/index.js | 162 - frameworks/non-keyed/literaljs/.babelrc | 11 - frameworks/non-keyed/literaljs/.gitignore | 3 - frameworks/non-keyed/literaljs/index.html | 11 - frameworks/non-keyed/literaljs/index.js | 165 - frameworks/non-keyed/literaljs/package.json | 34 - frameworks/non-keyed/literaljs/store.js | 143 - frameworks/non-keyed/mikado/index.html | 13 - frameworks/non-keyed/mikado/package.json | 27 - frameworks/non-keyed/mikado/src/data.js | 39 - frameworks/non-keyed/mikado/src/main.js | 31 - .../non-keyed/mikado/src/template/app.html | 35 - .../non-keyed/mikado/src/template/item.html | 12 - frameworks/non-keyed/mikado/task/build.js | 115 - frameworks/non-keyed/mimbl/buildDev.bat | 6 - frameworks/non-keyed/mimbl/buildProd.bat | 6 - frameworks/non-keyed/mimbl/index.html | 12 - frameworks/non-keyed/mimbl/indexDev.html | 13 - frameworks/non-keyed/mimbl/package.json | 34 - frameworks/non-keyed/mimbl/src/Main.tsx | 104 - frameworks/non-keyed/mimbl/src/Row.tsx | 75 - frameworks/non-keyed/mimbl/src/Store.js | 66 - frameworks/non-keyed/mimbl/src/TBody.tsx | 90 - frameworks/non-keyed/mimbl/tsconfig.json | 21 - frameworks/non-keyed/mimbl/webpack.config.js | 37 - frameworks/non-keyed/miso/.gitignore | 5 - frameworks/non-keyed/miso/README.md | 29 - frameworks/non-keyed/miso/cabal.config | 1 - frameworks/non-keyed/miso/default.nix | 20 - .../non-keyed/miso/dist-bundle/all.min.js | 897 - .../non-keyed/miso/dist-bundle/index.html | 14 - .../miso/miso-benchmark-non-keyed.cabal | 22 - frameworks/non-keyed/miso/package.json | 31 - frameworks/non-keyed/miso/src/Main.hs | 324 - frameworks/non-keyed/moon/index.html | 12 - frameworks/non-keyed/moon/package.json | 31 - frameworks/non-keyed/moon/src/index.js | 234 - frameworks/non-keyed/moon/webpack.config.js | 15 - frameworks/non-keyed/neverland/index.html | 12 - frameworks/non-keyed/neverland/package.json | 38 - .../non-keyed/neverland/rollup.config.js | 39 - frameworks/non-keyed/neverland/src/index.js | 90 - frameworks/non-keyed/polymer/.gitignore | 1 - frameworks/non-keyed/polymer/bower.json | 14 - frameworks/non-keyed/polymer/index.html | 13 - frameworks/non-keyed/polymer/package.json | 30 - frameworks/non-keyed/polymer/polymer.json | 12 - .../non-keyed/polymer/src/main-element.html | 126 - .../non-keyed/polymer/src/shared-styles.html | 32 - .../polymer/test/polymer-temp_test.html | 52 - frameworks/non-keyed/pux/.gitignore | 9 - frameworks/non-keyed/pux/bower.json | 27 - frameworks/non-keyed/pux/index.html | 13 - frameworks/non-keyed/pux/package.json | 34 - frameworks/non-keyed/pux/src/Main.purs | 367 - frameworks/non-keyed/ractive/.babelrc | 10 - frameworks/non-keyed/ractive/index.html | 12 - frameworks/non-keyed/ractive/package.json | 33 - .../non-keyed/ractive/src/main.ractive.html | 117 - .../non-keyed/ractive/webpack.config.js | 46 - frameworks/non-keyed/rawact/index.html | 12 - frameworks/non-keyed/rawact/package.json | 39 - frameworks/non-keyed/rawact/src/main.jsx | 158 - frameworks/non-keyed/rawact/webpack.config.js | 81 - frameworks/non-keyed/react/index.html | 15 - frameworks/non-keyed/react/package.json | 38 - frameworks/non-keyed/react/src/main.jsx | 158 - frameworks/non-keyed/react/webpack.config.js | 78 - frameworks/non-keyed/redom/index.html | 11 - frameworks/non-keyed/redom/package.json | 22 - .../non-keyed/redom/rollup.config.dev.js | 9 - frameworks/non-keyed/redom/rollup.config.js | 11 - frameworks/non-keyed/redom/src/app.js | 132 - frameworks/non-keyed/redom/src/main.js | 10 - frameworks/non-keyed/redom/src/store.js | 81 - frameworks/non-keyed/riot/index.html | 12 - frameworks/non-keyed/riot/package.json | 21 - frameworks/non-keyed/riot/src/app.riot | 110 - frameworks/non-keyed/riot/src/main.js | 7 - frameworks/non-keyed/riot/src/store.js | 75 - frameworks/non-keyed/riot/webpack.config.js | 33 - frameworks/non-keyed/san/.babelrc | 3 - frameworks/non-keyed/san/index.html | 15 - frameworks/non-keyed/san/package.json | 34 - frameworks/non-keyed/san/src/App.js | 125 - frameworks/non-keyed/san/src/main.es6.js | 4 - frameworks/non-keyed/san/src/store.es6.js | 174 - frameworks/non-keyed/san/webpack.config.js | 51 - frameworks/non-keyed/scarletsframe/.babelrc | 10 - frameworks/non-keyed/scarletsframe/index.html | 61 - .../non-keyed/scarletsframe/package.json | 34 - .../non-keyed/scarletsframe/src/main.js | 90 - .../non-keyed/scarletsframe/webpack.config.js | 37 - frameworks/non-keyed/seed/.gitignore | 7 - frameworks/non-keyed/seed/Cargo.toml | 21 - frameworks/non-keyed/seed/README.md | 12 - .../non-keyed/seed/bundled-dist/index.html | 16 - .../js-framework-benchmark-seed.js | 919 - .../js-framework-benchmark-seed_bg.wasm | Bin 327330 -> 0 bytes frameworks/non-keyed/seed/index.html | 16 - frameworks/non-keyed/seed/package.json | 22 - frameworks/non-keyed/seed/src/lib.rs | 235 - frameworks/non-keyed/sifrr/app.js | 7 - frameworks/non-keyed/sifrr/elements.js | 154 - frameworks/non-keyed/sifrr/index.html | 16 - frameworks/non-keyed/sifrr/package.json | 41 - frameworks/non-keyed/sifrr/rollup.config.js | 53 - frameworks/non-keyed/simi/.simi.toml | 1 - frameworks/non-keyed/simi/Cargo.toml | 16 - frameworks/non-keyed/simi/build.js | 35 - frameworks/non-keyed/simi/index.html | 12 - .../simi/js_framework_benchmark_simi.js | 543 - .../simi/js_framework_benchmark_simi_bg.js | 31 - .../simi/js_framework_benchmark_simi_bg.wasm | Bin 136617 -> 0 bytes frameworks/non-keyed/simi/package.json | 17 - frameworks/non-keyed/simi/src/lib.rs | 236 - frameworks/non-keyed/simi/static/index.html | 12 - frameworks/non-keyed/simulacra/.babelrc | 7 - frameworks/non-keyed/simulacra/index.html | 59 - frameworks/non-keyed/simulacra/package.json | 32 - frameworks/non-keyed/simulacra/src/main.js | 155 - .../non-keyed/simulacra/webpack.config.js | 40 - frameworks/non-keyed/slim-js/index.html | 13 - frameworks/non-keyed/slim-js/main-app.js | 202 - frameworks/non-keyed/slim-js/package.json | 18 - frameworks/non-keyed/slim-js/slim.js | 931 - frameworks/non-keyed/stage0/app.js | 174 - frameworks/non-keyed/stage0/index.html | 12 - frameworks/non-keyed/stage0/package.json | 43 - frameworks/non-keyed/stage0/rollup.config.js | 37 - frameworks/non-keyed/stdweb/.gitignore | 2 - frameworks/non-keyed/stdweb/Cargo.toml | 13 - frameworks/non-keyed/stdweb/README.md | 12 - .../non-keyed/stdweb/bundled-dist/index.html | 28 - .../js-framework-benchmark-stdweb.js | 669 - .../js-framework-benchmark-stdweb.wasm | Bin 95069 -> 0 bytes frameworks/non-keyed/stdweb/index.html | 50 - frameworks/non-keyed/stdweb/package.json | 21 - frameworks/non-keyed/stdweb/src/main.rs | 421 - frameworks/non-keyed/stem/.babelrc | 9 - frameworks/non-keyed/stem/.gitignore | 27 - frameworks/non-keyed/stem/README.md | 35 - .../non-keyed/stem/css/bootstrap.min.css | 6 - frameworks/non-keyed/stem/index.html | 15 - frameworks/non-keyed/stem/package.json | 33 - frameworks/non-keyed/stem/src/Main.jsx | 110 - frameworks/non-keyed/stem/src/Row.jsx | 50 - frameworks/non-keyed/stem/src/RowState.es6.js | 94 - .../non-keyed/stem/src/rollup.config.js | 26 - frameworks/non-keyed/surplus/.gitignore | 1 - frameworks/non-keyed/surplus/index.html | 12 - frameworks/non-keyed/surplus/package.json | 39 - frameworks/non-keyed/surplus/rollup.config.js | 35 - frameworks/non-keyed/surplus/src/main.ts | 6 - frameworks/non-keyed/surplus/src/store.ts | 136 - frameworks/non-keyed/surplus/src/view.tsx | 72 - frameworks/non-keyed/surplus/tsconfig.json | 13 - frameworks/non-keyed/svelte/index.html | 12 - frameworks/non-keyed/svelte/package.json | 30 - frameworks/non-keyed/svelte/rollup.config.js | 20 - frameworks/non-keyed/svelte/src/Main.svelte | 93 - frameworks/non-keyed/svelte/src/main.js | 5 - frameworks/non-keyed/thermite/.gitignore | 8 - frameworks/non-keyed/thermite/bower.json | 27 - frameworks/non-keyed/thermite/index.html | 11 - frameworks/non-keyed/thermite/package.json | 34 - frameworks/non-keyed/thermite/src/Main.purs | 341 - frameworks/non-keyed/uhtml/index.html | 6 - frameworks/non-keyed/uhtml/package.json | 38 - frameworks/non-keyed/uhtml/rollup.config.js | 31 - frameworks/non-keyed/uhtml/src/index.js | 19 - frameworks/non-keyed/uhtml/src/jumbotron.js | 39 - frameworks/non-keyed/uhtml/src/table.js | 32 - .../vanilla-dom-framework/index.html | 11 - .../vanilla-dom-framework/package.json | 23 - .../vanilla-dom-framework/src/main.js | 80 - .../vanilla-dom-framework/src/template.html | 44 - .../vanilla-dom-framework/webpack.config.js | 23 - frameworks/non-keyed/vanillajs-1/index.html | 48 - frameworks/non-keyed/vanillajs-1/package.json | 28 - .../non-keyed/vanillajs-1/rollup.config.js | 25 - frameworks/non-keyed/vanillajs-1/src/Main.js | 228 - frameworks/non-keyed/vanillajs/.babelrc | 3 - frameworks/non-keyed/vanillajs/index.html | 49 - frameworks/non-keyed/vanillajs/package.json | 30 - frameworks/non-keyed/vanillajs/src/Main.js | 311 - .../non-keyed/vanillajs/webpack.config.js | 40 - frameworks/non-keyed/vue-next/.babelrc | 11 - frameworks/non-keyed/vue-next/index.html | 12 - frameworks/non-keyed/vue-next/package.json | 31 - frameworks/non-keyed/vue-next/src/App.vue | 176 - frameworks/non-keyed/vue-next/src/main.js | 4 - .../non-keyed/vue-next/webpack.config.js | 31 - frameworks/non-keyed/vue/.babelrc | 10 - frameworks/non-keyed/vue/index.html | 12 - frameworks/non-keyed/vue/package.json | 35 - frameworks/non-keyed/vue/src/App.vue | 108 - frameworks/non-keyed/vue/src/main.es6.js | 7 - frameworks/non-keyed/vue/src/store.es6.js | 73 - frameworks/non-keyed/vue/webpack.config.js | 56 - frameworks/non-keyed/vuera/.babelrc | 4 - frameworks/non-keyed/vuera/index.html | 12 - frameworks/non-keyed/vuera/package.json | 42 - frameworks/non-keyed/vuera/src/App.vue | 109 - frameworks/non-keyed/vuera/src/Store.es6.js | 76 - frameworks/non-keyed/vuera/src/main.es6.js | 10 - frameworks/non-keyed/vuera/webpack.config.js | 59 - webdriver-ts-results/src/App.tsx | 2 +- webdriver-ts-results/src/results.ts | 2688 +- webdriver-ts-results/table.html | 14 +- webdriver-ts/results.json | 2 +- 1237 files changed, 44 insertions(+), 268220 deletions(-) delete mode 100644 frameworks/keyed/angular-ng/.gitignore delete mode 100644 frameworks/keyed/angular-ng/.npmrc delete mode 100644 frameworks/keyed/angular-ng/README.md delete mode 100644 frameworks/keyed/angular-ng/angular.json delete mode 100644 frameworks/keyed/angular-ng/browserslist delete mode 100644 frameworks/keyed/angular-ng/package.json delete mode 100644 frameworks/keyed/angular-ng/src/app/app.component.html delete mode 100644 frameworks/keyed/angular-ng/src/app/app.component.ts delete mode 100644 frameworks/keyed/angular-ng/src/app/app.module.ts delete mode 100644 frameworks/keyed/angular-ng/src/assets/.gitkeep delete mode 100644 frameworks/keyed/angular-ng/src/environments/environment.prod.ts delete mode 100644 frameworks/keyed/angular-ng/src/environments/environment.ts delete mode 100644 frameworks/keyed/angular-ng/src/favicon.ico delete mode 100644 frameworks/keyed/angular-ng/src/index.html delete mode 100644 frameworks/keyed/angular-ng/src/main.ts delete mode 100644 frameworks/keyed/angular-ng/src/polyfills.ts delete mode 100644 frameworks/keyed/angular-ng/src/styles.css delete mode 100644 frameworks/keyed/angular-ng/tsconfig.app.json delete mode 100644 frameworks/keyed/angular-ng/tsconfig.json delete mode 100644 frameworks/keyed/angular-noopzone/.gitignore delete mode 100644 frameworks/keyed/angular-noopzone/closure.conf delete mode 100644 frameworks/keyed/angular-noopzone/index.html delete mode 100644 frameworks/keyed/angular-noopzone/package.json delete mode 100644 frameworks/keyed/angular-noopzone/rollup.config.js delete mode 100644 frameworks/keyed/angular-noopzone/src/app.ts delete mode 100644 frameworks/keyed/angular-noopzone/src/main.ts delete mode 100644 frameworks/keyed/angular-noopzone/tsconfig.json delete mode 100644 frameworks/keyed/angular-optimized/.gitignore delete mode 100644 frameworks/keyed/angular-optimized/closure.conf delete mode 100644 frameworks/keyed/angular-optimized/index.html delete mode 100644 frameworks/keyed/angular-optimized/package.json delete mode 100644 frameworks/keyed/angular-optimized/rollup.config.js delete mode 100644 frameworks/keyed/angular-optimized/src/app.ts delete mode 100644 frameworks/keyed/angular-optimized/src/main.ts delete mode 100644 frameworks/keyed/angular-optimized/tsconfig.json delete mode 100644 frameworks/keyed/angular/.gitignore delete mode 100644 frameworks/keyed/angular/closure.conf delete mode 100644 frameworks/keyed/angular/index.html delete mode 100644 frameworks/keyed/angular/package.json delete mode 100644 frameworks/keyed/angular/rollup.config.js delete mode 100644 frameworks/keyed/angular/src/app.ts delete mode 100644 frameworks/keyed/angular/src/main.ts delete mode 100644 frameworks/keyed/angular/tsconfig.json delete mode 100755 frameworks/keyed/angularjs/index.html delete mode 100644 frameworks/keyed/angularjs/package.json delete mode 100644 frameworks/keyed/angularjs/src/home.controller.js delete mode 100644 frameworks/keyed/angularjs/src/home.template.html delete mode 100644 frameworks/keyed/angularjs/src/main.js delete mode 100755 frameworks/keyed/angularjs/webpack.config.js delete mode 100644 frameworks/keyed/apprun/index.html delete mode 100644 frameworks/keyed/apprun/package.json delete mode 100644 frameworks/keyed/apprun/src/main.tsx delete mode 100644 frameworks/keyed/apprun/src/store.ts delete mode 100644 frameworks/keyed/apprun/tsconfig.json delete mode 100644 frameworks/keyed/apprun/webpack.config.js delete mode 100644 frameworks/keyed/attodom/.editorconfig delete mode 100644 frameworks/keyed/attodom/index.html delete mode 100644 frameworks/keyed/attodom/index.js delete mode 100644 frameworks/keyed/attodom/package.json delete mode 100644 frameworks/keyed/attodom/src/store.js delete mode 100644 frameworks/keyed/attodom/src/view.js delete mode 100755 frameworks/keyed/aurelia/.babelrc delete mode 100644 frameworks/keyed/aurelia/.gitignore delete mode 100644 frameworks/keyed/aurelia/aurelia_project/aurelia.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/environments/dev.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/environments/prod.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/environments/stage.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/attribute.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/attribute.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/component.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/component.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/element.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/element.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/generator.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/generator.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/task.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/task.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/value-converter.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/generators/value-converter.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/build.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/build.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/copy-files.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/lint.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/process-css.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/process-markup.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/run.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/run.json delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/transpile.js delete mode 100644 frameworks/keyed/aurelia/aurelia_project/tasks/watch.js delete mode 100755 frameworks/keyed/aurelia/favicon.ico delete mode 100755 frameworks/keyed/aurelia/index.html delete mode 100755 frameworks/keyed/aurelia/jsconfig.json delete mode 100644 frameworks/keyed/aurelia/package.json delete mode 100755 frameworks/keyed/aurelia/src/app.html delete mode 100755 frameworks/keyed/aurelia/src/app.js delete mode 100644 frameworks/keyed/aurelia/src/aurelia-polyfills.js delete mode 100755 frameworks/keyed/aurelia/src/main.js delete mode 100644 frameworks/keyed/aurelia/src/store.js delete mode 100644 frameworks/keyed/binding.scala/.gitignore delete mode 100644 frameworks/keyed/binding.scala/build.sbt delete mode 100644 frameworks/keyed/binding.scala/js/build.sbt delete mode 100644 frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Main.scala delete mode 100644 frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Store.scala delete mode 100644 frameworks/keyed/binding.scala/package.json delete mode 100644 frameworks/keyed/binding.scala/project/build.properties delete mode 100644 frameworks/keyed/binding.scala/project/plugins.sbt delete mode 100644 frameworks/keyed/binding.scala/src/main/assets/index.html delete mode 100644 frameworks/keyed/blazor-wasm/.gitignore delete mode 100644 frameworks/keyed/blazor-wasm/dotnet-install.cmd delete mode 100755 frameworks/keyed/blazor-wasm/dotnet-install.sh delete mode 100644 frameworks/keyed/blazor-wasm/package.json delete mode 100644 frameworks/keyed/blazor-wasm/src/App.razor delete mode 100644 frameworks/keyed/blazor-wasm/src/App.razor.cs delete mode 100644 frameworks/keyed/blazor-wasm/src/Data.cs delete mode 100644 frameworks/keyed/blazor-wasm/src/Program.cs delete mode 100644 frameworks/keyed/blazor-wasm/src/Properties/launchSettings.json delete mode 100644 frameworks/keyed/blazor-wasm/src/_Imports.razor delete mode 100644 frameworks/keyed/blazor-wasm/src/blazor-wasm.csproj delete mode 100644 frameworks/keyed/blazor-wasm/src/global.json delete mode 100644 frameworks/keyed/blazor-wasm/src/wwwroot/index.html delete mode 100644 frameworks/keyed/bobril/.vscode/settings.json delete mode 100644 frameworks/keyed/bobril/index.html delete mode 100644 frameworks/keyed/bobril/package.json delete mode 100644 frameworks/keyed/bobril/src/app.ts delete mode 100644 frameworks/keyed/bobril/src/store.ts delete mode 100644 frameworks/keyed/bobril/tsconfig.json delete mode 100755 frameworks/keyed/choo/index.html delete mode 100644 frameworks/keyed/choo/package.json delete mode 100644 frameworks/keyed/choo/src/index.js delete mode 100644 frameworks/keyed/choo/src/rowsView.js delete mode 100644 frameworks/keyed/choo/src/store.js delete mode 100644 frameworks/keyed/choo/src/utils.js delete mode 100644 frameworks/keyed/crui/index.html delete mode 100644 frameworks/keyed/crui/package.json delete mode 100644 frameworks/keyed/crui/src/app.ts delete mode 100644 frameworks/keyed/crui/src/jumbotron.ts delete mode 100644 frameworks/keyed/crui/src/main.ts delete mode 100644 frameworks/keyed/crui/src/store.ts delete mode 100644 frameworks/keyed/crui/src/table.ts delete mode 100644 frameworks/keyed/crui/src/utils.ts delete mode 100644 frameworks/keyed/crui/tsconfig.json delete mode 100644 frameworks/keyed/crui/webpack.config.js delete mode 100644 frameworks/keyed/datum/.babelrc delete mode 100644 frameworks/keyed/datum/index.html delete mode 100644 frameworks/keyed/datum/package.json delete mode 100644 frameworks/keyed/datum/src/Main.js delete mode 100644 frameworks/keyed/datum/webpack.config.js delete mode 100644 frameworks/keyed/dojo/.dojorc delete mode 100644 frameworks/keyed/dojo/.gitignore delete mode 100644 frameworks/keyed/dojo/README.md delete mode 100644 frameworks/keyed/dojo/package.json delete mode 100644 frameworks/keyed/dojo/src/App.ts delete mode 100644 frameworks/keyed/dojo/src/Button.ts delete mode 100644 frameworks/keyed/dojo/src/Buttons.ts delete mode 100644 frameworks/keyed/dojo/src/Row.ts delete mode 100644 frameworks/keyed/dojo/src/Store.ts delete mode 100644 frameworks/keyed/dojo/src/index.html delete mode 100644 frameworks/keyed/dojo/src/main.css delete mode 100644 frameworks/keyed/dojo/src/main.ts delete mode 100644 frameworks/keyed/dojo/tsconfig.json delete mode 100644 frameworks/keyed/domc/app.old.js delete mode 100644 frameworks/keyed/domc/index.html delete mode 100644 frameworks/keyed/domc/package.json delete mode 100644 frameworks/keyed/domc/rollup.config.js delete mode 100644 frameworks/keyed/domc/src/app.js delete mode 100644 frameworks/keyed/domdiff/index.html delete mode 100644 frameworks/keyed/domdiff/package.json delete mode 100644 frameworks/keyed/domdiff/rollup.config.js delete mode 100644 frameworks/keyed/domdiff/src/index.js delete mode 100644 frameworks/keyed/domdiff/src/utils.js delete mode 100644 frameworks/keyed/dominator/.gitignore delete mode 100644 frameworks/keyed/dominator/Cargo.toml delete mode 100644 frameworks/keyed/dominator/README.md delete mode 100644 frameworks/keyed/dominator/bundled-dist/1.js delete mode 100644 frameworks/keyed/dominator/bundled-dist/accca9b65c226d0a493c.module.wasm delete mode 100644 frameworks/keyed/dominator/bundled-dist/index.js delete mode 100644 frameworks/keyed/dominator/index.html delete mode 100644 frameworks/keyed/dominator/js/index.js delete mode 100644 frameworks/keyed/dominator/package.json delete mode 100644 frameworks/keyed/dominator/src/lib.rs delete mode 100644 frameworks/keyed/dominator/webpack.config.js delete mode 100644 frameworks/keyed/domvm/build.js delete mode 100644 frameworks/keyed/domvm/index.html delete mode 100644 frameworks/keyed/domvm/package.json delete mode 100644 frameworks/keyed/domvm/src/main.es6.js delete mode 100644 frameworks/keyed/domvm/src/store.es6.js delete mode 100644 frameworks/keyed/doz/index.html delete mode 100644 frameworks/keyed/doz/package.json delete mode 100644 frameworks/keyed/doz/src/index.js delete mode 100755 frameworks/keyed/dyo/.babelrc delete mode 100755 frameworks/keyed/dyo/index.html delete mode 100644 frameworks/keyed/dyo/package.json delete mode 100644 frameworks/keyed/dyo/src/main.js delete mode 100755 frameworks/keyed/dyo/webpack.config.js delete mode 100644 frameworks/keyed/elm/.gitignore delete mode 100644 frameworks/keyed/elm/elm.json delete mode 100644 frameworks/keyed/elm/index.html delete mode 100644 frameworks/keyed/elm/package.json delete mode 100644 frameworks/keyed/elm/src/Main.elm delete mode 100644 frameworks/keyed/ember/.bowerrc delete mode 100644 frameworks/keyed/ember/.editorconfig delete mode 100644 frameworks/keyed/ember/.ember-cli delete mode 100644 frameworks/keyed/ember/.eslintignore delete mode 100644 frameworks/keyed/ember/.eslintrc.js delete mode 100644 frameworks/keyed/ember/.gitignore delete mode 100644 frameworks/keyed/ember/.template-lintrc.js delete mode 100644 frameworks/keyed/ember/.travis.yml delete mode 100644 frameworks/keyed/ember/.watchmanconfig delete mode 100644 frameworks/keyed/ember/HOW_TO_UPDATE.txt delete mode 100644 frameworks/keyed/ember/README.md delete mode 100644 frameworks/keyed/ember/app/app.js delete mode 100755 frameworks/keyed/ember/app/components/my-table.js delete mode 100644 frameworks/keyed/ember/app/components/table-row/template.hbs delete mode 100644 frameworks/keyed/ember/app/controllers/.gitkeep delete mode 100644 frameworks/keyed/ember/app/helpers/.gitkeep delete mode 100755 frameworks/keyed/ember/app/helpers/eq.js delete mode 100644 frameworks/keyed/ember/app/index.html delete mode 100644 frameworks/keyed/ember/app/router.js delete mode 100644 frameworks/keyed/ember/app/routes/.gitkeep delete mode 100644 frameworks/keyed/ember/app/styles/app.css delete mode 100644 frameworks/keyed/ember/app/templates/components/bs-button.hbs delete mode 100755 frameworks/keyed/ember/app/templates/components/my-table.hbs delete mode 100755 frameworks/keyed/ember/app/templates/index.hbs delete mode 100644 frameworks/keyed/ember/app/utils/benchmark-helpers.js delete mode 100644 frameworks/keyed/ember/config/environment.js delete mode 100644 frameworks/keyed/ember/config/optional-features.json delete mode 100644 frameworks/keyed/ember/config/targets.js delete mode 100644 frameworks/keyed/ember/ember-cli-build.js delete mode 100644 frameworks/keyed/ember/package.json delete mode 100644 frameworks/keyed/ember/public/crossdomain.xml delete mode 100644 frameworks/keyed/ember/public/robots.txt delete mode 100644 frameworks/keyed/ember/testem.js delete mode 100644 frameworks/keyed/ember/tests/helpers/destroy-app.js delete mode 100644 frameworks/keyed/ember/tests/helpers/module-for-acceptance.js delete mode 100644 frameworks/keyed/ember/tests/helpers/resolver.js delete mode 100644 frameworks/keyed/ember/tests/helpers/start-app.js delete mode 100644 frameworks/keyed/ember/tests/index.html delete mode 100644 frameworks/keyed/ember/tests/integration/.gitkeep delete mode 100644 frameworks/keyed/ember/tests/integration/components/performant-each/component-test.js delete mode 100644 frameworks/keyed/ember/tests/integration/components/table-row/component-test.js delete mode 100644 frameworks/keyed/ember/tests/test-helper.js delete mode 100644 frameworks/keyed/ember/tests/unit/.gitkeep delete mode 100644 frameworks/keyed/ember/vendor/.gitkeep delete mode 100644 frameworks/keyed/endorphin/index.html delete mode 100644 frameworks/keyed/endorphin/package.json delete mode 100644 frameworks/keyed/endorphin/rollup.config.js delete mode 100644 frameworks/keyed/endorphin/src/app-ui/app-ui.html delete mode 100644 frameworks/keyed/endorphin/src/app-ui/app-ui.js delete mode 100644 frameworks/keyed/endorphin/src/app.js delete mode 100644 frameworks/keyed/etch/.babelrc delete mode 100644 frameworks/keyed/etch/index.html delete mode 100644 frameworks/keyed/etch/package.json delete mode 100644 frameworks/keyed/etch/src/Main.jsx delete mode 100644 frameworks/keyed/etch/src/Row.jsx delete mode 100644 frameworks/keyed/etch/src/Store.es6.js delete mode 100644 frameworks/keyed/etch/src/main.es6.js delete mode 100644 frameworks/keyed/etch/webpack.config.js delete mode 100644 frameworks/keyed/faster-dom/index.html delete mode 100644 frameworks/keyed/faster-dom/package.json delete mode 100644 frameworks/keyed/faster-dom/src/Main.js delete mode 100644 frameworks/keyed/faster-dom/src/Store.js delete mode 100644 frameworks/keyed/faster-dom/webpack.config.js delete mode 100644 frameworks/keyed/fidan/app.tsx delete mode 100644 frameworks/keyed/fidan/data.ts delete mode 100644 frameworks/keyed/fidan/index.html delete mode 100644 frameworks/keyed/fidan/package.json delete mode 100644 frameworks/keyed/fidan/webpack.config.js delete mode 100644 frameworks/keyed/fntags/.gitignore delete mode 100644 frameworks/keyed/fntags/build.js delete mode 100644 frameworks/keyed/fntags/index.html delete mode 100644 frameworks/keyed/fntags/package.json delete mode 100644 frameworks/keyed/fntags/src/Main.js delete mode 100644 frameworks/keyed/ganic/.babelrc delete mode 100644 frameworks/keyed/ganic/index.html delete mode 100644 frameworks/keyed/ganic/package.json delete mode 100644 frameworks/keyed/ganic/src/Benchmark.js delete mode 100644 frameworks/keyed/ganic/src/buildData.js delete mode 100644 frameworks/keyed/ganic/src/main.js delete mode 100644 frameworks/keyed/ganic/src/useStore.js delete mode 100644 frameworks/keyed/ganic/webpack.config.js delete mode 100644 frameworks/keyed/glasgow/.babelrc delete mode 100644 frameworks/keyed/glasgow/index.html delete mode 100644 frameworks/keyed/glasgow/package.json delete mode 100644 frameworks/keyed/glasgow/readme.md delete mode 100644 frameworks/keyed/glasgow/rollup.config.js delete mode 100644 frameworks/keyed/glasgow/src/controller.jsx delete mode 100644 frameworks/keyed/glasgow/src/main.es6.js delete mode 100644 frameworks/keyed/glasgow/src/store.es6.js delete mode 100644 frameworks/keyed/glasgow/webpack.config.js delete mode 100644 frameworks/keyed/glimmer/.editorconfig delete mode 100644 frameworks/keyed/glimmer/.ember-cli delete mode 100644 frameworks/keyed/glimmer/.gitignore delete mode 100644 frameworks/keyed/glimmer/.template-lintrc.js delete mode 100644 frameworks/keyed/glimmer/.watchmanconfig delete mode 100644 frameworks/keyed/glimmer/README.md delete mode 100644 frameworks/keyed/glimmer/config/environment.js delete mode 100644 frameworks/keyed/glimmer/config/module-map.d.ts delete mode 100644 frameworks/keyed/glimmer/config/resolver-configuration.d.ts delete mode 100644 frameworks/keyed/glimmer/config/targets.js delete mode 100644 frameworks/keyed/glimmer/ember-cli-build.js delete mode 100644 frameworks/keyed/glimmer/package.json delete mode 100644 frameworks/keyed/glimmer/public/robots.txt delete mode 100644 frameworks/keyed/glimmer/src/index.ts delete mode 100644 frameworks/keyed/glimmer/src/main.ts delete mode 100644 frameworks/keyed/glimmer/src/ui/components/BsButton/template.hbs delete mode 100644 frameworks/keyed/glimmer/src/ui/components/Glimmer/component-test.ts delete mode 100644 frameworks/keyed/glimmer/src/ui/components/Glimmer/component.ts delete mode 100644 frameworks/keyed/glimmer/src/ui/components/Glimmer/template.hbs delete mode 100644 frameworks/keyed/glimmer/src/ui/components/PerformantEach/component.ts delete mode 100644 frameworks/keyed/glimmer/src/ui/components/PerformantEach/template.hbs delete mode 100644 frameworks/keyed/glimmer/src/ui/components/Table/template.hbs delete mode 100644 frameworks/keyed/glimmer/src/ui/index.html delete mode 100644 frameworks/keyed/glimmer/src/ui/styles/app.css delete mode 100644 frameworks/keyed/glimmer/src/utils/benchmark-helpers.ts delete mode 100644 frameworks/keyed/glimmer/src/utils/test-helpers/test-helper.ts delete mode 100644 frameworks/keyed/glimmer/testem.json delete mode 100644 frameworks/keyed/glimmer/tests/index.html delete mode 100644 frameworks/keyed/glimmer/tsconfig.json delete mode 100644 frameworks/keyed/glimmer/tslint.json delete mode 100644 frameworks/keyed/helix/.clj-kondo/config.edn delete mode 100644 frameworks/keyed/helix/.gitignore delete mode 100755 frameworks/keyed/helix/index-dev.html delete mode 100755 frameworks/keyed/helix/index.html delete mode 100644 frameworks/keyed/helix/package.json delete mode 100644 frameworks/keyed/helix/shadow-cljs.edn delete mode 100644 frameworks/keyed/helix/src/demo/main.cljs delete mode 100644 frameworks/keyed/helix/src/demo/utils.cljs delete mode 100644 frameworks/keyed/heresy/index.html delete mode 100644 frameworks/keyed/heresy/package.json delete mode 100644 frameworks/keyed/heresy/rollup.config.js delete mode 100644 frameworks/keyed/heresy/src/index.js delete mode 100644 frameworks/keyed/heresy/src/ui/app.js delete mode 100644 frameworks/keyed/heresy/src/ui/button.js delete mode 100644 frameworks/keyed/heresy/src/ui/row.js delete mode 100755 frameworks/keyed/hullo/.babelrc delete mode 100644 frameworks/keyed/hullo/.yo-rc.json delete mode 100644 frameworks/keyed/hullo/_webpack.config.js delete mode 100644 frameworks/keyed/hullo/index.html delete mode 100644 frameworks/keyed/hullo/package.json delete mode 100644 frameworks/keyed/hullo/src/index.js delete mode 100644 frameworks/keyed/hullo/webpack.config.js delete mode 100644 frameworks/keyed/hyperapp/index.html delete mode 100644 frameworks/keyed/hyperapp/package.json delete mode 100644 frameworks/keyed/hyperapp/src/index.js delete mode 100644 frameworks/keyed/hyperapp/src/store.js delete mode 100644 frameworks/keyed/hyperhtml/index.html delete mode 100644 frameworks/keyed/hyperhtml/package.json delete mode 100644 frameworks/keyed/hyperhtml/rollup.config.js delete mode 100644 frameworks/keyed/hyperhtml/src/index.js delete mode 100644 frameworks/keyed/hyperhtml/src/row.js delete mode 100644 frameworks/keyed/hyperoop/index.html delete mode 100644 frameworks/keyed/hyperoop/package.json delete mode 100644 frameworks/keyed/hyperoop/rollup.config.js delete mode 100644 frameworks/keyed/hyperoop/src/index.tsx delete mode 100644 frameworks/keyed/hyperoop/src/rowsView.tsx delete mode 100644 frameworks/keyed/hyperoop/src/store.ts delete mode 100644 frameworks/keyed/hyperoop/tsconfig.json delete mode 100755 frameworks/keyed/imba/index.html delete mode 100644 frameworks/keyed/imba/package.json delete mode 100755 frameworks/keyed/imba/src/main.imba delete mode 100755 frameworks/keyed/imba/webpack.config.js delete mode 100644 frameworks/keyed/inferno/.babelrc delete mode 100644 frameworks/keyed/inferno/index.html delete mode 100644 frameworks/keyed/inferno/package.json delete mode 100644 frameworks/keyed/inferno/readme.md delete mode 100644 frameworks/keyed/inferno/rollup.config.js delete mode 100644 frameworks/keyed/inferno/src/controller.jsx delete mode 100644 frameworks/keyed/inferno/src/main.es6.js delete mode 100644 frameworks/keyed/inferno/src/store.es6.js delete mode 100644 frameworks/keyed/isotope/index.html delete mode 100644 frameworks/keyed/isotope/package.json delete mode 100644 frameworks/keyed/isotope/rollup.config.js delete mode 100644 frameworks/keyed/isotope/src/main.js delete mode 100644 frameworks/keyed/isotope/src/menu.js delete mode 100644 frameworks/keyed/isotope/src/utils.js delete mode 100644 frameworks/keyed/ivi/.gitignore delete mode 100644 frameworks/keyed/ivi/index.html delete mode 100644 frameworks/keyed/ivi/package.json delete mode 100644 frameworks/keyed/ivi/rollup.config.js delete mode 100644 frameworks/keyed/ivi/src/main.js delete mode 100644 frameworks/keyed/knockout/index.html delete mode 100644 frameworks/keyed/knockout/package.json delete mode 100644 frameworks/keyed/knockout/rollup.config.js delete mode 100644 frameworks/keyed/knockout/src/Main.js delete mode 100644 frameworks/keyed/ko-jsx/index.html delete mode 100644 frameworks/keyed/ko-jsx/package.json delete mode 100644 frameworks/keyed/ko-jsx/rollup.config.js delete mode 100644 frameworks/keyed/ko-jsx/src/Main.js delete mode 100644 frameworks/keyed/ko-jsx/src/template.jsx delete mode 100644 frameworks/keyed/lighterhtml/index.html delete mode 100644 frameworks/keyed/lighterhtml/package.json delete mode 100644 frameworks/keyed/lighterhtml/rollup.config.js delete mode 100644 frameworks/keyed/lighterhtml/src/index.js delete mode 100644 frameworks/keyed/lighterhtml/src/jumbotron.js delete mode 100644 frameworks/keyed/lighterhtml/src/table.js delete mode 100644 frameworks/keyed/lit-element/index.html delete mode 100644 frameworks/keyed/lit-element/package.json delete mode 100644 frameworks/keyed/lit-element/rollup.config.js delete mode 100644 frameworks/keyed/lit-element/src/main.ts delete mode 100644 frameworks/keyed/lit-element/src/store.ts delete mode 100644 frameworks/keyed/lit-element/tsconfig.json delete mode 100644 frameworks/keyed/lit-html/index.html delete mode 100644 frameworks/keyed/lit-html/package.json delete mode 100644 frameworks/keyed/lit-html/rollup.config.js delete mode 100644 frameworks/keyed/lit-html/src/index.js delete mode 100644 frameworks/keyed/maquette/build.js delete mode 100644 frameworks/keyed/maquette/index.html delete mode 100644 frameworks/keyed/maquette/package.json delete mode 100644 frameworks/keyed/maquette/src/main.es6.js delete mode 100644 frameworks/keyed/maquette/src/store.es6.js delete mode 100755 frameworks/keyed/marionette-jquery/.babelrc delete mode 100644 frameworks/keyed/marionette-jquery/index.html delete mode 100644 frameworks/keyed/marionette-jquery/package.json delete mode 100644 frameworks/keyed/marionette-jquery/src/Main.js delete mode 100644 frameworks/keyed/marionette-jquery/src/row.tpl.js delete mode 100644 frameworks/keyed/marionette-jquery/webpack.config.js delete mode 100755 frameworks/keyed/marionette/.babelrc delete mode 100644 frameworks/keyed/marionette/index.html delete mode 100644 frameworks/keyed/marionette/package.json delete mode 100644 frameworks/keyed/marionette/src/Main.js delete mode 100644 frameworks/keyed/marionette/src/mn-domapi.js delete mode 100644 frameworks/keyed/marionette/src/mn-morphdom-renderer.js delete mode 100644 frameworks/keyed/marionette/src/mn-native-view.js delete mode 100644 frameworks/keyed/marionette/src/rowtemplate.js delete mode 100644 frameworks/keyed/marionette/webpack.config.js delete mode 100644 frameworks/keyed/marko/.gitignore delete mode 100644 frameworks/keyed/marko/index.html delete mode 100644 frameworks/keyed/marko/package.json delete mode 100644 frameworks/keyed/marko/rollup.config.js delete mode 100644 frameworks/keyed/marko/src/client.js delete mode 100644 frameworks/keyed/marko/src/main/component.js delete mode 100644 frameworks/keyed/marko/src/main/components/row.marko delete mode 100644 frameworks/keyed/marko/src/main/index.marko delete mode 100644 frameworks/keyed/mikado/index.html delete mode 100644 frameworks/keyed/mikado/package.json delete mode 100644 frameworks/keyed/mikado/src/data.js delete mode 100644 frameworks/keyed/mikado/src/main.js delete mode 100644 frameworks/keyed/mikado/src/template/app.html delete mode 100644 frameworks/keyed/mikado/src/template/item.html delete mode 100644 frameworks/keyed/mikado/task/build.js delete mode 100644 frameworks/keyed/mimbl/buildDev.bat delete mode 100644 frameworks/keyed/mimbl/buildProd.bat delete mode 100644 frameworks/keyed/mimbl/index.html delete mode 100644 frameworks/keyed/mimbl/indexDev.html delete mode 100644 frameworks/keyed/mimbl/package.json delete mode 100644 frameworks/keyed/mimbl/src/Main.tsx delete mode 100644 frameworks/keyed/mimbl/src/Row.tsx delete mode 100644 frameworks/keyed/mimbl/src/Store.js delete mode 100644 frameworks/keyed/mimbl/src/TBody.tsx delete mode 100644 frameworks/keyed/mimbl/tsconfig.json delete mode 100644 frameworks/keyed/mimbl/webpack.config.js delete mode 100644 frameworks/keyed/miso/.gitignore delete mode 100644 frameworks/keyed/miso/README.md delete mode 100644 frameworks/keyed/miso/cabal.config delete mode 100644 frameworks/keyed/miso/default.nix delete mode 100644 frameworks/keyed/miso/dist-bundle/all.min.js delete mode 100644 frameworks/keyed/miso/dist-bundle/index.html delete mode 100644 frameworks/keyed/miso/miso-benchmark-keyed.cabal delete mode 100644 frameworks/keyed/miso/package.json delete mode 100644 frameworks/keyed/miso/src/Main.hs delete mode 100644 frameworks/keyed/misojs/.gitignore delete mode 100644 frameworks/keyed/misojs/README.md delete mode 100644 frameworks/keyed/misojs/delegate.js delete mode 100644 frameworks/keyed/misojs/diff.js delete mode 100644 frameworks/keyed/misojs/index.html delete mode 100644 frameworks/keyed/misojs/main.js delete mode 100644 frameworks/keyed/misojs/package.json delete mode 100644 frameworks/keyed/mithril/.babelrc delete mode 100644 frameworks/keyed/mithril/index.html delete mode 100644 frameworks/keyed/mithril/package.json delete mode 100644 frameworks/keyed/mithril/src/controller.jsx delete mode 100644 frameworks/keyed/mithril/src/main.es6.js delete mode 100644 frameworks/keyed/mithril/src/store.es6.js delete mode 100644 frameworks/keyed/mithril/webpack.config.js delete mode 100644 frameworks/keyed/mobx-jsx/index.html delete mode 100644 frameworks/keyed/mobx-jsx/package.json delete mode 100644 frameworks/keyed/mobx-jsx/rollup.config.js delete mode 100644 frameworks/keyed/mobx-jsx/src/main.jsx delete mode 100644 frameworks/keyed/naiv/.eslintrc.yml delete mode 100644 frameworks/keyed/naiv/index.html delete mode 100644 frameworks/keyed/naiv/package.json delete mode 100644 frameworks/keyed/naiv/rollup.config.js delete mode 100644 frameworks/keyed/naiv/src/index.js delete mode 100644 frameworks/keyed/nervjs/.babelrc delete mode 100644 frameworks/keyed/nervjs/index.html delete mode 100644 frameworks/keyed/nervjs/package.json delete mode 100644 frameworks/keyed/nervjs/src/Main.jsx delete mode 100644 frameworks/keyed/nervjs/src/Store.es6.js delete mode 100644 frameworks/keyed/nervjs/webpack.config.js delete mode 100644 frameworks/keyed/neverland/index.html delete mode 100644 frameworks/keyed/neverland/package.json delete mode 100644 frameworks/keyed/neverland/rollup.config.js delete mode 100644 frameworks/keyed/neverland/src/index.js delete mode 100644 frameworks/keyed/petit-dom/index.html delete mode 100644 frameworks/keyed/petit-dom/package.json delete mode 100644 frameworks/keyed/petit-dom/rollup.config.js delete mode 100644 frameworks/keyed/petit-dom/src/index.js delete mode 100644 frameworks/keyed/petit-dom/src/store.js delete mode 100755 frameworks/keyed/plastiq/index.html delete mode 100644 frameworks/keyed/plastiq/package.json delete mode 100755 frameworks/keyed/plastiq/src/entry/main.es6.jsx delete mode 100755 frameworks/keyed/plastiq/src/entry/store.es6.js delete mode 100755 frameworks/keyed/plastiq/webpack.config.js delete mode 100644 frameworks/keyed/preact/.babelrc delete mode 100644 frameworks/keyed/preact/index.html delete mode 100644 frameworks/keyed/preact/package.json delete mode 100644 frameworks/keyed/preact/preact.test.js delete mode 100644 frameworks/keyed/preact/src/Main.jsx delete mode 100644 frameworks/keyed/preact/src/Row.jsx delete mode 100644 frameworks/keyed/preact/src/Store.es6.js delete mode 100644 frameworks/keyed/preact/test/preact.test.js delete mode 100644 frameworks/keyed/preact/test/setup.js delete mode 100644 frameworks/keyed/preact/webpack.config.js delete mode 100644 frameworks/keyed/ractive/.babelrc delete mode 100644 frameworks/keyed/ractive/index.html delete mode 100644 frameworks/keyed/ractive/package.json delete mode 100644 frameworks/keyed/ractive/src/main.ractive.html delete mode 100644 frameworks/keyed/ractive/webpack.config.js delete mode 100644 frameworks/keyed/rawact/index.html delete mode 100644 frameworks/keyed/rawact/package.json delete mode 100644 frameworks/keyed/rawact/src/main.jsx delete mode 100644 frameworks/keyed/rawact/webpack.config.js delete mode 100755 frameworks/keyed/rax/index.html delete mode 100644 frameworks/keyed/rax/package.json delete mode 100755 frameworks/keyed/rax/src/main.jsx delete mode 100755 frameworks/keyed/rax/webpack.config.js delete mode 100755 frameworks/keyed/react-djinn/index.html delete mode 100644 frameworks/keyed/react-djinn/package.json delete mode 100755 frameworks/keyed/react-djinn/src/main.jsx delete mode 100755 frameworks/keyed/react-djinn/webpack.config.js delete mode 100644 frameworks/keyed/react-easy-state/index.html delete mode 100644 frameworks/keyed/react-easy-state/package.json delete mode 100644 frameworks/keyed/react-easy-state/src/Main.jsx delete mode 100644 frameworks/keyed/react-easy-state/src/Row.jsx delete mode 100644 frameworks/keyed/react-easy-state/src/appStore.js delete mode 100644 frameworks/keyed/react-easy-state/src/index.jsx delete mode 100644 frameworks/keyed/react-easy-state/src/randomSentence.js delete mode 100755 frameworks/keyed/react-easy-state/webpack.config.js delete mode 100644 frameworks/keyed/react-hooks/index.html delete mode 100644 frameworks/keyed/react-hooks/package.json delete mode 100644 frameworks/keyed/react-hooks/src/main.jsx delete mode 100644 frameworks/keyed/react-hooks/webpack.config.js delete mode 100755 frameworks/keyed/react-lite/.babelrc delete mode 100755 frameworks/keyed/react-lite/index.html delete mode 100755 frameworks/keyed/react-lite/package.json delete mode 100755 frameworks/keyed/react-lite/src/Main.jsx delete mode 100755 frameworks/keyed/react-lite/src/Row.jsx delete mode 100755 frameworks/keyed/react-lite/src/Store.es6.js delete mode 100755 frameworks/keyed/react-lite/src/main.es6.js delete mode 100755 frameworks/keyed/react-lite/webpack.config.js delete mode 100644 frameworks/keyed/react-mobX/.babelrc delete mode 100755 frameworks/keyed/react-mobX/index.html delete mode 100644 frameworks/keyed/react-mobX/package.json delete mode 100644 frameworks/keyed/react-mobX/src/Main.jsx delete mode 100755 frameworks/keyed/react-mobX/src/Row.jsx delete mode 100755 frameworks/keyed/react-mobX/src/Store.es6.js delete mode 100755 frameworks/keyed/react-mobX/webpack.config.js delete mode 100755 frameworks/keyed/react-redux-combiner/index.html delete mode 100644 frameworks/keyed/react-redux-combiner/package.json delete mode 100755 frameworks/keyed/react-redux-combiner/src/controller.jsx delete mode 100755 frameworks/keyed/react-redux-combiner/src/main.jsx delete mode 100755 frameworks/keyed/react-redux-combiner/src/store.js delete mode 100644 frameworks/keyed/react-redux-combiner/src/utils.js delete mode 100755 frameworks/keyed/react-redux-combiner/webpack.config.js delete mode 100755 frameworks/keyed/react-redux-hooks/index.html delete mode 100644 frameworks/keyed/react-redux-hooks/package.json delete mode 100755 frameworks/keyed/react-redux-hooks/src/main.jsx delete mode 100755 frameworks/keyed/react-redux-hooks/webpack.config.js delete mode 100755 frameworks/keyed/react-redux/index.html delete mode 100644 frameworks/keyed/react-redux/package.json delete mode 100755 frameworks/keyed/react-redux/src/main.jsx delete mode 100755 frameworks/keyed/react-redux/webpack.config.js delete mode 100644 frameworks/keyed/react/.vscode/settings.json delete mode 100755 frameworks/keyed/react/index.html delete mode 100644 frameworks/keyed/react/package.json delete mode 100755 frameworks/keyed/react/src/main.jsx delete mode 100755 frameworks/keyed/react/webpack.config.js delete mode 100644 frameworks/keyed/reagent/.gitignore delete mode 100755 frameworks/keyed/reagent/index.html delete mode 100644 frameworks/keyed/reagent/package.json delete mode 100644 frameworks/keyed/reagent/project.clj delete mode 100644 frameworks/keyed/reagent/src/demo/main.cljs delete mode 100644 frameworks/keyed/reagent/src/demo/utils.cljs delete mode 100644 frameworks/keyed/reaml-preact/.gitignore delete mode 100644 frameworks/keyed/reaml-preact/.ocamlformat delete mode 100644 frameworks/keyed/reaml-preact/bsconfig.json delete mode 100644 frameworks/keyed/reaml-preact/index.html delete mode 100644 frameworks/keyed/reaml-preact/package.json delete mode 100644 frameworks/keyed/reaml-preact/rollup.config.js delete mode 100644 frameworks/keyed/reaml-preact/src/Main.ml delete mode 100644 frameworks/keyed/reaml-preact/src/Main.mli delete mode 100644 frameworks/keyed/reaml-react/.gitignore delete mode 100644 frameworks/keyed/reaml-react/.ocamlformat delete mode 100644 frameworks/keyed/reaml-react/bsconfig.json delete mode 100644 frameworks/keyed/reaml-react/index.html delete mode 100644 frameworks/keyed/reaml-react/package.json delete mode 100644 frameworks/keyed/reaml-react/rollup.config.js delete mode 100644 frameworks/keyed/reaml-react/src/Main.ml delete mode 100644 frameworks/keyed/reaml-react/src/Main.mli delete mode 100644 frameworks/keyed/reason-react/.gitignore delete mode 100644 frameworks/keyed/reason-react/bsconfig.json delete mode 100755 frameworks/keyed/reason-react/index.html delete mode 100644 frameworks/keyed/reason-react/package.json delete mode 100755 frameworks/keyed/reason-react/src/Button.re delete mode 100644 frameworks/keyed/reason-react/src/Index.re delete mode 100755 frameworks/keyed/reason-react/src/Jumbotron.re delete mode 100755 frameworks/keyed/reason-react/src/Main.re delete mode 100755 frameworks/keyed/reason-react/src/Row.re delete mode 100755 frameworks/keyed/reason-react/src/Util.re delete mode 100755 frameworks/keyed/reason-react/webpack.config.js delete mode 100644 frameworks/keyed/redom/index.html delete mode 100644 frameworks/keyed/redom/package.json delete mode 100644 frameworks/keyed/redom/rollup.config.dev.js delete mode 100644 frameworks/keyed/redom/rollup.config.js delete mode 100644 frameworks/keyed/redom/src/app.js delete mode 100644 frameworks/keyed/redom/src/main.js delete mode 100644 frameworks/keyed/redom/src/store.js delete mode 100644 frameworks/keyed/reflex-dom/.gitignore delete mode 100755 frameworks/keyed/reflex-dom/build.sh delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/all.js delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/all.js.externs delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/index.html delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/lib.js delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/out.frefs.js delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/out.frefs.json delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/out.js delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/rts.js delete mode 100644 frameworks/keyed/reflex-dom/bundled-dist/runmain.js delete mode 100755 frameworks/keyed/reflex-dom/install.sh delete mode 100644 frameworks/keyed/reflex-dom/package.json delete mode 100644 frameworks/keyed/resonatejs/index.html delete mode 100644 frameworks/keyed/resonatejs/package.json delete mode 100644 frameworks/keyed/resonatejs/src/main.js delete mode 100644 frameworks/keyed/resonatejs/src/resonate.min.js delete mode 100644 frameworks/keyed/resonatejs/webpack.config.js delete mode 100644 frameworks/keyed/riot/index.html delete mode 100644 frameworks/keyed/riot/package.json delete mode 100644 frameworks/keyed/riot/src/app.riot delete mode 100755 frameworks/keyed/riot/src/main.js delete mode 100755 frameworks/keyed/riot/src/store.js delete mode 100755 frameworks/keyed/riot/webpack.config.js delete mode 100644 frameworks/keyed/san/.babelrc delete mode 100755 frameworks/keyed/san/index.html delete mode 100755 frameworks/keyed/san/package.json delete mode 100644 frameworks/keyed/san/src/App.js delete mode 100755 frameworks/keyed/san/src/main.es6.js delete mode 100755 frameworks/keyed/san/src/store.es6.js delete mode 100755 frameworks/keyed/san/webpack.config.js delete mode 100644 frameworks/keyed/scarletsframe/.babelrc delete mode 100644 frameworks/keyed/scarletsframe/index.html delete mode 100644 frameworks/keyed/scarletsframe/package.json delete mode 100644 frameworks/keyed/scarletsframe/src/main.js delete mode 100644 frameworks/keyed/scarletsframe/webpack.config.js delete mode 100644 frameworks/keyed/sifrr/app.js delete mode 100644 frameworks/keyed/sifrr/elements.js delete mode 100644 frameworks/keyed/sifrr/index.html delete mode 100644 frameworks/keyed/sifrr/package.json delete mode 100644 frameworks/keyed/sifrr/rollup.config.js delete mode 100644 frameworks/keyed/sinuous/.eslintrc.yml delete mode 100644 frameworks/keyed/sinuous/index.html delete mode 100644 frameworks/keyed/sinuous/package.json delete mode 100644 frameworks/keyed/sinuous/rollup.config.js delete mode 100644 frameworks/keyed/sinuous/src/main.js delete mode 100644 frameworks/keyed/solid-state/index.html delete mode 100644 frameworks/keyed/solid-state/package.json delete mode 100644 frameworks/keyed/solid-state/rollup.config.js delete mode 100644 frameworks/keyed/solid-state/src/main.jsx delete mode 100644 frameworks/keyed/solid/index.html delete mode 100644 frameworks/keyed/solid/package.json delete mode 100644 frameworks/keyed/solid/rollup.config.js delete mode 100644 frameworks/keyed/solid/src/main.jsx delete mode 100644 frameworks/keyed/stage0/app.js delete mode 100644 frameworks/keyed/stage0/index.html delete mode 100644 frameworks/keyed/stage0/package.json delete mode 100644 frameworks/keyed/stage0/rollup.config.js delete mode 100644 frameworks/keyed/stdweb/.gitignore delete mode 100644 frameworks/keyed/stdweb/Cargo.toml delete mode 100644 frameworks/keyed/stdweb/README.md delete mode 100644 frameworks/keyed/stdweb/bundled-dist/index.html delete mode 100644 frameworks/keyed/stdweb/bundled-dist/js-framework-benchmark-stdweb.js delete mode 100644 frameworks/keyed/stdweb/bundled-dist/js-framework-benchmark-stdweb.wasm delete mode 100644 frameworks/keyed/stdweb/index.html delete mode 100644 frameworks/keyed/stdweb/package.json delete mode 100644 frameworks/keyed/stdweb/src/main.rs delete mode 100644 frameworks/keyed/surplus/.gitignore delete mode 100644 frameworks/keyed/surplus/index.html delete mode 100644 frameworks/keyed/surplus/package.json delete mode 100644 frameworks/keyed/surplus/rollup.config.js delete mode 100644 frameworks/keyed/surplus/src/main.ts delete mode 100644 frameworks/keyed/surplus/src/store.ts delete mode 100644 frameworks/keyed/surplus/src/view.tsx delete mode 100644 frameworks/keyed/surplus/tsconfig.json delete mode 100644 frameworks/keyed/svelte/index.html delete mode 100644 frameworks/keyed/svelte/package.json delete mode 100644 frameworks/keyed/svelte/rollup.config.js delete mode 100644 frameworks/keyed/svelte/src/Main.svelte delete mode 100644 frameworks/keyed/svelte/src/main.js delete mode 100644 frameworks/keyed/uhtml/index.html delete mode 100644 frameworks/keyed/uhtml/package.json delete mode 100644 frameworks/keyed/uhtml/rollup.config.js delete mode 100644 frameworks/keyed/uhtml/src/index.js delete mode 100644 frameworks/keyed/uhtml/src/jumbotron.js delete mode 100644 frameworks/keyed/uhtml/src/table.js delete mode 100644 frameworks/keyed/vanillajs-1/index.html delete mode 100644 frameworks/keyed/vanillajs-1/package.json delete mode 100644 frameworks/keyed/vanillajs-1/rollup.config.js delete mode 100644 frameworks/keyed/vanillajs-1/src/Main.js delete mode 100644 frameworks/keyed/vanillajs-wc/index.html delete mode 100644 frameworks/keyed/vanillajs-wc/package.json delete mode 100644 frameworks/keyed/vanillajs-wc/src/main.js delete mode 100644 frameworks/keyed/vanillajs/index.html delete mode 100644 frameworks/keyed/vanillajs/package.json delete mode 100644 frameworks/keyed/vanillajs/src/Main.js delete mode 100644 frameworks/keyed/vanillajs/webpack.config.js delete mode 100755 frameworks/keyed/vidom/index.html delete mode 100755 frameworks/keyed/vidom/package.json delete mode 100755 frameworks/keyed/vidom/src/controller.jsx delete mode 100755 frameworks/keyed/vidom/src/main.js delete mode 100755 frameworks/keyed/vidom/src/store.js delete mode 100755 frameworks/keyed/vidom/webpack.config.js delete mode 100644 frameworks/keyed/vue-next/.babelrc delete mode 100644 frameworks/keyed/vue-next/index.html delete mode 100644 frameworks/keyed/vue-next/package.json delete mode 100644 frameworks/keyed/vue-next/src/App.vue delete mode 100644 frameworks/keyed/vue-next/src/main.js delete mode 100644 frameworks/keyed/vue-next/webpack.config.js delete mode 100644 frameworks/keyed/vue/.babelrc delete mode 100644 frameworks/keyed/vue/index.html delete mode 100644 frameworks/keyed/vue/package.json delete mode 100644 frameworks/keyed/vue/src/App.vue delete mode 100644 frameworks/keyed/vue/src/main.es6.js delete mode 100644 frameworks/keyed/vue/src/store.es6.js delete mode 100644 frameworks/keyed/vue/webpack.config.js delete mode 100644 frameworks/non-keyed/angular/.gitignore delete mode 100644 frameworks/non-keyed/angular/closure.conf delete mode 100644 frameworks/non-keyed/angular/index.html delete mode 100644 frameworks/non-keyed/angular/package.json delete mode 100644 frameworks/non-keyed/angular/rollup.config.js delete mode 100644 frameworks/non-keyed/angular/src/app.ts delete mode 100644 frameworks/non-keyed/angular/src/main.ts delete mode 100644 frameworks/non-keyed/angular/tsconfig.json delete mode 100644 frameworks/non-keyed/apprun/index.html delete mode 100644 frameworks/non-keyed/apprun/package.json delete mode 100644 frameworks/non-keyed/apprun/src/main.tsx delete mode 100644 frameworks/non-keyed/apprun/src/store.ts delete mode 100644 frameworks/non-keyed/apprun/tsconfig.json delete mode 100644 frameworks/non-keyed/apprun/webpack.config.js delete mode 100755 frameworks/non-keyed/aurelia/.babelrc delete mode 100644 frameworks/non-keyed/aurelia/.gitignore delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/aurelia.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/environments/dev.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/environments/prod.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/environments/stage.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/attribute.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/attribute.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/binding-behavior.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/binding-behavior.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/component.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/component.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/element.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/element.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/generator.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/generator.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/task.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/task.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/value-converter.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/generators/value-converter.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/build.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/build.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/copy-files.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/lint.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/process-css.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/process-markup.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/run.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/run.json delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/transpile.js delete mode 100644 frameworks/non-keyed/aurelia/aurelia_project/tasks/watch.js delete mode 100755 frameworks/non-keyed/aurelia/favicon.ico delete mode 100755 frameworks/non-keyed/aurelia/index.html delete mode 100755 frameworks/non-keyed/aurelia/jsconfig.json delete mode 100644 frameworks/non-keyed/aurelia/package.json delete mode 100755 frameworks/non-keyed/aurelia/src/app.html delete mode 100755 frameworks/non-keyed/aurelia/src/app.js delete mode 100644 frameworks/non-keyed/aurelia/src/aurelia-polyfills.js delete mode 100755 frameworks/non-keyed/aurelia/src/main.js delete mode 100644 frameworks/non-keyed/aurelia/src/store.js delete mode 100644 frameworks/non-keyed/cyclejs-dom/.babelrc delete mode 100644 frameworks/non-keyed/cyclejs-dom/index.html delete mode 100644 frameworks/non-keyed/cyclejs-dom/package.json delete mode 100644 frameworks/non-keyed/cyclejs-dom/src/main.jsx delete mode 100644 frameworks/non-keyed/cyclejs-dom/webpack.config.js delete mode 100644 frameworks/non-keyed/dojo/.dojorc delete mode 100644 frameworks/non-keyed/dojo/.gitignore delete mode 100644 frameworks/non-keyed/dojo/README.md delete mode 100644 frameworks/non-keyed/dojo/package.json delete mode 100644 frameworks/non-keyed/dojo/src/App.ts delete mode 100644 frameworks/non-keyed/dojo/src/Button.ts delete mode 100644 frameworks/non-keyed/dojo/src/Buttons.ts delete mode 100644 frameworks/non-keyed/dojo/src/Row.ts delete mode 100644 frameworks/non-keyed/dojo/src/Store.ts delete mode 100644 frameworks/non-keyed/dojo/src/index.html delete mode 100644 frameworks/non-keyed/dojo/src/main.css delete mode 100644 frameworks/non-keyed/dojo/src/main.ts delete mode 100644 frameworks/non-keyed/dojo/tsconfig.json delete mode 100644 frameworks/non-keyed/domc/index.html delete mode 100644 frameworks/non-keyed/domc/package.json delete mode 100644 frameworks/non-keyed/domc/rollup.config.js delete mode 100644 frameworks/non-keyed/domc/src/app.js delete mode 100644 frameworks/non-keyed/domdiff/index.html delete mode 100644 frameworks/non-keyed/domdiff/package.json delete mode 100644 frameworks/non-keyed/domdiff/rollup.config.js delete mode 100644 frameworks/non-keyed/domdiff/src/index.js delete mode 100644 frameworks/non-keyed/domdiff/src/utils.js delete mode 100644 frameworks/non-keyed/domvm/build.js delete mode 100644 frameworks/non-keyed/domvm/index.html delete mode 100644 frameworks/non-keyed/domvm/package.json delete mode 100644 frameworks/non-keyed/domvm/src/main.es6.js delete mode 100644 frameworks/non-keyed/domvm/src/store.es6.js delete mode 100644 frameworks/non-keyed/elm/.gitignore delete mode 100644 frameworks/non-keyed/elm/elm.json delete mode 100644 frameworks/non-keyed/elm/index.html delete mode 100644 frameworks/non-keyed/elm/package.json delete mode 100644 frameworks/non-keyed/elm/src/Main.elm delete mode 100644 frameworks/non-keyed/endorphin/index.html delete mode 100644 frameworks/non-keyed/endorphin/package.json delete mode 100644 frameworks/non-keyed/endorphin/rollup.config.js delete mode 100644 frameworks/non-keyed/endorphin/src/app-ui/app-ui.html delete mode 100644 frameworks/non-keyed/endorphin/src/app-ui/app-ui.js delete mode 100644 frameworks/non-keyed/endorphin/src/app.js delete mode 100644 frameworks/non-keyed/etch/.babelrc delete mode 100644 frameworks/non-keyed/etch/index.html delete mode 100644 frameworks/non-keyed/etch/package.json delete mode 100644 frameworks/non-keyed/etch/src/Main.jsx delete mode 100644 frameworks/non-keyed/etch/src/Row.jsx delete mode 100644 frameworks/non-keyed/etch/src/Store.es6.js delete mode 100644 frameworks/non-keyed/etch/src/main.es6.js delete mode 100644 frameworks/non-keyed/etch/webpack.config.js delete mode 100644 frameworks/non-keyed/gruu/.babelrc delete mode 100644 frameworks/non-keyed/gruu/index.html delete mode 100644 frameworks/non-keyed/gruu/package.json delete mode 100644 frameworks/non-keyed/gruu/src/Store.es6.js delete mode 100644 frameworks/non-keyed/gruu/src/main.es6.js delete mode 100644 frameworks/non-keyed/gruu/webpack.config.js delete mode 100644 frameworks/non-keyed/halogen/.gitignore delete mode 100644 frameworks/non-keyed/halogen/index.html delete mode 100644 frameworks/non-keyed/halogen/package.json delete mode 100644 frameworks/non-keyed/halogen/packages.dhall delete mode 100644 frameworks/non-keyed/halogen/spago.dhall delete mode 100644 frameworks/non-keyed/halogen/src/Main.js delete mode 100644 frameworks/non-keyed/halogen/src/Main.purs delete mode 100644 frameworks/non-keyed/heresy/index.html delete mode 100644 frameworks/non-keyed/heresy/package.json delete mode 100644 frameworks/non-keyed/heresy/rollup.config.js delete mode 100644 frameworks/non-keyed/heresy/src/index.js delete mode 100644 frameworks/non-keyed/heresy/src/ui/app.js delete mode 100644 frameworks/non-keyed/heresy/src/ui/button.js delete mode 100644 frameworks/non-keyed/heresy/src/ui/row.js delete mode 100755 frameworks/non-keyed/hullo/.babelrc delete mode 100644 frameworks/non-keyed/hullo/.yo-rc.json delete mode 100644 frameworks/non-keyed/hullo/_webpack.config.js delete mode 100644 frameworks/non-keyed/hullo/index.html delete mode 100644 frameworks/non-keyed/hullo/package.json delete mode 100644 frameworks/non-keyed/hullo/src/index.js delete mode 100644 frameworks/non-keyed/hullo/webpack.config.js delete mode 100755 frameworks/non-keyed/imba/index.html delete mode 100644 frameworks/non-keyed/imba/package.json delete mode 100755 frameworks/non-keyed/imba/src/main.imba delete mode 100755 frameworks/non-keyed/imba/webpack.config.js delete mode 100644 frameworks/non-keyed/incr_dom/.gitignore delete mode 100644 frameworks/non-keyed/incr_dom/copy.sh delete mode 100644 frameworks/non-keyed/incr_dom/dune delete mode 100644 frameworks/non-keyed/incr_dom/dune-project delete mode 100644 frameworks/non-keyed/incr_dom/esy.json delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/.gitattributes delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/.gitignore delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/index.json delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/async_js.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/async_kernel.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/async_rpc_kernel.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/atd.2.0.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/atdgen-runtime.2.0.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/atdgen.2.0.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base-bytes.base/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base-threads.base/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base-unix.base/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base.v0.13.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base_bigstring.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/base_quickcheck.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/bin_prot.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/biniou.1.2.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/cmdliner.1.0.4/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/conf-m4.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/core_kernel.v0.13.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/cppo.1.6.6/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/dune-configurator.2.3.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/dune-private-libs.2.3.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/dune.2.3.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/easy-format.1.3.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/fieldslib.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/fix.20200131/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/incr_dom.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/incr_map.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/incr_select.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/incremental.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/jane-street-headers.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/jbuilder.1.0+beta20.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/js_of_ocaml-compiler.3.5.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/js_of_ocaml-ppx.3.5.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/js_of_ocaml.3.5.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/jst-config.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/menhir.20200211/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/menhirLib.20200211/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/menhirSdk.20200211/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/merlin-extend.0.5/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/merlin.3.3.3/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/num.1.3/files/installation-warning.patch delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/num.1.3/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocaml-compiler-libs.v0.12.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocaml-migrate-parsetree.1.6.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocamlbuild.0.14.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ocamlfind.1.8.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/octavius.1.2.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/parsexp.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_assert.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_base.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_bench.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_bin_prot.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_cold.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_compare.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_custom_printf.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_derivers.1.2.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_enumerate.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_expect.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_fail.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_fields_conv.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_hash.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_here.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_inline_test.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_jane.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_js_style.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_let.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_module_timer.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_optcomp.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_optional.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_pipebang.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_sexp_conv.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_sexp_message.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_sexp_value.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_stable.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_tools_versioned.5.3.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_typerep_conv.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppx_variants_conv.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/ppxlib.0.12.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/protocol_version_header.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/re.1.9.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/result.1.5/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/seq.base/files/META.seq delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/seq.base/files/seq.install delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/seq.base/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/sexplib.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/sexplib0.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/splittable_random.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/stdio.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/stringext.1.6.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/time_now.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/topkg.1.0.1/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/typerep.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/tyxml.4.3.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/uchar.0.0.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/uri-sexp.3.1.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/uri.3.1.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/uutf.1.0.2/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/variantslib.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/virtual_dom.v0.13.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/opam/yojson.1.7.0/opam delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__menhir_opam__c__20200211_opam_override/package.json delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/files/num-1.3.patch delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/package.json delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch delete mode 100644 frameworks/non-keyed/incr_dom/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json delete mode 100755 frameworks/non-keyed/incr_dom/index.html delete mode 100644 frameworks/non-keyed/incr_dom/js-framework-benchmark-components.opam delete mode 100644 frameworks/non-keyed/incr_dom/js-framework-benchmark.opam delete mode 100644 frameworks/non-keyed/incr_dom/package.json delete mode 100644 frameworks/non-keyed/incr_dom/src/app/App.re delete mode 100644 frameworks/non-keyed/incr_dom/src/app/Entrypoint.re delete mode 100644 frameworks/non-keyed/incr_dom/src/app/dune delete mode 100755 frameworks/non-keyed/incr_dom/src/components/Button.re delete mode 100644 frameworks/non-keyed/incr_dom/src/components/Elements.re delete mode 100755 frameworks/non-keyed/incr_dom/src/components/Jumbotron.re delete mode 100755 frameworks/non-keyed/incr_dom/src/components/Row.re delete mode 100755 frameworks/non-keyed/incr_dom/src/components/Util.re delete mode 100644 frameworks/non-keyed/incr_dom/src/components/dune delete mode 100644 frameworks/non-keyed/inferno/.babelrc delete mode 100644 frameworks/non-keyed/inferno/index.html delete mode 100644 frameworks/non-keyed/inferno/package.json delete mode 100644 frameworks/non-keyed/inferno/readme.md delete mode 100644 frameworks/non-keyed/inferno/rollup.config.js delete mode 100644 frameworks/non-keyed/inferno/src/controller.jsx delete mode 100644 frameworks/non-keyed/inferno/src/main.es6.js delete mode 100644 frameworks/non-keyed/inferno/src/store.es6.js delete mode 100644 frameworks/non-keyed/lighterhtml/index.html delete mode 100644 frameworks/non-keyed/lighterhtml/package.json delete mode 100644 frameworks/non-keyed/lighterhtml/rollup.config.js delete mode 100644 frameworks/non-keyed/lighterhtml/src/index.js delete mode 100644 frameworks/non-keyed/lighterhtml/src/jumbotron.js delete mode 100644 frameworks/non-keyed/lighterhtml/src/table.js delete mode 100644 frameworks/non-keyed/lit-element/index.html delete mode 100644 frameworks/non-keyed/lit-element/package.json delete mode 100644 frameworks/non-keyed/lit-element/rollup.config.js delete mode 100644 frameworks/non-keyed/lit-element/src/main.ts delete mode 100644 frameworks/non-keyed/lit-element/src/store.ts delete mode 100644 frameworks/non-keyed/lit-element/tsconfig.json delete mode 100644 frameworks/non-keyed/lit-html/index.html delete mode 100644 frameworks/non-keyed/lit-html/package.json delete mode 100644 frameworks/non-keyed/lit-html/rollup.config.js delete mode 100644 frameworks/non-keyed/lit-html/src/index.js delete mode 100644 frameworks/non-keyed/lite-html/index.html delete mode 100644 frameworks/non-keyed/lite-html/package.json delete mode 100644 frameworks/non-keyed/lite-html/rollup.config.js delete mode 100644 frameworks/non-keyed/lite-html/src/index.js delete mode 100644 frameworks/non-keyed/literaljs/.babelrc delete mode 100644 frameworks/non-keyed/literaljs/.gitignore delete mode 100644 frameworks/non-keyed/literaljs/index.html delete mode 100644 frameworks/non-keyed/literaljs/index.js delete mode 100644 frameworks/non-keyed/literaljs/package.json delete mode 100644 frameworks/non-keyed/literaljs/store.js delete mode 100644 frameworks/non-keyed/mikado/index.html delete mode 100644 frameworks/non-keyed/mikado/package.json delete mode 100644 frameworks/non-keyed/mikado/src/data.js delete mode 100644 frameworks/non-keyed/mikado/src/main.js delete mode 100644 frameworks/non-keyed/mikado/src/template/app.html delete mode 100644 frameworks/non-keyed/mikado/src/template/item.html delete mode 100644 frameworks/non-keyed/mikado/task/build.js delete mode 100644 frameworks/non-keyed/mimbl/buildDev.bat delete mode 100644 frameworks/non-keyed/mimbl/buildProd.bat delete mode 100644 frameworks/non-keyed/mimbl/index.html delete mode 100644 frameworks/non-keyed/mimbl/indexDev.html delete mode 100644 frameworks/non-keyed/mimbl/package.json delete mode 100644 frameworks/non-keyed/mimbl/src/Main.tsx delete mode 100644 frameworks/non-keyed/mimbl/src/Row.tsx delete mode 100644 frameworks/non-keyed/mimbl/src/Store.js delete mode 100644 frameworks/non-keyed/mimbl/src/TBody.tsx delete mode 100644 frameworks/non-keyed/mimbl/tsconfig.json delete mode 100644 frameworks/non-keyed/mimbl/webpack.config.js delete mode 100644 frameworks/non-keyed/miso/.gitignore delete mode 100644 frameworks/non-keyed/miso/README.md delete mode 100644 frameworks/non-keyed/miso/cabal.config delete mode 100644 frameworks/non-keyed/miso/default.nix delete mode 100644 frameworks/non-keyed/miso/dist-bundle/all.min.js delete mode 100644 frameworks/non-keyed/miso/dist-bundle/index.html delete mode 100644 frameworks/non-keyed/miso/miso-benchmark-non-keyed.cabal delete mode 100644 frameworks/non-keyed/miso/package.json delete mode 100644 frameworks/non-keyed/miso/src/Main.hs delete mode 100755 frameworks/non-keyed/moon/index.html delete mode 100755 frameworks/non-keyed/moon/package.json delete mode 100644 frameworks/non-keyed/moon/src/index.js delete mode 100644 frameworks/non-keyed/moon/webpack.config.js delete mode 100644 frameworks/non-keyed/neverland/index.html delete mode 100644 frameworks/non-keyed/neverland/package.json delete mode 100644 frameworks/non-keyed/neverland/rollup.config.js delete mode 100644 frameworks/non-keyed/neverland/src/index.js delete mode 100644 frameworks/non-keyed/polymer/.gitignore delete mode 100644 frameworks/non-keyed/polymer/bower.json delete mode 100755 frameworks/non-keyed/polymer/index.html delete mode 100644 frameworks/non-keyed/polymer/package.json delete mode 100644 frameworks/non-keyed/polymer/polymer.json delete mode 100755 frameworks/non-keyed/polymer/src/main-element.html delete mode 100644 frameworks/non-keyed/polymer/src/shared-styles.html delete mode 100644 frameworks/non-keyed/polymer/test/polymer-temp_test.html delete mode 100644 frameworks/non-keyed/pux/.gitignore delete mode 100644 frameworks/non-keyed/pux/bower.json delete mode 100644 frameworks/non-keyed/pux/index.html delete mode 100644 frameworks/non-keyed/pux/package.json delete mode 100644 frameworks/non-keyed/pux/src/Main.purs delete mode 100644 frameworks/non-keyed/ractive/.babelrc delete mode 100644 frameworks/non-keyed/ractive/index.html delete mode 100644 frameworks/non-keyed/ractive/package.json delete mode 100644 frameworks/non-keyed/ractive/src/main.ractive.html delete mode 100644 frameworks/non-keyed/ractive/webpack.config.js delete mode 100644 frameworks/non-keyed/rawact/index.html delete mode 100644 frameworks/non-keyed/rawact/package.json delete mode 100644 frameworks/non-keyed/rawact/src/main.jsx delete mode 100644 frameworks/non-keyed/rawact/webpack.config.js delete mode 100755 frameworks/non-keyed/react/index.html delete mode 100644 frameworks/non-keyed/react/package.json delete mode 100755 frameworks/non-keyed/react/src/main.jsx delete mode 100755 frameworks/non-keyed/react/webpack.config.js delete mode 100644 frameworks/non-keyed/redom/index.html delete mode 100644 frameworks/non-keyed/redom/package.json delete mode 100644 frameworks/non-keyed/redom/rollup.config.dev.js delete mode 100644 frameworks/non-keyed/redom/rollup.config.js delete mode 100644 frameworks/non-keyed/redom/src/app.js delete mode 100644 frameworks/non-keyed/redom/src/main.js delete mode 100644 frameworks/non-keyed/redom/src/store.js delete mode 100644 frameworks/non-keyed/riot/index.html delete mode 100644 frameworks/non-keyed/riot/package.json delete mode 100644 frameworks/non-keyed/riot/src/app.riot delete mode 100755 frameworks/non-keyed/riot/src/main.js delete mode 100755 frameworks/non-keyed/riot/src/store.js delete mode 100755 frameworks/non-keyed/riot/webpack.config.js delete mode 100644 frameworks/non-keyed/san/.babelrc delete mode 100755 frameworks/non-keyed/san/index.html delete mode 100755 frameworks/non-keyed/san/package.json delete mode 100644 frameworks/non-keyed/san/src/App.js delete mode 100755 frameworks/non-keyed/san/src/main.es6.js delete mode 100755 frameworks/non-keyed/san/src/store.es6.js delete mode 100755 frameworks/non-keyed/san/webpack.config.js delete mode 100644 frameworks/non-keyed/scarletsframe/.babelrc delete mode 100644 frameworks/non-keyed/scarletsframe/index.html delete mode 100644 frameworks/non-keyed/scarletsframe/package.json delete mode 100644 frameworks/non-keyed/scarletsframe/src/main.js delete mode 100644 frameworks/non-keyed/scarletsframe/webpack.config.js delete mode 100644 frameworks/non-keyed/seed/.gitignore delete mode 100644 frameworks/non-keyed/seed/Cargo.toml delete mode 100644 frameworks/non-keyed/seed/README.md delete mode 100644 frameworks/non-keyed/seed/bundled-dist/index.html delete mode 100644 frameworks/non-keyed/seed/bundled-dist/js-framework-benchmark-seed.js delete mode 100644 frameworks/non-keyed/seed/bundled-dist/js-framework-benchmark-seed_bg.wasm delete mode 100644 frameworks/non-keyed/seed/index.html delete mode 100644 frameworks/non-keyed/seed/package.json delete mode 100644 frameworks/non-keyed/seed/src/lib.rs delete mode 100644 frameworks/non-keyed/sifrr/app.js delete mode 100644 frameworks/non-keyed/sifrr/elements.js delete mode 100644 frameworks/non-keyed/sifrr/index.html delete mode 100644 frameworks/non-keyed/sifrr/package.json delete mode 100644 frameworks/non-keyed/sifrr/rollup.config.js delete mode 100644 frameworks/non-keyed/simi/.simi.toml delete mode 100644 frameworks/non-keyed/simi/Cargo.toml delete mode 100644 frameworks/non-keyed/simi/build.js delete mode 100644 frameworks/non-keyed/simi/index.html delete mode 100644 frameworks/non-keyed/simi/js_framework_benchmark_simi.js delete mode 100644 frameworks/non-keyed/simi/js_framework_benchmark_simi_bg.js delete mode 100644 frameworks/non-keyed/simi/js_framework_benchmark_simi_bg.wasm delete mode 100644 frameworks/non-keyed/simi/package.json delete mode 100644 frameworks/non-keyed/simi/src/lib.rs delete mode 100644 frameworks/non-keyed/simi/static/index.html delete mode 100644 frameworks/non-keyed/simulacra/.babelrc delete mode 100755 frameworks/non-keyed/simulacra/index.html delete mode 100755 frameworks/non-keyed/simulacra/package.json delete mode 100644 frameworks/non-keyed/simulacra/src/main.js delete mode 100644 frameworks/non-keyed/simulacra/webpack.config.js delete mode 100644 frameworks/non-keyed/slim-js/index.html delete mode 100644 frameworks/non-keyed/slim-js/main-app.js delete mode 100644 frameworks/non-keyed/slim-js/package.json delete mode 100644 frameworks/non-keyed/slim-js/slim.js delete mode 100644 frameworks/non-keyed/stage0/app.js delete mode 100644 frameworks/non-keyed/stage0/index.html delete mode 100644 frameworks/non-keyed/stage0/package.json delete mode 100644 frameworks/non-keyed/stage0/rollup.config.js delete mode 100644 frameworks/non-keyed/stdweb/.gitignore delete mode 100644 frameworks/non-keyed/stdweb/Cargo.toml delete mode 100644 frameworks/non-keyed/stdweb/README.md delete mode 100644 frameworks/non-keyed/stdweb/bundled-dist/index.html delete mode 100644 frameworks/non-keyed/stdweb/bundled-dist/js-framework-benchmark-stdweb.js delete mode 100644 frameworks/non-keyed/stdweb/bundled-dist/js-framework-benchmark-stdweb.wasm delete mode 100644 frameworks/non-keyed/stdweb/index.html delete mode 100644 frameworks/non-keyed/stdweb/package.json delete mode 100644 frameworks/non-keyed/stdweb/src/main.rs delete mode 100644 frameworks/non-keyed/stem/.babelrc delete mode 100644 frameworks/non-keyed/stem/.gitignore delete mode 100644 frameworks/non-keyed/stem/README.md delete mode 100644 frameworks/non-keyed/stem/css/bootstrap.min.css delete mode 100644 frameworks/non-keyed/stem/index.html delete mode 100644 frameworks/non-keyed/stem/package.json delete mode 100644 frameworks/non-keyed/stem/src/Main.jsx delete mode 100644 frameworks/non-keyed/stem/src/Row.jsx delete mode 100644 frameworks/non-keyed/stem/src/RowState.es6.js delete mode 100644 frameworks/non-keyed/stem/src/rollup.config.js delete mode 100644 frameworks/non-keyed/surplus/.gitignore delete mode 100644 frameworks/non-keyed/surplus/index.html delete mode 100644 frameworks/non-keyed/surplus/package.json delete mode 100644 frameworks/non-keyed/surplus/rollup.config.js delete mode 100644 frameworks/non-keyed/surplus/src/main.ts delete mode 100644 frameworks/non-keyed/surplus/src/store.ts delete mode 100644 frameworks/non-keyed/surplus/src/view.tsx delete mode 100644 frameworks/non-keyed/surplus/tsconfig.json delete mode 100644 frameworks/non-keyed/svelte/index.html delete mode 100644 frameworks/non-keyed/svelte/package.json delete mode 100644 frameworks/non-keyed/svelte/rollup.config.js delete mode 100644 frameworks/non-keyed/svelte/src/Main.svelte delete mode 100644 frameworks/non-keyed/svelte/src/main.js delete mode 100644 frameworks/non-keyed/thermite/.gitignore delete mode 100644 frameworks/non-keyed/thermite/bower.json delete mode 100644 frameworks/non-keyed/thermite/index.html delete mode 100644 frameworks/non-keyed/thermite/package.json delete mode 100644 frameworks/non-keyed/thermite/src/Main.purs delete mode 100644 frameworks/non-keyed/uhtml/index.html delete mode 100644 frameworks/non-keyed/uhtml/package.json delete mode 100644 frameworks/non-keyed/uhtml/rollup.config.js delete mode 100644 frameworks/non-keyed/uhtml/src/index.js delete mode 100644 frameworks/non-keyed/uhtml/src/jumbotron.js delete mode 100644 frameworks/non-keyed/uhtml/src/table.js delete mode 100644 frameworks/non-keyed/vanilla-dom-framework/index.html delete mode 100644 frameworks/non-keyed/vanilla-dom-framework/package.json delete mode 100644 frameworks/non-keyed/vanilla-dom-framework/src/main.js delete mode 100644 frameworks/non-keyed/vanilla-dom-framework/src/template.html delete mode 100644 frameworks/non-keyed/vanilla-dom-framework/webpack.config.js delete mode 100644 frameworks/non-keyed/vanillajs-1/index.html delete mode 100644 frameworks/non-keyed/vanillajs-1/package.json delete mode 100644 frameworks/non-keyed/vanillajs-1/rollup.config.js delete mode 100644 frameworks/non-keyed/vanillajs-1/src/Main.js delete mode 100755 frameworks/non-keyed/vanillajs/.babelrc delete mode 100644 frameworks/non-keyed/vanillajs/index.html delete mode 100644 frameworks/non-keyed/vanillajs/package.json delete mode 100644 frameworks/non-keyed/vanillajs/src/Main.js delete mode 100644 frameworks/non-keyed/vanillajs/webpack.config.js delete mode 100644 frameworks/non-keyed/vue-next/.babelrc delete mode 100644 frameworks/non-keyed/vue-next/index.html delete mode 100644 frameworks/non-keyed/vue-next/package.json delete mode 100644 frameworks/non-keyed/vue-next/src/App.vue delete mode 100644 frameworks/non-keyed/vue-next/src/main.js delete mode 100644 frameworks/non-keyed/vue-next/webpack.config.js delete mode 100644 frameworks/non-keyed/vue/.babelrc delete mode 100644 frameworks/non-keyed/vue/index.html delete mode 100644 frameworks/non-keyed/vue/package.json delete mode 100644 frameworks/non-keyed/vue/src/App.vue delete mode 100644 frameworks/non-keyed/vue/src/main.es6.js delete mode 100644 frameworks/non-keyed/vue/src/store.es6.js delete mode 100644 frameworks/non-keyed/vue/webpack.config.js delete mode 100644 frameworks/non-keyed/vuera/.babelrc delete mode 100644 frameworks/non-keyed/vuera/index.html delete mode 100644 frameworks/non-keyed/vuera/package.json delete mode 100644 frameworks/non-keyed/vuera/src/App.vue delete mode 100644 frameworks/non-keyed/vuera/src/Store.es6.js delete mode 100644 frameworks/non-keyed/vuera/src/main.es6.js delete mode 100644 frameworks/non-keyed/vuera/webpack.config.js diff --git a/frameworks/keyed/angular-ng/.gitignore b/frameworks/keyed/angular-ng/.gitignore deleted file mode 100644 index 86d943a9b..000000000 --- a/frameworks/keyed/angular-ng/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies -/node_modules - -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db diff --git a/frameworks/keyed/angular-ng/.npmrc b/frameworks/keyed/angular-ng/.npmrc deleted file mode 100644 index 3ca369a11..000000000 --- a/frameworks/keyed/angular-ng/.npmrc +++ /dev/null @@ -1 +0,0 @@ -NG_CLI_ANALYTICS=false \ No newline at end of file diff --git a/frameworks/keyed/angular-ng/README.md b/frameworks/keyed/angular-ng/README.md deleted file mode 100644 index b485ab8eb..000000000 --- a/frameworks/keyed/angular-ng/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# AngularNg - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.24. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/frameworks/keyed/angular-ng/angular.json b/frameworks/keyed/angular-ng/angular.json deleted file mode 100644 index e51c46141..000000000 --- a/frameworks/keyed/angular-ng/angular.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "angular-ng": { - "projectType": "application", - "schematics": {}, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/angular-ng", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "aot": false, - "assets": [ - { "glob": "**/*", "input": "src/css/", "output": "/css/" } - ], - "styles": [ - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "angular-ng:build" - }, - "configurations": { - "production": { - "browserTarget": "angular-ng:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "angular-ng:build" - } - } - } - }}, - "defaultProject": "angular-ng" -} \ No newline at end of file diff --git a/frameworks/keyed/angular-ng/browserslist b/frameworks/keyed/angular-ng/browserslist deleted file mode 100644 index 1dae0a755..000000000 --- a/frameworks/keyed/angular-ng/browserslist +++ /dev/null @@ -1,8 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 chrome versions \ No newline at end of file diff --git a/frameworks/keyed/angular-ng/package.json b/frameworks/keyed/angular-ng/package.json deleted file mode 100644 index de17c795a..000000000 --- a/frameworks/keyed/angular-ng/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "angular-ng", - "version": "0.0.0", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@angular/core", - "customURL": "/dist/angular-ng/" - }, - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "build-prod": "ng build --prod=true --buildOptimizer=true --sourceMap=false", - "build-dev": "ng serve" - }, - "private": true, - "dependencies": { - "@angular/animations": "9.1.2", - "@angular/common": "9.1.2", - "@angular/compiler": "9.1.2", - "@angular/core": "9.1.2", - "@angular/platform-browser": "9.1.2", - "@angular/platform-browser-dynamic": "9.1.2", - "rxjs": "6.5.5", - "tslib": "^1.11.1", - "zone.js": "0.10.3" - }, - "devDependencies": { - "@angular-devkit/build-angular": "0.901.1", - "@angular/cli": "9.1.1", - "@angular/compiler-cli": "9.1.2", - "@angular/language-service": "9.1.2", - "@types/node": "13.13.0", - "ts-node": "8.8.2", - "tslint": "6.1.1", - "typescript": "3.8.3" - } -} diff --git a/frameworks/keyed/angular-ng/src/app/app.component.html b/frameworks/keyed/angular-ng/src/app/app.component.html deleted file mode 100644 index 1092fbb53..000000000 --- a/frameworks/keyed/angular-ng/src/app/app.component.html +++ /dev/null @@ -1,42 +0,0 @@ -

-
-
-
-

Angular {{version}} keyed

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} -
- -
\ No newline at end of file diff --git a/frameworks/keyed/angular-ng/src/app/app.component.ts b/frameworks/keyed/angular-ng/src/app/app.component.ts deleted file mode 100644 index 29291a91c..000000000 --- a/frameworks/keyed/angular-ng/src/app/app.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component, VERSION, AfterViewChecked} from '@angular/core'; - -interface Data { - id: number; - label: string; -} - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styles: [] -}) -export class AppComponent { - data: Array = []; - selected: number = undefined; - id: number = 1; - backup: Array = undefined; - version: string; - - constructor() { - this.version = VERSION.full; - } - - buildData(count: number = 1000): Array { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data: Array = []; - for (var i = 0; i < count; i++) { - data.push({ id: this.id, label: adjectives[this._random(adjectives.length)] + " " + colours[this._random(colours.length)] + " " + nouns[this._random(nouns.length)] }); - this.id++; - } - return data; - } - - _random(max: number) { - return Math.round(Math.random() * 1000) % max; - } - - itemById(index: number, item: Data) { - return item.id; - } - - select(item: Data, event: Event) { - event.preventDefault(); - this.selected = item.id; - } - - delete(item: Data, event: Event) { - event.preventDefault(); - for (let i = 0, l = this.data.length; i < l; i++) { - if (this.data[i].id === item.id) { - this.data.splice(i, 1); - break; - } - } - } - - run() { - this.data = this.buildData(); - } - - add() { - this.data = this.data.concat(this.buildData(1000)); - } - - update() { - for (let i = 0; i < this.data.length; i += 10) { - this.data[i].label += ' !!!'; - } - } - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - } - clear() { - this.data = []; - this.selected = undefined; - } - swapRows() { - if (this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - } -} \ No newline at end of file diff --git a/frameworks/keyed/angular-ng/src/app/app.module.ts b/frameworks/keyed/angular-ng/src/app/app.module.ts deleted file mode 100644 index f65716351..000000000 --- a/frameworks/keyed/angular-ng/src/app/app.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; - -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [ - AppComponent - ], - imports: [ - BrowserModule - ], - providers: [], - bootstrap: [AppComponent] -}) -export class AppModule { } diff --git a/frameworks/keyed/angular-ng/src/assets/.gitkeep b/frameworks/keyed/angular-ng/src/assets/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/angular-ng/src/environments/environment.prod.ts b/frameworks/keyed/angular-ng/src/environments/environment.prod.ts deleted file mode 100644 index 3612073bc..000000000 --- a/frameworks/keyed/angular-ng/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/frameworks/keyed/angular-ng/src/environments/environment.ts b/frameworks/keyed/angular-ng/src/environments/environment.ts deleted file mode 100644 index 7b4f817ad..000000000 --- a/frameworks/keyed/angular-ng/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/frameworks/keyed/angular-ng/src/favicon.ico b/frameworks/keyed/angular-ng/src/favicon.ico deleted file mode 100644 index 997406ad22c29aae95893fb3d666c30258a09537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 - - - - Angular - - - - - - - - - - diff --git a/frameworks/keyed/angular-ng/src/main.ts b/frameworks/keyed/angular-ng/src/main.ts deleted file mode 100644 index d9d924350..000000000 --- a/frameworks/keyed/angular-ng/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; - -// if (environment.production) { - enableProdMode(); -// } - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); diff --git a/frameworks/keyed/angular-ng/src/polyfills.ts b/frameworks/keyed/angular-ng/src/polyfills.ts deleted file mode 100644 index aa665d6b8..000000000 --- a/frameworks/keyed/angular-ng/src/polyfills.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/frameworks/keyed/angular-ng/src/styles.css b/frameworks/keyed/angular-ng/src/styles.css deleted file mode 100644 index 90d4ee007..000000000 --- a/frameworks/keyed/angular-ng/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/frameworks/keyed/angular-ng/tsconfig.app.json b/frameworks/keyed/angular-ng/tsconfig.app.json deleted file mode 100644 index 565a11a21..000000000 --- a/frameworks/keyed/angular-ng/tsconfig.app.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "src/test.ts", - "src/**/*.spec.ts" - ] -} diff --git a/frameworks/keyed/angular-ng/tsconfig.json b/frameworks/keyed/angular-ng/tsconfig.json deleted file mode 100644 index 30956ae7e..000000000 --- a/frameworks/keyed/angular-ng/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2018", - "dom" - ] - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true - } -} diff --git a/frameworks/keyed/angular-noopzone/.gitignore b/frameworks/keyed/angular-noopzone/.gitignore deleted file mode 100644 index 2c9699a8d..000000000 --- a/frameworks/keyed/angular-noopzone/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist/ -node_modules/ -tmp/ diff --git a/frameworks/keyed/angular-noopzone/closure.conf b/frameworks/keyed/angular-noopzone/closure.conf deleted file mode 100644 index da5827062..000000000 --- a/frameworks/keyed/angular-noopzone/closure.conf +++ /dev/null @@ -1,40 +0,0 @@ ---compilation_level=ADVANCED_OPTIMIZATIONS ---language_out=ES5 ---output_wrapper="(function() {%output%}).call(this);" ---js_output_file=dist/bundle.js ---output_manifest=dist/manifest.MF ---variable_renaming_report=dist/variable_renaming_report ---property_renaming_report=dist/property_renaming_report ---create_source_map=%outname%.map - ---warning_level=QUIET ---dependency_mode=STRICT ---rewrite_polyfills=false ---jscomp_off=checkVars ---module_resolution=node ---process_common_js_modules ---package_json_entry_names=es2015 - -node_modules/zone.js/dist/zone_externs.js - ---js node_modules/rxjs/package.json ---js node_modules/rxjs/_esm2015/index.js ---js node_modules/rxjs/_esm2015/internal/**.js ---js node_modules/rxjs/operators/package.json ---js node_modules/rxjs/_esm2015/operators/index.js - ---js node_modules/@angular/core/package.json ---js node_modules/@angular/core/fesm2015/core.js ---js node_modules/@angular/core/src/testability/testability.externs.js - ---js node_modules/@angular/common/package.json ---js node_modules/@angular/common/fesm2015/common.js - ---js node_modules/@angular/compiler/package.json ---js node_modules/@angular/compiler/fesm2015/compiler.js - ---js node_modules/@angular/platform-browser/package.json ---js node_modules/@angular/platform-browser/fesm2015/platform-browser.js - ---js tmp/**.js ---entry_point=./tmp/src/main diff --git a/frameworks/keyed/angular-noopzone/index.html b/frameworks/keyed/angular-noopzone/index.html deleted file mode 100644 index 90c5e36b4..000000000 --- a/frameworks/keyed/angular-noopzone/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Angular - - - - - - - - - - \ No newline at end of file diff --git a/frameworks/keyed/angular-noopzone/package.json b/frameworks/keyed/angular-noopzone/package.json deleted file mode 100644 index c698fce82..000000000 --- a/frameworks/keyed/angular-noopzone/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "angular-closure", - "version": "1.0.0", - "description": "An angular app using closure compiler", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@angular/core" - }, - "scripts": { - "start": "echo 'please start in root project'", - "test": "karma start", - "ngc": "ngc", - "preclosure": "rimraf dist", - "closure": "google-closure-compiler --flagfile closure.conf", - "build-prod": "npm run ngc && npm run closure", - "rollup": "rollup -c rollup.config.js", - "build-dev": "npm run ngc && npm run rollup" - }, - "license": "MIT", - "dependencies": { - "@angular/common": "8.0.1", - "@angular/compiler": "8.0.1", - "@angular/compiler-cli": "8.0.1", - "@angular/core": "8.0.1", - "@angular/platform-browser": "8.0.1", - "core-js": "3.1.4", - "rxjs": "6.5.2", - "tsickle": "0.35.0", - "zone.js": "0.9.1" - }, - "devDependencies": { - "google-closure-compiler": "20190528.0.0", - "http-server": "0.11.1", - "rimraf": "2.6.3", - "rollup": "1.15.5", - "rollup-plugin-commonjs": "10.0.0", - "rollup-plugin-node-resolve": "5.0.2", - "rollup-plugin-uglify": "6.0.2", - "typescript": "3.4.5", - "yargs": "13.2.4" - } -} diff --git a/frameworks/keyed/angular-noopzone/rollup.config.js b/frameworks/keyed/angular-noopzone/rollup.config.js deleted file mode 100644 index 4f3e6de64..000000000 --- a/frameworks/keyed/angular-noopzone/rollup.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import nodeResolve from 'rollup-plugin-node-resolve' - -export default { - input: 'tmp/src/main.js', - output: { - file: 'dist/bundle.js', - format: 'iife', - }, - plugins: [ - nodeResolve({ - module: true, - }), - ] -} diff --git a/frameworks/keyed/angular-noopzone/src/app.ts b/frameworks/keyed/angular-noopzone/src/app.ts deleted file mode 100644 index b26c1df0f..000000000 --- a/frameworks/keyed/angular-noopzone/src/app.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { AfterViewChecked, ApplicationRef, Component, NgModule, VERSION } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; - -interface Data { - id: number; - label: string; -} - -@Component({ - selector: 'my-app', - template: ` -
-
-
-
-

Angular keyed (no Zone.js)

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} -
- -
` -}) -export class AppComponent { - data: Array = []; - selected: number = undefined; - id: number = 1; - backup: Array = undefined; - - constructor(private appRef: ApplicationRef) { - console.info(VERSION.full); - } - - buildData(count: number = 1000): Array { - var adjectives = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy']; - var colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; - var nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; - var data: Array = []; - for (var i = 0; i < count; i++) { - data.push({ - id: this.id, - label: adjectives[this._random(adjectives.length)] + ' ' + colours[this._random(colours.length)] + ' ' + nouns[this._random(nouns.length)] - }); - this.id++; - } - return data; - } - - _random(max: number) { - return Math.round(Math.random() * 1000) % max; - } - - itemById(index: number, item: Data) { - return item.id; - } - - select(item: Data, event: Event) { - event.preventDefault(); - this.selected = item.id; - this.appRef.tick(); - } - - delete(item: Data, event: Event) { - event.preventDefault(); - for (let i = 0, l = this.data.length; i < l; i++) { - if (this.data[i].id === item.id) { - this.data.splice(i, 1); - break; - } - } - this.appRef.tick(); - } - - run() { - this.data = this.buildData(); - this.appRef.tick(); - } - - add() { - this.data = this.data.concat(this.buildData(1000)); - this.appRef.tick(); - } - - update() { - for (let i = 0; i < this.data.length; i += 10) { - this.data[i].label += ' !!!'; - } - this.appRef.tick(); - } - - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - this.appRef.tick(); - } - - clear() { - this.data = []; - this.selected = undefined; - this.appRef.tick(); - } - - swapRows() { - if (this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - this.appRef.tick(); - } -} - -@NgModule({ - imports: [BrowserModule], - declarations: [AppComponent], - bootstrap: [AppComponent] -}) -export class AppModule { -} diff --git a/frameworks/keyed/angular-noopzone/src/main.ts b/frameworks/keyed/angular-noopzone/src/main.ts deleted file mode 100644 index 2ac1cf99b..000000000 --- a/frameworks/keyed/angular-noopzone/src/main.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { platformBrowser } from '@angular/platform-browser'; -import { enableProdMode, ApplicationRef } from '@angular/core'; -import { AppModuleNgFactory } from './app.ngfactory'; - -window['Zone'] = { - get current() { return this }, - assertZonePatched() { }, - fork() { return this }, - get() { return true }, - run(fn: Function) { return fn() }, - runGuarded(fn: Function) { return fn() }, -} - -enableProdMode(); -platformBrowser().bootstrapModuleFactory(AppModuleNgFactory, { ngZone: 'noop' }) diff --git a/frameworks/keyed/angular-noopzone/tsconfig.json b/frameworks/keyed/angular-noopzone/tsconfig.json deleted file mode 100644 index edfe04a15..000000000 --- a/frameworks/keyed/angular-noopzone/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "es2015", - "moduleResolution": "node", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ - "es2015", - "dom" - ], - "noImplicitAny": true, - "suppressImplicitAnyIndexErrors": true, - "outDir": "tmp" - }, - "angularCompilerOptions": { - "annotationsAs": "static fields", - "annotateForClosureCompiler": true, - "preserveWhitespaces": false, - "strictMetadataEmit": true - }, - "exclude": [ - "node_modules", - "tmp", - "dist" - ] -} \ No newline at end of file diff --git a/frameworks/keyed/angular-optimized/.gitignore b/frameworks/keyed/angular-optimized/.gitignore deleted file mode 100644 index 2c9699a8d..000000000 --- a/frameworks/keyed/angular-optimized/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist/ -node_modules/ -tmp/ diff --git a/frameworks/keyed/angular-optimized/closure.conf b/frameworks/keyed/angular-optimized/closure.conf deleted file mode 100644 index e0086ebfe..000000000 --- a/frameworks/keyed/angular-optimized/closure.conf +++ /dev/null @@ -1,43 +0,0 @@ ---compilation_level=ADVANCED_OPTIMIZATIONS ---language_out=ES5 ---output_wrapper="(function() {%output%}).call(this);" ---js_output_file=dist/bundle.js ---output_manifest=dist/manifest.MF ---variable_renaming_report=dist/variable_renaming_report ---property_renaming_report=dist/property_renaming_report ---create_source_map=%outname%.map - ---warning_level=QUIET ---dependency_mode=STRICT ---rewrite_polyfills=false ---jscomp_off=checkVars ---module_resolution=node ---process_common_js_modules ---package_json_entry_names=es2015 - -node_modules/zone.js/dist/zone_externs.js - ---js node_modules/rxjs/package.json ---js node_modules/rxjs/_esm2015/index.js ---js node_modules/rxjs/_esm2015/internal/**.js ---js node_modules/rxjs/operators/package.json ---js node_modules/rxjs/_esm2015/operators/index.js - ---js node_modules/@angular/core/package.json ---js node_modules/@angular/core/fesm2015/core.js ---js node_modules/@angular/core/src/testability/testability.externs.js - ---js node_modules/@angular/common/package.json ---js node_modules/@angular/common/fesm2015/common.js - ---js node_modules/@angular/compiler/package.json ---js node_modules/@angular/compiler/fesm2015/compiler.js - ---js node_modules/@angular/platform-browser/package.json ---js node_modules/@angular/platform-browser/fesm2015/platform-browser.js - ---js node_modules/@angular-contrib/core/package.json ---js node_modules/@angular-contrib/core/esm2015/angular-contrib-core.js - ---js tmp/**.js ---entry_point=./tmp/src/main diff --git a/frameworks/keyed/angular-optimized/index.html b/frameworks/keyed/angular-optimized/index.html deleted file mode 100644 index 90c5e36b4..000000000 --- a/frameworks/keyed/angular-optimized/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Angular - - - - - - - - - - \ No newline at end of file diff --git a/frameworks/keyed/angular-optimized/package.json b/frameworks/keyed/angular-optimized/package.json deleted file mode 100644 index 3671dcaa5..000000000 --- a/frameworks/keyed/angular-optimized/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "angular-closure", - "version": "1.0.0", - "description": "An angular app using closure compiler", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@angular/core" - }, - "scripts": { - "start": "echo 'please start in root project'", - "test": "karma start", - "ngc": "ngc", - "preclosure": "rimraf dist", - "closure": "google-closure-compiler --flagfile closure.conf", - "build-prod": "npm run ngc && npm run closure", - "rollup": "rollup -c rollup.config.js", - "build-dev": "npm run ngc && npm run rollup" - }, - "license": "MIT", - "dependencies": { - "@angular-contrib/core": "0.0.2", - "@angular/common": "8.0.1", - "@angular/compiler": "8.0.1", - "@angular/compiler-cli": "8.0.1", - "@angular/core": "8.0.1", - "@angular/platform-browser": "8.0.1", - "core-js": "3.1.4", - "rxjs": "6.5.2", - "tsickle": "0.35.0", - "zone.js": "0.9.1" - }, - "devDependencies": { - "google-closure-compiler": "20190528.0.0", - "http-server": "0.11.1", - "rimraf": "2.6.3", - "rollup": "1.15.5", - "rollup-plugin-commonjs": "10.0.0", - "rollup-plugin-node-resolve": "5.0.2", - "rollup-plugin-uglify": "6.0.2", - "typescript": "3.4.5", - "yargs": "13.2.4" - } -} diff --git a/frameworks/keyed/angular-optimized/rollup.config.js b/frameworks/keyed/angular-optimized/rollup.config.js deleted file mode 100644 index fa88b347a..000000000 --- a/frameworks/keyed/angular-optimized/rollup.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import nodeResolve from 'rollup-plugin-node-resolve'; - -export default { - input: 'tmp/src/main.js', - output: { - file: 'dist/bundle.js', - format: 'iife', - }, - plugins: [ - nodeResolve({ - module: true, - }), - ] -} \ No newline at end of file diff --git a/frameworks/keyed/angular-optimized/src/app.ts b/frameworks/keyed/angular-optimized/src/app.ts deleted file mode 100644 index 6a545c0e9..000000000 --- a/frameworks/keyed/angular-optimized/src/app.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { AfterViewChecked, ApplicationRef, Component, NgModule, IterableDiffers, VERSION } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FastIterableDifferFactory } from '@angular-contrib/core'; - -interface Data { - id: number; - label: string; -} - -@Component({ - selector: 'my-app', - template: ` -
-
-
-
-

Angular keyed (Optimized)

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} - - - - -
- -
` -}) -export class AppComponent { - data: Array = []; - selected: number = undefined; - id: number = 1; - backup: Array = undefined; - - constructor(private appRef: ApplicationRef, differs: IterableDiffers, fastDifferFactory: FastIterableDifferFactory) { - console.info(VERSION.full); - - // TODO: remove this. The normal setup does not work in Closure Compiler "ADVANCED" mode, figure it out. - differs.factories.unshift(fastDifferFactory); - } - - buildData(count: number = 1000): Array { - var adjectives = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy']; - var colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; - var nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; - var data: Array = []; - for (var i = 0; i < count; i++) { - data.push({ - id: this.id, - label: adjectives[this._random(adjectives.length)] + ' ' + colours[this._random(colours.length)] + ' ' + nouns[this._random(nouns.length)] - }); - this.id++; - } - return data; - } - - _random(max: number) { - return Math.round(Math.random() * 1000) % max; - } - - itemById(index: number, item: Data) { - return item.id; - } - - select(item: Data, event: Event) { - event.preventDefault(); - this.selected = item.id; - this.appRef.tick(); - } - - delete(item: Data, event: Event) { - event.preventDefault(); - for (let i = 0, l = this.data.length; i < l; i++) { - if (this.data[i].id === item.id) { - this.data.splice(i, 1); - break; - } - } - this.appRef.tick(); - } - - run() { - this.data = this.buildData(); - this.appRef.tick(); - } - - add() { - this.data = this.data.concat(this.buildData(1000)); - this.appRef.tick(); - } - - update() { - for (let i = 0; i < this.data.length; i += 10) { - this.data[i].label += ' !!!'; - } - this.appRef.tick(); - } - - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - this.appRef.tick(); - } - - clear() { - this.data = []; - this.selected = undefined; - this.appRef.tick(); - } - - swapRows() { - if (this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - this.appRef.tick(); - } -} - -@NgModule({ - imports: [BrowserModule], - declarations: [AppComponent], - bootstrap: [AppComponent], - providers: [FastIterableDifferFactory] -}) -export class AppModule { -} diff --git a/frameworks/keyed/angular-optimized/src/main.ts b/frameworks/keyed/angular-optimized/src/main.ts deleted file mode 100644 index 2ac1cf99b..000000000 --- a/frameworks/keyed/angular-optimized/src/main.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { platformBrowser } from '@angular/platform-browser'; -import { enableProdMode, ApplicationRef } from '@angular/core'; -import { AppModuleNgFactory } from './app.ngfactory'; - -window['Zone'] = { - get current() { return this }, - assertZonePatched() { }, - fork() { return this }, - get() { return true }, - run(fn: Function) { return fn() }, - runGuarded(fn: Function) { return fn() }, -} - -enableProdMode(); -platformBrowser().bootstrapModuleFactory(AppModuleNgFactory, { ngZone: 'noop' }) diff --git a/frameworks/keyed/angular-optimized/tsconfig.json b/frameworks/keyed/angular-optimized/tsconfig.json deleted file mode 100644 index edfe04a15..000000000 --- a/frameworks/keyed/angular-optimized/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "es2015", - "moduleResolution": "node", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ - "es2015", - "dom" - ], - "noImplicitAny": true, - "suppressImplicitAnyIndexErrors": true, - "outDir": "tmp" - }, - "angularCompilerOptions": { - "annotationsAs": "static fields", - "annotateForClosureCompiler": true, - "preserveWhitespaces": false, - "strictMetadataEmit": true - }, - "exclude": [ - "node_modules", - "tmp", - "dist" - ] -} \ No newline at end of file diff --git a/frameworks/keyed/angular/.gitignore b/frameworks/keyed/angular/.gitignore deleted file mode 100644 index 2c9699a8d..000000000 --- a/frameworks/keyed/angular/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -dist/ -node_modules/ -tmp/ diff --git a/frameworks/keyed/angular/closure.conf b/frameworks/keyed/angular/closure.conf deleted file mode 100644 index da5827062..000000000 --- a/frameworks/keyed/angular/closure.conf +++ /dev/null @@ -1,40 +0,0 @@ ---compilation_level=ADVANCED_OPTIMIZATIONS ---language_out=ES5 ---output_wrapper="(function() {%output%}).call(this);" ---js_output_file=dist/bundle.js ---output_manifest=dist/manifest.MF ---variable_renaming_report=dist/variable_renaming_report ---property_renaming_report=dist/property_renaming_report ---create_source_map=%outname%.map - ---warning_level=QUIET ---dependency_mode=STRICT ---rewrite_polyfills=false ---jscomp_off=checkVars ---module_resolution=node ---process_common_js_modules ---package_json_entry_names=es2015 - -node_modules/zone.js/dist/zone_externs.js - ---js node_modules/rxjs/package.json ---js node_modules/rxjs/_esm2015/index.js ---js node_modules/rxjs/_esm2015/internal/**.js ---js node_modules/rxjs/operators/package.json ---js node_modules/rxjs/_esm2015/operators/index.js - ---js node_modules/@angular/core/package.json ---js node_modules/@angular/core/fesm2015/core.js ---js node_modules/@angular/core/src/testability/testability.externs.js - ---js node_modules/@angular/common/package.json ---js node_modules/@angular/common/fesm2015/common.js - ---js node_modules/@angular/compiler/package.json ---js node_modules/@angular/compiler/fesm2015/compiler.js - ---js node_modules/@angular/platform-browser/package.json ---js node_modules/@angular/platform-browser/fesm2015/platform-browser.js - ---js tmp/**.js ---entry_point=./tmp/src/main diff --git a/frameworks/keyed/angular/index.html b/frameworks/keyed/angular/index.html deleted file mode 100644 index 2527412e5..000000000 --- a/frameworks/keyed/angular/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Angular - - - - - - - - - - - diff --git a/frameworks/keyed/angular/package.json b/frameworks/keyed/angular/package.json deleted file mode 100644 index b81a4eb9e..000000000 --- a/frameworks/keyed/angular/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "angular-closure", - "version": "1.0.0", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@angular/core" - }, - "description": "An angular app using closure compiler", - "scripts": { - "start": "echo 'please start in root project'", - "test": "karma start", - "ngc": "ngc", - "preclosure": "rimraf dist", - "closure": "google-closure-compiler --flagfile closure.conf", - "build-prod": "npm run ngc && npm run closure", - "rollup": "rollup -c rollup.config.js", - "build-dev": "npm run ngc && npm run rollup" - }, - "license": "MIT", - "dependencies": { - "@angular/common": "8.2.14", - "@angular/compiler": "8.2.14", - "@angular/compiler-cli": "8.2.14", - "@angular/core": "8.2.14", - "@angular/platform-browser": "8.2.14", - "core-js": "3.6.4", - "rxjs": "6.5.4", - "tsickle": "0.38.0", - "tslib": "1.10.0", - "zone.js": "0.10.2" - }, - "devDependencies": { - "google-closure-compiler": "20190528.0.0", - "http-server": "0.12.1", - "rimraf": "3.0.1", - "rollup": "1.15.5", - "rollup-plugin-commonjs": "10.0.0", - "rollup-plugin-node-resolve": "5.0.2", - "rollup-plugin-uglify": "6.0.2", - "typescript": "~3.5.3", - "yargs": "15.1.0" - } -} diff --git a/frameworks/keyed/angular/rollup.config.js b/frameworks/keyed/angular/rollup.config.js deleted file mode 100644 index e690ed034..000000000 --- a/frameworks/keyed/angular/rollup.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import nodeResolve from 'rollup-plugin-node-resolve'; - -export default { - input: 'tmp/src/main.js', - output: { - file: 'dist/bundle.js', - format: 'iife', - }, - plugins: [ - nodeResolve({ - module: true, - }), - ] -} diff --git a/frameworks/keyed/angular/src/app.ts b/frameworks/keyed/angular/src/app.ts deleted file mode 100644 index 1e01972c3..000000000 --- a/frameworks/keyed/angular/src/app.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { Component, NgModule, AfterViewChecked, VERSION } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; - -interface Data { - id: number; - label: string; -} - -@Component({ - selector: 'my-app', - template: `
-
-
-
-

Angular keyed

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} -
- -
` -}) -export class AppComponent { - data: Array = []; - selected: number = undefined; - id: number = 1; - backup: Array = undefined; - - constructor() { - console.info(VERSION.full); - } - - buildData(count: number = 1000): Array { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data: Array = []; - for (var i = 0; i < count; i++) { - data.push({ id: this.id, label: adjectives[this._random(adjectives.length)] + " " + colours[this._random(colours.length)] + " " + nouns[this._random(nouns.length)] }); - this.id++; - } - return data; - } - - _random(max: number) { - return Math.round(Math.random() * 1000) % max; - } - - itemById(index: number, item: Data) { - return item.id; - } - - select(item: Data, event: Event) { - event.preventDefault(); - this.selected = item.id; - } - - delete(item: Data, event: Event) { - event.preventDefault(); - for (let i = 0, l = this.data.length; i < l; i++) { - if (this.data[i].id === item.id) { - this.data.splice(i, 1); - break; - } - } - } - - run() { - this.data = this.buildData(); - } - - add() { - this.data = this.data.concat(this.buildData(1000)); - } - - update() { - for (let i = 0; i < this.data.length; i += 10) { - this.data[i].label += ' !!!'; - } - } - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - } - clear() { - this.data = []; - this.selected = undefined; - } - swapRows() { - if (this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - } -} - -@NgModule({ - imports: [BrowserModule], - declarations: [AppComponent], - bootstrap: [AppComponent], -}) -export class AppModule { } diff --git a/frameworks/keyed/angular/src/main.ts b/frameworks/keyed/angular/src/main.ts deleted file mode 100644 index f4b1ad659..000000000 --- a/frameworks/keyed/angular/src/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { platformBrowser } from '@angular/platform-browser'; -import { enableProdMode } from '@angular/core'; -import { AppModuleNgFactory } from './app.ngfactory'; - -enableProdMode(); -platformBrowser().bootstrapModuleFactory(AppModuleNgFactory) diff --git a/frameworks/keyed/angular/tsconfig.json b/frameworks/keyed/angular/tsconfig.json deleted file mode 100644 index b7aa823ea..000000000 --- a/frameworks/keyed/angular/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "es2015", - "moduleResolution": "node", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "importHelpers": true, - "lib": [ - "es2015", - "dom" - ], - "noImplicitAny": true, - "suppressImplicitAnyIndexErrors": true, - "outDir": "tmp" - }, - "angularCompilerOptions": { - "annotationsAs": "static fields", - "annotateForClosureCompiler": true, - "preserveWhitespaces": false, - "strictMetadataEmit": true - }, - "exclude": [ - "node_modules", - "tmp", - "dist" - ] -} diff --git a/frameworks/keyed/angularjs/index.html b/frameworks/keyed/angularjs/index.html deleted file mode 100755 index e9d197831..000000000 --- a/frameworks/keyed/angularjs/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - AngularJS - - - - - - - diff --git a/frameworks/keyed/angularjs/package.json b/frameworks/keyed/angularjs/package.json deleted file mode 100644 index e32cb8d43..000000000 --- a/frameworks/keyed/angularjs/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "js-framework-benchmark-angular", - "version": "1.0.0", - "description": "Boilerplate for Angular.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "angular" - }, - "scripts": { - "build-dev": "webpack -w", - "build-prod": "webpack -p" - }, - "keywords": [ - "angular" - ], - "author": "Stefan Krause", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "@babel/core": "7.2.2", - "@babel/preset-env": "7.3.1", - "babel-loader": "8.0.6", - "raw-loader": "3.0.0", - "webpack": "4.34.0", - "webpack-cli": "^3.3.4" - }, - "dependencies": { - "angular": "1.7.8" - } -} diff --git a/frameworks/keyed/angularjs/src/home.controller.js b/frameworks/keyed/angularjs/src/home.controller.js deleted file mode 100644 index b901c636c..000000000 --- a/frameworks/keyed/angularjs/src/home.controller.js +++ /dev/null @@ -1,62 +0,0 @@ - -export default class HomeController { - $onInit() { - this.start = 0; - this.data = []; - this.id = 1; - } - - buildData(count = 1000) { - const adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - const nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - const data = []; - for (let i = 0, len = count; i < len; i++) { - data.push({ id: this.id++, label: adjectives[this._random(adjectives.length)] + " " + colours[this._random(colours.length)] + " " + nouns[this._random(nouns.length)] }); - } - return data; - } - _random(max) { - return Math.round(Math.random() * 1000) % max; - } - add() { - this.start = performance.now(); - this.data = this.data.concat(this.buildData(1000)); - } - select(item) { - this.start = performance.now(); - this.selected = item.id; - } - del(item) { - this.start = performance.now(); - const idx = this.data.findIndex(d => d.id===item.id); - this.data.splice(idx, 1); - } - update() { - this.start = performance.now(); - for (let i=0;i 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - }; -}; \ No newline at end of file diff --git a/frameworks/keyed/angularjs/src/home.template.html b/frameworks/keyed/angularjs/src/home.template.html deleted file mode 100644 index 6e55eb175..000000000 --- a/frameworks/keyed/angularjs/src/home.template.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
-
-
-

AngularJS

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} -
- -
\ No newline at end of file diff --git a/frameworks/keyed/angularjs/src/main.js b/frameworks/keyed/angularjs/src/main.js deleted file mode 100644 index df23dc2bf..000000000 --- a/frameworks/keyed/angularjs/src/main.js +++ /dev/null @@ -1,20 +0,0 @@ -import angular from 'angular'; -import controller from './home.controller'; -import template from './home.template.html'; - -angular - .module('app', []) - .config(['$compileProvider', function ($compileProvider) { - $compileProvider.debugInfoEnabled(false); - }]) - .run(() => { - console.info(angular.version.full); - }) - .component('home', { - controller, - template, - }); - -angular.element(document).ready(() => { - angular.bootstrap(document.body, ['app'], { strictDi: true }); -}); \ No newline at end of file diff --git a/frameworks/keyed/angularjs/webpack.config.js b/frameworks/keyed/angularjs/webpack.config.js deleted file mode 100755 index 3c39de79c..000000000 --- a/frameworks/keyed/angularjs/webpack.config.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; -var path = require('path') - -module.exports = { - entry: { - main: './src/main' - }, - output: { - path: path.join(__dirname, 'dist'), - filename: 'main.js' - }, - module: { - rules: [ - { - test: /.js$/, - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - }, - }, - { - test: /\.html$/, - loader: 'raw-loader' - }, - ] - } -}; \ No newline at end of file diff --git a/frameworks/keyed/apprun/index.html b/frameworks/keyed/apprun/index.html deleted file mode 100644 index bc13c5f7b..000000000 --- a/frameworks/keyed/apprun/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - AppRun - - - -
- - - diff --git a/frameworks/keyed/apprun/package.json b/frameworks/keyed/apprun/package.json deleted file mode 100644 index 7de482515..000000000 --- a/frameworks/keyed/apprun/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "js-framework-benchmark-apprun-v2.23.10", - "version": "1.0.0", - "description": "AppRun demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "apprun" - }, - "scripts": { - "build-dev": "webpack -w -d", - "build-prod": "webpack -p" - }, - "keywords": [ - "apprun", - "js benmarks" - ], - "author": "Yiyi Sun { - const rows = model.data.map((curr) => { - const selected = curr.id == model.selected ? 'danger' : undefined; - const id = curr.id; - return - {id} - - {curr.label} - - - - - - - - ; - }); - - return (
-
-
-
-

AppRun

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - {rows} - -
- -
); -} - -const getId = (elem) => { - while (elem) { - if (elem.tagName === "TR") { - return elem.id; - } - elem = elem.parentNode; - } - return undefined; -} - -const click = (e) => { - const t = e.target as HTMLElement; - if (!t) return; - if (t.tagName === 'BUTTON' && t.id) { - e.preventDefault(); - component.run(t.id); - } else if (t.matches('.remove')) { - e.preventDefault(); - component.run('remove', getId(t)); - } else if (t.matches('.lbl')) { - e.preventDefault(); - component.run('select', getId(t)); - } -}; - -const component = new Component(store, view, update); -component['-patch-vdom-on'] = true; -component.rendered = () => { - store.selected && (document.getElementById(store.selected).className = 'danger'); -} -component.start(document.getElementById('main')); diff --git a/frameworks/keyed/apprun/src/store.ts b/frameworks/keyed/apprun/src/store.ts deleted file mode 100644 index 6050c30ef..000000000 --- a/frameworks/keyed/apprun/src/store.ts +++ /dev/null @@ -1,72 +0,0 @@ -function _random(max) { - return Math.round(Math.random()*1000)%max; -} - -export default class Store { - data = []; - backup = null; - selected = null; - id = 1; - constructor() { - } - buildData(count = 1000) { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }); - return data; - } - updateData(mod = 10) { - for (let i=0;i d.id==id); - this.data = this.data.filter((e, i) => e.id != id); - if (id === this.selected) this.selected = null; - } - run() { - this.data = this.buildData(); - this.selected = null; - } - add() { - this.data = this.data.concat(this.buildData(1000)); - this.selected = null; - } - update() { - this.updateData(); - } - select(id) { - this.selected = id; - } - hideAll() { - this.backup = this.data; - this.data = []; - this.selected = null; - } - showAll() { - this.data = this.backup; - this.backup = null; - this.selected = null; - } - runLots() { - this.data = this.buildData(10000); - this.selected = null; - } - clear() { - this.data = []; - this.selected = null; - } - swapRows() { - if (this.data.length > 4) { - var idx = this.data.length - 2; - var a = this.data[1]; - this.data[1] = this.data[idx]; - this.data[idx] = a; - } - } -} \ No newline at end of file diff --git a/frameworks/keyed/apprun/tsconfig.json b/frameworks/keyed/apprun/tsconfig.json deleted file mode 100644 index c7df68076..000000000 --- a/frameworks/keyed/apprun/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "es2015", - "moduleResolution": "node", - "jsx": "react", - "reactNamespace": "app", - "lib": ["dom", "es2015.promise", "es5"] - } -} \ No newline at end of file diff --git a/frameworks/keyed/apprun/webpack.config.js b/frameworks/keyed/apprun/webpack.config.js deleted file mode 100644 index f7bea084f..000000000 --- a/frameworks/keyed/apprun/webpack.config.js +++ /dev/null @@ -1,20 +0,0 @@ -var path = require('path') - -module.exports = { - entry: { - 'main': './src/main.tsx', - }, - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js' - }, - resolve: { - extensions: ['.webpack.js', '.web.js', '.ts', '.tsx', '.js'] - }, - module: { - rules: [ - { test: /\.tsx?$/, loader: 'ts-loader' }, - { test: /\.json$/, loader: 'json-loader' } - ] - } -} \ No newline at end of file diff --git a/frameworks/keyed/attodom/.editorconfig b/frameworks/keyed/attodom/.editorconfig deleted file mode 100644 index dd7255e8a..000000000 --- a/frameworks/keyed/attodom/.editorconfig +++ /dev/null @@ -1,8 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/frameworks/keyed/attodom/index.html b/frameworks/keyed/attodom/index.html deleted file mode 100644 index b49eea7d0..000000000 --- a/frameworks/keyed/attodom/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - attodom - - - - - - diff --git a/frameworks/keyed/attodom/index.js b/frameworks/keyed/attodom/index.js deleted file mode 100644 index dbf0dae48..000000000 --- a/frameworks/keyed/attodom/index.js +++ /dev/null @@ -1,8 +0,0 @@ -/*eslint indent: ["warn", 2, { "VariableDeclarator": 2 }]*/ - -var Store = require('./src/store'), - View = require('./src/view') - -var view = View(new Store) -view.update() -document.body.appendChild(view) diff --git a/frameworks/keyed/attodom/package.json b/frameworks/keyed/attodom/package.json deleted file mode 100644 index 8c1860186..000000000 --- a/frameworks/keyed/attodom/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "js-framework-benchmark-attodom", - "version": "0.12.0", - "description": "Benchmark for attodom", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "attodom" - }, - "scripts": { - "build-dev": "node -e \"require('@hugov/cjs-to-iife')('./index.js').then(code => {if (!fs.existsSync('./dist')) {fs.mkdirSync('./dist');} fs.writeFileSync('./dist/main.js', code); })\"", - "build-prod": "npm run build-dev && uglifyjs ./dist/main.js -c -m -o ./dist/main.js" - }, - "author": "Hugo Villeneuve", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "@hugov/cjs-to-iife": "^0.1.3", - "@types/node": "^12.0.8", - "uglify-js": "3.6.0" - }, - "dependencies": { - "attodom": "^0.12.0" - } -} diff --git a/frameworks/keyed/attodom/src/store.js b/frameworks/keyed/attodom/src/store.js deleted file mode 100644 index 539e5b189..000000000 --- a/frameworks/keyed/attodom/src/store.js +++ /dev/null @@ -1,87 +0,0 @@ -/*eslint indent: ["warn", 2, { "VariableDeclarator": 2 }]*/ -/*eslint quotes:0*/ -function _random(max) { - return Math.round(Math.random()*1000)%max -} - -module.exports = Store - -function Store() { - this.data = [] - this.backup = null - this.selected = null - this.id = 1 -} - -Store.prototype.buildData = function(count) { - if (!(count >=0)) count = 1000 - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"] - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"] - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"] - var data = [] - for (var i=0; i < count; ++i) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }) - return data -} - -Store.prototype.updateData = function(mod) { - if (!(mod >=0)) mod = 1000 - for (var i=0; i 998) { - var a = this.data[1] - this.data[1] = this.data[998] - this.data[998] = a - } -} diff --git a/frameworks/keyed/attodom/src/view.js b/frameworks/keyed/attodom/src/view.js deleted file mode 100644 index e475d4579..000000000 --- a/frameworks/keyed/attodom/src/view.js +++ /dev/null @@ -1,86 +0,0 @@ -/*eslint indent: ["warn", 2, { "VariableDeclarator": 2 }]*/ -var h = require('attodom/el'), - list = require('attodom/list') - -var TITLE = 'attodom v0.12.0' - -module.exports = function(store) { - function clickHandlerMenu(e) { - var key = e.target.id - if (key) { - e.preventDefault() - store[key === 'runlots' ? 'runLots' : key === 'swaprows' ? 'swapRows' : key]() - rowList.update(store.data) - } - } - - function updateRow(v) { - if (this.$label.data !== v.label) this.$label.data = v.label - var className = (this.id === store.selected) ? 'danger' : '' - if (this.className !== className) this.className = className - } - - function makeRow(rec) { - var $label - var row = h('tr', - h('td', {class: 'col-md-1'}, rec.id), - h('td', {class: 'col-md-4', onClick: clickHandlerSelect}, - h('a', {class: 'lbl'}, $label = document.createTextNode(rec.label)) - ), - h('td', {class: 'col-md-1', onClick: clickHandlerDelete}, - h('a', {class: 'remove'}, - h('span', {class: 'glyphicon glyphicon-remove remove', 'aria-hidden': 'true'}) - ) - ), - h('td', {class: 'col-md-6'}) - ) - row.id = rec.id - row.update = updateRow - row.$label = $label - return row - } - - function clickHandlerSelect(e) { - e.preventDefault() - store.select(this.parentNode.id) - rowList.update(store.data) - } - - function clickHandlerDelete(e) { - e.preventDefault() - store.delete(+this.parentNode.id) - rowList.update(store.data) - } - - var rowList = list(h('tbody', {id: 'tbody'}), makeRow, {key: 'id'}) - - return h('div', {id: 'main', update: function() { rowList.update(store.data) }}, - h('div', {class: 'container'}, - h('div', {class: 'jumbotron'}, - h('div', {class: 'row'}, - h('div', {class: 'col-md-6'}, - h('h1', TITLE) - ), - h('div', {class: 'col-md-6'}, - h('div', {class: 'row', onclick: clickHandlerMenu}, - button('run', 'Create 1,000 rows'), - button('runlots', 'Create 10,000 rows'), - button('add', 'Append 1,000 rows'), - button('update', 'Update every 10th row'), - button('clear', 'Clear'), - button('swaprows', 'Swap Rows') - ) - ) - ) - ), - h('table', {class: 'table table-hover table-striped test-data'}, rowList.parent), - h('span', {class: 'preloadicon glyphicon glyphicon-remove', 'aria-hidden': ''}) - ) - ) -} - -function button(id, tx) { - return h('div', {class: 'col-sm-6 smallpad'}, - h('button', {id: id, class: 'btn btn-primary btn-block', type: 'button'}, tx) - ) -} diff --git a/frameworks/keyed/aurelia/.babelrc b/frameworks/keyed/aurelia/.babelrc deleted file mode 100755 index 2b0041b33..000000000 --- a/frameworks/keyed/aurelia/.babelrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "sourceMap": true, - "sourceRoot": "src", - "moduleIds": false, - "comments": false, - "compact": false, - "code": true, - "presets": [ - ["es2015", {"loose": true}], - "stage-1" - ], - "plugins": [ - "syntax-flow", - "transform-decorators-legacy", - "transform-flow-strip-types" - ] -} diff --git a/frameworks/keyed/aurelia/.gitignore b/frameworks/keyed/aurelia/.gitignore deleted file mode 100644 index 12448646b..000000000 --- a/frameworks/keyed/aurelia/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -scripts -src/environment.js \ No newline at end of file diff --git a/frameworks/keyed/aurelia/aurelia_project/aurelia.json b/frameworks/keyed/aurelia/aurelia_project/aurelia.json deleted file mode 100644 index db9fe05d9..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/aurelia.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "name": "aurelia-v1.1.2-non-keyed", - "type": "project:application", - "bundler": { - "id": "cli", - "displayName": "Aurelia-CLI" - }, - "build": { - "targets": [ - { - "id": "web", - "displayName": "Web", - "index": "index.html", - "baseDir": ".", - "output": "scripts" - } - ], - "options": { - "minify": "stage & prod", - "sourcemaps": "dev & stage" - }, - "bundles": [ - { - "name": "app-bundle.js", - "source": [ - "[**/*.js]", - "**/*.{css,html}" - ] - }, - { - "name": "vendor-bundle.js", - "prepend": [ - "node_modules/requirejs/require.js" - ], - "dependencies": [ - "aurelia-binding", - "aurelia-bootstrapper", - "aurelia-dependency-injection", - "aurelia-framework", - "aurelia-loader", - "aurelia-loader-default", - "aurelia-logging", - { - "name": "aurelia-logging-console", - "path": "../node_modules/aurelia-logging-console/dist/amd", - "main": "aurelia-logging-console", - "env": "dev & stage" - }, - "aurelia-metadata", - "aurelia-pal", - "aurelia-pal-browser", - "aurelia-path", - "aurelia-task-queue", - "aurelia-templating", - "aurelia-templating-binding", - { - "name": "aurelia-templating-resources", - "path": "../node_modules/aurelia-templating-resources/dist/amd", - "main": "aurelia-templating-resources" - }, - "text" - ] - } - ], - "loader": { - "type": "require", - "configTarget": "vendor-bundle.js", - "includeBundleMetadataInConfig": "auto", - "plugins": [ - { - "name": "text", - "extensions": [ - ".html", - ".css" - ], - "stub": true - } - ] - } - }, - "platform": { - "id": "web", - "displayName": "Web", - "index": "index.html", - "baseDir": ".", - "output": "scripts" - }, - "transpiler": { - "id": "babel", - "displayName": "Babel", - "fileExtension": ".js", - "options": { - "plugins": [ - "transform-es2015-modules-amd" - ] - }, - "source": "src/**/*.js" - }, - "markupProcessor": { - "id": "minimum", - "displayName": "Minimal Minification", - "fileExtension": ".html", - "source": "src/**/*.html" - }, - "cssProcessor": { - "id": "none", - "displayName": "None", - "fileExtension": ".css", - "source": "src/**/*.css" - }, - "editor": { - "id": "none", - "displayName": "None" - }, - "unitTestRunner": { - "id": "none", - "displayName": "None" - }, - "paths": { - "root": "src", - "resources": "resources", - "elements": "resources/elements", - "attributes": "resources/attributes", - "valueConverters": "resources/value-converters", - "bindingBehaviors": "resources/binding-behaviors" - } -} \ No newline at end of file diff --git a/frameworks/keyed/aurelia/aurelia_project/environments/dev.js b/frameworks/keyed/aurelia/aurelia_project/environments/dev.js deleted file mode 100644 index f346d5a79..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/environments/dev.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - debug: true -}; diff --git a/frameworks/keyed/aurelia/aurelia_project/environments/prod.js b/frameworks/keyed/aurelia/aurelia_project/environments/prod.js deleted file mode 100644 index 0159bfda3..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/environments/prod.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - debug: false -}; diff --git a/frameworks/keyed/aurelia/aurelia_project/environments/stage.js b/frameworks/keyed/aurelia/aurelia_project/environments/stage.js deleted file mode 100644 index f346d5a79..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/environments/stage.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - debug: true -}; diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/attribute.js b/frameworks/keyed/aurelia/aurelia_project/generators/attribute.js deleted file mode 100644 index 7be503935..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/attribute.js +++ /dev/null @@ -1,44 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class AttributeGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the custom attribute?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.attributes.add( - ProjectItem.text(`${fileName}.js`, this.generateSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateSource(className) { - return `import {inject} from 'aurelia-framework'; - -@inject(Element) -export class ${className}CustomAttribute { - constructor(element) { - this.element = element; - } - - valueChanged(newValue, oldValue) { - - } -} - -`; - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/attribute.json b/frameworks/keyed/aurelia/aurelia_project/generators/attribute.json deleted file mode 100644 index ddf940c55..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/attribute.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "attribute", - "description": "Creates a custom attribute class and places it in the project resources." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.js b/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.js deleted file mode 100644 index 8726a1083..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.js +++ /dev/null @@ -1,41 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class BindingBehaviorGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the binding behavior?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.bindingBehaviors.add( - ProjectItem.text(`${fileName}.js`, this.generateSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateSource(className) { - return `export class ${className}BindingBehavior { - bind(binding, source) { - - } - - unbind(binding, source) { - - } -} - -` - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.json b/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.json deleted file mode 100644 index 60906a174..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/binding-behavior.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "binding-behavior", - "description": "Creates a binding behavior class and places it in the project resources." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/component.js b/frameworks/keyed/aurelia/aurelia_project/generators/component.js deleted file mode 100644 index 8f381c780..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/component.js +++ /dev/null @@ -1,51 +0,0 @@ -import { inject } from 'aurelia-dependency-injection'; -import { Project, ProjectItem, CLIOptions, UI } from 'aurelia-cli'; - -var path = require('path'); - -@inject(Project, CLIOptions, UI) -export default class ElementGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - let self = this; - - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the component?') - .then(name => { - - return self.ui.ensureAnswer(this.options.args[1], 'What sub-folder would you like to add it to?\nIf it doesn\'t exist it will be created for you.\n\nDefault folder is the source folder (src).', ".") - .then(subFolders => { - - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - self.project.root.add( - ProjectItem.text(path.join(subFolders, fileName + ".js"), this.generateJSSource(className)), - ProjectItem.text(path.join(subFolders, fileName + ".html"), this.generateHTMLSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${name} in the '${path.join(self.project.root.name, subFolders)}' folder`)); - }); - }); - } - - generateJSSource(className) { - return `export class ${className} { - constructor() { - this.message = 'Hello world'; - } -}` - } - - generateHTMLSource(className) { - return `` - } -} \ No newline at end of file diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/component.json b/frameworks/keyed/aurelia/aurelia_project/generators/component.json deleted file mode 100644 index ec3907561..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/component.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "component", - "description": "Creates a custom component class and template (view model and view), placing them in the project source folder (or optionally in sub folders)." -} \ No newline at end of file diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/element.js b/frameworks/keyed/aurelia/aurelia_project/generators/element.js deleted file mode 100644 index a1b48b9c1..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/element.js +++ /dev/null @@ -1,48 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class ElementGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the custom element?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.elements.add( - ProjectItem.text(`${fileName}.js`, this.generateJSSource(className)), - ProjectItem.text(`${fileName}.html`, this.generateHTMLSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateJSSource(className) { - return `import {bindable} from 'aurelia-framework'; - -export class ${className} { - @bindable value; - - valueChanged(newValue, oldValue) { - - } -} - -`; - } - - generateHTMLSource(className) { - return ``; - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/element.json b/frameworks/keyed/aurelia/aurelia_project/generators/element.json deleted file mode 100644 index 68d8c54e0..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/element.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "element", - "description": "Creates a custom element class and template, placing them in the project resources." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/generator.js b/frameworks/keyed/aurelia/aurelia_project/generators/generator.js deleted file mode 100644 index 416284286..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/generator.js +++ /dev/null @@ -1,73 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class GeneratorGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the generator?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.generators.add( - ProjectItem.text(`${fileName}.js`, this.generateSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateSource(className) { - return `import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class ${className}Generator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the new item?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.elements.add( - ProjectItem.text(\`\${fileName}.js\`, this.generateSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(\`Created \${fileName}.\`)); - }); - } - - generateSource(className) { -return \`import {bindable} from 'aurelia-framework'; - -export class \${className} { - @bindable value; - - valueChanged(newValue, oldValue) { - - } -} - -\` - } -} - -`; - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/generator.json b/frameworks/keyed/aurelia/aurelia_project/generators/generator.json deleted file mode 100644 index be946a5a9..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/generator.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "generator", - "description": "Creates a generator class and places it in the project generators folder." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/task.js b/frameworks/keyed/aurelia/aurelia_project/generators/task.js deleted file mode 100644 index a70f10b65..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/task.js +++ /dev/null @@ -1,41 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class TaskGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the task?') - .then(name => { - let fileName = this.project.makeFileName(name); - let functionName = this.project.makeFunctionName(name); - - this.project.tasks.add( - ProjectItem.text(`${fileName}.js`, this.generateSource(functionName)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateSource(functionName) { - return `import gulp from 'gulp'; -import changed from 'gulp-changed'; -import project from '../aurelia.json'; - -export default function ${functionName}() { - return gulp.src(project.paths.???) - .pipe(changed(project.paths.output, {extension: '.???'})) - .pipe(gulp.dest(project.paths.output)); -} - -`; - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/task.json b/frameworks/keyed/aurelia/aurelia_project/generators/task.json deleted file mode 100644 index fd15bc626..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/task.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "task", - "description": "Creates a task and places it in the project tasks folder." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.js b/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.js deleted file mode 100644 index df7997106..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.js +++ /dev/null @@ -1,41 +0,0 @@ -import {inject} from 'aurelia-dependency-injection'; -import {Project, ProjectItem, CLIOptions, UI} from 'aurelia-cli'; - -@inject(Project, CLIOptions, UI) -export default class ValueConverterGenerator { - constructor(project, options, ui) { - this.project = project; - this.options = options; - this.ui = ui; - } - - execute() { - return this.ui - .ensureAnswer(this.options.args[0], 'What would you like to call the value converter?') - .then(name => { - let fileName = this.project.makeFileName(name); - let className = this.project.makeClassName(name); - - this.project.valueConverters.add( - ProjectItem.text(`${fileName}.js`, this.generateSource(className)) - ); - - return this.project.commitChanges() - .then(() => this.ui.log(`Created ${fileName}.`)); - }); - } - - generateSource(className) { - return `export class ${className}ValueConverter { - toView(value) { - - } - - fromView(value) { - - } -} - -`; - } -} diff --git a/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.json b/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.json deleted file mode 100644 index 11081226c..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/generators/value-converter.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "value-converter", - "description": "Creates a value converter class and places it in the project resources." -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/build.js b/frameworks/keyed/aurelia/aurelia_project/tasks/build.js deleted file mode 100644 index a1ea53966..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/build.js +++ /dev/null @@ -1,40 +0,0 @@ -import gulp from 'gulp'; -import {CLIOptions, build as buildCLI} from 'aurelia-cli'; -import transpile from './transpile'; -import processMarkup from './process-markup'; -import processCSS from './process-css'; -import copyFiles from './copy-files'; -import watch from './watch'; -import project from '../aurelia.json'; - -let build = gulp.series( - readProjectConfiguration, - gulp.parallel( - transpile, - processMarkup, - processCSS, - copyFiles - ), - writeBundles -); - -let main; - -if (CLIOptions.taskName() === 'build' && CLIOptions.hasFlag('watch')) { - main = gulp.series( - build, - (done) => { watch(); done(); } - ); -} else { - main = build; -} - -function readProjectConfiguration() { - return buildCLI.src(project); -} - -function writeBundles() { - return buildCLI.dest(); -} - -export { main as default }; diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/build.json b/frameworks/keyed/aurelia/aurelia_project/tasks/build.json deleted file mode 100644 index ada5ca483..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/build.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "build", - "description": "Builds and processes all application assets.", - "flags": [ - { - "name": "env", - "description": "Sets the build environment.", - "type": "string" - }, - { - "name": "watch", - "description": "Watches source files for changes and refreshes the bundles automatically.", - "type": "boolean" - } - ] -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/copy-files.js b/frameworks/keyed/aurelia/aurelia_project/tasks/copy-files.js deleted file mode 100644 index 61a24d174..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/copy-files.js +++ /dev/null @@ -1,45 +0,0 @@ -import gulp from 'gulp'; -import path from 'path'; -import minimatch from 'minimatch'; -import changedInPlace from 'gulp-changed-in-place'; -import project from '../aurelia.json'; - -export default function copyFiles(done) { - if (typeof project.build.copyFiles !== 'object') { - done(); - return; - } - - const instruction = getNormalizedInstruction(); - const files = Object.keys(instruction); - - return gulp.src(files) - .pipe(changedInPlace({ firstPass: true })) - .pipe(gulp.dest(x => { - const filePath = prepareFilePath(x.path); - const key = files.find(f => minimatch(filePath, f)); - return instruction[key]; - })); -} - -function getNormalizedInstruction() { - const files = project.build.copyFiles; - let normalizedInstruction = {}; - - for (let key in files) { - normalizedInstruction[path.posix.normalize(key)] = files[key]; - } - - return normalizedInstruction; -} - -function prepareFilePath(filePath) { - let preparedPath = filePath.replace(process.cwd(), '').substring(1); - - //if we are running on windows we have to fix the path - if (/^win/.test(process.platform)) { - preparedPath = preparedPath.replace(/\\/g, '/'); - } - - return preparedPath; -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/lint.js b/frameworks/keyed/aurelia/aurelia_project/tasks/lint.js deleted file mode 100644 index e5d5f9d7d..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/lint.js +++ /dev/null @@ -1,10 +0,0 @@ -import gulp from 'gulp'; -import eslint from 'gulp-eslint'; -import project from '../aurelia.json'; - -export default function lint() { - return gulp.src([project.transpiler.source]) - .pipe(eslint()) - .pipe(eslint.format()) - .pipe(eslint.failAfterError()); -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/process-css.js b/frameworks/keyed/aurelia/aurelia_project/tasks/process-css.js deleted file mode 100644 index 5557344e6..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/process-css.js +++ /dev/null @@ -1,10 +0,0 @@ -import gulp from 'gulp'; -import changedInPlace from 'gulp-changed-in-place'; -import project from '../aurelia.json'; -import {build} from 'aurelia-cli'; - -export default function processCSS() { - return gulp.src(project.cssProcessor.source) - .pipe(changedInPlace({firstPass: true})) - .pipe(build.bundle()); -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/process-markup.js b/frameworks/keyed/aurelia/aurelia_project/tasks/process-markup.js deleted file mode 100644 index 451727682..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/process-markup.js +++ /dev/null @@ -1,21 +0,0 @@ -import gulp from 'gulp'; -import htmlmin from 'gulp-htmlmin'; -import plumber from 'gulp-plumber'; -import notify from 'gulp-notify'; -import changedInPlace from 'gulp-changed-in-place'; -import project from '../aurelia.json'; -import {build} from 'aurelia-cli'; - -export default function processMarkup() { - return gulp.src(project.markupProcessor.source) - .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')})) - .pipe(changedInPlace({firstPass:true})) - .pipe(htmlmin({ - removeComments: true, - collapseWhitespace: true, - minifyCSS: true, - minifyJS: true, - ignoreCustomFragments: [/\${.*?}/g] // ignore interpolation expressions - })) - .pipe(build.bundle()); -} \ No newline at end of file diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/run.js b/frameworks/keyed/aurelia/aurelia_project/tasks/run.js deleted file mode 100644 index 12fad9d69..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/run.js +++ /dev/null @@ -1,54 +0,0 @@ -import gulp from 'gulp'; -import browserSync from 'browser-sync'; -import historyApiFallback from 'connect-history-api-fallback/lib'; -import {CLIOptions} from 'aurelia-cli'; -import project from '../aurelia.json'; -import build from './build'; -import watch from './watch'; - -let serve = gulp.series( - build, - done => { - browserSync({ - online: false, - open: false, - port: 9000, - logLevel: 'silent', - server: { - baseDir: [project.platform.baseDir], - middleware: [historyApiFallback(), function(req, res, next) { - res.setHeader('Access-Control-Allow-Origin', '*'); - next(); - }] - } - }, function (err, bs) { - if (err) return done(err); - let urls = bs.options.get('urls').toJS(); - log(`Application Available At: ${urls.local}`); - log(`BrowserSync Available At: ${urls.ui}`); - done(); - }); - } -); - -function log(message) { - console.log(message); //eslint-disable-line no-console -} - -function reload() { - log('Refreshing the browser'); - browserSync.reload(); -} - -let run; - -if (CLIOptions.hasFlag('watch')) { - run = gulp.series( - serve, - done => { watch(reload); done(); } - ); -} else { - run = serve; -} - -export default run; diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/run.json b/frameworks/keyed/aurelia/aurelia_project/tasks/run.json deleted file mode 100644 index 6f617e4b6..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/run.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "run", - "description": "Builds the application and serves up the assets via a local web server, watching files for changes as you work.", - "flags": [ - { - "name": "env", - "description": "Sets the build environment.", - "type": "string" - }, - { - "name": "watch", - "description": "Watches source files for changes and refreshes the app automatically.", - "type": "boolean" - } - ] -} diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/transpile.js b/frameworks/keyed/aurelia/aurelia_project/tasks/transpile.js deleted file mode 100644 index 3c5df7305..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/transpile.js +++ /dev/null @@ -1,32 +0,0 @@ -import gulp from 'gulp'; -import changedInPlace from 'gulp-changed-in-place'; -import plumber from 'gulp-plumber'; -import babel from 'gulp-babel'; -import sourcemaps from 'gulp-sourcemaps'; -import notify from 'gulp-notify'; -import rename from 'gulp-rename'; -import project from '../aurelia.json'; -import {CLIOptions, build} from 'aurelia-cli'; - -function configureEnvironment() { - let env = CLIOptions.getEnvironment(); - - return gulp.src(`aurelia_project/environments/${env}.js`) - .pipe(changedInPlace({firstPass: true})) - .pipe(rename('environment.js')) - .pipe(gulp.dest(project.paths.root)); -} - -function buildJavaScript() { - return gulp.src(project.transpiler.source) - .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')})) - .pipe(changedInPlace({firstPass: true})) - .pipe(sourcemaps.init()) - .pipe(babel(project.transpiler.options)) - .pipe(build.bundle()); -} - -export default gulp.series( - configureEnvironment, - buildJavaScript -); diff --git a/frameworks/keyed/aurelia/aurelia_project/tasks/watch.js b/frameworks/keyed/aurelia/aurelia_project/tasks/watch.js deleted file mode 100644 index 9df951649..000000000 --- a/frameworks/keyed/aurelia/aurelia_project/tasks/watch.js +++ /dev/null @@ -1,128 +0,0 @@ -import gulp from 'gulp'; -import minimatch from 'minimatch'; -import gulpWatch from 'gulp-watch'; -import debounce from 'debounce'; -import { build } from 'aurelia-cli'; -import project from '../aurelia.json'; -import transpile from './transpile'; -import processMarkup from './process-markup'; -import processCSS from './process-css'; -import copyFiles from './copy-files'; - -const debounceWaitTime = 100; -let isBuilding = false; -let pendingRefreshPaths = []; -let watchCallback = () => { }; -let watches = [ - { name: 'transpile', callback: transpile, source: project.transpiler.source }, - { name: 'markup', callback: processMarkup, source: project.markupProcessor.source }, - { name: 'CSS', callback: processCSS, source: project.cssProcessor.source } -]; - -if (typeof project.build.copyFiles === 'object') { - for (let src of Object.keys(project.build.copyFiles)) { - watches.push({ name: 'file copy', callback: copyFiles, source: src }); - } -} - -let watch = (callback) => { - watchCallback = callback || watchCallback; - - // watch every glob individually - for(let watcher of watches) { - if (Array.isArray(watcher.source)) { - for(let glob of watcher.source) { - watchPath(glob); - } - } else { - watchPath(watcher.source); - } - } -}; - -let watchPath = (p) => { - gulpWatch( - p, - { - read: false, // performance optimization: do not read actual file contents - verbose: true - }, - (vinyl) => processChange(vinyl)); -}; - -let processChange = (vinyl) => { - if (vinyl.path && vinyl.cwd && vinyl.path.startsWith(vinyl.cwd)) { - let pathToAdd = vinyl.path.substr(vinyl.cwd.length + 1); - log(`Watcher: Adding path ${pathToAdd} to pending build changes...`); - pendingRefreshPaths.push(pathToAdd); - refresh(); - } -} - -let refresh = debounce(() => { - if (isBuilding) { - log('Watcher: A build is already in progress, deferring change detection...'); - return; - } - - isBuilding = true; - - let paths = pendingRefreshPaths.splice(0); - let refreshTasks = []; - - // determine which tasks need to be executed - // based on the files that have changed - for (let watcher of watches) { - if (Array.isArray(watcher.source)) { - for(let source of watcher.source) { - if (paths.find(path => minimatch(path, source))) { - refreshTasks.push(watcher); - } - } - } - else { - if (paths.find(path => minimatch(path, watcher.source))) { - refreshTasks.push(watcher); - } - } - } - - if (refreshTasks.length === 0) { - log('Watcher: No relevant changes found, skipping next build.'); - isBuilding = false; - return; - } - - log(`Watcher: Running ${refreshTasks.map(x => x.name).join(', ')} tasks on next build...`); - - let toExecute = gulp.series( - readProjectConfiguration, - gulp.parallel(refreshTasks.map(x => x.callback)), - writeBundles, - (done) => { - isBuilding = false; - watchCallback(); - done(); - if (pendingRefreshPaths.length > 0) { - log('Watcher: Found more pending changes after finishing build, triggering next one...'); - refresh(); - } - } - ); - - toExecute(); -}, debounceWaitTime); - -function log(message) { - console.log(message); -} - -function readProjectConfiguration() { - return build.src(project); -} - -function writeBundles() { - return build.dest(); -} - -export default watch; \ No newline at end of file diff --git a/frameworks/keyed/aurelia/favicon.ico b/frameworks/keyed/aurelia/favicon.ico deleted file mode 100755 index 9bd337167cd55418a0ffc7be9a0be9a9e5c66c87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmbu4u?<2o3`CzLdhCXVhVt*gFpK~jK*0zMfW#2A2o{14s&Mzip8!YiY@HL!fzZiJ z>5L&@0SqF=O4xTCM(yI>6zw=w|KzAXv$6_m4DV2t+R53|Biv9d;uoW8d3lN diff --git a/frameworks/keyed/aurelia/index.html b/frameworks/keyed/aurelia/index.html deleted file mode 100755 index 52393262e..000000000 --- a/frameworks/keyed/aurelia/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Aurelia - - - - - - - - diff --git a/frameworks/keyed/aurelia/jsconfig.json b/frameworks/keyed/aurelia/jsconfig.json deleted file mode 100755 index dd9df72d1..000000000 --- a/frameworks/keyed/aurelia/jsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "lib": ["es2017", "dom"], - "experimentalDecorators": true - }, - "exclude": [ - "node_modules", - "dist" - ] -} diff --git a/frameworks/keyed/aurelia/package.json b/frameworks/keyed/aurelia/package.json deleted file mode 100644 index 3bc47692c..000000000 --- a/frameworks/keyed/aurelia/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "js-framework-benchmark-aurelia", - "version": "1.0.0", - "description": "Benchmark for aurelia framework", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "aurelia-framework", - "issues": [694] - }, - "keywords": [ - "aurelia" - ], - "author": "Stefan Krause", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "scripts": { - "build-dev": "aurelia build --env dev", - "build-prod": "aurelia build --env prod" - }, - "dependencies": { - "aurelia-binding": "2.1.2", - "aurelia-bootstrapper": "2.3.0", - "aurelia-dependency-injection": "1.4.1", - "aurelia-framework": "1.3.0", - "aurelia-loader": "1.0.0", - "aurelia-loader-default": "1.0.4", - "aurelia-logging": "1.5.0", - "aurelia-logging-console": "1.0.0", - "aurelia-metadata": "1.0.4", - "aurelia-pal": "1.8.0", - "aurelia-pal-browser": "1.8.0", - "aurelia-path": "1.1.1", - "aurelia-task-queue": "1.3.1", - "aurelia-templating": "1.8.2", - "aurelia-templating-binding": "1.4.3", - "aurelia-templating-resources": "1.7.1", - "requirejs": "2.3.5", - "text": "github:requirejs/text#2.0.15" - }, - "devDependencies": { - "aurelia-cli": "0.33.1", - "aurelia-tools": "2.0.0", - "babel-eslint": "8.2.6", - "babel-plugin-syntax-flow": "6.18.0", - "babel-plugin-transform-decorators-legacy": "1.3.5", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-polyfill": "6.26.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "browser-sync": "2.24.6", - "connect-history-api-fallback": "1.5.0", - "debounce": "1.1.0", - "gulp": "4.0.0", - "gulp-babel": "7.0.1", - "gulp-changed-in-place": "2.3.0", - "gulp-eslint": "5.0.0", - "gulp-htmlmin": "4.0.0", - "gulp-notify": "3.2.0", - "gulp-plumber": "1.2.0", - "gulp-rename": "1.4.0", - "gulp-sourcemaps": "2.6.4", - "gulp-watch": "5.0.1", - "html-minifier": "3.5.19", - "minimatch": "3.0.4", - "through2": "2.0.3", - "uglify-js": "3.4.6", - "vinyl-fs": "3.0.3" - } -} diff --git a/frameworks/keyed/aurelia/src/app.html b/frameworks/keyed/aurelia/src/app.html deleted file mode 100755 index 7e81af75f..000000000 --- a/frameworks/keyed/aurelia/src/app.html +++ /dev/null @@ -1,47 +0,0 @@ - diff --git a/frameworks/keyed/aurelia/src/app.js b/frameworks/keyed/aurelia/src/app.js deleted file mode 100755 index ac2299012..000000000 --- a/frameworks/keyed/aurelia/src/app.js +++ /dev/null @@ -1,35 +0,0 @@ -import {Store} from './store'; - -export class App { - constructor() { - this.store = new Store(); - } - - run() { - this.store.run(); - } - add() { - this.store.add(); - } - remove(item) { - this.store.delete(item.id); - } - select(item) { - this.store.select(item.id); - } - update() { - this.store.update(); - } - - runLots() { - this.store.runLots(); - } - - clear() { - this.store.clear(); - } - - swapRows() { - this.store.swapRows(); - } -} diff --git a/frameworks/keyed/aurelia/src/aurelia-polyfills.js b/frameworks/keyed/aurelia/src/aurelia-polyfills.js deleted file mode 100644 index 648f5bbeb..000000000 --- a/frameworks/keyed/aurelia/src/aurelia-polyfills.js +++ /dev/null @@ -1,29 +0,0 @@ -// This replaces the aurelia-polyfills package. It includes only non-standard polyfills. -(function () { - var emptyMetadata = Object.freeze({}); - var metadataContainerKey = '__metadata__'; - - if (typeof Reflect.getOwnMetadata !== 'function') { - Reflect.getOwnMetadata = function (metadataKey, target, targetKey) { - if (target.hasOwnProperty(metadataContainerKey)) { - return (target[metadataContainerKey][targetKey] || emptyMetadata)[metadataKey]; - } - }; - } - - if (typeof Reflect.defineMetadata !== 'function') { - Reflect.defineMetadata = function (metadataKey, metadataValue, target, targetKey) { - var metadataContainer = target.hasOwnProperty(metadataContainerKey) ? target[metadataContainerKey] : target[metadataContainerKey] = {}; - var targetContainer = metadataContainer[targetKey] || (metadataContainer[targetKey] = {}); - targetContainer[metadataKey] = metadataValue; - }; - } - - if (typeof Reflect.metadata !== 'function') { - Reflect.metadata = function (metadataKey, metadataValue) { - return function (target, targetKey) { - Reflect.defineMetadata(metadataKey, metadataValue, target, targetKey); - }; - }; - } -})(); diff --git a/frameworks/keyed/aurelia/src/main.js b/frameworks/keyed/aurelia/src/main.js deleted file mode 100755 index ede9d2d9c..000000000 --- a/frameworks/keyed/aurelia/src/main.js +++ /dev/null @@ -1,15 +0,0 @@ -import environment from './environment' - -export function configure(aurelia) { - aurelia.use - .defaultBindingLanguage() - .defaultResources(); - - if (environment.debug) { - aurelia.use.developmentLogging(); - } - - aurelia.start().then(() => { - aurelia.setRoot('app'); - }); -} \ No newline at end of file diff --git a/frameworks/keyed/aurelia/src/store.js b/frameworks/keyed/aurelia/src/store.js deleted file mode 100644 index 46364629b..000000000 --- a/frameworks/keyed/aurelia/src/store.js +++ /dev/null @@ -1,73 +0,0 @@ -function _random(max) { - return Math.round(Math.random()*1000)%max; -} - -export class Store { - constructor() { - this.data = []; - this.selected = undefined; - this.id = 1; - } - buildData(count = 1000) { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }); - return data; - } - updateData(mod = 10) { - for (let i=0;i d.id==id); - this.data.splice(idx, 1); - } - run() { - // faster: 178 msecs - this.data = [] - setTimeout(() => {this.data = this.buildData();}); - // slower: 194 msecs - // this.data.splice(0, this.data.length, ...this.buildData()); - } - add() { - this.data = this.data.concat(this.buildData(1000)); - this.selected = undefined; - } - update() { - this.updateData(); - } - select(id) { - this.selected = id; - } - hideAll() { - this.backup = this.data; - this.data = []; - this.selected = undefined; - } - showAll() { - this.data = this.backup; - this.backup = null; - this.selected = undefined; - } - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - } - clear() { - this.data = []; - this.selected = undefined; - } - swapRows() { - if (this.data.length > 998) { - var temp = this.data[1]; - var temp2 = this.data[998]; - this.data.splice(1, 1, temp2); - this.data.splice(998, 1, temp); - } - } - -} diff --git a/frameworks/keyed/binding.scala/.gitignore b/frameworks/keyed/binding.scala/.gitignore deleted file mode 100644 index eb34e1881..000000000 --- a/frameworks/keyed/binding.scala/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -local.sbt \ No newline at end of file diff --git a/frameworks/keyed/binding.scala/build.sbt b/frameworks/keyed/binding.scala/build.sbt deleted file mode 100644 index 8a254804a..000000000 --- a/frameworks/keyed/binding.scala/build.sbt +++ /dev/null @@ -1,11 +0,0 @@ -enablePlugins(SbtWeb) - -lazy val js = project - -scalaJSProjects += js - -pipelineStages in Assets += scalaJSPipeline - -scalaVersion in Global := "2.11.8" - -scalacOptions in Global += "-optimise" diff --git a/frameworks/keyed/binding.scala/js/build.sbt b/frameworks/keyed/binding.scala/js/build.sbt deleted file mode 100644 index 8096e77cd..000000000 --- a/frameworks/keyed/binding.scala/js/build.sbt +++ /dev/null @@ -1,7 +0,0 @@ -enablePlugins(ScalaJSPlugin, ScalaJSWeb) - -libraryDependencies += "com.thoughtworks.binding" %%% "dom" % "10.0.1" - -addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full) - -persistLauncher in Compile := true diff --git a/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Main.scala b/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Main.scala deleted file mode 100644 index d1b619d7d..000000000 --- a/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Main.scala +++ /dev/null @@ -1,55 +0,0 @@ -package com.thoughtworks.binding -package benchmark - -import org.scalajs.dom._ - -/** - * @author 杨博 (Yang Bo) <pop.atry@gmail.com> - */ -object Main extends scalajs.js.JSApp { - - @dom def render(store: Store) =
-
-
-
-

Binding.scala v10.0.0

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - { - for (row <- store.data) yield { - "danger" case _ => "" }}> - } - } -
{row.id.toString} store.select(row)}>{row.label.bind} store.delete(row)}>
- -
- - override def main(): Unit = { - dom.render(document.body, render(new Store)) - } - -} diff --git a/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Store.scala b/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Store.scala deleted file mode 100644 index 7190f46ea..000000000 --- a/frameworks/keyed/binding.scala/js/src/main/scala/com/thoughtworks/binding/benchmark/Store.scala +++ /dev/null @@ -1,155 +0,0 @@ -package com.thoughtworks.binding.benchmark - -import com.thoughtworks.binding.Binding.{Var, Vars} - -import scala.util.Random - -/** - * @author 杨博 (Yang Bo) <pop.atry@gmail.com> - */ -final class Store { - import Store.Row - - val data: Vars[Row] = Vars.empty - val selected: Var[Option[Row]] = Var(None) - var seed = 1 - - val adjectives = Array("pretty", - "large", - "big", - "small", - "tall", - "short", - "long", - "handsome", - "plain", - "quaint", - "clean", - "elegant", - "easy", - "angry", - "crazy", - "helpful", - "mushy", - "odd", - "unsightly", - "adorable", - "important", - "inexpensive", - "cheap", - "expensive", - "fancy") - - val colours = Array("red", - "yellow", - "blue", - "green", - "pink", - "brown", - "purple", - "brown", - "white", - "black", - "orange") - - val nouns = Array("table", - "chair", - "house", - "bbq", - "desk", - "car", - "pony", - "cookie", - "sandwich", - "burger", - "pizza", - "mouse", - "keyboard") - - @inline - private def newLabel() = { - raw"""${ - adjectives(Random.nextInt(adjectives.length)) - } ${ - colours(Random.nextInt(colours.length)) - } ${ - nouns(Random.nextInt(nouns.length)) - }""" - } - - @inline - private def newId() = { - val id = seed - seed += 1 - id - } - - private def buildData(count: Int = 1000) = { - (for (i <- 0 until count) yield { - new Row(newId(), Var(newLabel())) - })(collection.breakOut(scalajs.js.WrappedArray.canBuildFrom)) - } - - private def replace(count: Int = 1000) = { - val buffer = data.get - buffer.clear() - buffer ++= buildData(count) - } - - @inline - def run() = { - replace(1000) - } - - @inline - def runLots() = { - replace(10000) - } - - @inline - def add() = { - data.get ++= buildData() - } - - def update() = { - val buffer = data.get - val i = buffer.iterator - for (i <- 0 until buffer.length by 10) { - val label = buffer(i).label - label := label.get + " !!!" - } - } - - @inline - def clear() = { - data.get.clear() - } - - def swapRows() = { - val buffer = data.get - if (buffer.length > 998) { - val row1 = buffer(1) - val row998 = buffer(998) - buffer(998) = row1 - buffer(1) = row998 - } - } - - @inline - def delete(row: Row) = { - val buffer = data.get - buffer -= row - } - - @inline - def select(row: Row) = { - selected := Some(row) - } - -} - -object Store { - - final class Row(val id: Int, val label: Var[String]) - -} diff --git a/frameworks/keyed/binding.scala/package.json b/frameworks/keyed/binding.scala/package.json deleted file mode 100644 index 0ed3e5aaf..000000000 --- a/frameworks/keyed/binding.scala/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "js-framework-benchmark-binding.scala", - "version": "1.0.0", - "description": "Benchmark for Binding.scala", - "js-framework-benchmark": { - "frameworkVersion": "10.0.1", - "customURL": "/target/web/stage", - "issues": [694] - }, - "scripts": { - "build-prod": "sbt web-stage" - }, - "devDependencies": { - "sbt-bin": "0.1.2" - }, - "author": "杨博 (Yang Bo) " -} diff --git a/frameworks/keyed/binding.scala/project/build.properties b/frameworks/keyed/binding.scala/project/build.properties deleted file mode 100644 index 27e88aa11..000000000 --- a/frameworks/keyed/binding.scala/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.13.13 diff --git a/frameworks/keyed/binding.scala/project/plugins.sbt b/frameworks/keyed/binding.scala/project/plugins.sbt deleted file mode 100644 index f0dcbc5cd..000000000 --- a/frameworks/keyed/binding.scala/project/plugins.sbt +++ /dev/null @@ -1,5 +0,0 @@ -addSbtPlugin("com.thoughtworks.sbt-best-practice" % "sbt-best-practice" % "latest.release") - -addSbtPlugin("com.vmunier" % "sbt-web-scalajs" % "1.0.1") - -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.13") diff --git a/frameworks/keyed/binding.scala/src/main/assets/index.html b/frameworks/keyed/binding.scala/src/main/assets/index.html deleted file mode 100644 index f2edf2b00..000000000 --- a/frameworks/keyed/binding.scala/src/main/assets/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Binding.scala v10.0.1 - - - - - - - diff --git a/frameworks/keyed/blazor-wasm/.gitignore b/frameworks/keyed/blazor-wasm/.gitignore deleted file mode 100644 index d0039e5eb..000000000 --- a/frameworks/keyed/blazor-wasm/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -dist/ -dotnet/ -obj/ -bin/ -.vs/ \ No newline at end of file diff --git a/frameworks/keyed/blazor-wasm/dotnet-install.cmd b/frameworks/keyed/blazor-wasm/dotnet-install.cmd deleted file mode 100644 index 997b5071b..000000000 --- a/frameworks/keyed/blazor-wasm/dotnet-install.cmd +++ /dev/null @@ -1 +0,0 @@ -powershell -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -JSonFile src/global.json -InstallDir ./dotnet -NoPath" diff --git a/frameworks/keyed/blazor-wasm/dotnet-install.sh b/frameworks/keyed/blazor-wasm/dotnet-install.sh deleted file mode 100755 index f75457377..000000000 --- a/frameworks/keyed/blazor-wasm/dotnet-install.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --jsonfile ./src/global.json --install-dir ./dotnet --no-path \ No newline at end of file diff --git a/frameworks/keyed/blazor-wasm/package.json b/frameworks/keyed/blazor-wasm/package.json deleted file mode 100644 index 149cb8b1d..000000000 --- a/frameworks/keyed/blazor-wasm/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "js-framework-benchmark-blazor-wasm", - "version": "1.0.0", - "description": "Blazor WebAssembly demo", - "js-framework-benchmark": { - "frameworkVersion": "3.2.0-preview4.20210.8", - "customURL": "/dist/wwwroot/" - }, - "scripts": { - "postinstall": "run-script-os", - "postinstall:win32": "dotnet-install.cmd", - "postinstall:nix": "./dotnet-install.sh", - "build-dev": "run-script-os", - "build-dev:win32": "cross-env DOTNET_CLI_TELEMETRY_OPTOUT=0 ./dotnet/dotnet.exe build ./src/ -c Debug", - "build-dev:nix": "cross-env DOTNET_CLI_TELEMETRY_OPTOUT=0 ./dotnet/dotnet build ./src/ -c Debug", - "build-prod": "run-script-os", - "build-prod:win32": "cross-env DOTNET_CLI_TELEMETRY_OPTOUT=0 ./dotnet/dotnet.exe publish ./src/ -c Release -o ./dist", - "build-prod:nix": "cross-env DOTNET_CLI_TELEMETRY_OPTOUT=0 ./dotnet/dotnet publish ./src/ -c Release -o ./dist" - }, - "keywords": [ - "blazor", - "webassembly" - ], - "author": "Stefan Krause", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "dependencies": {}, - "devDependencies": { - "cross-env": "^7.0.2", - "run-script-os": "1.1.1" - } -} diff --git a/frameworks/keyed/blazor-wasm/src/App.razor b/frameworks/keyed/blazor-wasm/src/App.razor deleted file mode 100644 index c6ed8cde1..000000000 --- a/frameworks/keyed/blazor-wasm/src/App.razor +++ /dev/null @@ -1,56 +0,0 @@ -@namespace blazor_wasm - -
-
-
-
-

Blazor-WASM-"keyed"

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - @foreach (var item in data) - { - - - - - - - } - -
@item.Id - - @item.Label - - - - - -
- -
- diff --git a/frameworks/keyed/blazor-wasm/src/App.razor.cs b/frameworks/keyed/blazor-wasm/src/App.razor.cs deleted file mode 100644 index 65e8db3c0..000000000 --- a/frameworks/keyed/blazor-wasm/src/App.razor.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace blazor_wasm -{ - public partial class App - { - List data = new List(); - int selected; - int id = 1; - Random random = new Random(0); - - string[] adjectives = new string[] - { - "pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy" - }; - - string[] colours = new string[] - { - "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange" - }; - - string[] nouns = new string[] - { - "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard" - }; - - List BuildData(int count = 1000) - { - var result = new List(); - for (int i = 0; i < count; i++) - { - result.Add(new Data - { - Id = this.id++, - Label = adjectives[this.random.Next(adjectives.Length)] + " " + colours[this.random.Next(colours.Length)] + " " + nouns[this.random.Next(nouns.Length)] - }); - } - - return result; - } - - public void Select(Data item) - { - this.selected = item.Id; - } - - void Delete(Data item) - { - this.data.Remove(item); - } - - void Run() - { - this.data = this.BuildData(); - } - void Runlots() - { - this.data = this.BuildData(10000); - } - void Add() - { - this.data.AddRange(this.BuildData(1000)); - } - void Update() - { - for (var i = 0; i < this.data.Count; i += 10) - { - this.data[i].Label += " !!!"; - } - } - void Clear() - { - this.data = new List(); - this.selected = 0; - } - void SwapRows() - { - if (this.data.Count > 998) - { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - } - } -} diff --git a/frameworks/keyed/blazor-wasm/src/Data.cs b/frameworks/keyed/blazor-wasm/src/Data.cs deleted file mode 100644 index 1871e4240..000000000 --- a/frameworks/keyed/blazor-wasm/src/Data.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace blazor_wasm -{ - public class Data - { - public int Id { get; set; } - public string Label { get; set; } - } -} \ No newline at end of file diff --git a/frameworks/keyed/blazor-wasm/src/Program.cs b/frameworks/keyed/blazor-wasm/src/Program.cs deleted file mode 100644 index ed8ea1c57..000000000 --- a/frameworks/keyed/blazor-wasm/src/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - -namespace blazor_wasm -{ - public class Program - { - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("app"); - - await builder.Build().RunAsync(); - } - } -} diff --git a/frameworks/keyed/blazor-wasm/src/Properties/launchSettings.json b/frameworks/keyed/blazor-wasm/src/Properties/launchSettings.json deleted file mode 100644 index 3d1b5c2f7..000000000 --- a/frameworks/keyed/blazor-wasm/src/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:33030/", - "sslPort": 44363 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "blazor-wasm": { - "commandName": "Project", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/frameworks/keyed/blazor-wasm/src/_Imports.razor b/frameworks/keyed/blazor-wasm/src/_Imports.razor deleted file mode 100644 index 4a26e97c5..000000000 --- a/frameworks/keyed/blazor-wasm/src/_Imports.razor +++ /dev/null @@ -1,8 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.JSInterop -@using blazor_wasm - diff --git a/frameworks/keyed/blazor-wasm/src/blazor-wasm.csproj b/frameworks/keyed/blazor-wasm/src/blazor-wasm.csproj deleted file mode 100644 index 735de5627..000000000 --- a/frameworks/keyed/blazor-wasm/src/blazor-wasm.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - netstandard2.1 - 3.0 - - - - - - - - - - diff --git a/frameworks/keyed/blazor-wasm/src/global.json b/frameworks/keyed/blazor-wasm/src/global.json deleted file mode 100644 index 1caecfb19..000000000 --- a/frameworks/keyed/blazor-wasm/src/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "3.1.201" - } - } \ No newline at end of file diff --git a/frameworks/keyed/blazor-wasm/src/wwwroot/index.html b/frameworks/keyed/blazor-wasm/src/wwwroot/index.html deleted file mode 100644 index bfe275bab..000000000 --- a/frameworks/keyed/blazor-wasm/src/wwwroot/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - blazor-wasm - - - - - - Loading... - - - - diff --git a/frameworks/keyed/bobril/.vscode/settings.json b/frameworks/keyed/bobril/.vscode/settings.json deleted file mode 100644 index c7c1623bc..000000000 --- a/frameworks/keyed/bobril/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "./node_modules/typescript/lib" -} \ No newline at end of file diff --git a/frameworks/keyed/bobril/index.html b/frameworks/keyed/bobril/index.html deleted file mode 100644 index 1e6fb644d..000000000 --- a/frameworks/keyed/bobril/index.html +++ /dev/null @@ -1 +0,0 @@ -Bobril v8.0.1 \ No newline at end of file diff --git a/frameworks/keyed/bobril/package.json b/frameworks/keyed/bobril/package.json deleted file mode 100644 index dfbea019f..000000000 --- a/frameworks/keyed/bobril/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "js-framework-benchmark-bobril", - "version": "1.0.0", - "description": "Bobril demo", - "main": "src/app.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "bobril" - }, - "scripts": { - "build-dev": "bb", - "build-prod": "bb b -v dist" - }, - "keywords": [ - "bobril", - "bobril-build" - ], - "author": "Boris Letocha", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "bobril-build": "0.82.0", - "uglify-js": "^3.4.6" - }, - "dependencies": { - "bobril": "8.11.2" - }, - "bobril": { - "title": "Bobril v8.0.1", - "dir": ".", - "dependencies": "disable", - "head": "" - }, - "resolutions": { - "glob": "7.1.1", - "uglify-js": "2.8.7", - "supports-color": "3.2.3", - "readable-stream": "2.2.3", - "mkdirp": "0.5.1", - "rimraf": "2.5.4", - "minimist": "1.2.0", - "assert-plus": "0.2.0", - "once": "1.4.0", - "debug": "0.7.4", - "colors": "1.1.2", - "esprima": "2.7.3", - "fs-extra": "1.0.0", - "bobril": "8.11.2", - "request": "2.79.0" - } -} diff --git a/frameworks/keyed/bobril/src/app.ts b/frameworks/keyed/bobril/src/app.ts deleted file mode 100644 index 6c2232be8..000000000 --- a/frameworks/keyed/bobril/src/app.ts +++ /dev/null @@ -1,186 +0,0 @@ -import * as b from "bobril"; -import { Store } from "./store"; - -// For who ever will read this: in Bobril you normally don't use bootstrap or class names directly, you use b.styleDef instead. -b.asset("../../../../css/currentStyle.css"); - -function divWithClass(name: string, children: b.IBobrilChildren) { - return { tag: "div", className: name, children }; -} - -function tdWithClass(name: string, children: b.IBobrilChildren) { - return { tag: "td", className: name, children }; -} - -let store = new Store(); - -interface IButtonData { - children?: b.IBobrilChildren; - id: string; - action: () => void; -} - -interface IButtonCtx extends b.IBobrilCtx { - data: IButtonData; -} - -const Button = b.createVirtualComponent({ - render(ctx: IButtonCtx, me: b.IBobrilNode) { - const d = ctx.data; - me.tag = "button"; - me.className = "btn btn-primary btn-block"; - me.attrs = { id: d.id }; - me.children = d.children; - }, - onClick(ctx: IButtonCtx): boolean { - ctx.data.action(); - b.invalidate(); - return true; - } -}); - -interface IHeaderData {} - -interface IHeaderCtx extends b.IBobrilCtx { - data: IHeaderData; -} - -const Header = b.createComponent({ - shouldChange() { - return false; - }, - render(ctx: IHeaderCtx, me: b.IBobrilNode) { - const d = ctx.data; - me.className = "jumbotron"; - me.children = divWithClass("row", [ - divWithClass("col-md-6", { tag: "h1", children: "Bobril v8.0.1" }), - divWithClass("col-md-6", [ - divWithClass( - "col-sm-6 smallpad", - Button({ id: "run", action: () => store.run() }, "Create 1,000 rows") - ), - divWithClass( - "col-sm-6 smallpad", - Button( - { id: "runlots", action: () => store.runLots() }, - "Create 10,000 rows" - ) - ), - divWithClass( - "col-sm-6 smallpad", - Button({ id: "add", action: () => store.add() }, "Append 1,000 rows") - ), - divWithClass( - "col-sm-6 smallpad", - Button( - { id: "update", action: () => store.update() }, - "Update every 10th row" - ) - ), - divWithClass( - "col-sm-6 smallpad", - Button({ id: "clear", action: () => store.clear() }, "Clear") - ), - divWithClass( - "col-sm-6 smallpad", - Button( - { id: "swaprows", action: () => store.swapRows() }, - "Swap Rows" - ) - ) - ]) - ]); - } -}); - -const ClickSelect: b.IBobrilComponent = { - onClick(ctx: b.IBobrilCtx, event: b.IBobrilMouseEvent): boolean { - store.select(ctx.data); - b.invalidate(); - return true; - } -}; - -const ClickRemove: b.IBobrilComponent = { - onClick(ctx: b.IBobrilCtx, event: b.IBobrilMouseEvent): boolean { - store.delete(ctx.data); - b.invalidate(); - return true; - } -}; - -interface IRowData { - item: { id: number; label: string }; - selected: boolean; -} - -interface IRowCtx extends b.IBobrilCtx { - data: IRowData; -} - -const Row = b.createVirtualComponent({ - init(ctx: IRowCtx) {}, - shouldChange(ctx: IRowCtx, me: b.IBobrilNode): boolean { - return ( - ctx.data.item !== me.data.item || ctx.data.selected !== me.data.selected - ); - }, - render(ctx: IRowCtx, me: b.IBobrilNode) { - const d = ctx.data; - me.tag = "tr"; - me.className = d.selected ? "danger" : ""; - const id = d.item.id; - me.children = [ - tdWithClass("col-md-1", id), - tdWithClass("col-md-4", { - tag: "a", - data: id, - component: ClickSelect, - children: d.item.label - }), - tdWithClass("col-md-1", { - tag: "a", - data: id, - component: ClickRemove, - children: { - tag: "span", - className: "glyphicon glyphicon-remove", - attrs: { "aria-hidden": "true" } - } - }), - tdWithClass("col-md-6", "") - ]; - } -}); - -b.init(() => { - return { - tag: "div", - className: "container", - component: { - }, - children: [ - Header(), - { - tag: "table", - className: "table table-hover table-striped test-data", - children: { - tag: "tbody", - children: store.data.map(item => - b.withKey( - Row({ item, selected: item.id === store.selected }), - item.id - ) - ) - } - }, - { - tag: "span", - className: "preloadicon glyphicon glyphicon-remove", - attrs: { "aria-hidden": "true" } - } - ] - }; -}); - -b.syncUpdate(); diff --git a/frameworks/keyed/bobril/src/store.ts b/frameworks/keyed/bobril/src/store.ts deleted file mode 100644 index 29dfbc7e7..000000000 --- a/frameworks/keyed/bobril/src/store.ts +++ /dev/null @@ -1,77 +0,0 @@ -function _random(max) { - return Math.round(Math.random()*1000)%max; -} - -export class Store { - data: { id:number, label:string }[]; - backup: { id:number, label:string }[]; - selected: number; - id: number; - constructor() { - this.data = []; - this.selected = undefined; - this.id = 1; - } - buildData(count = 1000) { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }); - return data; - } - updateData(mod = 10) { - for (let i=0;i d.id==id); - this.data = this.data.filter((e,i) => i!=idx); - return this; - } - deleteNext(id) { - const idx = this.data.findIndex(d => d.id==id); - this.data = this.data.filter((e,i) => i!=idx+1); - return this; - } - run() { - this.data = this.buildData(); - this.selected = undefined; - } - add() { - this.data = this.data.concat(this.buildData(1000)); - } - update() { - this.updateData(); - } - select(id:number) { - this.selected = id; - } - hideAll() { - this.backup = this.data; - this.data = []; - this.selected = undefined; - } - showAll() { - this.data = this.backup; - this.backup = null; - this.selected = undefined; - } - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - } - clear() { - this.data = []; - this.selected = undefined; - } - swapRows() { - if(this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - } -} diff --git a/frameworks/keyed/bobril/tsconfig.json b/frameworks/keyed/bobril/tsconfig.json deleted file mode 100644 index 3abd92aa3..000000000 --- a/frameworks/keyed/bobril/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "jsx": "react", - "reactNamespace": "b" - }, - "compileOnSave": false, - "files": [ - "node_modules/bobril/jsx.d.ts", - "src/app.ts", - "src/store.ts" - ] -} \ No newline at end of file diff --git a/frameworks/keyed/choo/index.html b/frameworks/keyed/choo/index.html deleted file mode 100755 index 26f8f63d9..000000000 --- a/frameworks/keyed/choo/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Choo v6.5.0 - - - -
- - - diff --git a/frameworks/keyed/choo/package.json b/frameworks/keyed/choo/package.json deleted file mode 100644 index 8fc470ae9..000000000 --- a/frameworks/keyed/choo/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "choo-v6.5.0", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "choo" - }, - "scripts": { - "build-dev": "browserify src/index.js > dist/index.js", - "build-prod": "rimraf dist && mkdirp dist && cross-env NODE_ENV=production browserify src/index.js -t envify -g yo-yoify -g unassertify -g es2020 -g uglifyify | uglifyjs > dist/index.js" - }, - "keywords": [ - "choo" - ], - "author": "Rahul Chanila", - "license": "MIT", - "dependencies": { - "browserify": "16.2.2", - "choo": "6.13.0", - "cross-env": "5.2.0", - "envify": "4.1.0", - "es2020": "1.1.9", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "uglify-js": "3.4.6", - "uglifyify": "5.0.1", - "unassertify": "2.1.1", - "yo-yoify": "4.3.0" - } -} diff --git a/frameworks/keyed/choo/src/index.js b/frameworks/keyed/choo/src/index.js deleted file mode 100644 index 3dd4fdf7c..000000000 --- a/frameworks/keyed/choo/src/index.js +++ /dev/null @@ -1,80 +0,0 @@ -const choo = require('choo'); -const html = require('choo/html'); -const app = choo(); - -const rowsView = require('./rowsView'); -const store = require('./store'); -const utils = require('./utils'); - -app.use(store); - -function view(state, emit) { - return html` -
-
-
-
-

Choo v6.5.0

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - ${rowsView(state, emit)} - -
- -
- `; - - function run() { - emit('run'); - } - - function runLots() { - emit('runLots'); - } - - function add() { - emit('add'); - } - - function update() { - emit('update'); - } - - function clear() { - emit('clear'); - } - - function swapRows() { - emit('swapRows'); - } -} - -app.route('/', view); -app.route('/:chooversion', view); -app.route('/:chooversion/index.html', view); -app.mount('#main'); diff --git a/frameworks/keyed/choo/src/rowsView.js b/frameworks/keyed/choo/src/rowsView.js deleted file mode 100644 index e13916540..000000000 --- a/frameworks/keyed/choo/src/rowsView.js +++ /dev/null @@ -1,55 +0,0 @@ -const html = require('choo/html'); -const utils = require('./utils'); - -module.exports = function rowsView(state, emit) { - const data = state.data; - const selected = state.selected; - - return data.map(d => { - const id = d.id; - const label = d.label; - const className = classNameSelected(selected); - return row({ id, label, className }, emit); - }); -}; - -function row(state, emit) { - const id = state.id; - const label = state.label; - const className = state.className; - - const row = html` - - ${id} - - ${label} - - - - - - - - - `; - - row.isSameNode = target => target && target.id === id; - - return row; -} - -function del(id, emit) { - return e => { - emit('delete', { id: id }); - }; -} - -function click(id, emit) { - return e => { - emit('select', { id: id }); - }; -} - -function classNameSelected(selected) { - return id => (id === selected ? 'danger' : ''); -} diff --git a/frameworks/keyed/choo/src/store.js b/frameworks/keyed/choo/src/store.js deleted file mode 100644 index 65c6748a5..000000000 --- a/frameworks/keyed/choo/src/store.js +++ /dev/null @@ -1,57 +0,0 @@ -const buildData = require('./utils').buildData; - -module.exports = function(state, emitter) { - state.data = []; - state.selected = false; - - emitter.on('run', function() { - state.data = buildData(1000); - state.selected = undefined; - emitter.emit('render'); - }); - - emitter.on('add', function() { - state.data = state.data.slice().concat(buildData(1000)); - state.selected = undefined; - emitter.emit('render'); - }); - - emitter.on('runLots', function() { - state.data = state.data.slice().concat(buildData(10000)); - state.selected = undefined; - emitter.emit('render'); - }); - - emitter.on('clear', function() { - state.data = []; - state.selected = undefined; - emitter.emit('render'); - }); - - emitter.on('update', function() { - for (let i = 0; i < state.data.length; i += 10) { - state.data[i].label += ' !!!'; - } - emitter.emit('render'); - }); - - emitter.on('swapRows', function() { - if (state.data.length > 998) { - const a = state.data[1]; - state.data[1] = state.data[998]; - state.data[998] = a; - } - emitter.emit('render'); - }); - - emitter.on('select', function(params) { - state.selected = params.id; - emitter.emit('render'); - }); - - emitter.on('delete', function(params) { - const idx = state.data.findIndex(d => d.id == params.id); - state.data.splice(idx, 1); - emitter.emit('render'); - }); -}; diff --git a/frameworks/keyed/choo/src/utils.js b/frameworks/keyed/choo/src/utils.js deleted file mode 100644 index 7067ddd7b..000000000 --- a/frameworks/keyed/choo/src/utils.js +++ /dev/null @@ -1,25 +0,0 @@ -exports.buildData = buildData; - -// - -let id = 1; - -function _random(max) { - return Math.round(Math.random() * 1000) % max; -} - -const adjectives = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy']; -const colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; -const nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; - -function buildData(count) { - count = count || 1000; - return new Array(count).fill('').map(() => { - return { - id: id++, - label: `${adjectives[_random(adjectives.length)]} ${colours[ - _random(colours.length) - ]} ${nouns[_random(nouns.length)]}` - }; - }); -} diff --git a/frameworks/keyed/crui/index.html b/frameworks/keyed/crui/index.html deleted file mode 100644 index a66855693..000000000 --- a/frameworks/keyed/crui/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - CRUI keyed - - - -
- - - diff --git a/frameworks/keyed/crui/package.json b/frameworks/keyed/crui/package.json deleted file mode 100644 index 2d5b27fa4..000000000 --- a/frameworks/keyed/crui/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "js-framework-benchmark-keyed-crui", - "version": "0.1.0", - "main": "dist/main.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@crui/core", - "issues": [694] - }, - "scripts": { - "build-dev": "webpack --watch", - "build-prod": "webpack" - }, - "author": "Pelligra Salvatore", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "dependencies": { - "@crui/core": "0.1.0-alpha.13", - "@crui/reactive": "0.1.0-alpha.13" - }, - "devDependencies": { - "@babel/core": "7.5.5", - "@babel/preset-env": "7.5.5", - "awesome-typescript-loader": "5.2.1", - "babel-core": "6.26.3", - "terser-webpack-plugin": "1.3.0", - "typescript": "3.5.3", - "webpack": "4.38.0", - "webpack-cli": "3.3.6" - } -} diff --git a/frameworks/keyed/crui/src/app.ts b/frameworks/keyed/crui/src/app.ts deleted file mode 100644 index 3ed3ed4c3..000000000 --- a/frameworks/keyed/crui/src/app.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { attribute, h, sc2 } from '@crui/core'; -import { Jumbotron } from './jumbotron'; -import { Store } from './store'; -import { Table } from './table'; -import { div, klass } from './utils'; - -const loading = h('span', sc2( - klass('preloadicon glyphicon glyphicon-remove'), - attribute('aria-hidden', 'true'), -)) - -export function App(store: Store) { - return div('container', [ - Jumbotron(store), - Table(store), - loading, - ]) -} \ No newline at end of file diff --git a/frameworks/keyed/crui/src/jumbotron.ts b/frameworks/keyed/crui/src/jumbotron.ts deleted file mode 100644 index c98234371..000000000 --- a/frameworks/keyed/crui/src/jumbotron.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, ctext, h, ht, onClick, props, sc } from '@crui/core'; -import { Store } from './store'; -import { div } from './utils'; - -export function Jumbotron(store: Store) { - return div('jumbotron', [ - row([ - col6(ht('h1', 'CRUI')), - col6(row([ - button('run', 'Create 1,000 rows', store.set1k), - button('runlots', 'Create 10,000 rows', store.set10k), - button('add', 'Append 1,000 rows', store.add1k), - button('update', 'Update every 10th row', store.updateEvery10th), - button('clear', 'Clear', store.clear), - button('swaprows', 'Swap Rows', store.swapRows), - ])) - ]) - ]) -} - -function row(cs: Component[]) { - return div('row', cs) -} - -function col6(c: Component) { - return div('col-md-6', [c]) -} - -type Handler = () => void -function button(id: string, text: string, click: Handler) { - return div('col-sm-6 smallpad', [ - h('button', sc([ - props({ id, className: 'btn btn-primary btn-block', type: 'button' }), - onClick(click), - ctext(text) - ])) - ]) -} \ No newline at end of file diff --git a/frameworks/keyed/crui/src/main.ts b/frameworks/keyed/crui/src/main.ts deleted file mode 100644 index b7ab8d985..000000000 --- a/frameworks/keyed/crui/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from '@crui/core/dom/browser'; -import { App } from './app' -import { Store } from './store' - -mount( - document.getElementById('main')!, - App(new Store), - {} -) \ No newline at end of file diff --git a/frameworks/keyed/crui/src/store.ts b/frameworks/keyed/crui/src/store.ts deleted file mode 100644 index ca9e7ce68..000000000 --- a/frameworks/keyed/crui/src/store.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { StreamBox } from '@crui/reactive/rx/box/stream'; -import { DRW$B } from '@crui/reactive/rx/box/types'; -import { StreamList } from '@crui/reactive/rx/list/stream'; -import { DRW$L, R$L } from '@crui/reactive/rx/list/types'; - -export type Item = { - id: number, - label: DRW$B, - selected: DRW$B -} - -export class Store { - private data: DRW$L - private selected: Item|null - - constructor() { - this.data = new StreamList([]) - this.selected = null - } - - getData(): R$L { - return this.data - } - - select = (item: Item) => { - if (this.selected === item) - return - - if (this.selected !== null) - this.selected.selected.set(false) - - this.selected = item - item.selected.set(true) - } - - set1k = () => { - this.data.set(buildData(1_000)) - } - - set10k = () => { - this.data.set(buildData(10_000)) - } - - add1k = () => { - this.data.concat(buildData(1_000)) - } - - remove = (item: Item) => { - this.data.remove(item) - } - - updateEvery10th = () => { - const items = this.data.get() - for (let i = 0; i < items.length; i += 10) { - const label = items[i].label - label.set(label.get() + ' !!!') - } - } - - swapRows = () => { - if (this.data.get().length <= 998) - return - - const tmp = this.data.item(1)! - this.data.update(1, this.data.item(998)!) - this.data.update(998, tmp) - } - - clear = () => { - this.data.set([]) - } -} - -let idCounter = 1 -const adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; -const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; -const nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - -function buildData(count: number) { - let data = new Array(count); - - for (let i = 0; i < count; i++) { - const adjective = pickRandom(adjectives) - const color = pickRandom(colours) - const noun = pickRandom(nouns) - - data[i] = { - id: idCounter++, - label: new StreamBox(`${adjective} ${color} ${noun}`), - selected: new StreamBox(false) - } - } - - return data; -} - -function pickRandom(xs: T[]): T { - return xs[random(xs.length)] -} - -function random (max: number) { - return Math.round(Math.random() * 1000) % max -} \ No newline at end of file diff --git a/frameworks/keyed/crui/src/table.ts b/frameworks/keyed/crui/src/table.ts deleted file mode 100644 index bb50844e6..000000000 --- a/frameworks/keyed/crui/src/table.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { attribute, child, children, Component, h, onClick, sc2, text } from '@crui/core'; -import { text$ } from '@crui/reactive/elems/text'; -import { map } from '@crui/reactive/rx/box/map'; -import { c$map } from '@crui/reactive/setups/map'; -import { $props } from '@crui/reactive/setups/props'; -import { Item, Store } from './store'; -import { klass } from './utils'; - -export function Table(store: Store) { - return h('table', sc2( - klass('table table-hover table-striped test-data'), - child(h('tbody', c$map( - store.getData(), - (item) => row(store, item) - ))) - )) -} - -const binIcon = h('span', sc2( - klass('glyphicon glyphicon-remove'), - attribute('aria-hidden', 'true') -)) - -function row(store: Store, item: Item) { - const className = map( - item.selected, - (selected) => selected ? 'danger' : '' - ) - return h('tr', sc2( - $props({ className }), - children([ - td('col-md-1', text(item.id.toString())), - td('col-md-4', a(text$(item.label), () => { - store.select(item) - })), - td('col-md-1', a(binIcon, () => { - store.remove(item) - })), - h('td', klass('col-md-6')) - ]) - )) -} - -function td(cls: string, c: Component<{}, any>) { - return h('td', sc2( - klass(cls), - child(c) - )) -} - -type Handler = () => void -function a(c: Component<{}, any>, click: Handler) { - return h('a', sc2( - onClick(click), - child(c) - )) -} \ No newline at end of file diff --git a/frameworks/keyed/crui/src/utils.ts b/frameworks/keyed/crui/src/utils.ts deleted file mode 100644 index 11378f49e..000000000 --- a/frameworks/keyed/crui/src/utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { children, Component, h, sc2 } from '@crui/core'; -import { props } from '@crui/core/setups/props'; - -export const klass = (className: string) => - props({ className }) - -export function div(cls: string, cs: Component[]) { - return h('div', sc2( - klass(cls), - children(cs) - )) -} \ No newline at end of file diff --git a/frameworks/keyed/crui/tsconfig.json b/frameworks/keyed/crui/tsconfig.json deleted file mode 100644 index 7bbf5c738..000000000 --- a/frameworks/keyed/crui/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "*": [ - "types/*" - ] - }, - "target": "ES2016", - "module": "esNext", - "sourceMap": true, - "outDir": "./dist/", - "strict": true, - "strictNullChecks": true, - "alwaysStrict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true - }, - "include": [ - "./src/*.ts", - ] -} diff --git a/frameworks/keyed/crui/webpack.config.js b/frameworks/keyed/crui/webpack.config.js deleted file mode 100644 index a0867c2ea..000000000 --- a/frameworks/keyed/crui/webpack.config.js +++ /dev/null @@ -1,75 +0,0 @@ -const path = require('path') -const webpack = require('webpack') -const TerserPlugin = require('terser-webpack-plugin') -const { CheckerPlugin } = require('awesome-typescript-loader') - -module.exports = { - mode: 'production', - entry: { - main: path.join(__dirname, 'src', 'main.ts'), - }, - output: { - path: path.join(__dirname, 'dist'), - filename: '[name].js' - }, - resolve: { - extensions: ['.ts', '.js'] - }, - module: { - rules: [{ - test: /\.ts$/, - loader: 'awesome-typescript-loader', - options: { - useBabel: true, - useCache: true, - }, - exclude: [/.test.ts/], - }] - }, - optimization: { - minimizer: [ - new TerserPlugin({ - terserOptions: { - parse: { - // we want terser to parse ecma 8 code. However, we don't want it - // to apply any minfication steps that turns valid ecma 5 code - // into invalid ecma 5 code. This is why the 'compress' and 'output' - // sections only apply transformations that are ecma 5 safe - // https://github.com/facebook/create-react-app/pull/4234 - ecma: 8, - }, - compress: { - ecma: 5, - warnings: false, - // Disabled because of an issue with Uglify breaking seemingly valid code: - // https://github.com/facebook/create-react-app/issues/2376 - // Pending further investigation: - // https://github.com/mishoo/UglifyJS2/issues/2011 - comparisons: false, - }, - mangle: { - safari10: true, - }, - output: { - ecma: 5, - comments: false, - // Turned on because emoji and regex is not minified properly using default - // https://github.com/facebook/create-react-app/issues/2488 - ascii_only: true, - }, - }, - // Use multi-process parallel running to improve the build speed - // Default number of concurrent runs: os.cpus().length - 1 - parallel: true, - // Enable file caching - cache: true, - }), - ] - }, - plugins: [ - new CheckerPlugin(), - new webpack.DefinePlugin({ - 'process.env': { NODE_ENV: JSON.stringify('production') } - }), - ], -} diff --git a/frameworks/keyed/datum/.babelrc b/frameworks/keyed/datum/.babelrc deleted file mode 100644 index 6df7eb362..000000000 --- a/frameworks/keyed/datum/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets" : [ "babel-preset-es2015"] -} \ No newline at end of file diff --git a/frameworks/keyed/datum/index.html b/frameworks/keyed/datum/index.html deleted file mode 100644 index b627e094c..000000000 --- a/frameworks/keyed/datum/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Datum - - - -
-
-
-
-
-

Datum v0.12.2

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - - - - - - - -
- -
- -
-
- - - diff --git a/frameworks/keyed/datum/package.json b/frameworks/keyed/datum/package.json deleted file mode 100644 index 7b2e2eacc..000000000 --- a/frameworks/keyed/datum/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "js-framework-benchmark-datumjs", - "version": "1.0.0", - "description": "Benchmark for Datum v0.8", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "Datum", - "issues": [694] - }, - "scripts": { - "build-dev": "webpack -w -d -c webpack.config.js", - "build-prod": "webpack -p -c webpack.config.js" - }, - "contributors": [ - "Stefan Krause", - "Martin Rixham" - ], - "license": "Apache-2.0", - "devDependencies": { - "babel-core": "6.18.2", - "babel-loader": "6.2.8", - "babel-preset-es2015": "6.18.0", - "webpack": "1.13.3" - }, - "dependencies": { - "Datum": "0.12.2" - } -} diff --git a/frameworks/keyed/datum/src/Main.js b/frameworks/keyed/datum/src/Main.js deleted file mode 100644 index da0958eb8..000000000 --- a/frameworks/keyed/datum/src/Main.js +++ /dev/null @@ -1,101 +0,0 @@ -const Datum = require('Datum'); - -var HomeViewModel = function () { - - this.data = []; - - var selected = new Datum(); - - var id = 1; - - var self = this; - - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - - function getRandomNumber(max) { - return Math.round(Math.random() * 1000) % max; - } - - function buildData(count) { - var data = []; - for (var i = 0; i < count; i++) { - data.push(new ItemViewModel(id++, getRandomLabel())); - } - return data; - } - - function getRandomLabel() { - return adjectives[getRandomNumber(adjectives.length)] + " " + - colours[getRandomNumber(colours.length)] + " " + - nouns[getRandomNumber(nouns.length)]; - } - - this.run = new Datum.Click(function () { - this.data = buildData(1000); - selected(null); - }); - - this.runLots = new Datum.Click(function () { - this.data = buildData(10000); - selected(null); - }); - - this.add = new Datum.Click(function () { - this.data.push.apply(this.data, buildData(1000)); - }); - - this.update = new Datum.Click(function () { - for (var i = 0; i < this.data.length; i += 10) { - this.data[i].update(); - } - }); - - this.clear = new Datum.Click(function () { - this.data = []; - selected(null); - }); - - this.swapRows = new Datum.Click(function () { - if (this.data.length > 998) { - var a = this.data[1]; - var b = this.data.splice(998, 1, a)[0]; - this.data.splice(1, 1, b); - } - }); - - function ItemViewModel(id, itemLabel) { - - var label = new Datum(itemLabel); - - this.label = new Datum.Text(label); - - this.id = new Datum.Text(function() { - - return id; - }); - - this.update = function() { - label(label() + " !!!"); - }; - - this.del = new Datum.Click(function () { - var index = self.data.indexOf(this); - self.data.splice(index, 1); - }); - - this.select = new Datum.Binding({ - click: function() { - selected(this); - }, - classes: { - danger: function() { - return selected() == this; - } - } - }); - } -}; - -new Datum.BindingRoot(new HomeViewModel()); diff --git a/frameworks/keyed/datum/webpack.config.js b/frameworks/keyed/datum/webpack.config.js deleted file mode 100644 index 066cdf1ec..000000000 --- a/frameworks/keyed/datum/webpack.config.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -var cache = {}; -var loaders = [ - { - test: /\.js$/, - loader: 'babel-loader', - exclude: /node_modules/ - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader' - } -]; -var extensions = [ - '', '.js', '.jsx', '.es6.js' -]; - -module.exports = [{ - cache: cache, - module: { - loaders: loaders - }, - entry: { - main: './src/Main.js', - }, - output: { - path: './dist', - filename: '[name].js' - }, - resolve: { - extensions: extensions, - root: [ - __dirname, - __dirname + '/src' - ], - alias: { - "Datum": __dirname+"/node_modules/Datum/target/Datum.js" - } - } -}]; diff --git a/frameworks/keyed/dojo/.dojorc b/frameworks/keyed/dojo/.dojorc deleted file mode 100644 index d7475edc7..000000000 --- a/frameworks/keyed/dojo/.dojorc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "build-app": { - "base": "/frameworks/keyed/dojo/output/dist/" - }, - "create-app": {} -} diff --git a/frameworks/keyed/dojo/.gitignore b/frameworks/keyed/dojo/.gitignore deleted file mode 100644 index c7f3174c5..000000000 --- a/frameworks/keyed/dojo/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_build -/output diff --git a/frameworks/keyed/dojo/README.md b/frameworks/keyed/dojo/README.md deleted file mode 100644 index 407491bf9..000000000 --- a/frameworks/keyed/dojo/README.md +++ /dev/null @@ -1 +0,0 @@ -# dojo-v6.0.0-keyed diff --git a/frameworks/keyed/dojo/package.json b/frameworks/keyed/dojo/package.json deleted file mode 100644 index 3b43f6b9e..000000000 --- a/frameworks/keyed/dojo/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "dojo-keyed", - "version": "1.0.0", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@dojo/framework", - "customURL": "/output/dist", - "issues": [694] - }, - "scripts": { - "build-prod": "./node_modules/.bin/dojo build" - }, - "dependencies": { - "@dojo/framework": "^6.0.0" - }, - "devDependencies": { - "@dojo/cli": "^6.0.0", - "@dojo/cli-build-app": "^6.0.0", - "typescript": "3.5.2" - } -} diff --git a/frameworks/keyed/dojo/src/App.ts b/frameworks/keyed/dojo/src/App.ts deleted file mode 100644 index b0ead98f9..000000000 --- a/frameworks/keyed/dojo/src/App.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { create, v, w } from '@dojo/framework/core/vdom'; -import Row from './Row'; -import Buttons from './Buttons'; -import store from './Store'; - -const factory = create({ store }); - -export default factory(function App({ middleware: { store }}) { - - const buttonConfigs = [ - { id: 'run', label: 'Create 1,000 rows', onClick: store.run }, - { id: 'runlots', label: 'Create 10,000 rows', onClick: store.runLots }, - { id: 'add', label: 'Append 1,000 rows', onClick: store.add }, - { id: 'update', label: 'Update every 10th row', onClick: store.update }, - { id: 'clear', label: 'Clear', onClick: store.clear }, - { id: 'swaprows', label: 'Swap Rows', onClick: store.swapRows } - ]; - - const rows = store.ids.map((id) => { - return w(Row, { - id, - key: id, - onSelect: store.select - }); - }); - - return v('div', { key: 'root', classes: [ 'container' ] }, [ - w(Buttons, { buttonConfigs }), - v('table', { classes: [ 'table', 'table-hover', 'table-striped', 'test-data' ] }, [ - v('tbody', rows) - ]), - v('span', { classes: [ 'preloadicon', 'glyphicon', 'glyphicon-remove' ] }) - ]); -}); diff --git a/frameworks/keyed/dojo/src/Button.ts b/frameworks/keyed/dojo/src/Button.ts deleted file mode 100644 index 6f4c875b7..000000000 --- a/frameworks/keyed/dojo/src/Button.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { create, w, v } from '@dojo/framework/core/vdom' - -export interface ButtonProperties { - id: string; - label: string; - onClick: () => void; -} - -const factory = create().properties(); - -export default factory(function Button({ properties }) { - const { id, label, onClick } = properties(); - - return v('div', { classes: [ 'col-sm-6', 'smallpad' ] }, [ - v('button', { - id, - classes: [ 'btn', 'btn-primary', 'btn-block' ], - onclick: onClick - }, [ label ]) - ]); -}); diff --git a/frameworks/keyed/dojo/src/Buttons.ts b/frameworks/keyed/dojo/src/Buttons.ts deleted file mode 100644 index ca9537982..000000000 --- a/frameworks/keyed/dojo/src/Buttons.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { create, w, v } from '@dojo/framework/core/vdom' -import Button from './Button'; - -export interface ButtonConfig { - id: string; - label: string; - onClick: () => void; -} - -export interface ButtonsProperties { - buttonConfigs: ButtonConfig[]; -} - -const factory = create().properties(); - -export default factory(function Buttons({ properties }) { - const { buttonConfigs } = properties(); - return v('div', { classes: [ 'jumbotron' ] }, [ - v('div', { classes: [ 'row' ] }, [ - v('div', { classes: [ 'col-md-6' ] }, [ - v('h1', ['Dojo v6.0.0']) - ]), - v('div', { classes: [ 'col-md-6' ] }, buttonConfigs.map(({ id, label, onClick }) => { - return w(Button, { key: id, id, label, onClick }); - })) - ]) - ]); -}); diff --git a/frameworks/keyed/dojo/src/Row.ts b/frameworks/keyed/dojo/src/Row.ts deleted file mode 100644 index 4090965e2..000000000 --- a/frameworks/keyed/dojo/src/Row.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { create, v } from '@dojo/framework/core/vdom'; -import store from './Store'; - -export interface RowProperties { - id: number; - onSelect: Function; -} - -const factory = create({ store }).properties(); - -export default factory(function Row({ properties, middleware: { store } }) { - const { id, onSelect } = properties(); - const item = store.item; - - if (!item) { - return null; - } - - return v('tr', { - key: id, - classes: [ store.selected === id && 'danger' ] - }, [ - v('td', { classes: [ 'col-md-1' ] }, [ `${id}` ]), - v('td', { classes: [ 'col-md-4' ] }, [ - v('a', { onclick: () => { - onSelect(id); - } }, [ item.label ]) - ]), - v('td', { classes: [ 'col-md-1' ] }, [ - v('a', { onclick: () => { - store.del(); - } }, [ - v('span', { - 'aria-hidden': true, - classes: [ 'glyphicon', 'glyphicon-remove' ] - }) - ]) - ]), - v('td', { classes: [ 'col-md-6' ] }) - ]); -}); diff --git a/frameworks/keyed/dojo/src/Store.ts b/frameworks/keyed/dojo/src/Store.ts deleted file mode 100644 index e66bf078e..000000000 --- a/frameworks/keyed/dojo/src/Store.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { create, invalidator } from '@dojo/framework/core/vdom'; - -function random(max: number) { - return Math.round(Math.random() * 1000) % max; -} - -export interface Item { - id: number; - label: string; -} - -export interface Data { - [index: string]: Item; -} - -const adjectives = [ - 'pretty', - 'large', - 'big', - 'small', - 'tall', - 'short', - 'long', - 'handsome', - 'plain', - 'quaint', - 'clean', - 'elegant', - 'easy', - 'angry', - 'crazy', - 'helpful', - 'mushy', - 'odd', - 'unsightly', - 'adorable', - 'important', - 'inexpensive', - 'cheap', - 'expensive', - 'fancy' -]; - -const colours = [ - 'red', - 'yellow', - 'blue', - 'green', - 'pink', - 'brown', - 'purple', - 'brown', - 'white', - 'black', - 'orange' -]; - -const nouns = [ - 'table', - 'chair', - 'house', - 'bbq', - 'desk', - 'car', - 'pony', - 'cookie', - 'sandwich', - 'burger', - 'pizza', - 'mouse', - 'keyboard' -]; - -const factory = create({ invalidator }); - -let id = 1; -let data: Data = {}; -let ids = new Set(); -let selected: number | undefined; -let invalidatorMap = new Map(); -let appInvalidator: Function; - -function buildData(count: number = 1000): { data: Data; ids: Set } { - const data: Data = {}; - const ids = new Set(); - for (let i = 0; i < count; i++) { - const adjective = adjectives[random(adjectives.length)]; - const colour = colours[random(colours.length)]; - const noun = nouns[random(nouns.length)]; - const label = `${adjective} ${colour} ${noun}`; - data[id] = { id, label }; - ids.add(id); - id = id + 1; - } - return { data, ids }; -} - -export default factory(({ properties, middleware: { invalidator }}) => { - const { key: widgetKey = 'app' } = properties(); - if (widgetKey === 'app') { - appInvalidator = invalidator; - } else { - invalidatorMap.set(widgetKey, invalidator); - } - - function invalidate(id: string | number = 'app') { - if (id === 'app') { - appInvalidator(); - } else if (invalidatorMap.has(id)) { - invalidatorMap.get(id)!(); - } - } - - return { - get ids(): number[] { - return Array.from(ids); - }, - get item(): Item | undefined { - return data[widgetKey]; - }, - get selected(): number | undefined { - return selected; - }, - del: () => { - if (typeof widgetKey === 'number') { - ids.delete(widgetKey); - delete data[widgetKey]; - invalidate(widgetKey); - } - }, - run: () => { - const builtData = buildData(); - ids = builtData.ids; - data = builtData.data; - selected = undefined; - invalidate(); - invalidatorMap.clear(); - }, - add: () => { - const builtData = buildData(); - data = { ...data, ...builtData.data }; - ids = new Set([...ids, ...builtData.ids]); - invalidate(); - }, - update: () => { - const idArray = [ ...ids ]; - for (let i = 0; i < idArray.length; i += 10) { - const itemId = idArray[i]; - const item = data[itemId]; - data[itemId] = { ...item, label: `${item.label} !!!`}; - invalidate(itemId); - } - }, - select: (id: number) => { - selected && invalidate(selected); - invalidate(id); - selected = id; - }, - runLots: () => { - const builtData = buildData(10000); - ids = builtData.ids; - data = builtData.data; - selected = undefined; - invalidate(); - invalidatorMap.clear(); - }, - clear: () => { - data = {}; - ids.clear(); - selected = undefined; - invalidate(); - invalidatorMap.clear(); - }, - swapRows: () => { - const idArray = [ ...ids ]; - if (idArray.length > 998) { - const row = idArray[1]; - idArray[1] = idArray[998]; - idArray[998] = row; - } - ids = new Set(idArray); - invalidate(); - } - } -}); diff --git a/frameworks/keyed/dojo/src/index.html b/frameworks/keyed/dojo/src/index.html deleted file mode 100644 index c5c3f6f91..000000000 --- a/frameworks/keyed/dojo/src/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - dojo-keyed - - - - - diff --git a/frameworks/keyed/dojo/src/main.css b/frameworks/keyed/dojo/src/main.css deleted file mode 100644 index 214e8ff5b..000000000 --- a/frameworks/keyed/dojo/src/main.css +++ /dev/null @@ -1 +0,0 @@ -/* Put your styles and imports here */ diff --git a/frameworks/keyed/dojo/src/main.ts b/frameworks/keyed/dojo/src/main.ts deleted file mode 100644 index 0dd49e5af..000000000 --- a/frameworks/keyed/dojo/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import renderer, { w } from '@dojo/framework/core/vdom'; -import App from './App'; - -const r = renderer(() => w(App, {})); -r.mount(); diff --git a/frameworks/keyed/dojo/tsconfig.json b/frameworks/keyed/dojo/tsconfig.json deleted file mode 100644 index db539e568..000000000 --- a/frameworks/keyed/dojo/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "declaration": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ - "dom", - "es5", - "es2015.promise", - "es2015.iterable", - "es2015.symbol", - "es2015.symbol.wellknown" - ], - "module": "umd", - "moduleResolution": "node", - "noImplicitAny": true, - "noImplicitThis": true, - "outDir": "_build/", - "removeComments": false, - "sourceMap": true, - "strictNullChecks": true, - "target": "es6" - }, - "include": [ - "./src/**/*.ts" - ] -} diff --git a/frameworks/keyed/domc/app.old.js b/frameworks/keyed/domc/app.old.js deleted file mode 100644 index 0bc4db4d4..000000000 --- a/frameworks/keyed/domc/app.old.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";const e=(e,t)=>{const n=`__${t}`;let i=e.target,o=`__${t}Data`;for(;null!==i;){const t=i[n];if(t)return void(i[o]?t(i[o]):t(e));i=i.parentNode}},t={};function n(n){t[n]||(document.addEventListener(n,t=>e(t,n)),t[n]=!0)}function i(){const{possible:e,n:t}=i;let n,o=t.toString(26).split(""),r="";for(;n=o.shift();)r+=e[parseInt(n,26)];return i.n++,r}i.possible="abcdefghijklmnopqrstuvwxyz",i.n=0;const o={};class r{constructor(){this.varCode=this.vdomCode=this.compareCode=this.refsCode=this.directiveSetupCode=this.directiveUpdateCode="",this.scopeVars={},this.component=null}compile(e){let t,n,i,o,r=!1,s="node",d=e;if(!((o=this.codegen(d,s))>0)){s="";do{if(!r&&(t=d.firstChild)){if(3===t.nodeType&&""===t.nodeValue.trim()){t.parentNode.removeChild(t);continue}r=!1,n=s,s+="_f",this.varCode+=`let ${s} = ${n||"node"}.firstChild;\n`,(o=this.codegen(t,s))>0&&(r=!0)}else if(t=d.nextSibling){if(3===t.nodeType&&""===t.nodeValue.trim()){t.parentNode.removeChild(t);continue}r=!1,n=s,s+="_n",this.varCode+=`let ${s} = ${n||"node"}.nextSibling;\n`,(o=this.codegen(t,s))>0&&(r=!0)}else s="n"===s[(i=s.length)-1]?s.slice(0,s.lastIndexOf("_f_n")):s.slice(0,i-2),t=d.parentNode,r=!0;if((d=t)===e)break}while(d)}}codegen(e,t){let r=e.nodeType,s=e.nodeName;if(8===r){const n=e.nodeValue.trim();return"#"===n[0]&&("#"===n[1]?this.directiveSetupCode+=`for(let i = 0; i < scope.${n.slice(2)}.length; i++) ${t}.parentNode.insertBefore(scope.${n.slice(2)}[i], ${t});\n${t}.parentNode.removeChild(${t});\n`:this.directiveSetupCode+=`${t}.parentNode.replaceChild(scope.${n.slice(1)}, ${t});\n`),0}if(3!==r){if(void 0!==e.attributes){let r=[];for(let s of e.attributes){let d=s.name,l=s.value;if("i"===d[0]&&"s"===d[1]){if(e.removeAttribute(d),"node"===t)this.component=o[l](e);else{const e=i();this.directiveSetupCode+=`let __${e} = utils["${l}"](${t})(scope);\n${t}.parentNode.replaceChild(__${e}, ${t});\n`,this.directiveUpdateCode+=` __${e}.update(scope);\n`}return 1}if("v"===d[0]&&"-"===d[1]){e.removeAttribute(d);const n=d.slice(2),o=i();return this.directiveSetupCode+=`let __${o} = utils.${n}(${t}, "${l}");\n`,this.directiveUpdateCode+=` __${o}(scope);\n`,1}if("o"===d[0]&&"n"===d[1]){const e=d.slice(2);n(e);const o=l,s=o.indexOf("(");let c,a;if(s>=0){c=o.slice(0,s);const e=o.slice(s+1,o.length-1);a=e.length>0?e.split(","):[]}else c=o,a=[];if(a.length>0){const n=i();this.refsCode+=`${t}.__${e} = scope.${c};\n`,this.vdomCode+=` vdom.${n} = ${a};\n`,this.compareCode+=` if (current.${n} !== vdom.${n}) ${t}.__${e}Data = vdom.${n};\n`}else this.refsCode+=`${t}.__${e} = scope.${c};\n`;r.push(d);for(let e,t,n=0;n=97&&e<=122&&(t.indexOf(".")>=0?this.scopeVars[t.slice(0,t.indexOf("."))]=!0:this.scopeVars[t]=!0)}else if(l.indexOf("{{")>=0){if("class"===d){const e=i();this.vdomCode+=` vdom.${e} = \`${l.replace(/{{/g,"${").replace(/}}/g,"}")}\`;\n`,this.compareCode+=` if (current.${e} !== vdom.${e}) ${t}.className = vdom.${e};\n`}else if("style"===d){let e=l.replace("{{","").replace("}}","").trim();this.directiveSetupCode+="let __style = node.style;\n",this.directiveUpdateCode+=` let scopeStyle = scope.${e};\n for(let key in scopeStyle) if(scopeStyle[key] !== __style[key]) __style[key] = scopeStyle[key];\n`}else{const e=i();this.vdomCode+=` vdom.${e} = \`${l.replace(/{{/g,"${").replace(/}}/g,"}")}\`;\n`,this.compareCode+=` if (current.${e} !== vdom.${e}) ${t}.setAttribute("${d}", vdom.${e});\n`}let e,n,o;for(;(e=l.indexOf("{{"))>=0;){n=l.indexOf("}}"),o=l.slice(e+2,n).split(/[\s\(\)]/g);for(let e,t,n=0;n=97&&e<=122&&(t.indexOf(".")>=0?this.scopeVars[t.slice(0,t.indexOf("."))]=!0:this.scopeVars[t]=!0);l=l.slice(n+1)}r.push(d)}}for(let t of r)e.removeAttribute(t)}}else{let n=e.nodeValue.trim();if(n.indexOf("{{")>=0){const o=i();let r,s,d;for(this.vdomCode+=` vdom.${o} = \`${n.replace(/{{/g,"${").replace(/}}/g,"}")}\`;\n`,this.compareCode+=` if (current.${o} !== vdom.${o}) ${t}.nodeValue = vdom.${o};\n`,e.nodeValue="";(r=n.indexOf("{{"))>=0;){s=n.indexOf("}}"),d=n.slice(r+2,s).split(/[\s\(\)]/g);for(let e,t,n=0;n=97&&e<=122&&(t.indexOf(".")>=0?this.scopeVars[t.slice(0,t.indexOf("."))]=!0:this.scopeVars[t]=!0);n=n.slice(s+1)}}}if(s.indexOf("-")>0){if("node"===t)this.component=o[s.toLowerCase()](e);else{const e=i();this.directiveSetupCode+=`let __${e} = utils["${s.toLowerCase()}"](${t})(scope);\n${t}.parentNode.replaceChild(__${e}, ${t});\n`,this.directiveUpdateCode+=` __${e}.update(scope);\n`}return 1}return 0}createFn(){if(this.component)return this.component;let e="";for(let t of Object.keys(this.scopeVars))e+=t+",";return Function("scope","node","utils","rehydrate","if (rehydrate !== true) node = node.cloneNode(true);\n"+this.varCode+"\n"+this.refsCode+"\n"+this.directiveSetupCode+"\n"+`let current = {};\nnode.update = function(scope) {\n${this.vdomCode.length>0?` const {${e}} = scope;\n\n const vdom = {};\n${this.vdomCode}\n${this.compareCode}\n current = vdom;\n`:""}\n${this.directiveUpdateCode}}\n`+"return node;")}}class s{constructor(e,t){this.dom=e,this.create=t}createInstance(e){const t=this.create(e,this.dom,o);return t.update(e),t}rehydrate(e){this.create(e,this.dom,o,!0),this.dom.update(e)}}function d(e){const t=new r;t.compile(e);const n=t.createFn();return new s(e,n)}d.customDirectives=o;const l=document.createElement("template");function c(e,t){var n=-1,i=e.length;if(i>0&&e[i-1]<=t)return i-1;for(;i-n>1;){var o=Math.floor((n+i)/2);e[o]>t?i=o:n=o}return n}d.component=function(e,t){let n,i,o;"string"==typeof t?n=t:(n=t.template,i=t.create,o=t.update),l.innerHTML=n.trim();let r=d(l.content.firstChild);d.customDirectives[e]=function(e){let t,n,s=1,d=void 0===i&&void 0===o,l=void 0===e.attributes||0===e.attributes.length,c=null===e.firstChild||1===e.childNodes.length&&3===e.firstChild.nodeType&&""===e.firstChild.nodeValue.trim();if(d&&l&&c&&(s=0),0===s)return Function("cNode","\n return function(scope) { return cNode.createInstance(scope) }\n ")(r);if(!l){let n="const vs = {};\n";for(let t of e.attributes)n+=`vs["${t.name}"] = scope["${t.value}"];\n`;t=Function("scope",n+"return vs;\n")}return c||(n=Array.from(e.childNodes)),e=>{let s,d,l=Object.assign({nodeRender:()=>{o&&Object.assign(l,o(l)),d(l)}},e);return t&&Object.assign(l,t(l)),l.children=n,i&&Object.assign(l,i(l)),l.node=s=r.createInstance(l),d=s.update,s.update=function(e){Object.assign(l,e,l),t&&Object.assign(l,t(l),l),o&&Object.assign(l,o(l)),d(l)},s}}},d.app=function(e){l.innerHTML=e.trim();let t=d(l.content.firstChild);return function(e){let n;return e.render=()=>n.update(e),n=t.createInstance(e)}},o.for=function(e,t="item of data"){const n=e.parentNode;n.textContent="";let i=[];const o=t.indexOf(" of "),r=t.slice(o+4),s=t.slice(0,o),l=d(e);return e=>{const t=Object.assign({},e),o=e[r];!function(e,t,n,i,o){if(0===n.length)return void(e.textContent="");if(0===t.length){let t;for(let o=0,r=n.length;o=0;s=r[s],o--)n[o]=s;return n}(g,a),x=[];let O=h;for(let e=l;e<=u;e++)x[e]=O,O=O.nextSibling;for(let t=0;t=a;t--)_[k]===t?(d=x[g[_[k]]],o(d,n[t]),k--):(-1===g[t]?S=i(n[t]):(S=x[g[t]],o(n[t])),e.insertBefore(S,d),d=S)}(n,i,o,e=>(t[s]=e,l.createInstance(t)),(e,n)=>{t[s]=n,e.update(t)}),i=o.slice(0)}};var a=1,f=function(e){for(var t=["pretty","large","big","small","tall","short","long","handsome","plain","quaint","clean","elegant","easy","angry","crazy","helpful","mushy","odd","unsightly","adorable","important","inexpensive","cheap","expensive","fancy"],n=["red","yellow","blue","green","pink","brown","purple","brown","white","black","orange"],i=["table","chair","house","bbq","desk","car","pony","cookie","sandwich","burger","pizza","mouse","keyboard"],o=[],r=0;r998){var t=e[1];e[1]=e[998],e[998]=t}h.update(p)},del:function(e){var t=e.id,n=p.data,i=n.findIndex(function(e){return e.id===t});n.splice(i,1),h.update(p)},select:function(e){p.selected=parseInt(e.id),h.update(p)},selected:0,data:[]},h=document.getElementById("main");d(h).rehydrate(p)}(); -//# sourceMappingURL=app.min.js.map diff --git a/frameworks/keyed/domc/index.html b/frameworks/keyed/domc/index.html deleted file mode 100644 index a243d772b..000000000 --- a/frameworks/keyed/domc/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - domc-keyed - - - - -
-
-
-
-

domc-keyed

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - - - - - - - -
{{item.id}} - {{item.label}} -
- - -
- - diff --git a/frameworks/keyed/domc/package.json b/frameworks/keyed/domc/package.json deleted file mode 100644 index d07ca07ec..000000000 --- a/frameworks/keyed/domc/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "js-framework-benchmark-domc", - "version": "1.0.0", - "description": "domc demo", - "main": "dist/app.min.js", - "scripts": { - "build-dev": "rollup -c -w", - "build-prod": "rollup -c" - }, - "js-framework-benchmark": { - "frameworkVersionFromPackage": "domc" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/krausest/js-framework-benchmark.git" - }, - "keywords": [ - "domc" - ], - "author": "Pavel Martynov", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/krausest/js-framework-benchmark/issues" - }, - "homepage": "https://github.com/krausest/js-framework-benchmark#readme", - "dependencies": { - "domc": "0.0.12" - }, - "devDependencies": { - "@babel/core": "7.4.5", - "@babel/plugin-external-helpers": "7.2.0", - "@babel/preset-env": "7.4.5", - "rollup": "1.16.6", - "rollup-plugin-babel": "4.3.3", - "rollup-plugin-node-resolve": "5.2.0", - "rollup-plugin-terser": "5.1.1", - "rollup-plugin-uglify": "6.0.2", - "uglify-es": "3.3.9" - } -} diff --git a/frameworks/keyed/domc/rollup.config.js b/frameworks/keyed/domc/rollup.config.js deleted file mode 100644 index 6de3665af..000000000 --- a/frameworks/keyed/domc/rollup.config.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -import * as path from 'path'; -import babel from 'rollup-plugin-babel'; -import resolve from 'rollup-plugin-node-resolve'; -import { terser } from "rollup-plugin-terser"; - -export default { - input: 'src/app.js', - output: { - file: 'dist/app.min.js', - format: 'iife', - name: 'app', - sourcemap: true, - }, - plugins: [ - resolve({ - module: true, - jsnext: true, - browser: true, - }), - babel({ - exclude: 'node_modules/**', - presets: [ - [ "@babel/preset-env", { - "targets": { - "browsers": ["last 1 chrome versions"] - } - }] - ], - plugins: [ - "@babel/plugin-external-helpers" - ], - runtimeHelpers: true, - babelrc: false, - }), - terser() - ], -} diff --git a/frameworks/keyed/domc/src/app.js b/frameworks/keyed/domc/src/app.js deleted file mode 100644 index 8e6ef0d6e..000000000 --- a/frameworks/keyed/domc/src/app.js +++ /dev/null @@ -1,74 +0,0 @@ - -import domc from 'domc' -import '../node_modules/domc/vFor.js' - -let did = 1 -const buildData = (count) => { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) { - data.push({ - id: did++, - label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] - }); - } - return data; -} -const _random = (max) => { - return Math.round(Math.random() * 1000) % max; -} - -const scope = { - add: () => { - scope.data = scope.data.concat(buildData(1000)) - main.update(scope) - }, - run: () => { - scope.data = buildData(1000) - main.update(scope) - }, - runLots: () => { - scope.data = buildData(10000) - main.update(scope) - }, - clearData: () => { - scope.data = [] - main.update(scope) - }, - update: () => { - const data = scope.data - for (let i=0;i { - const data = scope.data - if(data.length > 998) { - var tmp = data[1]; - data[1] = data[998]; - data[998] = tmp; - } - - main.update(scope) - }, - del: item => { - const id = item.id - const data = scope.data - const idx = data.findIndex(d => d.id === id); - data.splice(idx, 1) - main.update(scope) - }, - select: item => { - scope.selected = parseInt(item.id) - main.update(scope) - }, - selected: 0, - data: [], -} - -const main = document.getElementById('main') -const app = domc(main) -app.rehydrate(scope) diff --git a/frameworks/keyed/domdiff/index.html b/frameworks/keyed/domdiff/index.html deleted file mode 100644 index be1529c7b..000000000 --- a/frameworks/keyed/domdiff/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - domdiff keyed - - - - -
-
-
-
-

domdiff keyed

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - -
- -
- - diff --git a/frameworks/keyed/domdiff/package.json b/frameworks/keyed/domdiff/package.json deleted file mode 100644 index af0480fb7..000000000 --- a/frameworks/keyed/domdiff/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "js-framework-benchmark-domdiff", - "version": "1.0.0", - "description": "domdiff demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "domdiff" - }, - "scripts": { - "build-dev": "rollup -c -w", - "build-prod": "rollup -c" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/krausest/js-framework-benchmark.git" - }, - "keywords": [ - "domdiff" - ], - "author": "Mathis Zeiher", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/krausest/js-framework-benchmark/issues" - }, - "homepage": "https://github.com/krausest/js-framework-benchmark#readme", - "dependencies": { - "domdiff": "2.2.2", - "js-framework-benchmark-utils": "0.2.5" - }, - "devDependencies": { - "rollup": "^2.0.6", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-terser": "^5.3.0" - } -} diff --git a/frameworks/keyed/domdiff/rollup.config.js b/frameworks/keyed/domdiff/rollup.config.js deleted file mode 100644 index e785c4ad9..000000000 --- a/frameworks/keyed/domdiff/rollup.config.js +++ /dev/null @@ -1,17 +0,0 @@ -import resolve from 'rollup-plugin-node-resolve'; -import {terser} from 'rollup-plugin-terser'; - -export default { - input: 'src/index.js', - plugins: [ - resolve(), - terser() - ], - context: 'null', - moduleContext: 'null', - output: { - file: 'dist/index.js', - format: 'iife', - name: 'app' - } -}; diff --git a/frameworks/keyed/domdiff/src/index.js b/frameworks/keyed/domdiff/src/index.js deleted file mode 100644 index 2d33ffcb7..000000000 --- a/frameworks/keyed/domdiff/src/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import domdiff from 'domdiff'; -import {State} from 'js-framework-benchmark-utils'; -import {getRow} from './utils.js'; - -const tbody = document.querySelector('tbody'); -let rows = [].slice.call(tbody.children); -const state = State(({data, selected, select, remove}) => { - rows = domdiff( - tbody, - rows, - data.map(item => { - const {id, label} = item; - const info = getRow(data, select, remove, id, label); - const {row, selector, td} = info; - if (info.id !== id) - td.textContent = (row.id = (info.id = id)); - if (info.label !== label) - selector.textContent = (info.label = label); - const danger = id === selected; - if (info.danger !== danger) - row.classList.toggle('danger', (info.danger = danger)); - return row; - }) - ); -}); - -Object.keys(state).forEach(id => { - const button = document.querySelector(`#${id.toLowerCase()}`); - if (button) - button.addEventListener('click', () => state[id]()); -}); diff --git a/frameworks/keyed/domdiff/src/utils.js b/frameworks/keyed/domdiff/src/utils.js deleted file mode 100644 index 43fe3a402..000000000 --- a/frameworks/keyed/domdiff/src/utils.js +++ /dev/null @@ -1,39 +0,0 @@ -const template = document.createElement('template'); -template.innerHTML = ` - - - - - - - - -`.trim(); -const tr = template.content.firstChild; - -const createRow = (select, remove, id, label) => { - const row = tr.cloneNode(true); - const td = row.querySelector('td'); - td.textContent = (row.id = id); - - const [selector, remover] = row.querySelectorAll('a'); - selector.textContent = label; - selector.addEventListener('click', () => select(id)); - remover.addEventListener('click', () => remove(id)); - - return {danger: false, id, label, row, selector, td}; -}; - -const {create} = Object; -const rows = new WeakMap; - -const setCache = data => { - const cache = create(null); - rows.set(data, cache); - return cache; -}; - -export const getRow = (data, select, remove, id, label) => { - const cache = rows.get(data) || setCache(data); - return cache[id] || (cache[id] = createRow(select, remove, id, label)); -}; diff --git a/frameworks/keyed/dominator/.gitignore b/frameworks/keyed/dominator/.gitignore deleted file mode 100644 index 047278d56..000000000 --- a/frameworks/keyed/dominator/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -/target -/pkg -/wasm-pack.log -/yarn-error.log diff --git a/frameworks/keyed/dominator/Cargo.toml b/frameworks/keyed/dominator/Cargo.toml deleted file mode 100644 index e260c680c..000000000 --- a/frameworks/keyed/dominator/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "js-framework-benchmark-dominator" -version = "1.0.0" -edition = "2018" - -[profile.release] -lto = true -panic = "abort" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -dominator = "0.5.0" -futures-signals = "0.3.6" -wasm-bindgen = "0.2.46" -js-sys = "0.3.23" - -[dependencies.web-sys] -version = "0.3.23" -features = [ - "Window", - "Document", - "Element", -] - -[dependencies.wasm-bindgen-futures] -version = "0.3.24" -features = ["futures_0_3"] diff --git a/frameworks/keyed/dominator/README.md b/frameworks/keyed/dominator/README.md deleted file mode 100644 index 059eac9cc..000000000 --- a/frameworks/keyed/dominator/README.md +++ /dev/null @@ -1,16 +0,0 @@ -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: - -``` -rustup toolchain install nightly -rustup override set nightly -npm install -npm run build-prod-force -``` diff --git a/frameworks/keyed/dominator/bundled-dist/1.js b/frameworks/keyed/dominator/bundled-dist/1.js deleted file mode 100644 index 41f74e726..000000000 --- a/frameworks/keyed/dominator/bundled-dist/1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[,function(n,t,e){"use strict";e.r(t);var r=e(2);function c(){return r.d()}e.d(t,"main_js",function(){return c}),e.d(t,"__wbindgen_object_clone_ref",function(){return w}),e.d(t,"__wbindgen_object_drop_ref",function(){return g}),e.d(t,"__wbindgen_cb_forget",function(){return h}),e.d(t,"__wbindgen_cb_drop",function(){return v}),e.d(t,"__wbg_removeevent_c1c53d84f99418b3",function(){return p}),e.d(t,"__wbg_addclass_98f6d75340c883ab",function(){return m}),e.d(t,"__wbg_appendchild_66446c0dfd404e41",function(){return y}),e.d(t,"__wbg_createelement_362b6383204303eb",function(){return E}),e.d(t,"__widl_instanceof_HTMLElement",function(){return L}),e.d(t,"__wbg_random_4eec15c1337c828c",function(){return x}),e.d(t,"__wbindgen_string_new",function(){return j}),e.d(t,"__wbg_settextcontent_41d94df0242539e0",function(){return C}),e.d(t,"__wbg_addevent_c565d8397d798f9b",function(){return M}),e.d(t,"__wbg_setattribute_38575b25fc9198f7",function(){return k}),e.d(t,"__wbg_newnoargs_8d1797b163dbc9fb",function(){return A}),e.d(t,"__wbg_call_836fa928f74337e5",function(){return T}),e.d(t,"__widl_instanceof_Window",function(){return W}),e.d(t,"__widl_f_document_Window",function(){return B}),e.d(t,"__widl_f_get_element_by_id_Document",function(){return D}),e.d(t,"__wbg_resolve_3e3c14963c939fcd",function(){return H}),e.d(t,"__wbg_then_1469c8cdb2c56f2f",function(){return J}),e.d(t,"__wbindgen_throw",function(){return F}),e.d(t,"__wbg_removeclass_d627271f8d4311f5",function(){return I}),e.d(t,"__wbg_getat_93cbb0856a23a2bc",function(){return N}),e.d(t,"__wbg_insertchildbefore_88866440aac35d8f",function(){return P}),e.d(t,"__wbg_removechild_b47675f15e0460fd",function(){return U}),e.d(t,"__wbg_replacechild_c03cdfc26975e8db",function(){return q}),e.d(t,"__wbindgen_closure_wrapper92",function(){return z}),e.d(t,"__wbindgen_closure_wrapper120",function(){return G});const u=new Array(32);function i(n){return u[n]}u.fill(void 0),u.push(void 0,null,!0,!1);let o=u.length;function _(n){o===u.length&&u.push(u.length+1);const t=o;return o=u[t],u[t]=n,t}function f(n){const t=i(n);return function(n){n<36||(u[n]=o,o=n)}(n),t}let d=new TextDecoder("utf-8"),a=null;function s(n,t){return d.decode((null!==a&&a.buffer===r.e.buffer||(a=new Uint8Array(r.e.buffer)),a).subarray(n,n+t))}function l(n){return null==n}let b=32;const w=function(n){return _(i(n))},g=function(n){f(n)},h=function(n){f(n)},v=function(n){const t=f(n).original;return 1==t.cnt--&&(t.a=0,!0)},p=function(n,t,e){var r,c,u;r=i(n),c=i(t),u=i(e),r.removeEventListener(c,u,!1)},m=function(n,t){var e,r;e=i(n),r=i(t),e.classList.add(r)},y=function(n,t){var e,r;e=i(n),r=i(t),e.appendChild(r)},E=function(n){return _((t=i(n),document.createElement(t)));var t},L=function(n){return i(n)instanceof HTMLElement},x=void 0===Math.random?function(){throw new Error("imported function or type does not exist")}:Math.random,j=function(n,t){return _(s(n,t))},C=function(n,t){var e,r;e=i(n),r=i(t),e.textContent=r},M=function(n,t,e){var r,c,u;r=i(n),c=i(t),u=i(e),r.addEventListener(c,u,{capture:!1,once:!1,passive:!0})},k=function(n,t,e){var r,c,u;r=i(n),c=i(t),u=i(e),r.setAttribute(c,u)},A=function(n,t){let e=s(n,t);return _(new Function(e))},T=function(n,t){try{return _(i(n).call(i(t)))}catch(n){!function(n){r.b(_(n))}(n)}},W=function(n){return i(n)instanceof Window},B=function(n){const t=i(n).document;return l(t)?0:_(t)},D=function(n,t,e){let r=s(t,e);const c=i(n).getElementById(r);return l(c)?0:_(c)},H=function(n){return _(Promise.resolve(i(n)))},J=function(n,t){return _(i(n).then(i(t)))},F=function(n,t){let e=s(n,t);throw new Error(e)},I=function(n,t){var e,r;e=i(n),r=i(t),e.classList.remove(r)},N=function(n,t){return _((e=i(n),r=t>>>0,e.childNodes[r]));var e,r},P=function(n,t,e){var r,c,u;r=i(n),c=i(t),u=i(e),r.insertBefore(c,u)},U=function(n,t){var e,r;e=i(n),r=i(t),e.removeChild(r)},q=function(n,t,e){var r,c,u;r=i(n),c=i(t),u=i(e),r.replaceChild(c,u)},z=function(n,t,e){const c=r.a.get(31),i=r.a.get(16),o=t,f=function(n){this.cnt++;let t=this.a;this.a=0;try{return c(t,o,function(n){if(1==b)throw new Error("out of js stack");return u[--b]=n,b}(n))}finally{0==--this.cnt?i(t,o):this.a=t,u[b++]=void 0}};f.a=n,f.cnt=1;let d=f.bind(f);return d.original=f,_(d)},G=function(n,t,e){const c=r.a.get(15),u=r.a.get(16),i=t,o=function(n){this.cnt++;let t=this.a;this.a=0;try{return c(t,i,_(n))}finally{0==--this.cnt?u(t,i):this.a=t}};o.a=n,o.cnt=1;let f=o.bind(o);return f.original=o,_(f)};r.c()},function(n,t,e){"use strict";var r=e.w[n.i];n.exports=r;e(1);r.f()}]]); \ No newline at end of file diff --git a/frameworks/keyed/dominator/bundled-dist/accca9b65c226d0a493c.module.wasm b/frameworks/keyed/dominator/bundled-dist/accca9b65c226d0a493c.module.wasm deleted file mode 100644 index 6164f5cd92f3fcd1f0b7835eb02335128a652829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128085 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 IoO2ibFQpts`2YX_ diff --git a/frameworks/keyed/dominator/bundled-dist/index.js b/frameworks/keyed/dominator/bundled-dist/index.js deleted file mode 100644 index 46e8102a1..000000000 --- a/frameworks/keyed/dominator/bundled-dist/index.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){function n(n){for(var t,_,o=n[0],c=n[1],i=0,u=[];i - - - - Dominator - - - -
- - - diff --git a/frameworks/keyed/dominator/js/index.js b/frameworks/keyed/dominator/js/index.js deleted file mode 100644 index 9db81ab6f..000000000 --- a/frameworks/keyed/dominator/js/index.js +++ /dev/null @@ -1 +0,0 @@ -import("../pkg/index.js").catch(console.error); diff --git a/frameworks/keyed/dominator/package.json b/frameworks/keyed/dominator/package.json deleted file mode 100644 index 329079ea3..000000000 --- a/frameworks/keyed/dominator/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "js-framework-benchmark-dominator", - "version": "1.0.0", - "description": "Benchmark for dominator", - "license": "ISC", - "js-framework-benchmark": { - "frameworkVersion": "0.5.0" - }, - "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-prod-force": "rimraf bundled-dist pkg && webpack" - }, - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "@wasm-tool/wasm-pack-plugin": "^0.4.2", - "rimraf": "^2.6.3", - "webpack": "^4.35.0", - "webpack-cli": "^3.3.5" - } -} diff --git a/frameworks/keyed/dominator/src/lib.rs b/frameworks/keyed/dominator/src/lib.rs deleted file mode 100644 index 8740f782e..000000000 --- a/frameworks/keyed/dominator/src/lib.rs +++ /dev/null @@ -1,291 +0,0 @@ -use wasm_bindgen::prelude::*; -use std::rc::Rc; -use std::sync::atomic::{AtomicUsize, Ordering}; -use js_sys::Math; -use web_sys::window; -use futures_signals::signal::Mutable; -use futures_signals::signal_vec::{MutableVec, SignalVecExt}; -use dominator::{Dom, html, clone, events}; - - -const ADJECTIVES_LEN: usize = 25; -const ADJECTIVES_LEN_F64: f64 = ADJECTIVES_LEN as f64; -const ADJECTIVES: [&str; ADJECTIVES_LEN] = [ - "pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", - "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", - "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy", -]; - -const COLOURS_LEN: usize = 11; -const COLOURS_LEN_F64: f64 = COLOURS_LEN as f64; -const COLOURS: [&str; COLOURS_LEN] = [ - "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", - "orange", -]; - -const NOUNS_LEN: usize = 13; -const NOUNS_LEN_F64: f64 = NOUNS_LEN as f64; -const NOUNS: [&str; NOUNS_LEN] = [ - "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", - "pizza", "mouse", "keyboard", -]; - -fn random(max: f64) -> usize { - ((Math::random() * 1000.0) % max) as usize -} - - -#[inline] -fn col_md_6(children: &mut [Dom]) -> Dom { - html!("div", { - .class("col-md-6") - .children(children) - }) -} - -#[inline] -fn row(children: &mut [Dom]) -> Dom { - html!("div", { - .class("row") - .children(children) - }) -} - -#[inline] -fn button(id: &str, title: &str, mut on_click: F) -> Dom where F: FnMut() + 'static { - html!("div", { - .class(["col-sm-6", "smallpad"]) - .children(&mut [ - html!("button", { - .class(["btn", "btn-primary", "btn-block"]) - .attribute("type", "button") - .attribute("id", id) - .text(title) - .event(move |_: events::Click| { - on_click(); - }) - }), - ]) - }) -} - - -struct Row { - id: usize, - label: Mutable, -} - -impl Row { - fn new() -> Rc { - static ID_COUNTER: AtomicUsize = AtomicUsize::new(1); - - let adjective = ADJECTIVES[random(ADJECTIVES_LEN_F64)]; - let colour = COLOURS[random(COLOURS_LEN_F64)]; - let noun = NOUNS[random(NOUNS_LEN_F64)]; - - Rc::new(Self { - id: ID_COUNTER.fetch_add(1, Ordering::SeqCst), - label: Mutable::new(format!("{} {} {}", adjective, colour, noun)), - }) - } - - fn render(row: Rc, state: Rc) -> Dom { - let id = row.id; - - html!("tr", { - .class_signal("danger", state.selected_row.signal_ref(move |selected| { - if let Some(selected) = selected { - *selected == id - - } else { - false - } - })) - - .children(&mut [ - html!("td", { - .class("col-md-1") - .text(&id.to_string()) - }), - - html!("td", { - .class("col-md-4") - .children(&mut [ - html!("a", { - .text_signal(row.label.signal_cloned()) - .event(clone!(state => move |_: events::Click| { - state.select_row(id); - })) - }), - ]) - }), - - html!("td", { - .class("col-md-1") - .children(&mut [ - html!("a", { - .children(&mut [ - html!("span", { - .class(["glyphicon", "glyphicon-remove"]) - .attribute("aria-hidden", "true") - }), - ]) - .event(move |_: events::Click| { - state.remove_row(id); - }) - }), - ]) - }), - - html!("td", { - .class("col-md-6") - }), - ]) - }) - } -} - - -struct State { - rows: MutableVec>, - selected_row: Mutable>, -} - -impl State { - fn new() -> Rc { - Rc::new(Self { - rows: MutableVec::new(), - selected_row: Mutable::new(None), - }) - } - - fn clear(&self) { - self.rows.lock_mut().clear(); - self.selected_row.set(None); - } - - fn append(&self, count: usize) { - let mut rows = self.rows.lock_mut(); - - for _ in 0..count { - rows.push_cloned(Row::new()); - } - } - - fn create(&self, count: usize) { - let new_rows = (0..count).map(|_| Row::new()).collect(); - self.rows.lock_mut().replace_cloned(new_rows); - } - - fn update(&self) { - for row in self.rows.lock_ref().iter().step_by(10) { - row.label.lock_mut().push_str(" !!!"); - } - } - - fn swap(&self) { - let mut rows = self.rows.lock_mut(); - - if rows.len() > 998 { - rows.move_from_to(1, 998); - rows.move_from_to(998 - 1, 1); - } - } - - fn select_row(&self, row_id: usize) { - self.selected_row.set(Some(row_id)); - } - - fn remove_row(&self, row_id: usize) { - self.rows.lock_mut().retain(|row| { - row.id != row_id - }); - } - - fn render_jumbotron(state: Rc) -> Dom { - html!("div", { - .class("jumbotron") - .children(&mut [ - row(&mut [ - col_md_6(&mut [ - html!("h1", { - .text("Dominator keyed") - }), - ]), - - col_md_6(&mut [ - row(&mut [ - button("run", "Create 1,000 rows", clone!(state => move || { - state.create(1_000); - })), - - button("runlots", "Create 10,000 rows", clone!(state => move || { - state.create(10_000); - })), - - button("add", "Append 1,000 rows", clone!(state => move || { - state.append(1_000); - })), - - button("update", "Update every 10th row", clone!(state => move || { - state.update(); - })), - - button("clear", "Clear", clone!(state => move || { - state.clear(); - })), - - button("swaprows", "Swap Rows", move || { - state.swap(); - }), - ]), - ]), - ]), - ]) - }) - } - - fn render_table(state: Rc) -> Dom { - html!("table", { - .class(["table", "table-hover", "table-striped", "test-data"]) - .children(&mut [ - html!("tbody", { - .children_signal_vec(state.rows.signal_vec_cloned().map(move |row| { - Row::render(row, state.clone()) - })) - }) - ]) - }) - } - - fn render(state: Rc) -> Dom { - html!("div", { - .class("container") - .children(&mut [ - State::render_jumbotron(state.clone()), - - State::render_table(state), - - html!("span", { - .class(["preloadicon", "glyphicon", "glyphicon-remove"]) - .attribute("aria-hidden", "true") - }), - ]) - }) - } -} - - -#[wasm_bindgen(start)] -pub fn main_js() { - let state = State::new(); - - let element = window() - .unwrap_throw() - .document() - .unwrap_throw() - .get_element_by_id("main") - .unwrap_throw(); - - dominator::append_dom(&element, State::render(state)); -} diff --git a/frameworks/keyed/dominator/webpack.config.js b/frameworks/keyed/dominator/webpack.config.js deleted file mode 100644 index 071e0846a..000000000 --- a/frameworks/keyed/dominator/webpack.config.js +++ /dev/null @@ -1,23 +0,0 @@ -const path = require("path"); -const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); - -const dist = path.resolve(__dirname, "bundled-dist"); - -module.exports = { - mode: "production", - stats: "errors-warnings", - entry: { - index: "./js/index.js" - }, - output: { - path: dist, - publicPath: "bundled-dist/", - filename: "[name].js" - }, - plugins: [ - new WasmPackPlugin({ - crateDirectory: __dirname, - extraArgs: "--out-name index" - }) - ] -}; diff --git a/frameworks/keyed/domvm/build.js b/frameworks/keyed/domvm/build.js deleted file mode 100644 index 3ab821fac..000000000 --- a/frameworks/keyed/domvm/build.js +++ /dev/null @@ -1,80 +0,0 @@ -const rollup = require('rollup').rollup; -const buble = require('rollup-plugin-buble'); -const terser = require('terser'); -const fs = require('fs'); - -rollup({ - input: 'src/main.es6.js', - plugins: [ - buble() - ] -}).then(bundle => { - return bundle.write({ - file: 'dist/bundle.js', - format: 'iife' - }) -}).then(() => { - // from docs (https://github.com/mishoo/UglifyJS2) - const compressDefaults = { - arguments: true, - booleans: true, - collapse_vars: true, - comparisons: true, - conditionals: true, - dead_code: true, - directives: true, - drop_console: false, - drop_debugger: true, - evaluate: true, - expression: false, - global_defs: {}, - hoist_funs: false, - hoist_props: true, - hoist_vars: false, - if_return: true, - inline: 3, - join_vars: true, - keep_fargs: true, - keep_fnames: false, - keep_infinity: false, - loops: true, - negate_iife: true, - passes: 1, - properties: true, - pure_funcs: null, - pure_getters: "strict", - reduce_funcs: true, - reduce_vars: true, - sequences: true, - side_effects: true, - switches: true, - toplevel: false, - top_retain: null, - typeofs: true, - unsafe: false, - unsafe_comps: false, - unsafe_Function: false, - unsafe_math: false, - unsafe_proto: false, - unsafe_regexp: false, - unsafe_undefined: false, - unused: true, - }; - - const opts = { - compress: Object.assign({}, compressDefaults, { - booleans: false, - inline: 0, - keep_fargs: false, - hoist_props: false, - loops: false, - reduce_funcs: false, - unsafe: true, - unsafe_math: true, - }), - }; - - const compiled = terser.minify(fs.readFileSync('dist/bundle.js', 'utf8'), opts).code; - - fs.writeFileSync('dist/bundle.min.js', compiled, 'utf8'); -}).catch(err => console.log(err.stack)); \ No newline at end of file diff --git a/frameworks/keyed/domvm/index.html b/frameworks/keyed/domvm/index.html deleted file mode 100644 index c5bb8b257..000000000 --- a/frameworks/keyed/domvm/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - domvm (keyed) - - - - - - diff --git a/frameworks/keyed/domvm/package.json b/frameworks/keyed/domvm/package.json deleted file mode 100644 index fab081909..000000000 --- a/frameworks/keyed/domvm/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "js-framework-benchmark-domvm-keyed", - "version": "3.4.12-keyed", - "description": "Benchmark for domvm framework (keyed)", - "js-framework-benchmark": { - "frameworkVersion": "3.4.12" - }, - "scripts": { - "build-dev": "node build.js", - "build-prod": "node build.js" - }, - "devDependencies": { - "rollup": "1.16.3", - "rollup-plugin-buble": "0.19.6", - "terser": "4.0.1" - }, - "dependencies": { - "domvm": "git://github.com/domvm/domvm.git#3.4.12" - } -} diff --git a/frameworks/keyed/domvm/src/main.es6.js b/frameworks/keyed/domvm/src/main.es6.js deleted file mode 100644 index 4eb1c53c7..000000000 --- a/frameworks/keyed/domvm/src/main.es6.js +++ /dev/null @@ -1,101 +0,0 @@ -import { - createView, - defineElement, - FIXED_BODY, - list, -} from '../node_modules/domvm/dist/pico/domvm.pico.es.js'; - -import { Store } from './store.es6'; - -// el for static dom structures -const el = (tag, arg1, arg2) => defineElement(tag, arg1, arg2, FIXED_BODY); - -const store = new Store(); - -// for hygenic event handlers -store.exec = (name, id) => { - store[name](id); - vm.redraw(); -}; - -const vm = createView(AppView, store).mount(document.body); - -function AppView(vm, store) { - return _ => ( - el("div", {id: "main"}, [ - el("div", {class: "container"}, [ - JumbotronTpl(store), - TableTpl(store), - el("span", {class: "preloadicon glyphicon glyphicon-remove", "aria-hidden": "true"}) - ]) - ]) - ); -} - -function JumbotronTpl(store) { - return ( - el("div", {class: "jumbotron"}, [ - el("div", {class: "row"}, [ - el("div", {class: "col-md-6"}, [ - el("h1", "domvm (keyed)") - ]), - el("div", {class: "col-md-6"}, [ - el("div", {class: "row"}, [ - ButtonTpl(store, "run", "Create 1,000 rows"), - ButtonTpl(store, "runLots", "Create 10,000 rows"), - ButtonTpl(store, "add", "Append 1,000 rows"), - ButtonTpl(store, "update", "Update every 10th row"), - ButtonTpl(store, "clear", "Clear"), - ButtonTpl(store, "swapRows", "Swap Rows"), - ]) - ]) - ]) - ]) - ); -} - -function ButtonTpl(store, action, text) { - return ( - el("div", {class: "col-sm-6 smallpad"}, [ - el("button", { - class: "btn btn-primary btn-block", - id: action.toLowerCase(), - type: "button", - onclick: [store.exec, action], - }, text) - ]) - ); -} - -function TableTpl(store) { - const key = item => item.id; - const diff = { - val: (item) => item.label + (item.id === store.selected), - eq: (o, n) => o === n, - }; - - return ( - el("table", {class: "table table-hover table-striped test-data"}, [ - el("tbody", list(store.data, diff, key).map(item => - RowTpl(item, store, key(item)) - )) - ]) - ); -} - -function RowTpl(item, store, key) { - return ( - el("tr", {class: item.id === store.selected ? 'danger' : null}, [ - el("td", {class: "col-md-1"}, item.id), - el("td", {class: "col-md-4"}, [ - el("a", {onclick: [store.exec, "select", item.id]}, item.label) - ]), - el("td", {class: "col-md-1"}, [ - el("a", {onclick: [store.exec, "delete", item.id]}, [ - el("span", {class: "glyphicon glyphicon-remove", "aria-hidden": "true"}) - ]) - ]), - el("td", {class: "col-md-6"}) - ]).k(key) - ); -} \ No newline at end of file diff --git a/frameworks/keyed/domvm/src/store.es6.js b/frameworks/keyed/domvm/src/store.es6.js deleted file mode 100644 index 59d6f99be..000000000 --- a/frameworks/keyed/domvm/src/store.es6.js +++ /dev/null @@ -1,86 +0,0 @@ -function _random(max) { - return Math.round(Math.random()*1000)%max; -} - -export function Store() { - this.data = []; - this.backup = null; - this.selected = null; - this.id = 1; -} - -Store.prototype = { - constructor: Store, - - buildData: function(count) { - count = count || 1000; - - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }); - return data; - }, - - updateData: function(mod) { - mod = mod || 10; - - for (let i=0;i d.id==id); - this.data = this.data.filter((e,i) => i!=idx); - return this; - }, - - run: function() { - this.data = this.buildData(); - this.selected = null; - }, - - add: function() { - this.data = this.data.concat(this.buildData(1000)); - }, - - update: function() { - this.updateData(); - }, - - select: function(id) { - this.selected = id; - }, - - hideAll: function() { - this.backup = this.data; - this.data = []; - }, - - showAll: function() { - this.data = this.backup; - this.backup = null; - }, - - runLots: function() { - this.data = this.buildData(10000); - this.selected = null; - }, - - clear: function() { - this.data = []; - this.selected = null; - }, - - swapRows: function() { - if(this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - }, -}; \ No newline at end of file diff --git a/frameworks/keyed/doz/index.html b/frameworks/keyed/doz/index.html deleted file mode 100644 index 2ad96158b..000000000 --- a/frameworks/keyed/doz/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - -Doz - -
- diff --git a/frameworks/keyed/doz/package.json b/frameworks/keyed/doz/package.json deleted file mode 100644 index 9e9b1fbcb..000000000 --- a/frameworks/keyed/doz/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "js-framework-benchmark-doz", - "version": "1.0.0", - "description": "Doz demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "doz" - }, - "scripts": { - "build-dev": "webpack --watch --mode=development", - "build-prod": "webpack --mode=production" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/krausest/js-framework-benchmark.git" - }, - "keywords": [ - "doz" - ], - "author": "Fabio Ricali", - "license": "MIT", - "bugs": { - "url": "https://github.com/krausest/js-framework-benchmark/issues" - }, - "homepage": "https://github.com/krausest/js-framework-benchmark#readme", - "dependencies": { - "doz": "2.4.7" - }, - "devDependencies": { - "webpack": "4.41.4", - "webpack-cli": "3.3.10" - } -} diff --git a/frameworks/keyed/doz/src/index.js b/frameworks/keyed/doz/src/index.js deleted file mode 100644 index 7aa054808..000000000 --- a/frameworks/keyed/doz/src/index.js +++ /dev/null @@ -1,142 +0,0 @@ -import Doz from 'doz' - -const adjectives = [ - 'pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', 'cheap', 'expensive', 'fancy']; -const colours = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; -const nouns = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; - -let did = 1; -let selected = -1; - -const actions = { - add() { - this.getStore('records').data = this.getStore('records').data.concat(buildData(1000)); - }, - - run() { - this.getStore('records').data = buildData(1000); - }, - - runLots() { - this.getStore('records').data = buildData(10000); - }, - - clear() { - this.getStore('records').data = []; - }, - - del(id) { - const data = this.getStore('records').data; - const idx = data.findIndex(d => d.id === id); - data.splice(idx, 1); - }, - - select(id) { - const data = this.getStore('records').data; - if (selected > -1) { - data[selected].selected = false; - } - selected = data.findIndex(d => d.id === id); - data[selected].selected = true; - }, - - swapRows() { - this.mainComponent.prepareCommit(); - const data = this.getStore('records').data; - if (data.length > 998) { - const tmp = data[1]; - data[1] = data[998]; - data[998] = tmp; - } - this.mainComponent.commit(); - }, - - update() { - this.mainComponent.prepareCommit(); - const data = this.getStore('records').data; - for (let i = 0; i < data.length; i += 10) { - data[i].label += ' !!!'; - } - this.mainComponent.commit(); - } -}; - -const buildData = count => { - const data = []; - for (let i = 0; i < count; i++) { - data.push({ - id: did++, - label: `${adjectives[_random(adjectives.length)]} ${colours[_random(colours.length)]} ${nouns[_random(nouns.length)]}`, - selected: false, - }); - } - return data; -}; - -const _random = max => { - return Math.round(Math.random() * 1000) % max; -}; - -new Doz({ - store: 'records', - actions, - root: '#container', - props: { - data: [] - }, - template(h) { - return h` -
-
-
-
-

Doz

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - ${this.props.data.map( - item => h` - - - - - - ` - )} - -
${item.id} - ${item.label} - - - - -
- -
-` - }, -}); \ No newline at end of file diff --git a/frameworks/keyed/dyo/.babelrc b/frameworks/keyed/dyo/.babelrc deleted file mode 100755 index 18c6bd6e7..000000000 --- a/frameworks/keyed/dyo/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - presets: [ "es2015", "react"], - "plugins": [ - ["transform-react-jsx", { - "pragma": "h" - }] - ] -} diff --git a/frameworks/keyed/dyo/index.html b/frameworks/keyed/dyo/index.html deleted file mode 100755 index 1053bca2c..000000000 --- a/frameworks/keyed/dyo/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Dyo - - - -
- - - diff --git a/frameworks/keyed/dyo/package.json b/frameworks/keyed/dyo/package.json deleted file mode 100644 index 3a0b4b4ed..000000000 --- a/frameworks/keyed/dyo/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "js-framework-benchmark-dyo", - "version": "1.0.0", - "description": "Dyo demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "dyo" - }, - "scripts": { - "build-dev": "webpack -w -d", - "build-prod": "webpack -p" - }, - "keywords": [ - "dyo", - "webpack" - ], - "author": "Sultan Tarimo", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "babel-core": "6.26.3", - "babel-loader": "7.1.5", - "babel-preset-es2015": "6.24.1", - "babel-preset-react": "6.24.1", - "jsx-loader": "0.13.2", - "webpack": "4.16.3", - "webpack-cli": "^3.1.0" - }, - "dependencies": { - "dyo": "1.0.0" - } -} diff --git a/frameworks/keyed/dyo/src/main.js b/frameworks/keyed/dyo/src/main.js deleted file mode 100644 index 05c237ffd..000000000 --- a/frameworks/keyed/dyo/src/main.js +++ /dev/null @@ -1,129 +0,0 @@ -import {h, memo, render, useReducer} from 'dyo' - -const A = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", -"angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"] -const C = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"] -const N = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"] - -const random = (max) => { - return Math.round(Math.random() * 1000) % max -} - -const create = (id, data, length) => { - for (var i = 0; i < length; i++) { - data.push({id: id++, label: `${A[random(A.length)]} ${C[random(C.length)]} ${N[random(N.length)]}`}) - } - return {id, data, selected: -1} -} - -const run = ({id}) => { - return create(id, [], 1000) -} - -const alot = ({id}) => { - return create(id, [], 10000) -} - -const add = ({id, data}) => { - return create(id, data, 1000) -} - -const update = ({id, data, selected}) => { - for (var i = 0; i < data.length; i += 10) { - data[i].label += ' !!!' - } - return {id, data, selected} -} - -const clear = (state) => { - return {id: state.id, data: [], selected: -1} -} - -const init = (state) => { - return {id: 1, data: [], selected: -1} -} - -const swap = ({id, data, selected}) => { - if (data.length > 998) { - const temp = data[1] - data[1] = data[998] - data[998] = temp - } - return {id, data, selected} -} - -const remove = ({id, data, selected}, payload) => { - return {id: id, data: data.filter(({id}) => id !== payload), selected} -} - -const select = ({id, data, selected}, payload) => { - return {id, data, selected: payload} -} - -const reducer = (state, {type, payload}) => { - switch (type) { - case 'run': return run(state) - case 'alot': return alot(state) - case 'add': return add(state) - case 'update': return update(state) - case 'clear': return clear(state) - case 'swap': return swap(state) - case 'remove': return remove(state, payload) - case 'select': return select(state, payload) - } -} - -const Jumbo = memo(({dispatch}) => ( - h('div', {className: 'jumbotron'}, - h('div', {className: 'row'}, - h('div', {className: 'col-md-6'}, h('h1', {}, 'Dyo')), - h('div', {className: 'col-md-6'}, - h('div', {className: 'row'}, - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'run', onClick: e => dispatch({type: 'run'})}, 'Create 1,000 rows') - ), - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'runlots', onClick: e => dispatch({type: 'alot'})}, 'Create 10,000 rows') - ), - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'add', onClick: e => dispatch({type: 'add'})}, 'Append 1,000 rows') - ), - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'update', onClick: e => dispatch({type: 'update'})}, 'Update every 10th row') - ), - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'clear', onClick: e => dispatch({type: 'clear'})}, 'Clear') - ), - h('div', {className: 'col-sm-6 smallpad'}, - h('button', {className: 'btn btn-primary btn-block', type: 'button', id: 'swaprows', onClick: e => dispatch({type: 'swap'})}, 'Swap Rows') - ) - ) - ) - ) - ) -), (prev, next) => true) - -const Row = memo(({dispatch, id, label, selected}) => ( - h('tr', {className: selected ? 'danger' : ''}, - h('td', {className: 'col-md-1'}, id), - h('td', {className: 'col-md-4'}, h('a', {onClick: e => dispatch({type: 'select', payload: id})}, label)), - h('td', {className: 'col-md-1'}, h('a', {onClick: e => dispatch({type: 'remove', payload: id})}, - h('span', {className: 'glyphicon glyphicon-remove', 'aria-hidden': 'true'})) - ), - h('td', {className: 'col-md-6'}) - ) -), (prev, next) => prev.label === next.label && prev.selected === next.selected) - -const Main = (props) => { - const [{data, selected}, dispatch] = useReducer(reducer, init) - - return h('div', {className: 'container'}, - h(Jumbo, {dispatch}), - h('table', {className: 'table table-hover table-striped test-data'}, - h('tbody', {}, data.map(({id, label}) => h(Row, {dispatch, id, label, key: id, selected: id === selected}))) - ), - h('span', {className: 'preloadicon glyphicon glyphicon-remove', 'aria-hidden': 'true'}) - ) -} - -render(h(Main), '#main') diff --git a/frameworks/keyed/dyo/webpack.config.js b/frameworks/keyed/dyo/webpack.config.js deleted file mode 100755 index 90efec001..000000000 --- a/frameworks/keyed/dyo/webpack.config.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; -require("babel-plugin-syntax-jsx") -var path = require('path') -var webpack = require('webpack') -var cache = {}; -var loaders = [ - { - test: /\.jsx$/, - loader: 'babel-loader' - }, - { - test: /\.es6\.js$/, - loader: 'babel-loader' - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader' - } -]; -var extensions = [ - '.js', '.jsx', '.es6.js' -]; - -module.exports = [{ - cache: cache, - module: { - rules: loaders - }, - entry: { - main: './src/main.js', - }, - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js' - }, - resolve: { - extensions: extensions, - modules: [ - __dirname, - path.resolve(__dirname, "src"), - "node_modules" - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }) - ] -}]; diff --git a/frameworks/keyed/elm/.gitignore b/frameworks/keyed/elm/.gitignore deleted file mode 100644 index ed8225884..000000000 --- a/frameworks/keyed/elm/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# elm-package generated files -elm-stuff/ - -# elm-repl generated files -repl-temp-* - diff --git a/frameworks/keyed/elm/elm.json b/frameworks/keyed/elm/elm.json deleted file mode 100644 index 59ca55525..000000000 --- a/frameworks/keyed/elm/elm.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "application", - "source-directories": [ - "src" - ], - "elm-version": "0.19.0", - "dependencies": { - "direct": { - "elm/browser": "1.0.0", - "elm/core": "1.0.0", - "elm/html": "1.0.0", - "elm/json": "1.0.0", - "elm/random": "1.0.0", - "elm/url": "1.0.0" - }, - "indirect": { - "elm/time": "1.0.0", - "elm/virtual-dom": "1.0.0" - } - }, - "test-dependencies": { - "direct": {}, - "indirect": {} - } -} \ No newline at end of file diff --git a/frameworks/keyed/elm/index.html b/frameworks/keyed/elm/index.html deleted file mode 100644 index e0d2fc195..000000000 --- a/frameworks/keyed/elm/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Elm v0.19.0 - - - -
- - - - diff --git a/frameworks/keyed/elm/package.json b/frameworks/keyed/elm/package.json deleted file mode 100644 index 13e482527..000000000 --- a/frameworks/keyed/elm/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "js-framework-benchmark-elm", - "version": "1.0.0", - "description": "Elm demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "elm" - }, - "scripts": { - "build-prod": "elm make src/Main.elm --optimize --output=dist/main.js && uglifyjs dist/main.js --compress 'pure_funcs=\"F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9\",pure_getters=true,keep_fargs=false,unsafe_comps=true,unsafe=true,passes=2' --output=dist/main.js && uglifyjs dist/main.js --mangle --output=dist/main.js" - }, - "keywords": [ - "elm" - ], - "author": "Eduard Kyvenko ", - "license": "ISC", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "elm": "0.19.0-bugfix2", - "uglify-js": "3.4.8" - } -} diff --git a/frameworks/keyed/elm/src/Main.elm b/frameworks/keyed/elm/src/Main.elm deleted file mode 100644 index 7d15adb1b..000000000 --- a/frameworks/keyed/elm/src/Main.elm +++ /dev/null @@ -1,366 +0,0 @@ -module Main exposing (main) - -import Array exposing (Array) -import Browser -import Html exposing (Attribute, Html, a, button, div, h1, span, table, td, text, tr) -import Html.Attributes exposing (attribute, class, classList, href, id, type_) -import Html.Events exposing (onClick) -import Html.Keyed -import Html.Lazy exposing (lazy, lazy2) -import Random exposing (Generator, Seed) -import String - - -main : Program Int Model Msg -main = - Browser.element - { view = view - , update = update - , init = init - , subscriptions = subscriptions - } - - -adjectives : Generator String -adjectives = - Random.uniform - "pretty" - [ "large" - , "big" - , "small" - , "tall" - , "short" - , "long" - , "handsome" - , "plain" - , "quaint" - , "clean" - , "elegant" - , "easy" - , "angry" - , "crazy" - , "helpful" - , "mushy" - , "odd" - , "unsightly" - , "adorable" - , "important" - , "inexpensive" - , "cheap" - , "expensive" - , "fancy" - ] - - -colours : Generator String -colours = - Random.uniform - "red" - [ "yellow" - , "blue" - , "green" - , "pink" - , "brown" - , "purple" - , "brown" - , "white" - , "black" - , "orange" - ] - - -nouns : Generator String -nouns = - Random.uniform - "table" - [ "chair" - , "house" - , "bbq" - , "desk" - , "car" - , "pony" - , "cookie" - , "sandwich" - , "burger" - , "pizza" - , "mouse" - , "keyboard" - ] - - -buttons : List ( String, String, Msg ) -buttons = - [ ( "run", "Create 1,000 rows", Create 1000 ) - , ( "runlots", "Create 10,000 rows", Create 10000 ) - , ( "add", "Append 1,000 rows", AppendOneThousand ) - , ( "update", "Update every 10th row", UpdateEveryTenth ) - , ( "clear", "Clear", Clear ) - , ( "swaprows", "Swap Rows", Swap ) - ] - - -tbody : List (Attribute msg) -> List ( String, Html msg ) -> Html msg -tbody attrs children = - Html.Keyed.node "tbody" attrs children - - -btnPrimaryBlock : ( String, String, Msg ) -> Html Msg -btnPrimaryBlock ( buttonId, labelText, msg ) = - div - [ class "col-sm-6 smallpad" ] - [ button - [ type_ "button" - , class "btn btn-primary btn-block" - , id buttonId - , onClick msg - , attribute "ref" "text" - ] - [ text labelText ] - ] - - -viewKeyedRow : Int -> Row -> ( String, Html Msg ) -viewKeyedRow selectedId row = - ( String.fromInt row.id, lazy2 viewRow (selectedId == row.id) row ) - - -viewRow : Bool -> Row -> Html Msg -viewRow isSelected { id, label } = - tr - [ classList [ ( "danger", isSelected ) ] ] - [ td colMd1 - [ text (String.fromInt id) ] - , td colMd4 - [ a [ onClick (Select id) ] [ text label ] ] - , td colMd1 - [ a [ onClick (Remove id) ] removeIcon ] - , spacer - ] - - -removeIcon : List (Html msg) -removeIcon = - [ span - [ class "glyphicon glyphicon-remove" - , attribute "aria-hidden" "true" - ] - [] - ] - - -colMd1 : List (Attribute msg) -colMd1 = - [ class "col-md-1" ] - - -colMd4 : List (Attribute msg) -colMd4 = - [ class "col-md-4" ] - - -spacer : Html msg -spacer = - td [ class "col-md-6" ] [] - - -view : Model -> Html Msg -view model = - div containerClasses - [ jumbotron - , table tableClasses - [ tbody [] - (Array.foldr (viewRowHelp model.selectedId) [] model.rows) - ] - , footer - ] - - -containerClasses : List (Attribute msg) -containerClasses = - [ class "container" ] - - -tableClasses : List (Attribute msg) -tableClasses = - [ class "table table-hover table-striped test-data" ] - - -footer : Html msg -footer = - span - [ class "preloadicon glyphicon glyphicon-remove" - , attribute "aria-hidden" "true" - ] - [] - - -jumbotron : Html Msg -jumbotron = - div - [ class "jumbotron" ] - [ div - [ class "row" ] - [ div - [ class "col-md-6" ] - [ h1 [] [ text "Elm 0.19.0 (keyed)" ] ] - , div - [ class "col-md-6" ] - (List.map btnPrimaryBlock buttons) - ] - ] - - -viewRowHelp : Int -> Row -> List ( String, Html Msg ) -> List ( String, Html Msg ) -viewRowHelp selectedId row elems = - viewKeyedRow selectedId row :: elems - - -appendRandomEntries : Int -> Int -> ( Array Row, Seed ) -> ( Array Row, Seed ) -appendRandomEntries amount lastId pair = - if amount == 0 then - pair - - else - let - ( array, seed ) = - pair - - ( label, newSeed ) = - Random.step generator seed - - id = - lastId + 1 - - newArray = - Array.push - { id = id - , label = label - } - array - in - appendRandomEntries (amount - 1) id ( newArray, newSeed ) - - -type Msg - = Create Int - | AppendOneThousand - | UpdateEveryTenth - | Clear - | Swap - | Remove Int - | Select Int - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update msg model = - case msg of - Create amount -> - let - ( newRows, seed ) = - appendRandomEntries amount model.lastId ( Array.empty, model.seed ) - in - ( { model - | rows = newRows - , seed = seed - , lastId = model.lastId + amount - } - , Cmd.none - ) - - AppendOneThousand -> - let - amount = - 1000 - - ( newRows, seed ) = - appendRandomEntries amount model.lastId ( model.rows, model.seed ) - in - ( { model - | rows = newRows - , seed = seed - , lastId = model.lastId + amount - } - , Cmd.none - ) - - UpdateEveryTenth -> - ( { model | rows = updateEveryTenth 0 model.rows }, Cmd.none ) - - Clear -> - ( { model | rows = Array.empty }, Cmd.none ) - - Swap -> - let - rows = - model.rows - in - if Array.length rows > 998 then - case ( Array.get 1 rows, Array.get 998 rows ) of - ( Just from, Just to ) -> - ( { model - | rows = - rows - |> Array.set 1 to - |> Array.set 998 from - } - , Cmd.none - ) - - ( _, _ ) -> - ( model, Cmd.none ) - - else - ( model, Cmd.none ) - - Remove id -> - ( { model | rows = Array.filter (\r -> r.id /= id) model.rows }, Cmd.none ) - - Select id -> - ( { model | selectedId = id }, Cmd.none ) - - -updateEveryTenth : Int -> Array Row -> Array Row -updateEveryTenth index rows = - case Array.get index rows of - Just row -> - rows - |> Array.set index { row | label = row.label ++ " !!!" } - |> updateEveryTenth (index + 10) - - Nothing -> - rows - - -type alias Model = - { seed : Seed - , rows : Array Row - , lastId : Int - , selectedId : Int - } - - -type alias Row = - { id : Int - , label : String - } - - -init : Int -> ( Model, Cmd Msg ) -init systemTime = - ( { seed = Random.initialSeed systemTime - , rows = Array.empty - , lastId = 0 - , selectedId = 0 - } - , Cmd.none - ) - - -generator : Generator String -generator = - Random.map3 (\a c n -> a ++ " " ++ c ++ " " ++ n) adjectives colours nouns - - -subscriptions : Model -> Sub Msg -subscriptions model = - Sub.none diff --git a/frameworks/keyed/ember/.bowerrc b/frameworks/keyed/ember/.bowerrc deleted file mode 100644 index 959e1696e..000000000 --- a/frameworks/keyed/ember/.bowerrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "directory": "bower_components", - "analytics": false -} diff --git a/frameworks/keyed/ember/.editorconfig b/frameworks/keyed/ember/.editorconfig deleted file mode 100644 index 219985c22..000000000 --- a/frameworks/keyed/ember/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 2 - -[*.hbs] -insert_final_newline = false - -[*.{diff,md}] -trim_trailing_whitespace = false diff --git a/frameworks/keyed/ember/.ember-cli b/frameworks/keyed/ember/.ember-cli deleted file mode 100644 index ee64cfed2..000000000 --- a/frameworks/keyed/ember/.ember-cli +++ /dev/null @@ -1,9 +0,0 @@ -{ - /** - Ember CLI sends analytics information by default. The data is completely - anonymous, but there are times when you might want to disable this behavior. - - Setting `disableAnalytics` to true will prevent any data from being sent. - */ - "disableAnalytics": false -} diff --git a/frameworks/keyed/ember/.eslintignore b/frameworks/keyed/ember/.eslintignore deleted file mode 100644 index 72df37307..000000000 --- a/frameworks/keyed/ember/.eslintignore +++ /dev/null @@ -1,20 +0,0 @@ -# unconventional js -/blueprints/*/files/ -/vendor/ - -# compiled output -/dist/ -/tmp/ - -# dependencies -/bower_components/ -/node_modules/ - -# misc -/coverage/ -!.* - -# ember-try -/.node_modules.ember-try/ -/bower.json.ember-try -/package.json.ember-try diff --git a/frameworks/keyed/ember/.eslintrc.js b/frameworks/keyed/ember/.eslintrc.js deleted file mode 100644 index fa6ccaefa..000000000 --- a/frameworks/keyed/ember/.eslintrc.js +++ /dev/null @@ -1,46 +0,0 @@ -module.exports = { - root: true, - parser: 'babel-eslint', - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module', - ecmaFeatures: { - legacyDecorators: true - } - }, - plugins: [ - 'ember' - ], - extends: [ - 'eslint:recommended', - 'plugin:ember/recommended' - ], - env: { - browser: true - }, - rules: { - 'ember/no-jquery': 'error' - }, - overrides: [ - // node files - { - files: [ - '.eslintrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'lib/*/index.js', - 'server/**/*.js' - ], - parserOptions: { - sourceType: 'script' - }, - env: { - browser: false, - node: true - } - } - ] -}; diff --git a/frameworks/keyed/ember/.gitignore b/frameworks/keyed/ember/.gitignore deleted file mode 100644 index c40a1b2ab..000000000 --- a/frameworks/keyed/ember/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# See https://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist/ -/tmp/ - -# dependencies -/bower_components/ -/node_modules/ - -# misc -/.env* -/.pnp* -/.sass-cache -/connect.lock -/coverage/ -/libpeerconnection.log -/npm-debug.log* -/testem.log -/yarn-error.log - -# ember-try -/.node_modules.ember-try/ -/bower.json.ember-try -/package.json.ember-try diff --git a/frameworks/keyed/ember/.template-lintrc.js b/frameworks/keyed/ember/.template-lintrc.js deleted file mode 100644 index f38737001..000000000 --- a/frameworks/keyed/ember/.template-lintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = { - extends: 'octane' -}; diff --git a/frameworks/keyed/ember/.travis.yml b/frameworks/keyed/ember/.travis.yml deleted file mode 100644 index 7e5bbf6ec..000000000 --- a/frameworks/keyed/ember/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -language: node_js -node_js: - - "6" - -sudo: false -dist: trusty - -addons: - chrome: stable - -cache: - yarn: true - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - -install: - - yarn install --non-interactive -branches: - only: - - master - -script: - - npm run lint:hbs - - npm run lint:js - - npm test diff --git a/frameworks/keyed/ember/.watchmanconfig b/frameworks/keyed/ember/.watchmanconfig deleted file mode 100644 index e7834e3e4..000000000 --- a/frameworks/keyed/ember/.watchmanconfig +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignore_dirs": ["tmp", "dist"] -} diff --git a/frameworks/keyed/ember/HOW_TO_UPDATE.txt b/frameworks/keyed/ember/HOW_TO_UPDATE.txt deleted file mode 100644 index c650acdc8..000000000 --- a/frameworks/keyed/ember/HOW_TO_UPDATE.txt +++ /dev/null @@ -1,2 +0,0 @@ -Check https://github.com/ember-cli/ember-cli/releases and see the release notes. -Just using ncu will not be sufficient. diff --git a/frameworks/keyed/ember/README.md b/frameworks/keyed/ember/README.md deleted file mode 100644 index e741b07cb..000000000 --- a/frameworks/keyed/ember/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# ember-temp - -This README outlines the details of collaborating on this Ember application. -A short introduction of this app could easily go here. - -## Prerequisites - -You will need the following things properly installed on your computer. - -* [Git](https://git-scm.com/) -* [Node.js](https://nodejs.org/) -* [Yarn](https://yarnpkg.com/) -* [Ember CLI](https://ember-cli.com/) -* [Google Chrome](https://google.com/chrome/) - -## Installation - -* `git clone ` this repository -* `cd ember-temp` -* `yarn install` - -## Running / Development - -* `ember serve` -* Visit your app at [http://localhost:4200](http://localhost:4200). -* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). - -### Code Generators - -Make use of the many generators for code, try `ember help generate` for more details - -### Running Tests - -* `ember test` -* `ember test --server` - -### Linting - -* `yarn lint:hbs` -* `yarn lint:js` -* `yarn lint:js --fix` - -### Building - -* `ember build` (development) -* `ember build --environment production` (production) - -### Deploying - -Specify what it takes to deploy your app. - -## Further Reading / Useful Links - -* [ember.js](https://emberjs.com/) -* [ember-cli](https://ember-cli.com/) -* Development Browser Extensions - * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) - * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/frameworks/keyed/ember/app/app.js b/frameworks/keyed/ember/app/app.js deleted file mode 100644 index d8e2088b6..000000000 --- a/frameworks/keyed/ember/app/app.js +++ /dev/null @@ -1,12 +0,0 @@ -import Application from '@ember/application'; -import Resolver from 'ember-resolver'; -import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; - -export default class App extends Application { - modulePrefix = config.modulePrefix; - podModulePrefix = config.podModulePrefix; - Resolver = Resolver; -} - -loadInitializers(App, config.modulePrefix); diff --git a/frameworks/keyed/ember/app/components/my-table.js b/frameworks/keyed/ember/app/components/my-table.js deleted file mode 100755 index 412a38341..000000000 --- a/frameworks/keyed/ember/app/components/my-table.js +++ /dev/null @@ -1,67 +0,0 @@ -import Component from '@glimmer/component'; -import { action } from '@ember/object'; -import { tracked } from '@glimmer/tracking'; - -import { - run, runLots, add, update, swapRows, deleteRow, -} from 'ember-temp/utils/benchmark-helpers'; - -export default class MyTable extends Component { - @tracked - id = 1; - @tracked - data = []; - @tracked - selected = undefined; - - @action create() { - const result = run(this.id); - - this.id = result.id; - this.data = result.data; - this.selected = undefined; - } - - @action add() { - this.data = add(this.id, this.data) - } - - @action update() { - update(this.data); - } - - @action runLots() { - const result = runLots(this.id); - - this.data = result.data; - this.id = result.id; - this.selected = undefined; - } - - @action clear() { - this.data = []; - this.selected = undefined; - } - - @action swapRows() { - this.data = swapRows(this.data); - } - - @action remove(id) { - const selected = this.data.find(({selected}) => selected === true); - if (selected) { - selected.selected = false; - } - this.data = deleteRow(this.data, id); - this.selected = undefined; - } - - @action select(id) { - this.selected = id; - const selected = this.data.find(({selected}) => selected === true); - if (selected) { - selected.selected = false; - } - this.data.find((item)=>item.id === id).selected = true; - } -} diff --git a/frameworks/keyed/ember/app/components/table-row/template.hbs b/frameworks/keyed/ember/app/components/table-row/template.hbs deleted file mode 100644 index 4c9f8d562..000000000 --- a/frameworks/keyed/ember/app/components/table-row/template.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{{!-- template-lint-disable --}} - - {{@item.id}} -
{{@item.label}} - - - \ No newline at end of file diff --git a/frameworks/keyed/ember/app/controllers/.gitkeep b/frameworks/keyed/ember/app/controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/app/helpers/.gitkeep b/frameworks/keyed/ember/app/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/app/helpers/eq.js b/frameworks/keyed/ember/app/helpers/eq.js deleted file mode 100755 index 7ef3b140c..000000000 --- a/frameworks/keyed/ember/app/helpers/eq.js +++ /dev/null @@ -1,5 +0,0 @@ -import { helper } from '@ember/component/helper'; - -export default helper(function(params) { - return params[0] === params[1]; -}); diff --git a/frameworks/keyed/ember/app/index.html b/frameworks/keyed/ember/app/index.html deleted file mode 100644 index 01afb6cee..000000000 --- a/frameworks/keyed/ember/app/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - Ember v3.17 - - - {{content-for "head"}} - - - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - - - - - {{content-for "body-footer"}} - - diff --git a/frameworks/keyed/ember/app/router.js b/frameworks/keyed/ember/app/router.js deleted file mode 100644 index 43885df3f..000000000 --- a/frameworks/keyed/ember/app/router.js +++ /dev/null @@ -1,12 +0,0 @@ -import EmberRouter from '@ember/routing/router'; -import config from './config/environment'; - -export default class Router extends EmberRouter { - location = config.locationType; - rootURL = config.rootURL; -} - -Router.map(function() { - this.route('index', { path: '/' }); - this.route('index', { path: '/index.html' }); -}); diff --git a/frameworks/keyed/ember/app/routes/.gitkeep b/frameworks/keyed/ember/app/routes/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/app/styles/app.css b/frameworks/keyed/ember/app/styles/app.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/app/templates/components/bs-button.hbs b/frameworks/keyed/ember/app/templates/components/bs-button.hbs deleted file mode 100644 index 068fffdaf..000000000 --- a/frameworks/keyed/ember/app/templates/components/bs-button.hbs +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/frameworks/keyed/ember/app/templates/components/my-table.hbs b/frameworks/keyed/ember/app/templates/components/my-table.hbs deleted file mode 100755 index 0b3903b16..000000000 --- a/frameworks/keyed/ember/app/templates/components/my-table.hbs +++ /dev/null @@ -1,55 +0,0 @@ -
-
-
-

Ember v3.17

-
-
-
-
- - Create 1,000 rows - -
-
- - Create 10,000 rows - -
-
- - Append 1,000 rows - -
-
- - Update every 10th row - -
-
- - Clear - -
-
- - Swap Rows - -
-
-
-
-
- - -{{#if this.data.length}} - - - {{#each this.data key="id" as |item|}} - - {{/each}} - -
-{{/if}} - - - \ No newline at end of file diff --git a/frameworks/keyed/ember/app/templates/index.hbs b/frameworks/keyed/ember/app/templates/index.hbs deleted file mode 100755 index abff955b0..000000000 --- a/frameworks/keyed/ember/app/templates/index.hbs +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/frameworks/keyed/ember/app/utils/benchmark-helpers.js b/frameworks/keyed/ember/app/utils/benchmark-helpers.js deleted file mode 100644 index 34b48bac1..000000000 --- a/frameworks/keyed/ember/app/utils/benchmark-helpers.js +++ /dev/null @@ -1,89 +0,0 @@ -import { tracked } from '@glimmer/tracking'; - -class TodoItem { - @tracked label; - @tracked selected; - @tracked id - constructor({label,selected, id}) { - this.label = label; - this.selected = selected; - this.id = id; - } -} - -const _random = (max) => { - return Math.round(Math.random() * 1000) % max; -} - -const updateData = (data, mod = 10) => { - for (let i = 0; i < data.length; i += mod) { - data[i].label = data[i].label + ' !!!' ; - } - return data; -} - -export const buildData = (id, count = 1000) => { - var adjectives = [ - "pretty", "large", "big", "small", "tall", - "short", "long", "handsome", "plain", "quaint", - "clean", "elegant", "easy", "angry", "crazy", - "helpful", "mushy", "odd", "unsightly", "adorable", - "important", "inexpensive", "cheap", "expensive", "fancy"]; - - var colours = [ - "red", "yellow", "blue", "green", "pink", "brown", "purple", - "brown", "white", "black", "orange"]; - - var nouns = [ - "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", - "sandwich", "burger", "pizza", "mouse", "keyboard"]; - - var data = []; - - for (var i = 0; i < count; i++) - data.push(new TodoItem({ - id: id++, - selected: false, - label: adjectives[_random(adjectives.length)] - + " " - + colours[_random(colours.length)] - + " " - + nouns[_random(nouns.length)] - })); - - return {data, id}; -} - -export const add = (id, data) => { - const newData = buildData(id, 1000); - return [ ...data, ...newData.data]; -} - -export const run = (id) => { - return buildData(id); -} - -export const runLots = (id) => { - return buildData(id, 10000); -} - -export const update = (data) => { - return updateData(data); -} - -export const swapRows = (data) => { - const newData = [...data]; - if (newData.length > 998) { - let temp = newData[1]; - newData[1] = newData[998]; - newData[998] = temp; - } - return newData; -} - -export const deleteRow = (data, id) => { - return data.filter(d => { - return d.id !== id - }); -} - diff --git a/frameworks/keyed/ember/config/environment.js b/frameworks/keyed/ember/config/environment.js deleted file mode 100644 index 691e0cac2..000000000 --- a/frameworks/keyed/ember/config/environment.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -module.exports = function(environment) { - let ENV = { - - 'ember-resolver': { - features: { - // EMBER_RESOLVER_MODULE_UNIFICATION: true, - // EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION: true, - }, - }, - modulePrefix: 'ember-temp', - environment, - rootURL: '/frameworks/keyed/ember/dist/', - locationType: 'auto', - EmberENV: { - FEATURES: { - // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true - // 'ember-glimmer-angle-bracket-invocation': true, - // EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION: true, - // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true - }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false - } - }, - - APP: { - // Here you can pass flags/options to your application instance - // when it is created - } - }; - - if (environment === 'development') { - // ENV.APP.LOG_RESOLVER = true; - // ENV.APP.LOG_ACTIVE_GENERATION = true; - // ENV.APP.LOG_TRANSITIONS = true; - // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; - // ENV.APP.LOG_VIEW_LOOKUPS = true; - } - - if (environment === 'test') { - ENV.rootURL = '/'; - - // Testem prefers this... - ENV.locationType = 'none'; - - // keep test console output quieter - ENV.APP.LOG_ACTIVE_GENERATION = false; - ENV.APP.LOG_VIEW_LOOKUPS = false; - - ENV.APP.rootElement = '#ember-testing'; - ENV.APP.autoboot = false; - } - - if (environment === 'production') { - // here you can enable a production-specific feature - } - - return ENV; -}; diff --git a/frameworks/keyed/ember/config/optional-features.json b/frameworks/keyed/ember/config/optional-features.json deleted file mode 100644 index b26286e2e..000000000 --- a/frameworks/keyed/ember/config/optional-features.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "application-template-wrapper": false, - "default-async-observers": true, - "jquery-integration": false, - "template-only-glimmer-components": true -} diff --git a/frameworks/keyed/ember/config/targets.js b/frameworks/keyed/ember/config/targets.js deleted file mode 100644 index ddd4c5964..000000000 --- a/frameworks/keyed/ember/config/targets.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -const browsers = [ - 'last 1 Chrome versions', - 'last 1 Firefox versions', - 'last 1 Safari versions' -]; - -module.exports = { - browsers -}; diff --git a/frameworks/keyed/ember/ember-cli-build.js b/frameworks/keyed/ember/ember-cli-build.js deleted file mode 100644 index 9eace015d..000000000 --- a/frameworks/keyed/ember/ember-cli-build.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -const EmberApp = require('ember-cli/lib/broccoli/ember-app'); -const { Webpack } = require('@embroider/webpack'); -module.exports = function(defaults) { - let app = new EmberApp(defaults, { - hinting: false - // Add options here - }); - - // Use `app.import` to add additional libraries to the generated - // output files. - // - // If you need to use different assets in different - // environments, specify an object as the first parameter. That - // object's keys should be the environment name and the values - // should be the asset to use in that environment. - // - // If the library that you are including contains AMD or ES6 - // modules that you would like to import into your application - // please specify an object with the list of modules as keys - // along with the exports of each module as its value. - - return require('@embroider/compat').compatBuild(app, Webpack, { - staticAddonTestSupportTrees: true, - staticAddonTrees: true, - staticHelpers: true, - staticComponents: true, - packagerOptions: { - webpackConfig: { - mode: 'production' - } - } - }); -}; diff --git a/frameworks/keyed/ember/package.json b/frameworks/keyed/ember/package.json deleted file mode 100644 index d1212033d..000000000 --- a/frameworks/keyed/ember/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "ember-temp", - "version": "0.0.0", - "private": true, - "description": "Small description for ember-temp goes here", - "repository": "", - "license": "MIT", - "author": "", - "directories": { - "doc": "doc", - "test": "tests" - }, - "js-framework-benchmark": { - "frameworkVersionFromPackage": "ember-source", - "customURL": "/dist" - }, - "scripts": { - "ember": "node_modules/.bin/ember", - "ember-cli-update": "node_modules/.bin/ember-cli-update", - "build": "ember build", - "build-dev": "ember build --environment=production", - "build-prod": "ember build --environment=production", - "lint:hbs": "ember-template-lint .", - "lint:js": "eslint .", - "start": "ember serve", - "test": "ember test" - }, - "devDependencies": { - "@ember/optional-features": "^1.1.0", - "@embroider/compat": "^0.11.0", - "@embroider/core": "^0.11.0", - "@embroider/webpack": "^0.11.0", - "@glimmer/component": "^1.0.0", - "babel-eslint": "^10.0.3", - "broccoli-asset-rev": "3.0.0", - "ember-auto-import": "^1.5.3", - "ember-cli": "~3.15.2", - "ember-cli-babel": "^7.13.0", - "ember-cli-dependency-checker": "3.2.0", - "ember-cli-eslint": "5.1.0", - "ember-cli-htmlbars": "^4.2.0", - "ember-cli-inject-live-reload": "2.0.1", - "ember-cli-sri": "2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.3", - "ember-cli-template-trimmer": "0.0.6", - "ember-cli-uglify": "3.0.0", - "ember-cli-update": "0.34.10", - "ember-hbs-minifier": "0.4.0", - "ember-load-initializers": "^2.1.1", - "ember-qunit": "^4.6.0", - "ember-resolver": "^7.0.0", - "ember-source": "3.17.0-beta.1", - "eslint-plugin-ember": "^7.7.1", - "loader.js": "4.7.0", - "qunit-dom": "^0.9.2" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - }, - "ember": { - "edition": "octane" - } -} diff --git a/frameworks/keyed/ember/public/crossdomain.xml b/frameworks/keyed/ember/public/crossdomain.xml deleted file mode 100644 index 0c16a7a07..000000000 --- a/frameworks/keyed/ember/public/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/frameworks/keyed/ember/public/robots.txt b/frameworks/keyed/ember/public/robots.txt deleted file mode 100644 index f5916452e..000000000 --- a/frameworks/keyed/ember/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# http://www.robotstxt.org -User-agent: * -Disallow: diff --git a/frameworks/keyed/ember/testem.js b/frameworks/keyed/ember/testem.js deleted file mode 100644 index 367f5659c..000000000 --- a/frameworks/keyed/ember/testem.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - test_page: 'tests/index.html?hidepassed', - disable_watching: true, - launch_in_ci: [ - 'Chrome' - ], - launch_in_dev: [ - 'Chrome' - ], - browser_args: { - Chrome: { - ci: [ - // --no-sandbox is needed when running Chrome inside a container - process.env.CI ? '--no-sandbox' : null, - '--headless', - '--disable-dev-shm-usage', - '--disable-software-rasterizer', - '--mute-audio', - '--remote-debugging-port=0', - '--window-size=1440,900' - ].filter(Boolean) - } - } -}; diff --git a/frameworks/keyed/ember/tests/helpers/destroy-app.js b/frameworks/keyed/ember/tests/helpers/destroy-app.js deleted file mode 100644 index e7f983bd1..000000000 --- a/frameworks/keyed/ember/tests/helpers/destroy-app.js +++ /dev/null @@ -1,5 +0,0 @@ -import { run } from '@ember/runloop'; - -export default function destroyApp(application) { - run(application, 'destroy'); -} diff --git a/frameworks/keyed/ember/tests/helpers/module-for-acceptance.js b/frameworks/keyed/ember/tests/helpers/module-for-acceptance.js deleted file mode 100644 index 90a93bac2..000000000 --- a/frameworks/keyed/ember/tests/helpers/module-for-acceptance.js +++ /dev/null @@ -1,21 +0,0 @@ -import { module } from 'qunit'; -import { resolve } from 'rsvp'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; - -export default function(name, options = {}) { - module(name, { - beforeEach() { - this.application = startApp(); - - if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); - } - }, - - afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return resolve(afterEach).then(() => destroyApp(this.application)); - } - }); -} diff --git a/frameworks/keyed/ember/tests/helpers/resolver.js b/frameworks/keyed/ember/tests/helpers/resolver.js deleted file mode 100644 index b208d38d0..000000000 --- a/frameworks/keyed/ember/tests/helpers/resolver.js +++ /dev/null @@ -1,11 +0,0 @@ -import Resolver from '../../resolver'; -import config from '../../config/environment'; - -const resolver = Resolver.create(); - -resolver.namespace = { - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix -}; - -export default resolver; diff --git a/frameworks/keyed/ember/tests/helpers/start-app.js b/frameworks/keyed/ember/tests/helpers/start-app.js deleted file mode 100644 index 99d35dcf4..000000000 --- a/frameworks/keyed/ember/tests/helpers/start-app.js +++ /dev/null @@ -1,17 +0,0 @@ -import Application from '../../app'; -import config from '../../config/environment'; -import { merge } from '@ember/polyfills'; -import { run } from '@ember/runloop'; - -export default function startApp(attrs) { - let attributes = merge({}, config.APP); - attributes.autoboot = true; - attributes = merge(attributes, attrs); // use defaults, but you can override; - - return run(() => { - let application = Application.create(attributes); - application.setupForTesting(); - application.injectTestHelpers(); - return application; - }); -} diff --git a/frameworks/keyed/ember/tests/index.html b/frameworks/keyed/ember/tests/index.html deleted file mode 100644 index 69bed1099..000000000 --- a/frameworks/keyed/ember/tests/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - EmberTemp Tests - - - - {{content-for "head"}} - {{content-for "test-head"}} - - - - - - {{content-for "head-footer"}} - {{content-for "test-head-footer"}} - - - {{content-for "body"}} - {{content-for "test-body"}} - - - - - - - - {{content-for "body-footer"}} - {{content-for "test-body-footer"}} - - diff --git a/frameworks/keyed/ember/tests/integration/.gitkeep b/frameworks/keyed/ember/tests/integration/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/tests/integration/components/performant-each/component-test.js b/frameworks/keyed/ember/tests/integration/components/performant-each/component-test.js deleted file mode 100644 index 6dd8ae5d2..000000000 --- a/frameworks/keyed/ember/tests/integration/components/performant-each/component-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'ember-qunit'; -import { render } from '@ember/test-helpers'; -import hbs from 'htmlbars-inline-precompile'; - -module('Integration | Component | performant-each', function(hooks) { - setupRenderingTest(hooks); - - test('it renders', async function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.set('myAction', function(val) { ... }); - - await render(hbs``); - - assert.equal(this.element.textContent.trim(), ''); - - // Template block usage: - await render(hbs` - - template block text - - `); - - assert.equal(this.element.textContent.trim(), 'template block text'); - }); -}); diff --git a/frameworks/keyed/ember/tests/integration/components/table-row/component-test.js b/frameworks/keyed/ember/tests/integration/components/table-row/component-test.js deleted file mode 100644 index 18a855ae3..000000000 --- a/frameworks/keyed/ember/tests/integration/components/table-row/component-test.js +++ /dev/null @@ -1,26 +0,0 @@ -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'ember-qunit'; -import { render } from '@ember/test-helpers'; -import hbs from 'htmlbars-inline-precompile'; - -module('Integration | Component | table-row', function(hooks) { - setupRenderingTest(hooks); - - test('it renders', async function(assert) { - // Set any properties with this.set('myProperty', 'value'); - // Handle any actions with this.set('myAction', function(val) { ... }); - - await render(hbs`{{table-row}}`); - - assert.equal(this.element.textContent.trim(), ''); - - // Template block usage: - await render(hbs` - {{#table-row}} - template block text - {{/table-row}} - `); - - assert.equal(this.element.textContent.trim(), 'template block text'); - }); -}); diff --git a/frameworks/keyed/ember/tests/test-helper.js b/frameworks/keyed/ember/tests/test-helper.js deleted file mode 100644 index 0382a848d..000000000 --- a/frameworks/keyed/ember/tests/test-helper.js +++ /dev/null @@ -1,8 +0,0 @@ -import Application from '../app'; -import config from '../config/environment'; -import { setApplication } from '@ember/test-helpers'; -import { start } from 'ember-qunit'; - -setApplication(Application.create(config.APP)); - -start(); diff --git a/frameworks/keyed/ember/tests/unit/.gitkeep b/frameworks/keyed/ember/tests/unit/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/ember/vendor/.gitkeep b/frameworks/keyed/ember/vendor/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frameworks/keyed/endorphin/index.html b/frameworks/keyed/endorphin/index.html deleted file mode 100644 index c25833026..000000000 --- a/frameworks/keyed/endorphin/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Endorphin - - - -
-
- - - diff --git a/frameworks/keyed/endorphin/package.json b/frameworks/keyed/endorphin/package.json deleted file mode 100644 index ea4e6866e..000000000 --- a/frameworks/keyed/endorphin/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "js-framework-benchmark-endorphin", - "version": "1.0.0", - "description": "Boilerplate for endorphin", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "endorphin" - }, - "main": "index.js", - "scripts": { - "build-dev": "rollup -c -w", - "build-prod": "rollup -c --environment production", - "watch": "rollup -wc" - }, - "keywords": [], - "author": "Sergey Chikuyonok", - "license": "ISC", - "devDependencies": { - "@endorphinjs/rollup-plugin-endorphin": "0.3.0", - "chokidar": "3.0.0", - "endorphin": "0.5.2", - "rollup": "1.12.4", - "rollup-plugin-buble": "0.19.6", - "rollup-plugin-commonjs": "10.0.0", - "rollup-plugin-node-resolve": "5.0.0", - "rollup-plugin-uglify": "6.0.2", - "rollup-plugin-terser": "5.0.0" - }, - "dependencies": {} -} diff --git a/frameworks/keyed/endorphin/rollup.config.js b/frameworks/keyed/endorphin/rollup.config.js deleted file mode 100644 index 8328d7cc6..000000000 --- a/frameworks/keyed/endorphin/rollup.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import resolve from 'rollup-plugin-node-resolve'; -import commonjs from 'rollup-plugin-commonjs'; -import { terser } from 'rollup-plugin-terser'; -import endorphin from '@endorphinjs/rollup-plugin-endorphin'; - -export default { - input: './src/app.js', - plugins: [ - resolve(), - commonjs(), - endorphin(), - process.env.production && terser() - ], - output: [{ - format: 'iife', - file: './dist/main.js', - sourcemap: true - }] -}; diff --git a/frameworks/keyed/endorphin/src/app-ui/app-ui.html b/frameworks/keyed/endorphin/src/app-ui/app-ui.html deleted file mode 100644 index 294754059..000000000 --- a/frameworks/keyed/endorphin/src/app-ui/app-ui.html +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/frameworks/keyed/endorphin/src/app-ui/app-ui.js b/frameworks/keyed/endorphin/src/app-ui/app-ui.js deleted file mode 100644 index 76fac9634..000000000 --- a/frameworks/keyed/endorphin/src/app-ui/app-ui.js +++ /dev/null @@ -1,71 +0,0 @@ -const A = ['pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', - 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', - 'cheap', 'expensive', 'fancy']; -const C = ['red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange']; -const N = ['table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', - 'keyboard']; - -function random(max) { - return Math.floor(Math.random() * 1000) % max; -} - -let nextId = 1; - -function buildData(count) { - const data = new Array(count); - for (let i = 0; i < count; i++) { - data[i] = { - id: nextId++, - label: `${A[random(A.length)]} ${C[random(C.length)]} ${N[random(N.length)]}`, - }; - } - return data; -} - -export function state() { - return { rows: [], selected: null }; -} - -export function onAdd({ state, setState }) { - setState({ rows: state.rows.concat(buildData(1000)) }); -} - -export function onClear({ setState }) { - setState({ rows: [], selected: null }); -} - -export function onPartialUpdate({ state, setState }) { - const rows = state.rows.slice(); - - for (let i = 0; i < rows.length; i += 10) { - rows[i].label += ' !!!'; - } - - setState({ rows }); -} - -export function onRemove(item, { state, setState }) { - const { rows } = state; - const ix = rows.indexOf(item); - setState({ - rows: [...rows.slice(0, ix), ...rows.slice(ix + 1)] - }); -} - -export function onRun({ setState }) { - setState({ rows: buildData(1000), selected: null }); -} - -export function onRunLots({ setState }) { - setState({ rows: buildData(10000), selected: null }); -} - -export function onSwapRows({ state, setState }) { - const rows = state.rows.slice(); - - if (rows.length > 998) { - [rows[1], rows[998]] = [rows[998], rows[1]]; - - setState({ rows }); - } -} diff --git a/frameworks/keyed/endorphin/src/app.js b/frameworks/keyed/endorphin/src/app.js deleted file mode 100644 index 72a9331b5..000000000 --- a/frameworks/keyed/endorphin/src/app.js +++ /dev/null @@ -1,4 +0,0 @@ -import endorphin from 'endorphin'; -import * as AppUI from './app-ui/app-ui.html'; - -endorphin('endorphin-app', AppUI, { target: document.getElementById('main') }); diff --git a/frameworks/keyed/etch/.babelrc b/frameworks/keyed/etch/.babelrc deleted file mode 100644 index 55a896652..000000000 --- a/frameworks/keyed/etch/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - presets: [ "es2015", "react"], - plugins: [] -} \ No newline at end of file diff --git a/frameworks/keyed/etch/index.html b/frameworks/keyed/etch/index.html deleted file mode 100644 index bf9175d3a..000000000 --- a/frameworks/keyed/etch/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - etch v0.12.5 keyed - - - -
- - - diff --git a/frameworks/keyed/etch/package.json b/frameworks/keyed/etch/package.json deleted file mode 100644 index c46aa688f..000000000 --- a/frameworks/keyed/etch/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "js-framework-benchmark-etch-keyed", - "version": "1.0.0", - "description": "Etch keyed demo", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "etch" - }, - "scripts": { - "build-dev": "webpack -w -d", - "build-prod": "webpack -p" - }, - "devDependencies": { - "babel-core": "6.26.3", - "babel-loader": "7.1.5", - "babel-preset-es2015": "6.24.1", - "babel-preset-react": "6.24.1", - "jsx-loader": "0.13.2", - "webpack": "4.16.3", - "webpack-cli": "^3.1.0" - }, - "dependencies": { - "etch": "0.14.0" - } -} diff --git a/frameworks/keyed/etch/src/Main.jsx b/frameworks/keyed/etch/src/Main.jsx deleted file mode 100644 index 4da615a1f..000000000 --- a/frameworks/keyed/etch/src/Main.jsx +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; -/** @jsx etch.dom */ - -var etch = require('etch'); -const {Row} = require('./Row'); -const {Store} = require('./Store'); - -export class Main { - constructor(props, children) { - this.props = props; - this.children = children; - - this.store = new Store(); - - this.select = this.select.bind(this); - this.delete = this.delete.bind(this); - this.add = this.add.bind(this); - this.run = this.run.bind(this); - this.updateRows = this.updateRows.bind(this); - this.runLots = this.runLots.bind(this); - this.clear = this.clear.bind(this); - this.swapRows = this.swapRows.bind(this); - - etch.initialize(this); - } - - update (props, children) { - return etch.update(this); - } - - run() { - this.store.run(); - this.update(); - } - add() { - this.store.add(); - this.update(); - } - updateRows() { - this.store.update(); - this.update(); - } - select(id) { - this.store.select(id); - this.update(); - } - delete(id) { - this.store.delete(id); - this.update(); - } - runLots() { - this.store.runLots(); - this.update(); - } - clear() { - this.store.clear(); - this.update(); - } - swapRows() { - this.store.swapRows(); - this.update(); - } - render () { - let rows = this.store.data.map((d,i) => { - return - }); - return (
-
-
-
-

etch v0.12.5 (keyed)

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - - {rows} - -
- -
); - } -} diff --git a/frameworks/keyed/etch/src/Row.jsx b/frameworks/keyed/etch/src/Row.jsx deleted file mode 100644 index a6abebe2d..000000000 --- a/frameworks/keyed/etch/src/Row.jsx +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; -/** @jsx etch.dom */ - -var etch = require('etch'); - -export class Row { - constructor(props, children) { - this.props = props; - this.children = children; - - this.onDelete = this.onDelete.bind(this); - this.onClick = this.onClick.bind(this); - - etch.initialize(this); - } - - update(nextProps, children) { - if (nextProps.data === this.props.data && nextProps.styleClass === this.props.styleClass) { - return Promise.resolve(); - } - this.props = Object.assign({}, this.props, nextProps); - this.children = children; - return etch.update(this); - } - - onDelete() { - this.props.onDelete(this.props.data.id); - } - onClick() { - this.props.onClick(this.props.data.id); - } - - render() { - let {styleClass, onClick, onDelete, data} = this.props; - return ( - {data.id} - - {data.label} - - - - ); - } -} diff --git a/frameworks/keyed/etch/src/Store.es6.js b/frameworks/keyed/etch/src/Store.es6.js deleted file mode 100644 index 2a39c87b7..000000000 --- a/frameworks/keyed/etch/src/Store.es6.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -function _random(max) { - return Math.round(Math.random()*1000)%max; -} - -export class Store { - constructor() { - this.data = []; - this.selected = undefined; - this.id = 1; - } - buildData(count = 1000) { - var adjectives = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]; - var colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; - var nouns = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]; - var data = []; - for (var i = 0; i < count; i++) - data.push({id: this.id++, label: adjectives[_random(adjectives.length)] + " " + colours[_random(colours.length)] + " " + nouns[_random(nouns.length)] }); - return data; - } - updateData(mod = 10) { - for (let i=0;i d.id==id); - this.data.splice(idx, 1); - } - run() { - this.data = this.buildData(); - this.selected = undefined; - } - add() { - this.data = this.data.concat(this.buildData(1000)); - } - update() { - this.updateData(); - } - select(id) { - this.selected = id; - } - runLots() { - this.data = this.buildData(10000); - this.selected = undefined; - } - clear() { - this.data = []; - this.selected = undefined; - } - swapRows() { - if(this.data.length > 998) { - var a = this.data[1]; - this.data[1] = this.data[998]; - this.data[998] = a; - } - } -} \ No newline at end of file diff --git a/frameworks/keyed/etch/src/main.es6.js b/frameworks/keyed/etch/src/main.es6.js deleted file mode 100644 index f373c7358..000000000 --- a/frameworks/keyed/etch/src/main.es6.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -let {Main} = require('./Main'); -let component = new Main({}); -document.getElementById('main').appendChild(component.element); diff --git a/frameworks/keyed/etch/webpack.config.js b/frameworks/keyed/etch/webpack.config.js deleted file mode 100644 index a311907ab..000000000 --- a/frameworks/keyed/etch/webpack.config.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; -require("babel-plugin-syntax-jsx") -var path = require('path') -var webpack = require('webpack') -var cache = {}; -var loaders = [ - { - test: /\.jsx$/, - loader: 'babel-loader' - }, - { - test: /(\.es6)?\.js$/, - loader: 'babel-loader' - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader' - } -]; -var extensions = [ - '.js', '.jsx', '.es6.js' -]; - -module.exports = [{ - cache: cache, - module: { - rules: loaders - }, - entry: { - main: './src/main.es6.js', - }, - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js' - }, - resolve: { - extensions: extensions, - modules: [ - __dirname, - path.resolve(__dirname, "src"), - "node_modules" - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }) - ] -}]; diff --git a/frameworks/keyed/faster-dom/index.html b/frameworks/keyed/faster-dom/index.html deleted file mode 100644 index c9ea63c2b..000000000 --- a/frameworks/keyed/faster-dom/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - FasterDom-"keyed" - - - -
-
- - - diff --git a/frameworks/keyed/faster-dom/package.json b/frameworks/keyed/faster-dom/package.json deleted file mode 100644 index 5ebc35592..000000000 --- a/frameworks/keyed/faster-dom/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "js-framework-benchmark-faster-dom", - "main": "index.js", - "description": "Benchmark for faster-dom.js framework", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "faster-dom" - }, - "scripts": { - "build-dev": "webpack -w -d", - "build-prod": "webpack -p" - }, - "keywords": [ - "faster-dom", - "webpack" - ], - "author": "Stefan Krause", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "babel-core": "6.24.1", - "babel-loader": "7.0.0", - "babel-preset-es2015": "6.24.1", - "webpack": "4.29.2", - "webpack-cli": "3.2.3" - }, - "dependencies": { - "faster-dom": "0.0.43-alpha", - "terser-webpack-plugin": "^1.2.3" - } -} diff --git a/frameworks/keyed/faster-dom/src/Main.js b/frameworks/keyed/faster-dom/src/Main.js deleted file mode 100644 index 3d9d7a9ec..000000000 --- a/frameworks/keyed/faster-dom/src/Main.js +++ /dev/null @@ -1,290 +0,0 @@ -import { Component, bootstrap, createComponent, fdFor, fdObject, fdValue } from 'faster-dom' - -import { Store } from './Store'; - -function createTr(item, selectedId, onSelect, onRemove) { - return createComponent(TrComponent, item, selectedId, onSelect, onRemove) -} - -class TrComponent extends Component { - constructor(item, selectedItem, onSelect, onRemove) { - super(); - this.selectedItemObs = selectedItem; - const selectedObs = fdValue(this.selectedItemObs.value === item ? true : false) - - this.selectedSub = (newItem) => { - selectedObs.value = newItem === item ? true : false - } - this.selectedItemObs.addSubscriber(this.selectedSub) - this.reactive = { - selected: selectedObs - } - this.fdObjects = { - trClasses: new fdObject({ - 'danger': this.reactive.selected - }), - } - this.onSelectClick = () => { - onSelect(item); - } - this.onRemoveClick = () => { - onRemove(item); - } - this.template = { - tag: "tr", - classList: this.fdObjects.trClasses, - children: [ - { - tag: "td", - classList: 'col-md-1', - textValue: item.id, - }, - { - tag: "td", - classList: 'col-md-4', - children: [ - { - tag: "a", - attrs: { - 'data-action': 'select', - }, - listeners: { - click: this.onSelectClick - }, - textValue: item.label, - } - ] - }, - { - tag: "td", - classList: 'col-md-1', - children: [ - { - tag: 'a', - children: [ - { - tag: 'span', - classList: 'remove glyphicon glyphicon-remove', - listeners: { - click: this.onRemoveClick - }, - attrs: { - 'aria-hidden': 'true' - } - } - ] - } - ] - }, - { - tag: "td", - classList: 'col-md-6' - } - ] - } - } - - onDestroy() { - this.selectedItemObs.removeSubscriber(this.selectedSub); - } -} - -function createMainContainer() { - return createComponent(MainContainer); -} - -class MainContainer extends Component { - constructor() { - super(); - this.store = new Store(); - this.onRunClick = () => { - this.store.setData(); - } - this.onRunLotsClick = () => { - this.store.setData(10000); - } - this.onAppendClick = () => { - this.store.append(); - } - this.onClear = () => { - this.store.clear(); - } - this.onUpdateClick = () => { - this.store.update(); - } - this.onSwapClick = () => { - this.store.swapData(); - } - this.template = { - tag: "div", - classList: 'container', - children: [ - { - tag: "div", - classList: "jumbotron", - children: [ - { - tag: "div", - classList: 'row', - children: [ - { - tag: "div", - classList: "col-md-6", - children: [ - { - tag: "h1", - textValue: 'FastDom-"keyed"' - } - ] - }, - { - tag: "div", - classList: 'col-md-6', - children: [ - { - tag: "div", - classList: 'row', - children: [ - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - classList: 'btn btn-primary btn-block', - attrs: { - id: "run" - }, - textValue: "Create 1,000 rows", - listeners: { - click: this.onRunClick, - } - } - ] - }, - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - attrs: { - id: "runlots" - }, - classList: 'btn btn-primary btn-block', - textValue: "Create 10,000 rows", - listeners: { - click: this.onRunLotsClick, - } - } - ] - }, - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - attrs: { - id: "add" - }, - classList: 'btn btn-primary btn-block', - textValue: "Append 1,000 rows", - listeners: { - click: this.onAppendClick, - } - } - ] - }, - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - attrs: { - id: "update" - }, - classList: 'btn btn-primary btn-block', - textValue: "Update every 10th row", - listeners: { - click: this.onUpdateClick, - } - } - ] - }, - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - attrs: { - id: "clear" - }, - classList: 'btn btn-primary btn-block', - textValue: "Clear", - listeners: { - click: this.onClear, - } - } - ] - }, - { - tag: "div", - classList: 'col-sm-6 smallpad', - children: [ - { - tag: "button", - attrs: { - id: "swaprows" - }, - classList: 'btn btn-primary btn-block', - textValue: "Swap Rows", - listeners: { - click: this.onSwapClick, - } - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - tag: "table", - attrs: { - id: "table" - }, - classList: 'table table-hover table-striped test-data', - children: [ - { - tag: "tbody", - children: [ - fdFor(this.store.data, createTr, [ - (e) => e, - () => this.store.selectedItem, - () => this.store.select, - () => this.store.remove, - ], (item) => item.id) - ] - } - ] - }, - { - tag: "span", - attrs: { - 'aria-hidden': true, - }, - classList: 'preloadicon glyphicon glyphicon-remove' - } - ] - } - } -} - -bootstrap('#main', createMainContainer) \ No newline at end of file diff --git a/frameworks/keyed/faster-dom/src/Store.js b/frameworks/keyed/faster-dom/src/Store.js deleted file mode 100644 index a1ec1f1e8..000000000 --- a/frameworks/keyed/faster-dom/src/Store.js +++ /dev/null @@ -1,124 +0,0 @@ -import { fdValue } from 'faster-dom' - -let id = 1; - -const rand = Math.random - -function buildData(count) { - const adjectives = [ - "pretty", - "large", - "big", - "small", - "tall", - "short", - "long", - "handsome", - "plain", - "quaint", - "clean", - "elegant", - "easy", - "angry", - "crazy", - "helpful", - "mushy", - "odd", - "unsightly", - "adorable", - "important", - "inexpensive", - "cheap", - "expensive", - "fancy", - ] - - const colours = [ - "red", - "yellow", - "blue", - "green", - "pink", - "brown", - "purple", - "brown", - "white", - "black", - "orange", - ] - - const nouns = [ - "table", - "chair", - "house", - "bbq", - "desk", - "car", - "pony", - "cookie", - "sandwich", - "burger", - "pizza", - "mouse", - "keyboard", - ] - - const arr = []; - for(let i = 0; i> 0]} ${colours[ - rand() * 1000 % colours.length >> 0]} ${nouns[ - rand() * 1000 % nouns.length >> 0]}`) - }) - } - return arr; -} - -export class Store { - constructor() { - this.data = fdValue([]); - this.selectedItem = fdValue(null) - this.select = (item) => { - this.selectedItem.value = item; - } - this.remove = (item) => { - const removeIndex = this.data.value.indexOf(item) - this.data.value.splice(removeIndex, 1) - this.data.value = [...this.data.value] - } - } - - setData(count = 1000) { - this.data.value = buildData(count); - } - - append(count = 1000) { - this.data.value = this.data.value.concat(buildData(count)) - } - - clear() { - this.data.value = []; - } - - update() { - const length = this.data.value.length - for (let i = 0; i < length; i += 10) { - const item = this.data.value[i] - item.label.value = `${item.label.value} !!!` - } - } - - swapData() { - const arr = this.data.value - if (arr.length <= 998) { - return - } - - const temp = arr[1] - arr[1] = arr[998] - arr[998] = temp - this.data.value = [...arr] - } -} \ No newline at end of file diff --git a/frameworks/keyed/faster-dom/webpack.config.js b/frameworks/keyed/faster-dom/webpack.config.js deleted file mode 100644 index 71d67b623..000000000 --- a/frameworks/keyed/faster-dom/webpack.config.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; -const path = require('path') -const TerserPlugin = require('terser-webpack-plugin'); - -const extensions = [ - '.js', '.jsx', '.es6.js' -]; - -module.exports = [{ - mode: 'production', - module: { - rules: [ - { - test: /\.js$/, - loader: 'babel-loader' - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader' - } - ] - }, - entry: { - main: './src/Main.js', - }, - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js' - }, - optimization: { - minimizer: [ - new TerserPlugin({ - terserOptions: { - parse: { - // we want terser to parse ecma 8 code. However, we don't want it - // to apply any minfication steps that turns valid ecma 5 code - // into invalid ecma 5 code. This is why the 'compress' and 'output' - // sections only apply transformations that are ecma 5 safe - // https://github.com/facebook/create-react-app/pull/4234 - ecma: 8, - }, - compress: { - ecma: 5, - warnings: false, - // Disabled because of an issue with Uglify breaking seemingly valid code: - // https://github.com/facebook/create-react-app/issues/2376 - // Pending further investigation: - // https://github.com/mishoo/UglifyJS2/issues/2011 - comparisons: false, - }, - mangle: { - safari10: true, - }, - output: { - ecma: 5, - comments: false, - // Turned on because emoji and regex is not minified properly using default - // https://github.com/facebook/create-react-app/issues/2488 - ascii_only: true, - }, - }, - // Use multi-process parallel running to improve the build speed - // Default number of concurrent runs: os.cpus().length - 1 - parallel: true, - // Enable file caching - cache: true, - }), - ] - }, - resolve: { - extensions: extensions, - modules: [ - __dirname, - path.resolve(__dirname, "src"), - "node_modules" - ], - alias: { - } - } -}]; \ No newline at end of file diff --git a/frameworks/keyed/fidan/app.tsx b/frameworks/keyed/fidan/app.tsx deleted file mode 100644 index 6a3c7fca0..000000000 --- a/frameworks/keyed/fidan/app.tsx +++ /dev/null @@ -1,184 +0,0 @@ -"use strict"; -import { value, beforeCompute, FidanArray } from "@fidanjs/runtime"; - -import { buildData, BenchmarkDataRow } from "./data"; -import { jsxArrayMap } from "@fidanjs/jsx"; - -const dataArray = value([]) as FidanArray; -const selectedTr = value(null); - -beforeCompute( - null, - (current, prev) => { - if (prev) prev.className = ""; - if (current) current.className = "danger"; - }, - [selectedTr] -); - -const run = () => { - const data = buildData(1000); - dataArray(data); -}; - -const runLots = () => { - selectedTr(null); - const data = buildData(10000); - dataArray(data); -}; - -const add = () => { - selectedTr(null); - const currentData = dataArray(); - const newData = buildData(1000); - currentData.push.apply(currentData, newData); -}; - -const cleardata = () => { - selectedTr(null); - dataArray([]); -}; - -const select = e => { - selectedTr(e.target.parentNode.parentNode); -}; - -const del = e => { - const id = parseInt(e.target.getAttribute("data-id")); - const data = dataArray(); - const idx = data.findIndex(item => item.id() == id); - data.splice(idx, 1); -}; - -const update = () => { - const data = dataArray(); - for (let i = 0; i < data.length; i += 10) { - data[i].label(data[i].label() + " !!!"); - } -}; - -const swaprows = () => { - const data = dataArray(); - const x = 1, - y = 998; - const sp1 = data.splice(x, 1, data[y])[0]; - data.splice(y, 1, sp1); - // dataArray().splice(y, 1, dataArray().splice(x, 1, dataArray()[y])[0]); -}; - -const itemView = (dataItem: BenchmarkDataRow) => { - return ( - - {dataItem.id} - - {dataItem.label} - - - - - - - - ); -}; - -const mainView = (( -
-
-
-
-

fidan

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - -
-
-) as any) as HTMLElement; - -mainView.addEventListener("click", (e: any) => { - if (e.target.matches(".lbl")) { - select(e); - } else if (e.target.matches(".remove")) { - del(e); - } -}); - -document.getElementById("main").appendChild(mainView); diff --git a/frameworks/keyed/fidan/data.ts b/frameworks/keyed/fidan/data.ts deleted file mode 100644 index 8f2636f8c..000000000 --- a/frameworks/keyed/fidan/data.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { value, FidanValue } from "@fidanjs/runtime"; - -export interface BenchmarkDataRow { - id: FidanValue; - label: FidanValue; -} - -let did = 1; -function _random(max) { - return Math.round(Math.random() * 1000) % max; -} - -export const buildData = count => { - var adjectives = [ - "pretty", - "large", - "big", - "small", - "tall", - "short", - "long", - "handsome", - "plain", - "quaint", - "clean", - "elegant", - "easy", - "angry", - "crazy", - "helpful", - "mushy", - "odd", - "unsightly", - "adorable", - "important", - "inexpensive", - "cheap", - "expensive", - "fancy" - ]; - var colours = [ - "red", - "yellow", - "blue", - "green", - "pink", - "brown", - "purple", - "brown", - "white", - "black", - "orange" - ]; - var nouns = [ - "table", - "chair", - "house", - "bbq", - "desk", - "car", - "pony", - "cookie", - "sandwich", - "burger", - "pizza", - "mouse", - "keyboard" - ]; - var data = []; - for (var i = 0; i < count; i++) { - data.push({ - id: value(did++), - label: value( - adjectives[_random(adjectives.length)] + - " " + - colours[_random(colours.length)] + - " " + - nouns[_random(nouns.length)] - ) - }); - } - return data; -}; diff --git a/frameworks/keyed/fidan/index.html b/frameworks/keyed/fidan/index.html deleted file mode 100644 index 10b1a92f3..000000000 --- a/frameworks/keyed/fidan/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - fidan - - - -
- - - diff --git a/frameworks/keyed/fidan/package.json b/frameworks/keyed/fidan/package.json deleted file mode 100644 index 0d050d378..000000000 --- a/frameworks/keyed/fidan/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "js-framework-benchmark-fidan", - "version": "1.0.0", - "description": "fidan demo", - "main": "app.js", - "scripts": { - "build-dev": "webpack -d", - "build-prod": "webpack -p", - "start": "ws", - "yalc-link": "yalc link @fidanjs/runtime" - }, - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@fidanjs/runtime", - "issues": [694] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/krausest/js-framework-benchmark.git" - }, - "keywords": [ - "fidanjs" - ], - "author": "Ismail Codar", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/krausest/js-framework-benchmark/issues" - }, - "homepage": "https://github.com/krausest/js-framework-benchmark#readme", - "dependencies": { - "@fidanjs/jsx": "0.0.8", - "@fidanjs/runtime": "0.0.23" - }, - "devDependencies": { - "@babel/preset-env": "7.4.4", - "@babel/preset-typescript": "7.3.3", - "babel-loader": "8.0.6", - "webpack": "4.31.0", - "webpack-cli": "3.3.2" - } -} diff --git a/frameworks/keyed/fidan/webpack.config.js b/frameworks/keyed/fidan/webpack.config.js deleted file mode 100644 index c73d1831b..000000000 --- a/frameworks/keyed/fidan/webpack.config.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - entry: "./app.tsx", - output: { - filename: "app.min.js" - }, - resolve: { - extensions: [".ts", ".tsx"] - }, - module: { - rules: [ - { - test: /\.tsx?$/, - loader: "babel-loader", - options: { - presets: ["@babel/preset-typescript", "@babel/preset-env"], - plugins: ["@fidanjs/fidan-jsx"] - } - } - ] - } -}; diff --git a/frameworks/keyed/fntags/.gitignore b/frameworks/keyed/fntags/.gitignore deleted file mode 100644 index ae3a6d4d9..000000000 --- a/frameworks/keyed/fntags/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -fntags.js -node_modules \ No newline at end of file diff --git a/frameworks/keyed/fntags/build.js b/frameworks/keyed/fntags/build.js deleted file mode 100644 index 65a2039ee..000000000 --- a/frameworks/keyed/fntags/build.js +++ /dev/null @@ -1,20 +0,0 @@ -const fs = require( 'fs-extra' ) -const terser = require( 'terser' ) - -if( fs.existsSync( 'dist' ) ) fs.removeSync( 'dist' ) -fs.mkdirSync( 'dist' ) - -const minify = ( file ) => { - let content = fs.readFileSync( file, 'utf8' ) - if( process.argv[ 2 ] === 'dev' ) { - return content - } else { - const code = terser.minify( content ).code - if( !code ) throw new Error( `failed to minify ${file}` ).stack - return code - } -} - -fs.writeFileSync( 'dist/fntags.js', minify( 'node_modules/fntags/src/fntags.js' ) ) - -fs.writeFileSync( 'dist/Main.js', minify( 'src/Main.js' ).replace( '../node_modules/fntags/src/fntags.js', './fntags.js' ) ) \ No newline at end of file diff --git a/frameworks/keyed/fntags/index.html b/frameworks/keyed/fntags/index.html deleted file mode 100644 index fa9fa083d..000000000 --- a/frameworks/keyed/fntags/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - fntags-keyed - - - - - - \ No newline at end of file diff --git a/frameworks/keyed/fntags/package.json b/frameworks/keyed/fntags/package.json deleted file mode 100644 index 67616af70..000000000 --- a/frameworks/keyed/fntags/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "js-framework-benchmark-fntags", - "version": "0.0.1", - "description": "fntags demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "fntags" - }, - "scripts": { - "build-dev": "node build.js dev", - "build-prod": "node build.js" - }, - "author": "Robert Kempton", - "dependencies": { - "fntags": "0.1.7" - }, - "devDependencies": { - "fs-extra": "8.1.0", - "terser": "4.3.8" - } -} diff --git a/frameworks/keyed/fntags/src/Main.js b/frameworks/keyed/fntags/src/Main.js deleted file mode 100644 index 9bd9ef885..000000000 --- a/frameworks/keyed/fntags/src/Main.js +++ /dev/null @@ -1,125 +0,0 @@ -import { findElement, fnapp, fnbind, fnstate, h, resetState } from '../node_modules/fntags/src/fntags.js' - -let data = fnstate( { current: [] } ) - -function random( max ) { return Math.round( Math.random() * 1000 ) % max } - -const A = [ 'pretty', 'large', 'big', 'small', 'tall', 'short', 'long', 'handsome', 'plain', 'quaint', 'clean', - 'elegant', 'easy', 'angry', 'crazy', 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', 'important', 'inexpensive', - 'cheap', 'expensive', 'fancy' ] -const C = [ 'red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', 'brown', 'white', 'black', 'orange' ] -const N = [ 'table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', 'sandwich', 'burger', 'pizza', 'mouse', - 'keyboard' ] - -let nextId = 1 -function buildData( count ) { - const newData = new Array( count ) - for( let i = 0; i < count; i++ ) { - newData[ i ] = fnstate( { - id: nextId++, - label: `${A[ random( A.length ) ]} ${C[ random( C.length ) ]} ${N[ random( N.length ) ]}` - } ) - } - return newData -} - -const Button = ( id, title, onclick ) => - h( 'div', { class: 'col-sm-6 smallpad' }, - h( 'button', { id, type: 'button', class: 'btn btn-primary btn-block', onclick: onclick }, title ) - ) - -let selectedId= 0 -const row = ( item ) => { - let label = h( 'a', { - onclick: () => { - let currentSelection = data.current.find( i => i && i.id == selectedId ) - if( currentSelection ) findElement( currentSelection ).className = '' - findElement( item ).className = 'danger' - selectedId = item.id - } - }, item.label ) - let id = h( 'td', { class: 'col-md-1' }, item.id ) - let tr = h( 'tr', { id: item.id.toString(), class: selectedId === item.id ? 'danger' : '' }, - id, - h( 'td', { class: 'col-md-4' }, label ), - h( 'td', { - class: 'col-md-1', - onclick: ( e ) => { - e.preventDefault() - tr.replaceWith( '' ) - resetState( item ) - data.current[ data.current.findIndex( i => i && i.id === item.id ) ] = null - tr = null - } - }, - h( 'a', - h( 'span', { class: 'glyphicon glyphicon-remove', 'aria-hidden': 'true' } ) - ) - ), - h( 'td', { class: 'col-md-6' } ) - ) - return fnbind( - item, - tr, - () => { - label.innerText = item.label - id.innerText = item.id - } - ) -} - -const dataTable = h( 'tbody' ) -fnapp( document.body, - h( 'div', { class: 'container' }, - h( 'div', { class: 'jumbotron' }, - h( 'div', { class: 'row' }, - h( 'div', { class: 'col-md-6' }, - h( 'h1', 'fntags keyed' ) - ), - h( 'div', { class: 'col-md-6' }, - h( 'div', { class: 'row' }, - Button( 'run', 'Create 1,000 rows', () => data.current = buildData( 1000 ) ), - Button( 'runlots', 'Create 10,000 rows', () => data.current = buildData( 10000 ) ), - Button( 'add', 'Append 1,000 rows', () => { - let newData = buildData( 1000 ) - data.current.push( ...data.current.concat( newData ) ) - dataTable.append( ...newData.map( row ) ) - } ), - Button( 'update', 'Update every 10th row', () => { - for( let i = 0; i < data.current.length; i += 10 ) { - data.current[ i ].label += ' !!!' - } - } ), - Button( 'clear', 'Clear', () => data.current = [] ), - Button( 'swaprows', 'Swap Rows', ( ) => { - const theData = data.current - if( theData.length > 998 ) { - - let rowa = findElement( theData[ 1 ], el => el.getAttribute( 'id' ) == theData[ 1 ].id ) - let rowb = findElement( theData[ 998 ], el => el.getAttribute( 'id' ) == theData[ 998 ].id ) - - const a = theData[ 1 ] - theData[ 1 ] = theData[ 998 ] - theData[ 998 ] = a - let sib = rowa.nextSibling - let parent = rowa.parentNode - parent.insertBefore( rowa, rowb ) - parent.insertBefore( rowb, sib ) - - } - } ) - ) - ) - ) - ) - ), - h( 'table', { class: 'table table-hover table-striped test-data' }, - fnbind( data, dataTable, ( el, st ) => { - while( el.firstChild ) { - el.removeChild( el.firstChild ) - } - el.append( ...st.current.filter( r => r ).map( row ) ) - } ) - ), - h( 'span', { class: 'preloadicon glyphicon glyphicon-remove', 'aria-hidden': 'true' } ) -) \ No newline at end of file diff --git a/frameworks/keyed/ganic/.babelrc b/frameworks/keyed/ganic/.babelrc deleted file mode 100644 index 91f8895b9..000000000 --- a/frameworks/keyed/ganic/.babelrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { - "useBuiltIns": false - }] - ], - "plugins": [ - [ - "@babel/plugin-transform-react-jsx", - { - "pragma": "Ganic.createElement", - "pragmaFrag": "Ganic.Fragment", - "throwIfNamespace": false - } - ], - [ - "@babel/plugin-transform-runtime", - { - "regenerator": true - } - ] - ], - "parserOpts": {} -} \ No newline at end of file diff --git a/frameworks/keyed/ganic/index.html b/frameworks/keyed/ganic/index.html deleted file mode 100644 index ac2225615..000000000 --- a/frameworks/keyed/ganic/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Ganic - - - -
- - - diff --git a/frameworks/keyed/ganic/package.json b/frameworks/keyed/ganic/package.json deleted file mode 100644 index 50ac6eab0..000000000 --- a/frameworks/keyed/ganic/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "js-framework-benchmark-ganic", - "version": "1.0.0", - "description": "Benchmark for ganic library", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "ganic" - }, - "scripts": { - "build-dev": "webpack --watch", - "build-prod": "webpack" - }, - "author": "Rango Yuan", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "dependencies": { - "ganic": "2.1.2", - "ganic-dom": "2.1.7", - "ganic-usex": "2.1.4" - }, - "devDependencies": { - "@babel/core": "7.7.4", - "@babel/plugin-transform-react-jsx": "7.7.4", - "@babel/plugin-transform-runtime": "7.6.2", - "@babel/preset-env": "7.7.4", - "@babel/runtime": "7.7.4", - "babel-loader": "8.0.6", - "terser-webpack-plugin": "1.3.0", - "webpack": "4.34.0", - "webpack-cli": "3.3.4" - } -} diff --git a/frameworks/keyed/ganic/src/Benchmark.js b/frameworks/keyed/ganic/src/Benchmark.js deleted file mode 100644 index dcd9931cc..000000000 --- a/frameworks/keyed/ganic/src/Benchmark.js +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-disable no-unused-vars */ -import Ganic from 'ganic'; -import { useCallback } from "ganic-usex"; -import useStore from './useStore'; - -const GlyphIcon = ; - -const Row = ({ selected, item, dispatch }) => { - const select = useCallback(() => dispatch({ type: 'SELECT', id: item.id })), - remove = useCallback(() => dispatch({ type: 'REMOVE', id: item.id })); - - return ( - {item.id} - {item.label} - {GlyphIcon} - - ); -}; - -const Button = ({ id, cb, title }) => ( -
- -
-); - -const Jumbotron = ({ dispatch }) => ( -
-
-
-

Ganic keyed

-
-
-
-
-
-
-
-); - -const Benchmark = () => { - const [state, dispatch] = useStore(); - - return (
- - - {state.data.map(item => ( - - ))} -
- -
); -} - -export default Benchmark; diff --git a/frameworks/keyed/ganic/src/buildData.js b/frameworks/keyed/ganic/src/buildData.js deleted file mode 100644 index 3649bdeff..000000000 --- a/frameworks/keyed/ganic/src/buildData.js +++ /dev/null @@ -1,23 +0,0 @@ -const random = max => Math.round(Math.random() * 1000) % max; - -const A = ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", - "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", - "cheap", "expensive", "fancy"]; -const C = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]; -const N = ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", - "keyboard"]; - -let nextId = 1; - -const buildData = count => { - const data = new Array(count); - for (let i = 0; i < count; i++) { - data[i] = { - id: nextId++, - label: `${A[random(A.length)]} ${C[random(C.length)]} ${N[random(N.length)]}`, - }; - } - return data; -} - -export default buildData; diff --git a/frameworks/keyed/ganic/src/main.js b/frameworks/keyed/ganic/src/main.js deleted file mode 100644 index e1231ba2c..000000000 --- a/frameworks/keyed/ganic/src/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import Ganic from 'ganic'; -import GanicDOM from 'ganic-dom'; -import Benchmark from './Benchmark'; - -GanicDOM.render(, document.getElementById('main')); diff --git a/frameworks/keyed/ganic/src/useStore.js b/frameworks/keyed/ganic/src/useStore.js deleted file mode 100644 index ead2c5f90..000000000 --- a/frameworks/keyed/ganic/src/useStore.js +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable no-unused-vars */ -import { useCallback, useInitialState } from 'ganic-usex'; -import buildData from './buildData'; - -// todo: move useReducer to ganic-usex -const useReducer = (reducer, initState) => { - const [state, setState] = useInitialState(initState); - const dispatch = useCallback(action => setState(s => reducer(s, action))); - return [state, dispatch]; -} - -const listReducer = (state, action) => { - const { data, selected } = state; - switch (action.type) { - case 'RUN': - return { data: buildData(1000), selected: 0 }; - case 'RUN_LOTS': - return { data: buildData(10000), selected: 0 }; - case 'ADD': - return { data: data.concat(buildData(1000)), selected }; - case 'UPDATE': - const newData = data.slice(0); - for (let i = 0; i < newData.length; i += 10) { - const r = newData[i]; - newData[i] = { id: r.id, label: r.label + " !!!" }; - } - return { data: newData, selected }; - case 'CLEAR': - return { data: [], selected: 0 }; - case 'SWAP_ROWS': - return { data: [data[0], data[998], ...data.slice(2, 998), data[1], data[999]], selected }; - case 'REMOVE': - const idx = data.findIndex((d) => d.id === action.id); - return { data: [...data.slice(0, idx), ...data.slice(idx + 1)], selected }; - case 'SELECT': - return { data, selected: action.id }; - } - return state; -} - -const initState = { data: [], selected: 0 }; -const useStore = () => useReducer(listReducer, initState); - -export default useStore; diff --git a/frameworks/keyed/ganic/webpack.config.js b/frameworks/keyed/ganic/webpack.config.js deleted file mode 100644 index 249746ec7..000000000 --- a/frameworks/keyed/ganic/webpack.config.js +++ /dev/null @@ -1,61 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const TerserPlugin = require('terser-webpack-plugin'); - -module.exports = { - mode: 'production', - // mode: 'development', - entry: { - main: path.join(__dirname, 'src', 'main.js'), - }, - output: { - path: path.join(__dirname, 'dist'), - filename: '[name].js' - }, - resolve: { - extensions: ['.js', '.jsx'] - }, - module: { - rules: [{ - test: /\.jsx?$/, - exclude: /node_modules/, - use: [ - { - loader: 'babel-loader', - } - ] - }] - }, - optimization: { - minimizer: [ - new TerserPlugin({ - terserOptions: { - parse: { - ecma: 8, - }, - compress: { - ecma: 5, - warnings: false, - comparisons: false, - }, - mangle: { - safari10: true, - }, - output: { - ecma: 5, - comments: false, - ascii_only: true, - }, - }, - parallel: true, - cache: true, - }), - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': { NODE_ENV: JSON.stringify('production') } - // 'process.env': { NODE_ENV: JSON.stringify('development') } - }), - ], -}; diff --git a/frameworks/keyed/glasgow/.babelrc b/frameworks/keyed/glasgow/.babelrc deleted file mode 100644 index 773e66fd4..000000000 --- a/frameworks/keyed/glasgow/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "plugins": [ - "transform-react-jsx", - ] -} diff --git a/frameworks/keyed/glasgow/index.html b/frameworks/keyed/glasgow/index.html deleted file mode 100644 index c3f20ca73..000000000 --- a/frameworks/keyed/glasgow/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Glasgow - - - -
- - - diff --git a/frameworks/keyed/glasgow/package.json b/frameworks/keyed/glasgow/package.json deleted file mode 100644 index 47519a43f..000000000 --- a/frameworks/keyed/glasgow/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "js-framework-benchmark-glasgow", - "version": "1.0.0", - "description": "Benchmark for glasgow framework", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "glasgow" - }, - "scripts": { - "build-dev": "rollup -c", - "build-prod": "rollup -c --environment production" - }, - "keywords": [ - "ractive" - ], - "author": "Stefan Krause", - "license": "Apache-2.0", - "homepage": "https://github.com/krausest/js-framework-benchmark", - "repository": { - "type": "git", - "url": "https://github.com/krausest/js-framework-benchmark.git" - }, - "devDependencies": { - "babel-core": "6.26.3", - "babel-loader": "7.1.5", - "babel-preset-stage-0": "6.24.1", - "rollup": "^0.63.4", - "rollup-plugin-alias": "^1.4.0", - "rollup-plugin-babel": "^3.0.7", - "rollup-plugin-commonjs": "^9.1.4", - "rollup-plugin-node-resolve": "^3.3.0", - "rollup-plugin-replace": "^2.0.0", - "babel-plugin-transform-react-jsx": "^6.24.1" - }, - "dependencies": { - "glasgow": "0.2.7" - } -} diff --git a/frameworks/keyed/glasgow/readme.md b/frameworks/keyed/glasgow/readme.md deleted file mode 100644 index 7472e6db7..000000000 --- a/frameworks/keyed/glasgow/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -# Glasgow Keyed -Bundle is done using Rollup. diff --git a/frameworks/keyed/glasgow/rollup.config.js b/frameworks/keyed/glasgow/rollup.config.js deleted file mode 100644 index d5f67b318..000000000 --- a/frameworks/keyed/glasgow/rollup.config.js +++ /dev/null @@ -1,42 +0,0 @@ -const commonjsPlugin = require('rollup-plugin-commonjs'); -const nodeResolvePlugin = require('rollup-plugin-node-resolve'); -const babelPlugin = require('rollup-plugin-babel'); -const path = require('path'); -const replace = require('rollup-plugin-replace'); -const alias = require('rollup-plugin-alias'); - -const isProduction = process.env.production; - -const extensions = ['.mjs', '.js', '.jsx']; - -// see below for details on the options -const plugins = [ - nodeResolvePlugin({ - preferBuiltins: false, - extensions: extensions - }), - replace({ - 'process.env.NODE_ENV': isProduction ? JSON.stringify('production') : JSON.stringify('development'), - sourcemap: false - }), - babelPlugin({ - exclude: 'node_modules/**', - sourceMaps: false - }), - commonjsPlugin({ - sourceMap: false, - extensions: extensions - }), -]; - - -export default { - input: path.join(__dirname, 'src/main.es6.js'), - output: { - name: 'glasgow', - format: 'iife', - file: path.join(__dirname, 'dist', 'main.js'), - sourcemap: false - }, - plugins: plugins -} diff --git a/frameworks/keyed/glasgow/src/controller.jsx b/frameworks/keyed/glasgow/src/controller.jsx deleted file mode 100644 index dcd7fb423..000000000 --- a/frameworks/keyed/glasgow/src/controller.jsx +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; - -/** @jsx glasgow */ - -import { Store } from './store.es6' -import glasgow from 'glasgow' - -function selectRow(props) { - props.store.select(props.id); -} - -function deleteRow(props) { - props.store.delete(props.id); -} - -function Row({ d, id, styleClass }) { - return ( - - {''+id} - - {d.label} - - - - - - - - ) -} - -function createRows(store) { - const rows = []; - const data = store.data; - const selected = store.selected; - - for (let i = 0; i < data.length; i++) { - const d = data[i]; - const id = d.id; - - rows.push( - - ); - } - - return {rows}; -} - -function bind(obj,name) { - let func = obj[name]; - return function(...args) { - return func.apply(obj, args); - } -} - -export function Controller(props) { - - return
-
-
-
-

Glasgow - keyed

-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
- - {createRows(store)} -
-
-} - - -const store = new Store(); -glasgow.setDebug(0); -glasgow.mount(document.getElementById("main"), ); - diff --git a/frameworks/keyed/glasgow/src/main.es6.js b/frameworks/keyed/glasgow/src/main.es6.js deleted file mode 100644 index 9a538bb4f..000000000 --- a/frameworks/keyed/glasgow/src/main.es6.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -import './controller'; diff --git a/frameworks/keyed/glasgow/src/store.es6.js b/frameworks/keyed/glasgow/src/store.es6.js deleted file mode 100644 index f7e05e1fb..000000000 --- a/frameworks/keyed/glasgow/src/store.es6.js +++ /dev/null @@ -1,142 +0,0 @@ -'use strict'; - -function random(max) { - return Math.round(Math.random() * 1000) % max; -} - -let rowId = 1; -const adjectives = [ - "pretty", - "large", - "big", - "small", - "tall", - "short", - "long", - "handsome", - "plain", - "quaint", - "clean", - "elegant", - "easy", - "angry", - "crazy", - "helpful", - "mushy", - "odd", - "unsightly", - "adorable", - "important", - "inexpensive", - "cheap", - "expensive", - "fancy" -]; -const colours = [ - "red", - "yellow", - "blue", - "green", - "pink", - "brown", - "purple", - "brown", - "white", - "black", - "orange" -]; -const nouns = [ - "table", - "chair", - "house", - "bbq", - "desk", - "car", - "pony", - "cookie", - "sandwich", - "burger", - "pizza", - "mouse", - "keyboard" -]; - -function buildData(count, result) { - for (let i = 0; i < count; i++) { - result.push({ - id: rowId++, - label: adjectives[random(adjectives.length)] + - " " + - colours[random(colours.length)] + - " " + - nouns[random(nouns.length)] - }); - } -} - -export class Store { - constructor() { - this.data = []; - this.selected = undefined; - this.id = 1; - } - - updateData() { - let data = this.data; - - for (let i = 0; i < data.length; i += 10) { - const dataItem = data[i]; - - data[i] = { - id: dataItem.id, - label: dataItem.label + " !!!" - }; - } - } - - delete(id) { - const data = this.data; - const idx = data.findIndex((d) => d.id === id); - - data.splice(idx, 1); - } - - run() { - this.data = []; - this.add(); - this.selected = undefined; - } - - add() { - buildData(1000, this.data); - } - - update() { - this.updateData(); - } - - select(id) { - this.selected = id; - } - - runLots() { - const newData = []; - buildData(10000, newData); - this.data = newData; - this.selected = undefined; - } - - clear() { - this.data = []; - this.selected = undefined; - } - - swapRows() { - let data = this.data; - if (data.length > 998) { - const a = data[1]; - data[1] = data[998]; - data[998] = a; - } - } -} diff --git a/frameworks/keyed/glasgow/webpack.config.js b/frameworks/keyed/glasgow/webpack.config.js deleted file mode 100644 index 935f371b6..000000000 --- a/frameworks/keyed/glasgow/webpack.config.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; -require("babel-plugin-syntax-jsx") -var path = require('path') - -var cache = {}; -var loaders = [ - { - test: /\.jsx$/, - loader: 'babel-loader' - }, - { - test: /\.es6\.js$/, - loader: 'babel-loader' - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader' - } -]; -var extensions = [ - '.js', '.jsx', '.es6.js', '.msx' -]; - -module.exports = [{ - cache: cache, - module: { - loaders: loaders - }, - entry: { - main: './src/main', - }, - output: { - path: path.resolve(__dirname, "dist"), - filename: '[name].js', - sourceMapFilename: "[file].map", - }, - resolve: { - modules: [ - __dirname, - path.resolve(__dirname, "src"), - "node_modules" - ], - extensions: extensions - } -}]; diff --git a/frameworks/keyed/glimmer/.editorconfig b/frameworks/keyed/glimmer/.editorconfig deleted file mode 100644 index 219985c22..000000000 --- a/frameworks/keyed/glimmer/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 2 - -[*.hbs] -insert_final_newline = false - -[*.{diff,md}] -trim_trailing_whitespace = false diff --git a/frameworks/keyed/glimmer/.ember-cli b/frameworks/keyed/glimmer/.ember-cli deleted file mode 100644 index bc83a0cf6..000000000 --- a/frameworks/keyed/glimmer/.ember-cli +++ /dev/null @@ -1,3 +0,0 @@ -{ - "blueprint": "@glimmer/blueprint" -} diff --git a/frameworks/keyed/glimmer/.gitignore b/frameworks/keyed/glimmer/.gitignore deleted file mode 100644 index cdd5f9eea..000000000 --- a/frameworks/keyed/glimmer/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -tmp/* -dist diff --git a/frameworks/keyed/glimmer/.template-lintrc.js b/frameworks/keyed/glimmer/.template-lintrc.js deleted file mode 100644 index b45e96ffd..000000000 --- a/frameworks/keyed/glimmer/.template-lintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = { - extends: 'recommended' -}; diff --git a/frameworks/keyed/glimmer/.watchmanconfig b/frameworks/keyed/glimmer/.watchmanconfig deleted file mode 100644 index e7834e3e4..000000000 --- a/frameworks/keyed/glimmer/.watchmanconfig +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignore_dirs": ["tmp", "dist"] -} diff --git a/frameworks/keyed/glimmer/README.md b/frameworks/keyed/glimmer/README.md deleted file mode 100644 index 0291fb835..000000000 --- a/frameworks/keyed/glimmer/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# glimmer - -This README outlines the details of collaborating on this Glimmer application. -A short introduction of this app could easily go here. - -## Prerequisites - -You will need the following things properly installed on your computer. - -* [Git](https://git-scm.com/) -* [Node.js](https://nodejs.org/) (with NPM) -* [Yarn](https://yarnpkg.com/en/) -* [Ember CLI](https://ember-cli.com/) - -## Installation - -* `git clone ` this repository -* `cd glimmer` -* `yarn` - -## Running / Development - -* `ember serve` -* Visit your app at [http://localhost:4200](http://localhost:4200). - -### Building - -* `ember build` (development) -* `ember build --environment production` (production) - -## Further Reading / Useful Links - -* [glimmerjs](http://github.com/tildeio/glimmer/) -* [ember-cli](https://ember-cli.com/) diff --git a/frameworks/keyed/glimmer/config/environment.js b/frameworks/keyed/glimmer/config/environment.js deleted file mode 100644 index f164ca218..000000000 --- a/frameworks/keyed/glimmer/config/environment.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = function(environment) { - let ENV = { - modulePrefix: 'glimmer', - environment - }; - - return ENV; -}; diff --git a/frameworks/keyed/glimmer/config/module-map.d.ts b/frameworks/keyed/glimmer/config/module-map.d.ts deleted file mode 100644 index b01e2cb55..000000000 --- a/frameworks/keyed/glimmer/config/module-map.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * This is just a placeholder file to keep TypeScript aware editors happy. At build time, - * it will be replaced with a complete map of resolvable module paths => rolled up contents. - */ - -export interface Dict { - [index: string]: T; -} - -declare let map: Dict; -export default map; diff --git a/frameworks/keyed/glimmer/config/resolver-configuration.d.ts b/frameworks/keyed/glimmer/config/resolver-configuration.d.ts deleted file mode 100644 index a96597e0f..000000000 --- a/frameworks/keyed/glimmer/config/resolver-configuration.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * This is just a placeholder file to keep TypeScript aware editors happy. At build time, - * it will be replaced with a resolver configuration composed from your application's - * `config/environment.js` (and supplemented with default settings as possible). - */ - -import { ResolverConfiguration } from '@glimmer/resolver'; -declare var _default: ResolverConfiguration; -export default _default; diff --git a/frameworks/keyed/glimmer/config/targets.js b/frameworks/keyed/glimmer/config/targets.js deleted file mode 100644 index d4535c674..000000000 --- a/frameworks/keyed/glimmer/config/targets.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -let browsers = [ - 'last 1 Chrome versions', - 'last 1 Firefox versions', - 'last 1 Safari versions', -]; - -module.exports = { browsers }; diff --git a/frameworks/keyed/glimmer/ember-cli-build.js b/frameworks/keyed/glimmer/ember-cli-build.js deleted file mode 100644 index 6363d3a26..000000000 --- a/frameworks/keyed/glimmer/ember-cli-build.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -const GlimmerApp = require('@glimmer/application-pipeline').GlimmerApp; - -module.exports = function(defaults) { - let app = new GlimmerApp(defaults, { - // Add options here - }); - - return app.toTree(); -}; diff --git a/frameworks/keyed/glimmer/package.json b/frameworks/keyed/glimmer/package.json deleted file mode 100644 index 04161f96b..000000000 --- a/frameworks/keyed/glimmer/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "glimmer", - "version": "0.0.0", - "description": "A brand new Glimmer app.", - "directories": { - "doc": "doc", - "test": "tests" - }, - "js-framework-benchmark": { - "frameworkVersionFromPackage": "@glimmer/application", - "customURL": "/dist" - }, - "scripts": { - "build": "ember build -prod", - "start": "ember server", - "test": "ember test", - "lint:ts": "tslint -c tslint.json 'src/**/*.ts' -t codeFrame", - "build-dev": "ember build", - "build-prod": "ember build --environment=production" - }, - "devDependencies": { - "@glimmer/application": "^0.14.0-alpha.8", - "@glimmer/application-pipeline": "^0.15.0", - "@glimmer/blueprint": "^0.14.0-alpha.8", - "@glimmer/component": "^0.14.0-alpha.8", - "@glimmer/inline-precompile": "^1.0.0", - "@glimmer/resolver": "^0.4.1", - "@glimmer/test-helpers": "^0.31.1", - "@types/qunit": "^2.0.31", - "broccoli-asset-rev": "^2.5.0", - "ember-cli": "^3.9.0", - "ember-cli-dependency-checker": "^2.0.1", - "ember-cli-inject-live-reload": "^1.6.1", - "tslint": "5.11.0", - "ember-template-lint": "^1.0.0-beta.6", - "ember-hbs-minifier": "^0.4.0", - "ember-cli-uglify": "^3.0.0", - "qunitjs": "^2.3.3", - "typescript": "~3.2.1" - }, - "engines": { - "node": ">= 4.0" - }, - "private": true -} diff --git a/frameworks/keyed/glimmer/public/robots.txt b/frameworks/keyed/glimmer/public/robots.txt deleted file mode 100644 index f5916452e..000000000 --- a/frameworks/keyed/glimmer/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# http://www.robotstxt.org -User-agent: * -Disallow: diff --git a/frameworks/keyed/glimmer/src/index.ts b/frameworks/keyed/glimmer/src/index.ts deleted file mode 100644 index 5f57587fc..000000000 --- a/frameworks/keyed/glimmer/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentManager } from '@glimmer/component'; -import { setPropertyDidChange } from '@glimmer/tracking'; -import App from './main'; - -const app = new App(); -const containerElement = document.getElementById('app'); - -setPropertyDidChange(() => { - app.scheduleRerender(); -}); - -app.registerInitializer({ - initialize(registry) { - registry.register( - `component-manager:/${app.rootName}/component-managers/main`, - ComponentManager - ); - }, -}); - -app.renderComponent('Glimmer', containerElement, null); - -app.boot(); diff --git a/frameworks/keyed/glimmer/src/main.ts b/frameworks/keyed/glimmer/src/main.ts deleted file mode 100644 index a5ab60b77..000000000 --- a/frameworks/keyed/glimmer/src/main.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Application, { DOMBuilder, RuntimeCompilerLoader, SyncRenderer } from '@glimmer/application'; -import Resolver, { BasicModuleRegistry } from '@glimmer/resolver'; -import moduleMap from '../config/module-map'; -import resolverConfiguration from '../config/resolver-configuration'; - -export default class App extends Application { - constructor() { - let moduleRegistry = new BasicModuleRegistry(moduleMap); - let resolver = new Resolver(resolverConfiguration, moduleRegistry); - const element = document.body; - - super({ - builder: new DOMBuilder({ element, nextSibling: null }), - loader: new RuntimeCompilerLoader(), - renderer: new SyncRenderer(), - resolver, - rootName: resolverConfiguration.app.rootName - }); - } -} diff --git a/frameworks/keyed/glimmer/src/ui/components/BsButton/template.hbs b/frameworks/keyed/glimmer/src/ui/components/BsButton/template.hbs deleted file mode 100644 index 042fac75b..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/BsButton/template.hbs +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/frameworks/keyed/glimmer/src/ui/components/Glimmer/component-test.ts b/frameworks/keyed/glimmer/src/ui/components/Glimmer/component-test.ts deleted file mode 100644 index 9c34194eb..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/Glimmer/component-test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import hbs from '@glimmer/inline-precompile'; -import { setupRenderingTest } from '@glimmer/test-helpers'; - -const { module, test } = QUnit; - -module('Component: Glimmer', function(hooks) { - setupRenderingTest(hooks); - - test('it renders', async function(assert) { - await this.render(hbs``); - assert.equal(this.containerElement.textContent, 'Welcome to Glimmer!\n'); - }); -}); diff --git a/frameworks/keyed/glimmer/src/ui/components/Glimmer/component.ts b/frameworks/keyed/glimmer/src/ui/components/Glimmer/component.ts deleted file mode 100644 index c5fd47f6c..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/Glimmer/component.ts +++ /dev/null @@ -1,93 +0,0 @@ -import Component, { tracked } from "@glimmer/component"; -import { - add, - deleteRow, - run, - runLots, - swapRows, - update -} from "./../../../utils/benchmark-helpers"; - -function isRendering(ctx) { - if (ctx.__owner__._rendering || ctx.__owner__._scheduled) { - return true; - } - return false; -} - -export default class Glimmer extends Component { - @tracked public id = 1; - @tracked public data = []; - - public create() { - if (isRendering(this)) { - return; - } - const result = run(this.id); - this.data = result.data; - this.id = result.id; - } - - public add() { - if (isRendering(this)) { - return; - } - this.data = add(this.id, this.data).data; - } - - public update() { - if (isRendering(this)) { - return; - } - update(this.data); - } - public runLots() { - if (isRendering(this)) { - return; - } - const result = runLots(this.id); - this.data = result.data; - this.id = result.id; - this.resetSelection(); - } - - public clear() { - this.data = []; - } - - public swapRows() { - if (isRendering(this)) { - return; - } - this.data = swapRows(this.data); - } - - public remove(id) { - if (isRendering(this)) { - return; - } - this.data = deleteRow(this.data, id); - this.resetSelection(); - } - - public select(id) { - if (isRendering(this)) { - return; - } - this.data.forEach(item => { - if (item.id === id) { - item.selected = true; - } else if (item.selected) { - item.selected = false; - } - }); - } - - private resetSelection() { - this.data.forEach(item => { - if (item.selected) { - item.selected = false; - } - }); - } -} diff --git a/frameworks/keyed/glimmer/src/ui/components/Glimmer/template.hbs b/frameworks/keyed/glimmer/src/ui/components/Glimmer/template.hbs deleted file mode 100644 index 0e1d9a90e..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/Glimmer/template.hbs +++ /dev/null @@ -1,53 +0,0 @@ -
-
-
-
-

Glimmer v0.14.0

-
-
-
-
- - Create 1,000 rows - -
-
- - Create 10,000 rows - -
-
- - Append 1,000 rows - -
-
- - Update every 10th row - -
-
- - Clear - -
-
- - Swap Rows - -
-
-
-
-
- - - - - - - \ No newline at end of file diff --git a/frameworks/keyed/glimmer/src/ui/components/PerformantEach/component.ts b/frameworks/keyed/glimmer/src/ui/components/PerformantEach/component.ts deleted file mode 100644 index 4a53d492c..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/PerformantEach/component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Component from '@glimmer/component'; - -export default class PerformantEach extends Component { - public fragment: any = null; - constructor() { - super(...arguments); - this.fragment = document.createElement('tbody'); - } - get appendNode() { - const item = document.getElementById('items-list'); - if (!item.contains(this.fragment)) { - item.append(this.fragment); - } - return ''; - } -} \ No newline at end of file diff --git a/frameworks/keyed/glimmer/src/ui/components/PerformantEach/template.hbs b/frameworks/keyed/glimmer/src/ui/components/PerformantEach/template.hbs deleted file mode 100644 index e851a5cae..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/PerformantEach/template.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{{#in-element this.fragment}} - {{#each @items key="id" as |item|}}{{/each}} - {{this.appendNode}} -{{/in-element}} diff --git a/frameworks/keyed/glimmer/src/ui/components/Table/template.hbs b/frameworks/keyed/glimmer/src/ui/components/Table/template.hbs deleted file mode 100644 index 12f478acd..000000000 --- a/frameworks/keyed/glimmer/src/ui/components/Table/template.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{{! template-lint-disable }} -
{{item.id}}{{item.label}}
- {{#if @data.length}} - - {{/if}} -
diff --git a/frameworks/keyed/glimmer/src/ui/index.html b/frameworks/keyed/glimmer/src/ui/index.html deleted file mode 100644 index 84e5f780b..000000000 --- a/frameworks/keyed/glimmer/src/ui/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Glimmer 0.14 - - - - {{content-for "head"}} - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - -
- - - {{content-for "body-footer"}} - - diff --git a/frameworks/keyed/glimmer/src/ui/styles/app.css b/frameworks/keyed/glimmer/src/ui/styles/app.css deleted file mode 100644 index c6afad22c..000000000 --- a/frameworks/keyed/glimmer/src/ui/styles/app.css +++ /dev/null @@ -1,3 +0,0 @@ -h1 { - color: #444; -} diff --git a/frameworks/keyed/glimmer/src/utils/benchmark-helpers.ts b/frameworks/keyed/glimmer/src/utils/benchmark-helpers.ts deleted file mode 100644 index b8455eb25..000000000 --- a/frameworks/keyed/glimmer/src/utils/benchmark-helpers.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { tracked } from '@glimmer/component'; - -class Item { - public id; - @tracked - public label = ''; - @tracked - public selected = false; - constructor({id, label, selected}) { - this.id = id; - this.label = label; - this.selected = selected; - } -} - -// tslint:disable-next-line: variable-name -const _random = (max) => { - return Math.round(Math.random() * 1000) % max; -}; - -const updateData = (data, mod = 10) => { - for (let i = 0; i < data.length; i += mod) { - data[i].label = data[i].label + ' !!!'; - } -}; - -export const buildData = (id, count = 1000) => { - const adjectives = [ - 'pretty', 'large', 'big', 'small', 'tall', - 'short', 'long', 'handsome', 'plain', 'quaint', - 'clean', 'elegant', 'easy', 'angry', 'crazy', - 'helpful', 'mushy', 'odd', 'unsightly', 'adorable', - 'important', 'inexpensive', 'cheap', 'expensive', 'fancy']; - - let colours = [ - 'red', 'yellow', 'blue', 'green', 'pink', 'brown', 'purple', - 'brown', 'white', 'black', 'orange']; - - let nouns = [ - 'table', 'chair', 'house', 'bbq', 'desk', 'car', 'pony', 'cookie', - 'sandwich', 'burger', 'pizza', 'mouse', 'keyboard']; - - let data = []; - - for (let i = 0; i < count; i++) { - data.push(new Item({ - id: id++, - label: adjectives[_random(adjectives.length)] - + ' ' - + colours[_random(colours.length)] - + ' ' - + nouns[_random(nouns.length)], - selected: false - })); - } - - return { data, id }; -}; - -export const add = (id, data) => { - const newData = buildData(id, 1000); - - return { data: [...data, ...newData.data], id: newData.id }; -}; - -export const run = (id) => { - return buildData(id); -}; - -export const runLots = (id) => { - return buildData(id, 10000); -}; - -export const update = (data) => { - return updateData(data); -}; - -export const swapRows = (data) => { - const newData = [...data]; - if (newData.length > 998) { - let temp = newData[1]; - newData[1] = newData[998]; - newData[998] = temp; - } - return newData; -}; - -export const deleteRow = (data, id) => { - return data.filter((d: Item) => { - return d.id !== id; - }); -}; diff --git a/frameworks/keyed/glimmer/src/utils/test-helpers/test-helper.ts b/frameworks/keyed/glimmer/src/utils/test-helpers/test-helper.ts deleted file mode 100644 index e015436aa..000000000 --- a/frameworks/keyed/glimmer/src/utils/test-helpers/test-helper.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { setApp, start } from '@glimmer/test-helpers'; -import App from '../../main'; - -QUnit.config.autostart = false; -setApp(App); -import '../../../tests'; -start(); diff --git a/frameworks/keyed/glimmer/testem.json b/frameworks/keyed/glimmer/testem.json deleted file mode 100644 index 0231f1634..000000000 --- a/frameworks/keyed/glimmer/testem.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "test_page": "tests/index.html", - "disable_watching": true, - "launch_in_ci": ["Firefox", "Chrome"] -} diff --git a/frameworks/keyed/glimmer/tests/index.html b/frameworks/keyed/glimmer/tests/index.html deleted file mode 100644 index 90bb1b573..000000000 --- a/frameworks/keyed/glimmer/tests/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - glimmer - - - - - - - - - - -
-
-
-
- - diff --git a/frameworks/keyed/glimmer/tsconfig.json b/frameworks/keyed/glimmer/tsconfig.json deleted file mode 100644 index caccd57c3..000000000 --- a/frameworks/keyed/glimmer/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "es2015", - "inlineSourceMap": true, - "inlineSources": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "types": [ - "qunit" - ] - }, - "exclude": [ - "node_modules", - "tmp", - "dist" - ] -} diff --git a/frameworks/keyed/glimmer/tslint.json b/frameworks/keyed/glimmer/tslint.json deleted file mode 100644 index e2b801006..000000000 --- a/frameworks/keyed/glimmer/tslint.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": { - "quotemark": [true, "single"], - "trailing-comma": false, - "only-arrow-functions": false, - "prefer-const": false, - "interface-name": [true, "never-prefix"] - }, - "rulesDirectory": [] -} diff --git a/frameworks/keyed/helix/.clj-kondo/config.edn b/frameworks/keyed/helix/.clj-kondo/config.edn deleted file mode 100644 index 5d961a3fe..000000000 --- a/frameworks/keyed/helix/.clj-kondo/config.edn +++ /dev/null @@ -1 +0,0 @@ -{:lint-as {helix.core/defnc clojure.core/defn}} diff --git a/frameworks/keyed/helix/.gitignore b/frameworks/keyed/helix/.gitignore deleted file mode 100644 index 9ce4f8f37..000000000 --- a/frameworks/keyed/helix/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -out -.shadow-cljs -dist -dev diff --git a/frameworks/keyed/helix/index-dev.html b/frameworks/keyed/helix/index-dev.html deleted file mode 100755 index 9ddb4fc7c..000000000 --- a/frameworks/keyed/helix/index-dev.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Helix - - - -
- - - diff --git a/frameworks/keyed/helix/index.html b/frameworks/keyed/helix/index.html deleted file mode 100755 index fa5f040c7..000000000 --- a/frameworks/keyed/helix/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Helix - - - -
- - - diff --git a/frameworks/keyed/helix/package.json b/frameworks/keyed/helix/package.json deleted file mode 100644 index f7aa8c5f8..000000000 --- a/frameworks/keyed/helix/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "private": true, - "js-framework-benchmark": { - "frameworkVersion": "0.0.10" - }, - "scripts": { - "watch": "shadow-cljs watch :app", - "build-dev": "shadow-cljs compile :app", - "build-prod": "shadow-cljs release :app" - }, - "devDependencies": { - "shadow-cljs": "2.8.100", - "ws": "^7.1.2" - }, - "dependencies": { - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-refresh": "0.8.1" - } -} diff --git a/frameworks/keyed/helix/shadow-cljs.edn b/frameworks/keyed/helix/shadow-cljs.edn deleted file mode 100644 index bcd063768..000000000 --- a/frameworks/keyed/helix/shadow-cljs.edn +++ /dev/null @@ -1,34 +0,0 @@ -{:source-paths - ["src" - "resources" - "checkouts/helix/src"] - - :dependencies [[lilactown/helix "0.0.10"] - [lucywang000/hashp "0.1.2"] - [binaryage/devtools "1.0.0"]] - - :nrepl {:port 6666 - :cider true - :init-ns user} - - :builds {:app {:target :browser - - :dev - {:output-dir - "dev" - - :asset-path - "/frameworks/keyed/helix/dev/"} - :devtools {:after-load demo.main/after-reload - - :watch-dir "resources/demo/styles" - :watch-path "/styles" - - :preloads [devtools.preload - hashp.core]} - - :release {:output-dir "dist" - :compiler-options {:optimizations :advanced - :infer-externs true}} - - :modules {:main {:init-fn demo.main/init!}}}}} diff --git a/frameworks/keyed/helix/src/demo/main.cljs b/frameworks/keyed/helix/src/demo/main.cljs deleted file mode 100644 index f55e1fc52..000000000 --- a/frameworks/keyed/helix/src/demo/main.cljs +++ /dev/null @@ -1,115 +0,0 @@ -(ns demo.main - (:require [helix.core :as hx :refer [defnc $]] - [helix.dom :as d] - [helix.hooks :as hooks :refer [use-state use-effect]] - ["react-dom" :as rdom] - [demo.utils :as u])) - -(defnc row [{:keys [data selected? on-select on-delete]}] - (d/tr {:class (if selected? "danger")} - (d/td {:class "col-md-1"} - (:id data)) - (d/td {:class "col-md-4"} - (d/a {:on-click (fn [e] (on-select (:id data)))} - (:label data))) - (d/td {:class "col-md-1"} - (d/a {:on-click (fn [e] (on-delete (:id data)))} - (d/span {:class "glyphicon glyphicon-remove" - :aria-hidden "true"}))) - (d/td {:class "col-md-6"}))) - -(defonce id-atom (atom 0)) - -(defnc main [] - (js/console.log "re-render") - (let [[data set-data] (use-state []) - [selected set-selected] (use-state nil) - run - (fn run [_] - (set-data (vec (u/build-data id-atom 1000))) - (set-selected nil)) - run-lots - (fn run-lots [_] - (set-data (vec (u/build-data id-atom 10000))) - (set-selected nil)) - add - (fn add [_] - (set-data u/add id-atom)) - update-some - (fn update-some [] - (set-data u/update-some)) - clear - (fn clear [] - (set-selected nil) - (set-data [])) - swap-rows - (fn swap-rows [] - (set-data u/swap-rows)) - select - (fn select [id] - (set-selected id)) - delete - (fn delete [id] - (set-data u/delete-row id))] - (d/div - {:class "container"} - (d/div - {:class "jumbotron"} - (d/div - {:class "row"} - (d/div {:class "col-md-6"} - (d/h1 (str "Helix"))) - (d/div {:class "col-md-6"} - (d/div {:class "row"} - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class " btn btn-primary btn-block" - :type "button" - :id "run" - :on-click run} - "Create 1,000 rows")) - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class "btn btn-primary btn-block" - :type "button" - :id "runlots" - :on-click run-lots} - "Create 10,000 rows")) - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class "btn btn-primary btn-block" - :type "button" - :id "add" - :on-click add} - "Append 1,000 rows")) - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class " btn btn-primary btn-block" - :type "button" - :id "update" - :on-click update-some} - "Update every 10th row")) - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class "btn btn-primary btn-block" - :type "button" - :id "clear" - :on-click clear} - "Clear")) - (d/div {:class "col-sm-6 smallpad"} - (d/button {:class "btn btn-primary btn-block" - :type "button" - :id "swaprows" - :on-click swap-rows} - "Swap rows")))))) - (d/table {:class "table table-hover table-striped test-data"} - (d/tbody - (for [{:keys [id] :as d} data] - ($ row {:key id - :data d - :selected? (identical? id selected) - :on-select select - :on-delete delete})))) - (d/span {:class "preloadicon glyphicon glyphicon-remove" - :aria-hidden "true"})))) - -(defn init! [] - (rdom/render ($ main) (.getElementById js/document. "main"))) - -(defn after-reload [] - (init!)) diff --git a/frameworks/keyed/helix/src/demo/utils.cljs b/frameworks/keyed/helix/src/demo/utils.cljs deleted file mode 100644 index 5d7ae53d0..000000000 --- a/frameworks/keyed/helix/src/demo/utils.cljs +++ /dev/null @@ -1,31 +0,0 @@ -(ns demo.utils) - -(def adjectives ["pretty", "large", "big", "small", "tall", "short", "long", "handsome", "plain", "quaint", "clean", "elegant", "easy", "angry", "crazy", "helpful", "mushy", "odd", "unsightly", "adorable", "important", "inexpensive", "cheap", "expensive", "fancy"]) -(def colours ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"]) -(def nouns ["table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", "pizza", "mouse", "keyboard"]) - -(defrecord Data [id label]) - -(defn build-data [id-atom count] - (repeatedly count (fn [] - (->Data (swap! id-atom inc) (str (rand-nth adjectives) " " (rand-nth colours) " " (rand-nth nouns)))))) - -(defn add [data id-atom] - (into data (build-data id-atom 1000))) - -(defn update-some [data] - (reduce (fn [data index] - (let [row (get data index)] - (assoc data index (assoc row :label (str (:label row) " !!!"))))) - data - (range 0 (count data) 10))) - -(defn swap-rows [data] - (if (> (count data) 998) - (-> data - (assoc 1 (get data 998)) - (assoc 998 (get data 1))) - data)) - -(defn delete-row [data id] - (vec (remove #(identical? id (:id %)) data))) diff --git a/frameworks/keyed/heresy/index.html b/frameworks/keyed/heresy/index.html deleted file mode 100644 index 0d3f58391..000000000 --- a/frameworks/keyed/heresy/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - -heresy keyed - -
- diff --git a/frameworks/keyed/heresy/package.json b/frameworks/keyed/heresy/package.json deleted file mode 100644 index 993d5ffe8..000000000 --- a/frameworks/keyed/heresy/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "js-framework-benchmark-heresy", - "version": "1.0.0", - "description": "heresy demo", - "main": "index.js", - "js-framework-benchmark": { - "frameworkVersionFromPackage": "heresy" - }, - "scripts": { - "build-dev": "rollup -c -w", - "build-prod": "rollup -c" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/krausest/js-framework-benchmark.git" - }, - "keywords": [ - "heresy" - ], - "author": "Mathis Zeiher", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/krausest/js-framework-benchmark/issues" - }, - "homepage": "https://github.com/krausest/js-framework-benchmark#readme", - "dependencies": { - "heresy": "0.26.1", - "js-framework-benchmark-utils": "0.2.5" - }, - "devDependencies": { - "@ungap/degap": "^0.1.7", - "rollup": "^2.0.6", - "rollup-plugin-includepaths": "^0.2.3", - "rollup-plugin-minify-html-literals": "^1.2.3", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-terser": "^5.3.0" - } -} diff --git a/frameworks/keyed/heresy/rollup.config.js b/frameworks/keyed/heresy/rollup.config.js deleted file mode 100644 index e21a311c7..000000000 --- a/frameworks/keyed/heresy/rollup.config.js +++ /dev/null @@ -1,39 +0,0 @@ -import resolve from 'rollup-plugin-node-resolve'; -import includePaths from 'rollup-plugin-includepaths'; -import minifyHTML from 'rollup-plugin-minify-html-literals'; -import { terser } from 'rollup-plugin-terser'; - -export default { - input: 'src/index.js', - plugins: [ - minifyHTML({ - options: { - minifyOptions: { - keepClosingSlash: true - } - } - }), - includePaths({ - include: { - "@ungap/create-content": "./node_modules/@ungap/degap/create-content.js", - "@ungap/template-tag-arguments": "./node_modules/@ungap/degap/template-tag-arguments.js", - "@ungap/template-literal": "./node_modules/@ungap/degap/template-literal.js", - "@ungap/weakmap": "./node_modules/@ungap/degap/weakmap.js", - "@ungap/weakset": "./node_modules/@ungap/degap/weakset.js", - "@ungap/event": "./node_modules/@ungap/degap/event.js", - "@ungap/essential-map": "./node_modules/@ungap/degap/essential-map.js", - "@ungap/import-node": "./node_modules/@ungap/degap/import-node.js", - "@ungap/trim": "./node_modules/@ungap/degap/trim.js" - }, - }), - resolve(), - terser() - ], - context: 'null', - moduleContext: 'null', - output: { - file: 'dist/index.js', - format: 'iife', - name: 'app' - } -}; diff --git a/frameworks/keyed/heresy/src/index.js b/frameworks/keyed/heresy/src/index.js deleted file mode 100644 index 8b46a3bcb..000000000 --- a/frameworks/keyed/heresy/src/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import {State} from 'js-framework-benchmark-utils'; -import {define, html, render} from 'heresy'; - -import App from './ui/app.js'; -define('App', App); - -const state = State(update); -const main = document.getElementById('container'); - -update(state); - -function update(state) { - render(main, html``); -} diff --git a/frameworks/keyed/heresy/src/ui/app.js b/frameworks/keyed/heresy/src/ui/app.js deleted file mode 100644 index 2ffdaa2bb..000000000 --- a/frameworks/keyed/heresy/src/ui/app.js +++ /dev/null @@ -1,53 +0,0 @@ -import {html} from 'heresy'; - -import Button from './button.js'; -import Row from './row.js'; - -export default { - extends: 'div', - includes: {Button, Row}, - mappedAttributes: ['state'], - oninit() { - this.classList.add('container'); - }, - onstate() { - this.render(); - }, - onclick({target}) { - const a = target.closest('a'); - const {action} = a.dataset; - this.state[action](+a.closest('tr').id); - }, - render() { - const { - data, selected, - run, runLots, add, update, clear, swapRows - } = this.state; - this.html` -
-
-
-

heresy keyed

-
-
-
-
-
-
-
- - - ${data.map(({id, label}) => html.for(data, id)` - - `)} - -
-