├── wasm-pack ├── .cargo-ok ├── index.js ├── package-lock.json ├── src │ └── lib.rs ├── tests │ └── web.rs ├── package.json ├── .appveyor.yml ├── Cargo.toml ├── LICENSE_MIT ├── README.md ├── .travis.yml └── LICENSE_APACHE ├── neon ├── README.md ├── lib │ └── index.js ├── .gitignore ├── native │ ├── build.rs │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── package.json └── package-lock.json ├── node-bindgen-addon ├── build.rs ├── index.js ├── package-lock.json ├── src │ └── lib.rs ├── package.json └── Cargo.toml ├── rust-addon ├── index.js ├── index.node ├── package-lock.json ├── build.rs ├── package.json ├── Cargo.toml └── src │ └── lib.rs ├── napi-rs-addon ├── build.rs ├── index.js ├── package.json ├── Cargo.toml ├── src │ └── lib.rs └── package-lock.json ├── .gitignore ├── package.json ├── README.md └── index.js /wasm-pack/.cargo-ok: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /neon/README.md: -------------------------------------------------------------------------------- 1 | # neon 2 | 3 | 4 | -------------------------------------------------------------------------------- /neon/lib/index.js: -------------------------------------------------------------------------------- 1 | const addon = require('../native') 2 | 3 | module.exports = addon 4 | -------------------------------------------------------------------------------- /wasm-pack/index.js: -------------------------------------------------------------------------------- 1 | const addon = require('./pkg') 2 | 3 | module.exports = addon 4 | -------------------------------------------------------------------------------- /node-bindgen-addon/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | node_bindgen::build::configure(); 3 | } 4 | -------------------------------------------------------------------------------- /rust-addon/index.js: -------------------------------------------------------------------------------- 1 | const addon = require('./index.node') 2 | 3 | module.exports = addon 4 | -------------------------------------------------------------------------------- /rust-addon/index.node: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdsaund/rust-node-perf/HEAD/rust-addon/index.node -------------------------------------------------------------------------------- /node-bindgen-addon/index.js: -------------------------------------------------------------------------------- 1 | const addon = require('./dist/index.node') 2 | 3 | module.exports = addon 4 | -------------------------------------------------------------------------------- /napi-rs-addon/build.rs: -------------------------------------------------------------------------------- 1 | // build.rs 2 | extern crate napi_build; 3 | 4 | fn main() { 5 | napi_build::setup(); 6 | } 7 | -------------------------------------------------------------------------------- /napi-rs-addon/index.js: -------------------------------------------------------------------------------- 1 | const addon = require('./target/release/napi_rs_addon.node') 2 | 3 | module.exports = addon 4 | -------------------------------------------------------------------------------- /rust-addon/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rust-addon", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1 5 | } 6 | -------------------------------------------------------------------------------- /wasm-pack/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wasm-pack", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1 5 | } 6 | -------------------------------------------------------------------------------- /neon/.gitignore: -------------------------------------------------------------------------------- 1 | native/target 2 | native/index.node 3 | native/artifacts.json 4 | **/*~ 5 | **/node_modules 6 | **/.DS_Store 7 | -------------------------------------------------------------------------------- /node-bindgen-addon/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bindgen-addon", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1 5 | } 6 | -------------------------------------------------------------------------------- /wasm-pack/src/lib.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::*; 2 | 3 | #[wasm_bindgen] 4 | pub fn add(a: f64, b: f64) -> f64 { 5 | a + b 6 | } 7 | -------------------------------------------------------------------------------- /neon/native/build.rs: -------------------------------------------------------------------------------- 1 | extern crate neon_build; 2 | 3 | fn main() { 4 | neon_build::setup(); // must be called in build.rs 5 | 6 | // add project-specific build logic here... 7 | } 8 | -------------------------------------------------------------------------------- /node-bindgen-addon/src/lib.rs: -------------------------------------------------------------------------------- 1 | use node_bindgen::derive::node_bindgen; 2 | 3 | /// add two integer 4 | #[node_bindgen] 5 | fn add(first: i32, second: i32) -> i32 { 6 | first + second 7 | } 8 | -------------------------------------------------------------------------------- /rust-addon/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | println!("cargo:rustc-cdylib-link-arg=-undefined"); 3 | if cfg!(target_os = "macos") { 4 | println!("cargo:rustc-cdylib-link-arg=dynamic_lookup"); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | */target 2 | Cargo.lock 3 | 4 | **/*.rs.bk 5 | **/node_modules/ 6 | 7 | wasm-pack/Cargo.lock 8 | wasm-pack/bin/ 9 | wasm-pack/pkg/ 10 | wasm-pack/wasm-pack.log 11 | 12 | node-bindgen-addon/dist/ 13 | -------------------------------------------------------------------------------- /node-bindgen-addon/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bindgen-addon", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "postinstall": "nj-cli build" 8 | }, 9 | "author": "", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /rust-addon/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rust-addon", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "postinstall": "cargo build --release && mv ./target/release/librust_addon.so ./index.node" 8 | }, 9 | "author": "", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /wasm-pack/tests/web.rs: -------------------------------------------------------------------------------- 1 | //! Test suite for the Web and headless browsers. 2 | 3 | #![cfg(target_arch = "wasm32")] 4 | 5 | extern crate wasm_bindgen_test; 6 | use wasm_bindgen_test::*; 7 | 8 | wasm_bindgen_test_configure!(run_in_browser); 9 | 10 | #[wasm_bindgen_test] 11 | fn pass() { 12 | assert_eq!(1 + 1, 2); 13 | } 14 | -------------------------------------------------------------------------------- /neon/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neon", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "lib/index.js", 6 | "author": "Jolyon Saunders ", 7 | "license": "MIT", 8 | "dependencies": { 9 | "neon-cli": "^0.3.3" 10 | }, 11 | "scripts": { 12 | "install": "neon build" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /napi-rs-addon/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "napi-rs-addon", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "postinstall": "cargo build --release && napi --release" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "napi-rs": "^0.2.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /rust-addon/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-addon" 3 | version = "0.1.0" 4 | authors = ["Jolyon Saunders "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [lib] 10 | crate-type=["cdylib"] 11 | 12 | [dependencies] 13 | nodejs-sys = "0.2.0" 14 | -------------------------------------------------------------------------------- /wasm-pack/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wasm-pack", 3 | "version": "1.0.0", 4 | "description": "
", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "postinstall": "wasm-pack build --target nodejs --release" 11 | }, 12 | "author": "", 13 | "license": "ISC" 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "compare", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "preinstall": "npm i --prefix ./napi-rs-addon && npm i --prefix ./neon && npm i --prefix ./node-bindgen-addon && npm i --prefix ./rust-addon && npm i --prefix ./wasm-pack" 8 | }, 9 | "author": "", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /neon/native/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "neon" 3 | version = "0.1.0" 4 | authors = ["Jolyon Saunders "] 5 | license = "MIT" 6 | build = "build.rs" 7 | exclude = ["artifacts.json", "index.node"] 8 | 9 | [lib] 10 | name = "neon" 11 | crate-type = ["cdylib"] 12 | 13 | [build-dependencies] 14 | neon-build = "0.3.3" 15 | 16 | [dependencies] 17 | neon = "0.3.3" 18 | -------------------------------------------------------------------------------- /wasm-pack/.appveyor.yml: -------------------------------------------------------------------------------- 1 | install: 2 | - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe 3 | - if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly 4 | - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin 5 | - rustc -V 6 | - cargo -V 7 | 8 | build: false 9 | 10 | test_script: 11 | - cargo test --locked 12 | -------------------------------------------------------------------------------- /neon/native/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate neon; 3 | 4 | use neon::prelude::*; 5 | 6 | fn add(mut cx: FunctionContext) -> JsResult { 7 | let mut this = cx.this(); 8 | let a = cx.argument::(0)?.value(); 9 | let b = cx.argument::(1)?.value(); 10 | 11 | Ok(cx.number(a + b as f64)) 12 | } 13 | 14 | register_module!(mut cx, { 15 | cx.export_function("add", add) 16 | }); 17 | -------------------------------------------------------------------------------- /napi-rs-addon/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "napi-rs-addon" 3 | version = "0.1.0" 4 | authors = ["Jolyon Saunders "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [lib] 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | napi-rs = "0.2.3" 14 | napi-rs-derive = "0.1.0" 15 | 16 | [build-dependencies] 17 | napi-build = "0.1.1" 18 | -------------------------------------------------------------------------------- /node-bindgen-addon/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "node-bindgen-addon" 3 | version = "0.1.0" 4 | authors = ["Jolyon Saunders "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [lib] 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | node-bindgen = "1.3.0" 14 | 15 | [build-dependencies] 16 | node-bindgen = { version = "1.3.0", features = ["build"] } 17 | -------------------------------------------------------------------------------- /napi-rs-addon/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate napi_rs as napi; 3 | #[macro_use] 4 | extern crate napi_rs_derive; 5 | 6 | use napi::{CallContext, Env, Number, Object, Result, Value}; 7 | use std::convert::TryInto; 8 | 9 | register_module!(test_module, init); 10 | 11 | fn init<'env>( 12 | env: &'env Env, 13 | exports: &'env mut Value<'env, Object>, 14 | ) -> Result>> { 15 | 16 | exports.set_named_property("add", env.create_function("add", add)?)?; 17 | Ok(None) 18 | } 19 | 20 | #[js_function(2)] // ------> arguments length, omit for zero 21 | fn add<'env>(ctx: CallContext<'env>) -> Result> { 22 | let a: f64 = ctx.get::(0)?.try_into().unwrap(); 23 | let b: f64 = ctx.get::(1)?.try_into().unwrap(); 24 | ctx.env.create_double(a + b) 25 | } 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rust-node-perf 2 | Benchmarking of various frameworks used in interfacing rust with node.js. Many of the competing solutions arent clear on what approach is being used (FFI, N-API, WASM), which is a primary factor in the per-call performance overhead. 3 | 4 | This project provides a minimal implementation of a function `add(a, b)` in each framework to benchmark these overheads so we can compare their performance. 5 | 6 | ## Results 7 | 8 | | Framework | Relative Exec Time | Effort | 9 | | ----------------------------- | ------------------ | -------- | 10 | | node.js | 1 | n/a | 11 | | wasm-pack (nodejs target) | 1.5386953312994696 | low | 12 | | rust-addon | 2.563630295032209 | high | 13 | | napi-rs | 3.1991337066589773 | mid | 14 | | neon | 13.342197321199631 | mid | 15 | | node-bindgen | 13.606728128895583 | low | 16 | -------------------------------------------------------------------------------- /napi-rs-addon/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "napi-rs-addon", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "minimist": { 8 | "version": "1.2.5", 9 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 10 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 11 | }, 12 | "napi-rs": { 13 | "version": "0.2.3", 14 | "resolved": "https://registry.npmjs.org/napi-rs/-/napi-rs-0.2.3.tgz", 15 | "integrity": "sha512-F+VNgo7uxUyB2DyCtMAPZT0r06jipFD89nnn1mkEvVsaC5p05Pwz78sd9Jz/NN2tC2FT7PlsY5Ep6EB0VY6C5Q==", 16 | "requires": { 17 | "minimist": "^1.2.5", 18 | "toml": "^3.0.0" 19 | } 20 | }, 21 | "toml": { 22 | "version": "3.0.0", 23 | "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", 24 | "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const rustAddon = require('./rust-addon') 2 | const wasmPack = require('./wasm-pack/pkg') 3 | const neon = require('./neon') 4 | const napiRs = require('./napi-rs-addon') 5 | const nodeBindgen = require('./node-bindgen-addon') 6 | 7 | const NS_PER_SEC = 1e9 8 | 9 | const modules = { 10 | rustAddon, 11 | wasmPack, 12 | neon, 13 | napiRs, 14 | nodeBindgen 15 | } 16 | 17 | const pairs = Array(1000000).fill().map(() => [Math.random(), Math.random()]) 18 | 19 | function bench (func, jsTime) { 20 | let totalTime = 0 21 | 22 | for (const [a, b] of pairs) { 23 | const start = process.hrtime() 24 | func(a, b) 25 | const diff = process.hrtime(start) 26 | totalTime += diff[0] + (diff[1] / NS_PER_SEC) 27 | } 28 | 29 | return totalTime / jsTime 30 | } 31 | 32 | function add (a, b) { 33 | return a + b 34 | } 35 | 36 | const jsTime = bench(add, 1) 37 | 38 | const results = [{ module: 'js', relativeTime: 1 }] 39 | 40 | for (const mod of Object.keys(modules)) { 41 | results.push({ module: mod, relativeTime: bench(modules[mod].add, jsTime) }) 42 | } 43 | 44 | console.table(results) 45 | -------------------------------------------------------------------------------- /wasm-pack/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wasm-pack" 3 | version = "0.1.0" 4 | authors = ["Jolyon Saunders "] 5 | edition = "2018" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "rlib"] 9 | 10 | [features] 11 | default = ["console_error_panic_hook"] 12 | 13 | [dependencies] 14 | wasm-bindgen = "0.2" 15 | 16 | # The `console_error_panic_hook` crate provides better debugging of panics by 17 | # logging them with `console.error`. This is great for development, but requires 18 | # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for 19 | # code size when deploying. 20 | console_error_panic_hook = { version = "0.1.1", optional = true } 21 | 22 | # `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size 23 | # compared to the default allocator's ~10K. It is slower than the default 24 | # allocator, however. 25 | # 26 | # Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. 27 | wee_alloc = { version = "0.4.2", optional = true } 28 | 29 | [dev-dependencies] 30 | wasm-bindgen-test = "0.2" 31 | 32 | [profile.release] 33 | # Tell `rustc` to optimize for small code size. 34 | opt-level = "s" 35 | -------------------------------------------------------------------------------- /wasm-pack/LICENSE_MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Jolyon Saunders 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /rust-addon/src/lib.rs: -------------------------------------------------------------------------------- 1 | use nodejs_sys::{ 2 | napi_callback_info, napi_create_double, napi_create_function, napi_env, napi_get_cb_info, 3 | napi_get_value_double, napi_set_named_property, napi_value, 4 | }; 5 | use std::ffi::CString; 6 | 7 | pub unsafe extern "C" fn add(env: napi_env, info: napi_callback_info) -> napi_value { 8 | // creating a buffer where napi_value of argument be written 9 | let mut buffer: [napi_value; 2] = std::mem::MaybeUninit::zeroed().assume_init(); 10 | // max number of arguments 11 | let mut argc = 2 as usize; 12 | // getting arguments and value of this 13 | napi_get_cb_info( 14 | env, 15 | info, 16 | &mut argc, 17 | buffer.as_mut_ptr(), 18 | std::ptr::null_mut(), 19 | std::ptr::null_mut(), 20 | ); 21 | // converting napi to f64 22 | let mut x = 0 as f64; 23 | let mut y = 0 as f64; 24 | napi_get_value_double(env, buffer[0], &mut x); 25 | napi_get_value_double(env, buffer[1], &mut y); 26 | // creating the return value 27 | let mut local: napi_value = std::mem::zeroed(); 28 | napi_create_double(env, x + y, &mut local); 29 | // returning the result 30 | local 31 | } 32 | 33 | #[no_mangle] 34 | pub unsafe extern "C" fn napi_register_module_v1( 35 | env: napi_env, 36 | exports: napi_value, 37 | ) -> nodejs_sys::napi_value { 38 | // creating a function name 39 | let p = CString::new("add").expect("CString::new failed"); 40 | let mut local: napi_value = std::mem::zeroed(); 41 | // creating the function 42 | napi_create_function( 43 | env, 44 | p.as_ptr(), 45 | 5, 46 | Some(add), 47 | std::ptr::null_mut(), 48 | &mut local, 49 | ); 50 | // setting function as property 51 | napi_set_named_property(env, exports, p.as_ptr(), local); 52 | // returning exports 53 | exports 54 | } 55 | -------------------------------------------------------------------------------- /wasm-pack/README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

wasm-pack-template

4 | 5 | A template for kick starting a Rust and WebAssembly project using wasm-pack. 6 | 7 |

8 | Build Status 9 |

10 | 11 |

12 | Tutorial 13 | | 14 | Chat 15 |

16 | 17 | Built with 🦀🕸 by The Rust and WebAssembly Working Group 18 |
19 | 20 | ## About 21 | 22 | [**📚 Read this template tutorial! 📚**][template-docs] 23 | 24 | This template is designed for compiling Rust libraries into WebAssembly and 25 | publishing the resulting package to NPM. 26 | 27 | Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other 28 | templates and usages of `wasm-pack`. 29 | 30 | [tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html 31 | [template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html 32 | 33 | ## 🚴 Usage 34 | 35 | ### 🐑 Use `cargo generate` to Clone this Template 36 | 37 | [Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate) 38 | 39 | ``` 40 | cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project 41 | cd my-project 42 | ``` 43 | 44 | ### 🛠️ Build with `wasm-pack build` 45 | 46 | ``` 47 | wasm-pack build 48 | ``` 49 | 50 | ### 🔬 Test in Headless Browsers with `wasm-pack test` 51 | 52 | ``` 53 | wasm-pack test --headless --firefox 54 | ``` 55 | 56 | ### 🎁 Publish to NPM with `wasm-pack publish` 57 | 58 | ``` 59 | wasm-pack publish 60 | ``` 61 | 62 | ## 🔋 Batteries Included 63 | 64 | * [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating 65 | between WebAssembly and JavaScript. 66 | * [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook) 67 | for logging panic messages to the developer console. 68 | * [`wee_alloc`](https://github.com/rustwasm/wee_alloc), an allocator optimized 69 | for small code size. 70 | -------------------------------------------------------------------------------- /wasm-pack/.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | sudo: false 3 | 4 | cache: cargo 5 | 6 | matrix: 7 | include: 8 | 9 | # Builds with wasm-pack. 10 | - rust: beta 11 | env: RUST_BACKTRACE=1 12 | addons: 13 | firefox: latest 14 | chrome: stable 15 | before_script: 16 | - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) 17 | - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) 18 | - cargo install-update -a 19 | - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f 20 | script: 21 | - cargo generate --git . --name testing 22 | # Having a broken Cargo.toml (in that it has curlies in fields) anywhere 23 | # in any of our parent dirs is problematic. 24 | - mv Cargo.toml Cargo.toml.tmpl 25 | - cd testing 26 | - wasm-pack build 27 | - wasm-pack test --chrome --firefox --headless 28 | 29 | # Builds on nightly. 30 | - rust: nightly 31 | env: RUST_BACKTRACE=1 32 | before_script: 33 | - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) 34 | - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) 35 | - cargo install-update -a 36 | - rustup target add wasm32-unknown-unknown 37 | script: 38 | - cargo generate --git . --name testing 39 | - mv Cargo.toml Cargo.toml.tmpl 40 | - cd testing 41 | - cargo check 42 | - cargo check --target wasm32-unknown-unknown 43 | - cargo check --no-default-features 44 | - cargo check --target wasm32-unknown-unknown --no-default-features 45 | - cargo check --no-default-features --features console_error_panic_hook 46 | - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook 47 | - cargo check --no-default-features --features "console_error_panic_hook wee_alloc" 48 | - cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc" 49 | 50 | # Builds on beta. 51 | - rust: beta 52 | env: RUST_BACKTRACE=1 53 | before_script: 54 | - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) 55 | - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) 56 | - cargo install-update -a 57 | - rustup target add wasm32-unknown-unknown 58 | script: 59 | - cargo generate --git . --name testing 60 | - mv Cargo.toml Cargo.toml.tmpl 61 | - cd testing 62 | - cargo check 63 | - cargo check --target wasm32-unknown-unknown 64 | - cargo check --no-default-features 65 | - cargo check --target wasm32-unknown-unknown --no-default-features 66 | - cargo check --no-default-features --features console_error_panic_hook 67 | - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook 68 | # Note: no enabling the `wee_alloc` feature here because it requires 69 | # nightly for now. 70 | -------------------------------------------------------------------------------- /wasm-pack/LICENSE_APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | -------------------------------------------------------------------------------- /neon/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neon", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-escape-sequences": { 8 | "version": "4.1.0", 9 | "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", 10 | "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", 11 | "requires": { 12 | "array-back": "^3.0.1" 13 | }, 14 | "dependencies": { 15 | "array-back": { 16 | "version": "3.1.0", 17 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", 18 | "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" 19 | } 20 | } 21 | }, 22 | "ansi-escapes": { 23 | "version": "3.2.0", 24 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 25 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 26 | }, 27 | "ansi-regex": { 28 | "version": "3.0.0", 29 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 30 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 31 | }, 32 | "ansi-styles": { 33 | "version": "3.2.1", 34 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 35 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 36 | "requires": { 37 | "color-convert": "^1.9.0" 38 | } 39 | }, 40 | "array-back": { 41 | "version": "2.0.0", 42 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", 43 | "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", 44 | "requires": { 45 | "typical": "^2.6.1" 46 | } 47 | }, 48 | "balanced-match": { 49 | "version": "1.0.0", 50 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 51 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 52 | }, 53 | "brace-expansion": { 54 | "version": "1.1.11", 55 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 56 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 57 | "requires": { 58 | "balanced-match": "^1.0.0", 59 | "concat-map": "0.0.1" 60 | } 61 | }, 62 | "builtins": { 63 | "version": "1.0.3", 64 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", 65 | "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" 66 | }, 67 | "chalk": { 68 | "version": "2.1.0", 69 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 70 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 71 | "requires": { 72 | "ansi-styles": "^3.1.0", 73 | "escape-string-regexp": "^1.0.5", 74 | "supports-color": "^4.0.0" 75 | } 76 | }, 77 | "chardet": { 78 | "version": "0.4.2", 79 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 80 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" 81 | }, 82 | "cli-cursor": { 83 | "version": "2.1.0", 84 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 85 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 86 | "requires": { 87 | "restore-cursor": "^2.0.0" 88 | } 89 | }, 90 | "cli-width": { 91 | "version": "2.2.1", 92 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 93 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 94 | }, 95 | "color-convert": { 96 | "version": "1.9.3", 97 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 98 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 99 | "requires": { 100 | "color-name": "1.1.3" 101 | } 102 | }, 103 | "color-name": { 104 | "version": "1.1.3", 105 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 106 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 107 | }, 108 | "command-line-args": { 109 | "version": "4.0.7", 110 | "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", 111 | "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", 112 | "requires": { 113 | "array-back": "^2.0.0", 114 | "find-replace": "^1.0.3", 115 | "typical": "^2.6.1" 116 | } 117 | }, 118 | "command-line-commands": { 119 | "version": "2.0.1", 120 | "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-2.0.1.tgz", 121 | "integrity": "sha512-m8c2p1DrNd2ruIAggxd/y6DgygQayf6r8RHwchhXryaLF8I6koYjoYroVP+emeROE9DXN5b9sP1Gh+WtvTTdtQ==", 122 | "requires": { 123 | "array-back": "^2.0.0" 124 | } 125 | }, 126 | "command-line-usage": { 127 | "version": "4.1.0", 128 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", 129 | "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", 130 | "requires": { 131 | "ansi-escape-sequences": "^4.0.0", 132 | "array-back": "^2.0.0", 133 | "table-layout": "^0.4.2", 134 | "typical": "^2.6.1" 135 | } 136 | }, 137 | "commander": { 138 | "version": "2.20.3", 139 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 140 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 141 | "optional": true 142 | }, 143 | "concat-map": { 144 | "version": "0.0.1", 145 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 146 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 147 | }, 148 | "deep-extend": { 149 | "version": "0.6.0", 150 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 151 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 152 | }, 153 | "escape-string-regexp": { 154 | "version": "1.0.5", 155 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 156 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 157 | }, 158 | "external-editor": { 159 | "version": "2.2.0", 160 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 161 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 162 | "requires": { 163 | "chardet": "^0.4.0", 164 | "iconv-lite": "^0.4.17", 165 | "tmp": "^0.0.33" 166 | } 167 | }, 168 | "figures": { 169 | "version": "2.0.0", 170 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 171 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 172 | "requires": { 173 | "escape-string-regexp": "^1.0.5" 174 | } 175 | }, 176 | "find-replace": { 177 | "version": "1.0.3", 178 | "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", 179 | "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", 180 | "requires": { 181 | "array-back": "^1.0.4", 182 | "test-value": "^2.1.0" 183 | }, 184 | "dependencies": { 185 | "array-back": { 186 | "version": "1.0.4", 187 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", 188 | "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", 189 | "requires": { 190 | "typical": "^2.6.0" 191 | } 192 | } 193 | } 194 | }, 195 | "fs.realpath": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 198 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 199 | }, 200 | "git-config": { 201 | "version": "0.0.7", 202 | "resolved": "https://registry.npmjs.org/git-config/-/git-config-0.0.7.tgz", 203 | "integrity": "sha1-qcij7wendsPXImE1bYtye2IgKyg=", 204 | "requires": { 205 | "iniparser": "~1.0.5" 206 | } 207 | }, 208 | "glob": { 209 | "version": "7.1.6", 210 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 211 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 212 | "requires": { 213 | "fs.realpath": "^1.0.0", 214 | "inflight": "^1.0.4", 215 | "inherits": "2", 216 | "minimatch": "^3.0.4", 217 | "once": "^1.3.0", 218 | "path-is-absolute": "^1.0.0" 219 | } 220 | }, 221 | "handlebars": { 222 | "version": "4.7.6", 223 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", 224 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", 225 | "requires": { 226 | "minimist": "^1.2.5", 227 | "neo-async": "^2.6.0", 228 | "source-map": "^0.6.1", 229 | "uglify-js": "^3.1.4", 230 | "wordwrap": "^1.0.0" 231 | } 232 | }, 233 | "has-flag": { 234 | "version": "2.0.0", 235 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 236 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" 237 | }, 238 | "iconv-lite": { 239 | "version": "0.4.24", 240 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 241 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 242 | "requires": { 243 | "safer-buffer": ">= 2.1.2 < 3" 244 | } 245 | }, 246 | "inflight": { 247 | "version": "1.0.6", 248 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 249 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 250 | "requires": { 251 | "once": "^1.3.0", 252 | "wrappy": "1" 253 | } 254 | }, 255 | "inherits": { 256 | "version": "2.0.4", 257 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 258 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 259 | }, 260 | "iniparser": { 261 | "version": "1.0.5", 262 | "resolved": "https://registry.npmjs.org/iniparser/-/iniparser-1.0.5.tgz", 263 | "integrity": "sha1-g21r7+bfv87gvM8c+fKsxwJ/eD0=" 264 | }, 265 | "inquirer": { 266 | "version": "3.3.0", 267 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 268 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 269 | "requires": { 270 | "ansi-escapes": "^3.0.0", 271 | "chalk": "^2.0.0", 272 | "cli-cursor": "^2.1.0", 273 | "cli-width": "^2.0.0", 274 | "external-editor": "^2.0.4", 275 | "figures": "^2.0.0", 276 | "lodash": "^4.3.0", 277 | "mute-stream": "0.0.7", 278 | "run-async": "^2.2.0", 279 | "rx-lite": "^4.0.8", 280 | "rx-lite-aggregates": "^4.0.8", 281 | "string-width": "^2.1.0", 282 | "strip-ansi": "^4.0.0", 283 | "through": "^2.3.6" 284 | } 285 | }, 286 | "is-fullwidth-code-point": { 287 | "version": "2.0.0", 288 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 289 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 290 | }, 291 | "lodash": { 292 | "version": "4.17.15", 293 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 294 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 295 | }, 296 | "lodash.padend": { 297 | "version": "4.6.1", 298 | "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", 299 | "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" 300 | }, 301 | "mimic-fn": { 302 | "version": "1.2.0", 303 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 304 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 305 | }, 306 | "minimatch": { 307 | "version": "3.0.4", 308 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 309 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 310 | "requires": { 311 | "brace-expansion": "^1.1.7" 312 | } 313 | }, 314 | "minimist": { 315 | "version": "1.2.5", 316 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 317 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 318 | }, 319 | "mkdirp": { 320 | "version": "0.5.5", 321 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 322 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 323 | "requires": { 324 | "minimist": "^1.2.5" 325 | } 326 | }, 327 | "mute-stream": { 328 | "version": "0.0.7", 329 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 330 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 331 | }, 332 | "neo-async": { 333 | "version": "2.6.1", 334 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", 335 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" 336 | }, 337 | "neon-cli": { 338 | "version": "0.3.3", 339 | "resolved": "https://registry.npmjs.org/neon-cli/-/neon-cli-0.3.3.tgz", 340 | "integrity": "sha512-P2kc9ZDp0fXfmHDx3YcQwX8gvZew8WroXG3YY6N2LZoYZNrnGUWIOYGQcck52Jmry+ka02xDtw+lCHpOuGoxRA==", 341 | "requires": { 342 | "chalk": "~2.1.0", 343 | "command-line-args": "^4.0.2", 344 | "command-line-commands": "^2.0.0", 345 | "command-line-usage": "^4.0.0", 346 | "git-config": "0.0.7", 347 | "handlebars": "^4.1.0", 348 | "inquirer": "^3.0.6", 349 | "mkdirp": "^0.5.1", 350 | "quickly-copy-file": "^1.0.0", 351 | "rimraf": "^2.6.1", 352 | "rsvp": "^4.6.1", 353 | "semver": "^5.1.0", 354 | "toml": "^2.3.0", 355 | "ts-typed-json": "^0.2.2", 356 | "validate-npm-package-license": "^3.0.1", 357 | "validate-npm-package-name": "^3.0.0" 358 | } 359 | }, 360 | "once": { 361 | "version": "1.4.0", 362 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 363 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 364 | "requires": { 365 | "wrappy": "1" 366 | } 367 | }, 368 | "onetime": { 369 | "version": "2.0.1", 370 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 371 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 372 | "requires": { 373 | "mimic-fn": "^1.0.0" 374 | } 375 | }, 376 | "os-tmpdir": { 377 | "version": "1.0.2", 378 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 379 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 380 | }, 381 | "path-is-absolute": { 382 | "version": "1.0.1", 383 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 384 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 385 | }, 386 | "quickly-copy-file": { 387 | "version": "1.0.0", 388 | "resolved": "https://registry.npmjs.org/quickly-copy-file/-/quickly-copy-file-1.0.0.tgz", 389 | "integrity": "sha1-n4/wZiMFEO50IrASFHKwk6hpCFk=", 390 | "requires": { 391 | "mkdirp": "~0.5.0" 392 | } 393 | }, 394 | "reduce-flatten": { 395 | "version": "1.0.1", 396 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", 397 | "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=" 398 | }, 399 | "restore-cursor": { 400 | "version": "2.0.0", 401 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 402 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 403 | "requires": { 404 | "onetime": "^2.0.0", 405 | "signal-exit": "^3.0.2" 406 | } 407 | }, 408 | "rimraf": { 409 | "version": "2.7.1", 410 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 411 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 412 | "requires": { 413 | "glob": "^7.1.3" 414 | } 415 | }, 416 | "rsvp": { 417 | "version": "4.8.5", 418 | "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", 419 | "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" 420 | }, 421 | "run-async": { 422 | "version": "2.4.1", 423 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 424 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 425 | }, 426 | "rx-lite": { 427 | "version": "4.0.8", 428 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 429 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" 430 | }, 431 | "rx-lite-aggregates": { 432 | "version": "4.0.8", 433 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 434 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 435 | "requires": { 436 | "rx-lite": "*" 437 | } 438 | }, 439 | "safer-buffer": { 440 | "version": "2.1.2", 441 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 442 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 443 | }, 444 | "semver": { 445 | "version": "5.7.1", 446 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 447 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 448 | }, 449 | "signal-exit": { 450 | "version": "3.0.3", 451 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 452 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 453 | }, 454 | "source-map": { 455 | "version": "0.6.1", 456 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 457 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 458 | }, 459 | "spdx-correct": { 460 | "version": "3.1.0", 461 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 462 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 463 | "requires": { 464 | "spdx-expression-parse": "^3.0.0", 465 | "spdx-license-ids": "^3.0.0" 466 | } 467 | }, 468 | "spdx-exceptions": { 469 | "version": "2.3.0", 470 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 471 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" 472 | }, 473 | "spdx-expression-parse": { 474 | "version": "3.0.0", 475 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 476 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 477 | "requires": { 478 | "spdx-exceptions": "^2.1.0", 479 | "spdx-license-ids": "^3.0.0" 480 | } 481 | }, 482 | "spdx-license-ids": { 483 | "version": "3.0.5", 484 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 485 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 486 | }, 487 | "string-width": { 488 | "version": "2.1.1", 489 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 490 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 491 | "requires": { 492 | "is-fullwidth-code-point": "^2.0.0", 493 | "strip-ansi": "^4.0.0" 494 | } 495 | }, 496 | "strip-ansi": { 497 | "version": "4.0.0", 498 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 499 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 500 | "requires": { 501 | "ansi-regex": "^3.0.0" 502 | } 503 | }, 504 | "supports-color": { 505 | "version": "4.5.0", 506 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 507 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 508 | "requires": { 509 | "has-flag": "^2.0.0" 510 | } 511 | }, 512 | "table-layout": { 513 | "version": "0.4.5", 514 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", 515 | "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", 516 | "requires": { 517 | "array-back": "^2.0.0", 518 | "deep-extend": "~0.6.0", 519 | "lodash.padend": "^4.6.1", 520 | "typical": "^2.6.1", 521 | "wordwrapjs": "^3.0.0" 522 | } 523 | }, 524 | "test-value": { 525 | "version": "2.1.0", 526 | "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", 527 | "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", 528 | "requires": { 529 | "array-back": "^1.0.3", 530 | "typical": "^2.6.0" 531 | }, 532 | "dependencies": { 533 | "array-back": { 534 | "version": "1.0.4", 535 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", 536 | "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", 537 | "requires": { 538 | "typical": "^2.6.0" 539 | } 540 | } 541 | } 542 | }, 543 | "through": { 544 | "version": "2.3.8", 545 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 546 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 547 | }, 548 | "tmp": { 549 | "version": "0.0.33", 550 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 551 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 552 | "requires": { 553 | "os-tmpdir": "~1.0.2" 554 | } 555 | }, 556 | "toml": { 557 | "version": "2.3.6", 558 | "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", 559 | "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" 560 | }, 561 | "ts-typed-json": { 562 | "version": "0.2.2", 563 | "resolved": "https://registry.npmjs.org/ts-typed-json/-/ts-typed-json-0.2.2.tgz", 564 | "integrity": "sha1-UxhL7ok+RZkbc8jEY6OLWeJ81H4=", 565 | "requires": { 566 | "rsvp": "^3.5.0" 567 | }, 568 | "dependencies": { 569 | "rsvp": { 570 | "version": "3.6.2", 571 | "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", 572 | "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" 573 | } 574 | } 575 | }, 576 | "typical": { 577 | "version": "2.6.1", 578 | "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", 579 | "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" 580 | }, 581 | "uglify-js": { 582 | "version": "3.9.1", 583 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", 584 | "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", 585 | "optional": true, 586 | "requires": { 587 | "commander": "~2.20.3" 588 | } 589 | }, 590 | "validate-npm-package-license": { 591 | "version": "3.0.4", 592 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 593 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 594 | "requires": { 595 | "spdx-correct": "^3.0.0", 596 | "spdx-expression-parse": "^3.0.0" 597 | } 598 | }, 599 | "validate-npm-package-name": { 600 | "version": "3.0.0", 601 | "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", 602 | "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", 603 | "requires": { 604 | "builtins": "^1.0.3" 605 | } 606 | }, 607 | "wordwrap": { 608 | "version": "1.0.0", 609 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 610 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 611 | }, 612 | "wordwrapjs": { 613 | "version": "3.0.0", 614 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", 615 | "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", 616 | "requires": { 617 | "reduce-flatten": "^1.0.1", 618 | "typical": "^2.6.1" 619 | } 620 | }, 621 | "wrappy": { 622 | "version": "1.0.2", 623 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 624 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 625 | } 626 | } 627 | } 628 | --------------------------------------------------------------------------------