diff --git a/.idea/runConfigurations/_trace__filter__array.xml b/.idea/runConfigurations/_trace__filter__array.xml
deleted file mode 100644
index ba1e808..0000000
--- a/.idea/runConfigurations/_trace__filter__array.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__filter__example.xml b/.idea/runConfigurations/_trace__filter__example.xml
deleted file mode 100644
index c6f1d22..0000000
--- a/.idea/runConfigurations/_trace__filter__example.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__filter__op.xml b/.idea/runConfigurations/_trace__filter__op.xml
deleted file mode 100644
index 52842d0..0000000
--- a/.idea/runConfigurations/_trace__filter__op.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__filter__return_type.xml b/.idea/runConfigurations/_trace__filter__return_type.xml
deleted file mode 100644
index 7f2a0cc..0000000
--- a/.idea/runConfigurations/_trace__filter__return_type.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__filter__step_in.xml b/.idea/runConfigurations/_trace__filter__step_in.xml
deleted file mode 100644
index e3bc808..0000000
--- a/.idea/runConfigurations/_trace__filter__step_in.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__parser__parse_array_float.xml b/.idea/runConfigurations/_trace__parser__parse_array_float.xml
deleted file mode 100644
index f912aaa..0000000
--- a/.idea/runConfigurations/_trace__parser__parse_array_float.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__parser__parse_array_sytax.xml b/.idea/runConfigurations/_trace__parser__parse_array_sytax.xml
deleted file mode 100644
index 14e87ff..0000000
--- a/.idea/runConfigurations/_trace__parser__parse_array_sytax.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/_trace__parser__parse_path.xml b/.idea/runConfigurations/_trace__parser__parse_path.xml
deleted file mode 100644
index c43f72a..0000000
--- a/.idea/runConfigurations/_trace__parser__parse_path.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/all.xml b/.idea/runConfigurations/all.xml
index cae146e..cb9472d 100644
--- a/.idea/runConfigurations/all.xml
+++ b/.idea/runConfigurations/all.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/.idea/runConfigurations/filter.xml b/.idea/runConfigurations/filter.xml
new file mode 100644
index 0000000..157a24b
--- /dev/null
+++ b/.idea/runConfigurations/filter.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/filter_all.xml b/.idea/runConfigurations/filter_all.xml
deleted file mode 100644
index 01babd6..0000000
--- a/.idea/runConfigurations/filter_all.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/lib.xml b/.idea/runConfigurations/lib.xml
new file mode 100644
index 0000000..6bd36ec
--- /dev/null
+++ b/.idea/runConfigurations/lib.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/parser.xml b/.idea/runConfigurations/parser.xml
new file mode 100644
index 0000000..c7acee9
--- /dev/null
+++ b/.idea/runConfigurations/parser.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/parser_all.xml b/.idea/runConfigurations/parser_all.xml
deleted file mode 100644
index a123ded..0000000
--- a/.idea/runConfigurations/parser_all.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/tokenize_all.xml b/.idea/runConfigurations/tokenize_all.xml
deleted file mode 100644
index fed0e31..0000000
--- a/.idea/runConfigurations/tokenize_all.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/tokenizer.xml b/.idea/runConfigurations/tokenizer.xml
new file mode 100644
index 0000000..7f7d0e2
--- /dev/null
+++ b/.idea/runConfigurations/tokenizer.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index bc75abb..e5b153a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,9 +13,6 @@ matrix:
- rust: stable
env: RUST_BACKTRACE=1
- # addons:
- # firefox: latest
- # chrome: stable
before_script:
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
@@ -26,64 +23,21 @@ matrix:
- cargo test --verbose --all
- cd wasm
- wasm-pack build
-# - wasm-pack test --chrome --firefox --headless
-
- # Builds with wasm-pack.
- - rust: beta
- env: RUST_BACKTRACE=1
-# addons:
-# firefox: latest
-# chrome: stable
- before_script:
- - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
- - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
- - cargo install-update -a
- - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
- script:
- - cargo build --verbose --all
- - cargo test --verbose --all
- - cd wasm
- - wasm-pack build
-# - wasm-pack test --chrome --firefox --headless
-
- # Builds on nightly.
- - rust: nightly
- env: RUST_BACKTRACE=1
- before_script:
- - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
- - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
- - cargo install-update -a
- - rustup target add wasm32-unknown-unknown
- script:
- - cargo build --verbose --all
- - cargo test --verbose --all
- - cd wasm
- - cargo check
- - cargo check --target wasm32-unknown-unknown
- - cargo check --no-default-features
- - cargo check --target wasm32-unknown-unknown --no-default-features
- - cargo check --no-default-features --features console_error_panic_hook
- - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook
- - cargo check --no-default-features --features "console_error_panic_hook wee_alloc"
- - cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc"
-
- # Builds on beta.
- - rust: beta
- env: RUST_BACKTRACE=1
- before_script:
- - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
- - (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
- - cargo install-update -a
- - rustup target add wasm32-unknown-unknown
- script:
- - cargo build --verbose --all
- - cargo test --verbose --all
- - cd wasm
- - cargo check
- - cargo check --target wasm32-unknown-unknown
- - cargo check --no-default-features
- - cargo check --target wasm32-unknown-unknown --no-default-features
- - cargo check --no-default-features --features console_error_panic_hook
- - cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook
- # Note: no enabling the `wee_alloc` feature here because it requires
- # nightly for now.
+ - language: node_js
+ node_js:
+ - 'node'
+ - '11'
+ - '10'
+ - '9'
+ - '8'
+ before_install:
+ - curl https://sh.rustup.rs -sSf > /tmp/rustup.sh
+ - sh /tmp/rustup.sh -y
+ - export PATH="$HOME/.cargo/bin:$PATH"
+ - source "$HOME/.cargo/env"
+ - cd nodejs
+ - node -v
+ - npm -v
+ - npm install
+ script:
+ - npm test
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index 72a69ba..af1cabc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -30,5 +30,5 @@ name = "jsonpath_lib"
path = "src/lib.rs"
[profile.release]
-debug = true
-lto = false
+#debug = true
+#lto = false
diff --git a/benches/bench.rs b/benches/bench.rs
index cfe1957..be51d33 100644
--- a/benches/bench.rs
+++ b/benches/bench.rs
@@ -15,13 +15,39 @@ fn read_json(path: &str) -> String {
}
#[bench]
-fn bench_reader(b: &mut Bencher) {
+fn bench_selector(b: &mut Bencher) {
let string = read_json("./benches/example.json");
+ let path = r#"$..book[?(@.price<30 && @.category=="fiction")]"#;
let json: Value = serde_json::from_str(string.as_str()).unwrap();
- let mut reader = jsonpath::reader(json);
+ let mut selector = jsonpath::selector(&json);
b.iter(move || {
- for _ in 1..10000 {
- let _ = reader("$.store").unwrap();
+ for _ in 1..1000 {
+ let _ = selector(path).unwrap();
+ }
+ });
+}
+
+#[bench]
+fn bench_select(b: &mut Bencher) {
+ let string = read_json("./benches/example.json");
+ let path = r#"$..book[?(@.price<30 && @.category=="fiction")]"#;
+ let json: Value = serde_json::from_str(string.as_str()).unwrap();
+ b.iter(move || {
+ for _ in 1..1000 {
+ let _ = jsonpath::select(&json, path).unwrap();
+ }
+ });
+}
+
+#[bench]
+fn bench_compile(b: &mut Bencher) {
+ let string = read_json("./benches/example.json");
+ let path = r#"$..book[?(@.price<30 && @.category=="fiction")]"#;
+ let json: Value = serde_json::from_str(string.as_str()).unwrap();
+ let mut template = jsonpath::compile(path);
+ b.iter(move || {
+ for _ in 1..1000 {
+ let _ = template(&json).unwrap();
}
});
}
\ No newline at end of file
diff --git a/benches/bench_bin/.gitignore b/benches/bench_bin/.gitignore
index bbcdd09..4fbbf9d 100644
--- a/benches/bench_bin/.gitignore
+++ b/benches/bench_bin/.gitignore
@@ -1,4 +1,5 @@
/target
**/*.rs.bk
Cargo.lock
-bin/
\ No newline at end of file
+bin/
+.idea
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/bench_bin.iml b/benches/bench_bin/.idea/bench_bin.iml
new file mode 100644
index 0000000..f270a33
--- /dev/null
+++ b/benches/bench_bin/.idea/bench_bin.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/encodings.xml b/benches/bench_bin/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/benches/bench_bin/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/misc.xml b/benches/bench_bin/.idea/misc.xml
new file mode 100644
index 0000000..6a0d516
--- /dev/null
+++ b/benches/bench_bin/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/modules.xml b/benches/bench_bin/.idea/modules.xml
new file mode 100644
index 0000000..e381186
--- /dev/null
+++ b/benches/bench_bin/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/vcs.xml b/benches/bench_bin/.idea/vcs.xml
new file mode 100644
index 0000000..b2bdec2
--- /dev/null
+++ b/benches/bench_bin/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/.idea/workspace.xml b/benches/bench_bin/.idea/workspace.xml
new file mode 100644
index 0000000..93edc39
--- /dev/null
+++ b/benches/bench_bin/.idea/workspace.xml
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1552690262696
+
+
+ 1552690262696
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/benches/bench_bin/bench.sh b/benches/bench_bin/bench.sh
index 96a63eb..68ad3cc 100755
--- a/benches/bench_bin/bench.sh
+++ b/benches/bench_bin/bench.sh
@@ -2,7 +2,7 @@
set -e
if [ -d "target/release" ]; then
- ./target/release/bench_bin
+ ./target/release/bench_bin $1 $2
else
echo "빌드먼저"
fi
\ No newline at end of file
diff --git a/benches/bench_bin/src/main.rs b/benches/bench_bin/src/main.rs
index 00174f1..85e67bc 100644
--- a/benches/bench_bin/src/main.rs
+++ b/benches/bench_bin/src/main.rs
@@ -4,6 +4,8 @@ extern crate serde_json;
use serde_json::Value;
use std::io::Read;
+use std::env;
+
fn read_json(path: &str) -> String {
let mut f = std::fs::File::open(path).unwrap();
let mut contents = String::new();
@@ -14,8 +16,33 @@ fn read_json(path: &str) -> String {
fn main() {
let string = read_json("../example.json");
let json: Value = serde_json::from_str(string.as_str()).unwrap();
- let mut selector = jsonpath::selector(json);
- for _ in 1..100000 {
- let _ = selector(r#"$..book[?(@.price<30 && @.category=="fiction")]"#).unwrap();
+ let path = r#"$..book[?(@.price<30 && @.category=="fiction")]"#;
+
+ let args: Vec = env::args().collect();
+ let iter = match &args[2].as_str().parse::() {
+ Ok(iter) => *iter,
+ _ => 100000
+ };
+
+ match &args[1].as_str() {
+ &"compile" => {
+ let mut template = jsonpath::compile(path);
+ for _ in 1..iter {
+ let _ = template(&json).unwrap();
+ }
+ }
+ &"selector" => {
+ let mut selector = jsonpath::selector(&json);
+ for _ in 1..iter {
+ let _ = selector(path).unwrap();
+ }
+ }
+ &"select" => {
+ let json: Value = serde_json::from_str(string.as_str()).unwrap();
+ for _ in 1..iter {
+ let _ = jsonpath::select(&json, path).unwrap();
+ }
+ }
+ _ => panic!("Invalid argument")
}
}
diff --git a/benches/bench_node_vs_rust.sh b/benches/bench_node_vs_rust.sh
index 974760f..b941cb2 100755
--- a/benches/bench_node_vs_rust.sh
+++ b/benches/bench_node_vs_rust.sh
@@ -5,19 +5,42 @@ DIR="$(pwd)"
cd "${DIR}"/bench_bin && cargo build --release
-printf "\n\n$..book[?(@.price<30 && @.category=="fiction")] (loop 100,000)"
+ITER=100000
+
+printf "\n\n$..book[?(@.price<30 && @.category=="fiction")] (loop ${ITER})"
printf "\n\n"
-echo "Rust: " && time ./bench.sh
+#echo "Rust - compile: " && time ./bench.sh compile ${ITER}
+#printf "\n"
+#sleep 1
+#echo "Rust - selector: " && time ./bench.sh selector ${ITER}
+#printf "\n"
+#sleep 1
+echo "Rust - select: " && time ./bench.sh select ${ITER}
printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath module: " && time ./bench.sh jsonpath
+sleep 1
+cd "${DIR}"/javascript && echo "NodeJs - jsonpath: " && time ./bench.sh jsonpath ${ITER}
printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm module - selector: " && time ./bench.sh wasmSelector
+sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - selector: " && time ./bench.sh wasmSelector ${ITER}
+#printf "\n"
+#sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - compile: " && time ./bench.sh wasmCompile ${ITER}
+#printf "\n"
+#sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - compile-alloc: " && time ./bench.sh wasmCompileAlloc ${ITER}
+#printf "\n"
+#sleep 1
+cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - select:" && time ./bench.sh wasmSelect ${ITER}
printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm module - compile: " && time ./bench.sh wasmCompile
-printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm module - compile-alloc: " && time ./bench.sh wasmCompileAlloc
-printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm module - select:" && time ./bench.sh wasmSelect
-printf "\n"
-cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm module - select-alloc:" && time ./bench.sh wasmSelectAlloc
\ No newline at end of file
+sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - select-alloc:" && time ./bench.sh wasmSelectAlloc ${ITER}
+#printf "\n"
+#sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-rs - compile:" && time ./bench.sh nativeCompile ${ITER}
+#printf "\n"
+#sleep 1
+#cd "${DIR}"/javascript && echo "NodeJs - jsonpath-rs - selector:" && time ./bench.sh nativeSelector ${ITER}
+#printf "\n"
+#sleep 1
+cd "${DIR}"/javascript && echo "NodeJs - jsonpath-rs - select:" && time ./bench.sh nativeSelect ${ITER}
\ No newline at end of file
diff --git a/benches/javascript/bench.js b/benches/javascript/bench.js
index 4927116..562bea3 100644
--- a/benches/javascript/bench.js
+++ b/benches/javascript/bench.js
@@ -35,40 +35,65 @@ let json = {
},
'expensive': 10,
};
+let jsonStr = JSON.stringify(json);
+function getJson() {
+ return JSON.parse(jsonStr);
+}
+const path = '$..book[?(@.price<30 && @.category=="fiction")]';
const jp = require('jsonpath');
const jpw = require('@nodejs/jsonpath-wasm');
-const iter = 100000;
+const jpwRs = require('jsonpath-rs');
function jsonpath() {
for (var i = 0; i < iter; i++) {
- let _ = jp.query(json, '$..book[?(@.price<30 && @.category=="fiction")]');
+ let _ = jp.query(getJson(), path);
+ }
+}
+
+function nativeCompile() {
+ let template = jpwRs.compile(path);
+ for (var i = 0; i < iter; i++) {
+ let _ = template(JSON.stringify(json));
+ }
+}
+
+function nativeSelector() {
+ let selector = jpwRs.selector(getJson());
+ for (var i = 0; i < iter; i++) {
+ let _ = selector(path);
+ }
+}
+
+function nativeSelect() {
+ for (var i = 0; i < iter; i++) {
+ let _ = jpwRs.select(JSON.stringify(json), path);
}
}
function wasmSelector() {
- let selector = jpw.selector(json);
+ let selector = jpw.selector(getJson());
for (var i = 0; i < iter; i++) {
- let _ = selector('$..book[?(@.price<30 && @.category=="fiction")]');
+ let _ = selector(path);
}
}
function wasmCompile() {
- let template = jpw.compile('$..book[?(@.price<30 && @.category=="fiction")]');
+ let template = jpw.compile(path);
for (var i = 0; i < iter; i++) {
- let _ = template(json);
+ let _ = template(getJson());
}
}
function wasmCompileAlloc() {
- let ptr = jpw.alloc_json(json);
+ let ptr = jpw.alloc_json(getJson());
if (ptr == 0) {
console.error('Invalid pointer');
return;
}
try {
- let template = jpw.compile('$..book[?(@.price<30 && @.category=="fiction")]');
+ let template = jpw.compile(path);
for (var i = 0; i < iter; i++) {
let _ = template(ptr);
}
@@ -79,12 +104,12 @@ function wasmCompileAlloc() {
function wasmSelect() {
for (var i = 0; i < iter; i++) {
- let _ = jpw.select(json, '$..book[?(@.price<30 && @.category=="fiction")]');
+ let _ = jpw.select(getJson(), path);
}
}
function wasmSelectAlloc() {
- let ptr = jpw.alloc_json(json);
+ let ptr = jpw.alloc_json(getJson());
if (ptr == 0) {
console.error('Invalid pointer');
return;
@@ -92,33 +117,13 @@ function wasmSelectAlloc() {
try {
for (var i = 0; i < iter; i++) {
- let _ = jpw.select(ptr, '$..book[?(@.price<30 && @.category=="fiction")]');
+ let _ = jpw.select(ptr, path);
}
} finally {
jpw.dealloc_json(ptr);
}
}
-let functionName = process.argv[2];
-
-switch (functionName) {
- case 'jsonpath':
- jsonpath();
- break;
- case 'wasmSelector':
- wasmSelector();
- break;
- case 'wasmCompile':
- wasmCompile();
- break;
- case 'wasmSelect':
- wasmSelect();
- break;
- case 'wasmCompileAlloc':
- wasmCompileAlloc();
- break;
- case 'wasmSelectAlloc':
- wasmSelectAlloc();
- default:
- console.error('Invalid function name');
-}
+const functionName = process.argv[2];
+const iter = parseInt(process.argv[3], 10);
+eval(functionName + "()");
\ No newline at end of file
diff --git a/benches/javascript/bench.sh b/benches/javascript/bench.sh
index 36f0194..8bfd5c0 100755
--- a/benches/javascript/bench.sh
+++ b/benches/javascript/bench.sh
@@ -1,2 +1,2 @@
#!/bin/bash
-node bench.js $1
+node bench.js $1 $2
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..a229421
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+set -e
+
+# project_root
+DIR="$(pwd)"
+WASM="${DIR}"/wasm
+WASM_WWW="${WASM}"/www
+WASM_WWW_BENCH="${WASM}"/www_bench
+WASM_BROWSER_PKG="${WASM}"/browser_pkg
+WASM_NODEJS_PKG="${WASM}"/nodejs_pkg
+BENCHES="${DIR}"/benches
+BENCHES_JS="${BENCHES}"/javascript
+NODEJS="${DIR}"/nodejs
+DOCS="${DIR}"/docs
+DOCS_BENCH="${DOCS}"/bench
+
+__msg () {
+ echo ">>>>>>>>>>$1<<<<<<<<<<"
+}
+
+__cargo_clean () {
+ cd "${BENCHES}"/bench_bin && cargo clean && \
+ cd "${NODEJS}"/native && cargo clean && \
+ cd "${WASM}" && cargo clean && \
+ cd "${DIR}" && cargo clean
+}
+
+echo
+__msg "clean"
+rm -rf \
+ "${WASM_NODEJS_PKG}" \
+ "${WASM_BROWSER_PKG}" \
+ "${BENCHES_JS}"/node_modules \
+ "${NODEJS}"/node_modules \
+ "${WASM_WWW}"/node_modules \
+ "${WASM_WWW_BENCH}"/node_modules \
+ "${WASM_WWW}"/dist \
+ "${WASM_WWW_BENCH}"/dist
+
+if [ "$1" = "all" ]; then
+ __msg "clean targets"
+ __cargo_clean
+fi
+
+__msg "npm install"
+echo
+cd "${WASM_WWW}" && npm install
+cd "${WASM_WWW_BENCH}" && npm install
+cd "${NODEJS}" && npm install
+cd "${BENCHES_JS}" && npm install
+
+echo
+echo
+__msg "wasm-pack"
+cd "${WASM}" && \
+ wasm-pack build --target=nodejs --scope nodejs --out-dir nodejs_pkg && \
+ cd "${WASM_NODEJS_PKG}" && npm link
+
+cd "${WASM}" && \
+ wasm-pack build --target=browser --scope browser --out-dir browser_pkg && \
+ cd "${WASM_BROWSER_PKG}" && npm link
+
+echo
+__msg "link"
+cd "${WASM_WWW}" && \
+ npm link @browser/jsonpath-wasm
+
+cd "${WASM_WWW_BENCH}" && \
+ npm link @browser/jsonpath-wasm
+
+cd "${BENCHES_JS}" && \
+ npm link @nodejs/jsonpath-wasm && \
+ npm link jsonpath-rs
+
+echo
+__msg "docs"
+cd "${WASM_WWW}" && \
+ npm run build &&
+ rm -f "${DOCS}"/*.js "${DOCS}"/*.wasm "${DOCS}"/*.html && \
+ cp "${WASM_WWW}"/dist/*.* "${DOCS}"/
+
+cd "${WASM_WWW_BENCH}" && \
+ npm run build &&
+ rm -f "${DOCS_BENCH}"/*.js "${DOCS_BENCH}"/*.wasm "${DOCS_BENCH}"/*.html && \
+ cp "${WASM_WWW_BENCH}"/dist/*.* "${DOCS_BENCH}"/
+
+__msg "done"
diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js
index 24514ce..d8c210e 100644
--- a/docs/0.bootstrap.js
+++ b/docs/0.bootstrap.js
@@ -4,11 +4,11 @@
/*!***************************************!*\
!*** ../browser_pkg/jsonpath_wasm.js ***!
\***************************************/
-/*! exports provided: alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __widl_f_log_1_, __wbindgen_string_new, __wbindgen_number_get, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_closure_wrapper101, __wbindgen_closure_wrapper103, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_throw */
+/*! exports provided: alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __widl_f_log_1_, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_string_new, __wbindgen_number_get, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_closure_wrapper99, __wbindgen_closure_wrapper101, __wbindgen_throw */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alloc_json\", function() { return alloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dealloc_json\", function() { return dealloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reader\", function() { return reader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"read\", function() { return read; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"testa\", function() { return testa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__widl_f_log_1_\", function() { return __widl_f_log_1_; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return __wbindgen_number_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_forget\", function() { return __wbindgen_cb_forget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper101\", function() { return __wbindgen_closure_wrapper101; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper103\", function() { return __wbindgen_closure_wrapper103; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../browser_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n* @param {any} arg0\n* @returns {number}\n*/\nfunction alloc_json(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction dealloc_json(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](arg0)) !== 0;\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet cachegetUint8Memory = null;\nfunction getUint8Memory() {\n if (cachegetUint8Memory === null || cachegetUint8Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory = new Uint8Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet passStringToWasm;\nif (typeof cachedTextEncoder.encodeInto === 'function') {\n passStringToWasm = function(arg) {\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let writeOffset = 0;\n while (true) {\n const view = getUint8Memory().subarray(ptr + writeOffset, ptr + size);\n const { read, written } = cachedTextEncoder.encodeInto(arg, view);\n arg = arg.substring(read);\n writeOffset += written;\n if (arg.length === 0) {\n break;\n }\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size * 2);\n size *= 2;\n }\n WASM_VECTOR_LEN = writeOffset;\n return ptr;\n };\n} else {\n passStringToWasm = function(arg) {\n\n const buf = cachedTextEncoder.encode(arg);\n const ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](buf.length);\n getUint8Memory().set(buf, ptr);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n };\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n/**\n* @param {string} arg0\n* @returns {any}\n*/\nfunction compile(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use selector\n*\n* @param {any} arg0\n* @returns {any}\n*/\nfunction reader(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"reader\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @returns {any}\n*/\nfunction selector(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction select(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use select\n*\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction read(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"read\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n* @returns {void}\n*/\nfunction testa() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"testa\"]();\n}\n\nfunction __widl_f_log_1_(arg0) {\n console.log(getObject(arg0));\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8');\n\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbindgen_string_new(p, l) { return addHeapObject(getStringFromWasm(p, l)); }\n\nfunction __wbindgen_number_get(n, invalid) {\n let obj = getObject(n);\n if (typeof(obj) === 'number') return obj;\n getUint8Memory()[invalid] = 1;\n return 0;\n}\n\nfunction __wbindgen_is_string(i) { return typeof(getObject(i)) === 'string' ? 1 : 0; }\n\nlet cachegetUint32Memory = null;\nfunction getUint32Memory() {\n if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint32Memory = new Uint32Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint32Memory;\n}\n\nfunction __wbindgen_string_get(i, len_ptr) {\n let obj = getObject(i);\n if (typeof(obj) !== 'string') return 0;\n const ptr = passStringToWasm(obj);\n getUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\n return ptr;\n}\n\nconst __wbindgen_cb_forget = dropObject;\n\nfunction __wbindgen_json_parse(ptr, len) { return addHeapObject(JSON.parse(getStringFromWasm(ptr, len))); }\n\nfunction __wbindgen_json_serialize(idx, ptrptr) {\n const ptr = passStringToWasm(JSON.stringify(getObject(idx)));\n getUint32Memory()[ptrptr / 4] = ptr;\n return WASM_VECTOR_LEN;\n}\n\nfunction __wbindgen_closure_wrapper101(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(16);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const cb = function(arg0) {\n this.cnt++;\n try {\n return takeObject(f(this.a, b, addHeapObject(arg0)));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper103(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(14);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(15);\n const cb = function(arg0) {\n this.cnt++;\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(f(this.a, b, ptr0, len0));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_object_clone_ref(idx) {\n return addHeapObject(getObject(idx));\n}\n\nfunction __wbindgen_object_drop_ref(i) { dropObject(i); }\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alloc_json\", function() { return alloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dealloc_json\", function() { return dealloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reader\", function() { return reader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"read\", function() { return read; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"testa\", function() { return testa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__widl_f_log_1_\", function() { return __widl_f_log_1_; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return __wbindgen_number_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_forget\", function() { return __wbindgen_cb_forget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper99\", function() { return __wbindgen_closure_wrapper99; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper101\", function() { return __wbindgen_closure_wrapper101; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../browser_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n* @param {any} arg0\n* @returns {number}\n*/\nfunction alloc_json(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction dealloc_json(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](arg0)) !== 0;\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet cachegetUint8Memory = null;\nfunction getUint8Memory() {\n if (cachegetUint8Memory === null || cachegetUint8Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory = new Uint8Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passStringToWasm(arg) {\n\n const buf = cachedTextEncoder.encode(arg);\n const ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](buf.length);\n getUint8Memory().set(buf, ptr);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n/**\n* @param {string} arg0\n* @returns {any}\n*/\nfunction compile(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use selector\n*\n* @param {any} arg0\n* @returns {any}\n*/\nfunction reader(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"reader\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @returns {any}\n*/\nfunction selector(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction select(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use select\n*\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction read(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"read\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n* @returns {void}\n*/\nfunction testa() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"testa\"]();\n}\n\nfunction __widl_f_log_1_(arg0) {\n console.log(getObject(arg0));\n}\n\nfunction __wbindgen_object_clone_ref(idx) {\n return addHeapObject(getObject(idx));\n}\n\nfunction __wbindgen_object_drop_ref(i) { dropObject(i); }\n\nlet cachedTextDecoder = new TextDecoder('utf-8');\n\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbindgen_string_new(p, l) {\n return addHeapObject(getStringFromWasm(p, l));\n}\n\nfunction __wbindgen_number_get(n, invalid) {\n let obj = getObject(n);\n if (typeof(obj) === 'number') return obj;\n getUint8Memory()[invalid] = 1;\n return 0;\n}\n\nfunction __wbindgen_is_string(i) {\n return typeof(getObject(i)) === 'string' ? 1 : 0;\n}\n\nlet cachegetUint32Memory = null;\nfunction getUint32Memory() {\n if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint32Memory = new Uint32Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint32Memory;\n}\n\nfunction __wbindgen_string_get(i, len_ptr) {\n let obj = getObject(i);\n if (typeof(obj) !== 'string') return 0;\n const ptr = passStringToWasm(obj);\n getUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\n return ptr;\n}\n\nconst __wbindgen_cb_forget = dropObject;\n\nfunction __wbindgen_json_parse(ptr, len) {\n return addHeapObject(JSON.parse(getStringFromWasm(ptr, len)));\n}\n\nfunction __wbindgen_json_serialize(idx, ptrptr) {\n const ptr = passStringToWasm(JSON.stringify(getObject(idx)));\n getUint32Memory()[ptrptr / 4] = ptr;\n return WASM_VECTOR_LEN;\n}\n\nfunction __wbindgen_closure_wrapper99(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(14);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(15);\n const cb = function(arg0) {\n this.cnt++;\n try {\n return takeObject(f(this.a, b, addHeapObject(arg0)));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper101(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(16);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const cb = function(arg0) {\n this.cnt++;\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(f(this.a, b, ptr0, len0));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm.js?");
/***/ }),
@@ -16,7 +16,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/*!********************************************!*\
!*** ../browser_pkg/jsonpath_wasm_bg.wasm ***!
\********************************************/
-/*! exports provided: memory, alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_free, __wbg_function_table */
+/*! exports provided: memory, alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __wbindgen_malloc, __wbindgen_free, __wbg_function_table */
/***/ (function(module, exports, __webpack_require__) {
eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./jsonpath_wasm */ \"../browser_pkg/jsonpath_wasm.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm_bg.wasm?");
diff --git a/docs/9a826648f4cbc2bc8591.module.wasm b/docs/9a826648f4cbc2bc8591.module.wasm
deleted file mode 100644
index b09af39..0000000
Binary files a/docs/9a826648f4cbc2bc8591.module.wasm and /dev/null differ
diff --git a/docs/bench/0.bootstrap.js b/docs/bench/0.bootstrap.js
index f43bb0e..30b16e0 100644
--- a/docs/bench/0.bootstrap.js
+++ b/docs/bench/0.bootstrap.js
@@ -4,11 +4,11 @@
/*!***************************************!*\
!*** ../browser_pkg/jsonpath_wasm.js ***!
\***************************************/
-/*! exports provided: alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __widl_f_log_1_, __wbindgen_string_new, __wbindgen_number_get, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_closure_wrapper101, __wbindgen_closure_wrapper103, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_throw */
+/*! exports provided: alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __widl_f_log_1_, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_string_new, __wbindgen_number_get, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_closure_wrapper99, __wbindgen_closure_wrapper101, __wbindgen_throw */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alloc_json\", function() { return alloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dealloc_json\", function() { return dealloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reader\", function() { return reader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"read\", function() { return read; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"testa\", function() { return testa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__widl_f_log_1_\", function() { return __widl_f_log_1_; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return __wbindgen_number_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_forget\", function() { return __wbindgen_cb_forget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper101\", function() { return __wbindgen_closure_wrapper101; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper103\", function() { return __wbindgen_closure_wrapper103; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../browser_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n* @param {any} arg0\n* @returns {number}\n*/\nfunction alloc_json(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction dealloc_json(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](arg0)) !== 0;\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet cachegetUint8Memory = null;\nfunction getUint8Memory() {\n if (cachegetUint8Memory === null || cachegetUint8Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory = new Uint8Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet passStringToWasm;\nif (typeof cachedTextEncoder.encodeInto === 'function') {\n passStringToWasm = function(arg) {\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let writeOffset = 0;\n while (true) {\n const view = getUint8Memory().subarray(ptr + writeOffset, ptr + size);\n const { read, written } = cachedTextEncoder.encodeInto(arg, view);\n arg = arg.substring(read);\n writeOffset += written;\n if (arg.length === 0) {\n break;\n }\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size * 2);\n size *= 2;\n }\n WASM_VECTOR_LEN = writeOffset;\n return ptr;\n };\n} else {\n passStringToWasm = function(arg) {\n\n const buf = cachedTextEncoder.encode(arg);\n const ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](buf.length);\n getUint8Memory().set(buf, ptr);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n };\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n/**\n* @param {string} arg0\n* @returns {any}\n*/\nfunction compile(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use selector\n*\n* @param {any} arg0\n* @returns {any}\n*/\nfunction reader(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"reader\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @returns {any}\n*/\nfunction selector(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction select(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use select\n*\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction read(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"read\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n* @returns {void}\n*/\nfunction testa() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"testa\"]();\n}\n\nfunction __widl_f_log_1_(arg0) {\n console.log(getObject(arg0));\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8');\n\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbindgen_string_new(p, l) { return addHeapObject(getStringFromWasm(p, l)); }\n\nfunction __wbindgen_number_get(n, invalid) {\n let obj = getObject(n);\n if (typeof(obj) === 'number') return obj;\n getUint8Memory()[invalid] = 1;\n return 0;\n}\n\nfunction __wbindgen_is_string(i) { return typeof(getObject(i)) === 'string' ? 1 : 0; }\n\nlet cachegetUint32Memory = null;\nfunction getUint32Memory() {\n if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint32Memory = new Uint32Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint32Memory;\n}\n\nfunction __wbindgen_string_get(i, len_ptr) {\n let obj = getObject(i);\n if (typeof(obj) !== 'string') return 0;\n const ptr = passStringToWasm(obj);\n getUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\n return ptr;\n}\n\nconst __wbindgen_cb_forget = dropObject;\n\nfunction __wbindgen_json_parse(ptr, len) { return addHeapObject(JSON.parse(getStringFromWasm(ptr, len))); }\n\nfunction __wbindgen_json_serialize(idx, ptrptr) {\n const ptr = passStringToWasm(JSON.stringify(getObject(idx)));\n getUint32Memory()[ptrptr / 4] = ptr;\n return WASM_VECTOR_LEN;\n}\n\nfunction __wbindgen_closure_wrapper101(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(16);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const cb = function(arg0) {\n this.cnt++;\n try {\n return takeObject(f(this.a, b, addHeapObject(arg0)));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper103(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(14);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(15);\n const cb = function(arg0) {\n this.cnt++;\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(f(this.a, b, ptr0, len0));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_object_clone_ref(idx) {\n return addHeapObject(getObject(idx));\n}\n\nfunction __wbindgen_object_drop_ref(i) { dropObject(i); }\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alloc_json\", function() { return alloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dealloc_json\", function() { return dealloc_json; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reader\", function() { return reader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return select; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"read\", function() { return read; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"testa\", function() { return testa; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__widl_f_log_1_\", function() { return __widl_f_log_1_; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return __wbindgen_number_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_string\", function() { return __wbindgen_is_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_forget\", function() { return __wbindgen_cb_forget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_parse\", function() { return __wbindgen_json_parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper99\", function() { return __wbindgen_closure_wrapper99; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper101\", function() { return __wbindgen_closure_wrapper101; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../browser_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n/**\n* @param {any} arg0\n* @returns {number}\n*/\nfunction alloc_json(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction dealloc_json(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](arg0)) !== 0;\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet cachegetUint8Memory = null;\nfunction getUint8Memory() {\n if (cachegetUint8Memory === null || cachegetUint8Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory = new Uint8Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passStringToWasm(arg) {\n\n const buf = cachedTextEncoder.encode(arg);\n const ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](buf.length);\n getUint8Memory().set(buf, ptr);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n/**\n* @param {string} arg0\n* @returns {any}\n*/\nfunction compile(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](ptr0, len0));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use selector\n*\n* @param {any} arg0\n* @returns {any}\n*/\nfunction reader(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"reader\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @returns {any}\n*/\nfunction selector(arg0) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(arg0)));\n}\n\n/**\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction select(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n*\n* deprecated. use select\n*\n* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction read(arg0, arg1) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"read\"](addHeapObject(arg0), ptr1, len1));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\n}\n\n/**\n* @returns {void}\n*/\nfunction testa() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"testa\"]();\n}\n\nfunction __widl_f_log_1_(arg0) {\n console.log(getObject(arg0));\n}\n\nfunction __wbindgen_object_clone_ref(idx) {\n return addHeapObject(getObject(idx));\n}\n\nfunction __wbindgen_object_drop_ref(i) { dropObject(i); }\n\nlet cachedTextDecoder = new TextDecoder('utf-8');\n\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbindgen_string_new(p, l) {\n return addHeapObject(getStringFromWasm(p, l));\n}\n\nfunction __wbindgen_number_get(n, invalid) {\n let obj = getObject(n);\n if (typeof(obj) === 'number') return obj;\n getUint8Memory()[invalid] = 1;\n return 0;\n}\n\nfunction __wbindgen_is_string(i) {\n return typeof(getObject(i)) === 'string' ? 1 : 0;\n}\n\nlet cachegetUint32Memory = null;\nfunction getUint32Memory() {\n if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint32Memory = new Uint32Array(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint32Memory;\n}\n\nfunction __wbindgen_string_get(i, len_ptr) {\n let obj = getObject(i);\n if (typeof(obj) !== 'string') return 0;\n const ptr = passStringToWasm(obj);\n getUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\n return ptr;\n}\n\nconst __wbindgen_cb_forget = dropObject;\n\nfunction __wbindgen_json_parse(ptr, len) {\n return addHeapObject(JSON.parse(getStringFromWasm(ptr, len)));\n}\n\nfunction __wbindgen_json_serialize(idx, ptrptr) {\n const ptr = passStringToWasm(JSON.stringify(getObject(idx)));\n getUint32Memory()[ptrptr / 4] = ptr;\n return WASM_VECTOR_LEN;\n}\n\nfunction __wbindgen_closure_wrapper99(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(14);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(15);\n const cb = function(arg0) {\n this.cnt++;\n try {\n return takeObject(f(this.a, b, addHeapObject(arg0)));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper101(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(16);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const cb = function(arg0) {\n this.cnt++;\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return takeObject(f(this.a, b, ptr0, len0));\n\n } finally {\n if (this.cnt-- == 1) d(this.a, b);\n\n }\n\n };\n cb.a = a;\n cb.cnt = 1;\n let real = cb.bind(cb);\n real.original = cb;\n return addHeapObject(real);\n}\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm.js?");
/***/ }),
@@ -16,7 +16,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/*!********************************************!*\
!*** ../browser_pkg/jsonpath_wasm_bg.wasm ***!
\********************************************/
-/*! exports provided: memory, alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_free, __wbg_function_table */
+/*! exports provided: memory, alloc_json, dealloc_json, compile, reader, selector, select, read, testa, __wbindgen_malloc, __wbindgen_free, __wbg_function_table */
/***/ (function(module, exports, __webpack_require__) {
eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./jsonpath_wasm */ \"../browser_pkg/jsonpath_wasm.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../browser_pkg/jsonpath_wasm_bg.wasm?");
@@ -31,7 +31,7 @@ eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __we
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @browser/jsonpath-wasm */ \"../browser_pkg/jsonpath_wasm.js\");\n/* harmony import */ var jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jsonpath/jsonpath.js */ \"./node_modules/jsonpath/jsonpath.js\");\n/* harmony import */ var jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nfunction run(message, iter, cb) {\n return new Promise(function(resolve, _reject) {\n let d = Date.now();\n for (let i = 0; i < iter; i++) {\n cb();\n }\n msg([message, Date.now() - d].join(\", \"));\n setTimeout(resolve, 0);\n })\n}\n\nfunction msg(msg) {\n console.log(msg);\n let div = document.createElement(\"div\");\n div.innerText = msg;\n document.body.appendChild(div);\n}\n\nlet json = {\n \"store\": {\n \"book\": [\n {\n \"category\": \"reference\",\n \"author\": \"Nigel Rees\",\n \"title\": \"Sayings of the Century\",\n \"price\": 8.95\n },\n {\n \"category\": \"fiction\",\n \"author\": \"Evelyn Waugh\",\n \"title\": \"Sword of Honour\",\n \"price\": 12.99\n },\n {\n \"category\": \"fiction\",\n \"author\": \"Herman Melville\",\n \"title\": \"Moby Dick\",\n \"isbn\": \"0-553-21311-3\",\n \"price\": 8.99\n },\n {\n \"category\": \"fiction\",\n \"author\": \"J. R. R. Tolkien\",\n \"title\": \"The Lord of the Rings\",\n \"isbn\": \"0-395-19395-8\",\n \"price\": 22.99\n }\n ],\n \"bicycle\": {\n \"color\": \"red\",\n \"price\": 19.95\n }\n },\n \"expensive\": 10\n};\n\nlet path = '$..book[?(@.price<30 && @.category==\"fiction\")]';\nlet template = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](path);\nlet selector = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](json);\n\nlet ptr = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](json);\nif(ptr == 0) console.error('invalid ptr');\n\nlet iterCount = 3000;\n\nrun('jsonpath', iterCount, function() { jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__[\"query\"](json, path) })\n .then(function() {\n return run('jsonpath-wasm- selector', iterCount, function() { selector(path) });\n })\n .then(function() {\n return run('jsonpath-wasm- compile', iterCount, function() { template(json) });\n })\n .then(function() {\n return run('jsonpath-wasm- compile-alloc', iterCount, function() { template(ptr) });\n })\n .then(function() {\n return run('jsonpath-wasm- select', iterCount, function() { _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](json, path) });\n })\n .then(function() {\n return run('jsonpath-wasm- select-alloc', iterCount, function() { _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](ptr, path) });\n })\n .finally(function() {\n if(!_browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](ptr)) {\n console.error('fail to dealloc');\n }\n });\n\n\n//# sourceURL=webpack:///./index.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @browser/jsonpath-wasm */ \"../browser_pkg/jsonpath_wasm.js\");\n/* harmony import */ var jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jsonpath/jsonpath.js */ \"./node_modules/jsonpath/jsonpath.js\");\n/* harmony import */ var jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nfunction run(message, iter, cb) {\n return new Promise(function(resolve, _reject) {\n let d = Date.now();\n for (let i = 0; i < iter; i++) {\n cb();\n }\n msg([message, Date.now() - d].join(\", \"));\n setTimeout(resolve, 0);\n })\n}\n\nfunction msg(msg) {\n console.log(msg);\n let div = document.createElement(\"div\");\n div.innerText = msg;\n document.body.appendChild(div);\n}\n\nlet json = {\n \"store\": {\n \"book\": [\n {\n \"category\": \"reference\",\n \"author\": \"Nigel Rees\",\n \"title\": \"Sayings of the Century\",\n \"price\": 8.95\n },\n {\n \"category\": \"fiction\",\n \"author\": \"Evelyn Waugh\",\n \"title\": \"Sword of Honour\",\n \"price\": 12.99\n },\n {\n \"category\": \"fiction\",\n \"author\": \"Herman Melville\",\n \"title\": \"Moby Dick\",\n \"isbn\": \"0-553-21311-3\",\n \"price\": 8.99\n },\n {\n \"category\": \"fiction\",\n \"author\": \"J. R. R. Tolkien\",\n \"title\": \"The Lord of the Rings\",\n \"isbn\": \"0-395-19395-8\",\n \"price\": 22.99\n }\n ],\n \"bicycle\": {\n \"color\": \"red\",\n \"price\": 19.95\n }\n },\n \"expensive\": 10\n};\n\nlet path = '$..book[?(@.price<30 && @.category==\"fiction\")]';\nlet template = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"compile\"](path);\nlet selector = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](json);\n\nlet ptr = _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"alloc_json\"](json);\nif(ptr == 0) console.error('invalid ptr');\n\nlet iterCount = 2000;\n\nrun('jsonpath', iterCount, function() { jsonpath_jsonpath_js__WEBPACK_IMPORTED_MODULE_1__[\"query\"](json, path) })\n .then(function() {\n return run('jsonpath-wasm- selector', iterCount, function() { selector(path) });\n })\n .then(function() {\n return run('jsonpath-wasm- compile', iterCount, function() { template(json) });\n })\n .then(function() {\n return run('jsonpath-wasm- compile-alloc', iterCount, function() { template(ptr) });\n })\n .then(function() {\n return run('jsonpath-wasm- select', iterCount, function() { _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](json, path) });\n })\n .then(function() {\n return run('jsonpath-wasm- select-alloc', iterCount, function() { _browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"select\"](ptr, path) });\n })\n .finally(function() {\n if(!_browser_jsonpath_wasm__WEBPACK_IMPORTED_MODULE_0__[\"dealloc_json\"](ptr)) {\n console.error('fail to dealloc');\n }\n });\n\n\n//# sourceURL=webpack:///./index.js?");
/***/ })
diff --git a/docs/bench/9a826648f4cbc2bc8591.module.wasm b/docs/bench/9a826648f4cbc2bc8591.module.wasm
deleted file mode 100644
index b09af39..0000000
Binary files a/docs/bench/9a826648f4cbc2bc8591.module.wasm and /dev/null differ
diff --git a/docs/bench/bootstrap.js b/docs/bench/bootstrap.js
index cd45796..7b72122 100644
--- a/docs/bench/bootstrap.js
+++ b/docs/bench/bootstrap.js
@@ -61,9 +61,6 @@
/******/ "__wbindgen_object_drop_ref": function(p0i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32);
/******/ },
-/******/ "__wbindgen_object_clone_ref": function(p0i32) {
-/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32);
-/******/ },
/******/ "__wbindgen_cb_forget": function(p0i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_cb_forget"](p0i32);
/******/ },
@@ -85,14 +82,17 @@
/******/ "__wbindgen_string_get": function(p0i32,p1i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_get"](p0i32,p1i32);
/******/ },
+/******/ "__wbindgen_object_clone_ref": function(p0i32) {
+/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32);
+/******/ },
/******/ "__wbindgen_throw": function(p0i32,p1i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_throw"](p0i32,p1i32);
/******/ },
+/******/ "__wbindgen_closure_wrapper99": function(p0i32,p1i32,p2i32) {
+/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper99"](p0i32,p1i32,p2i32);
+/******/ },
/******/ "__wbindgen_closure_wrapper101": function(p0i32,p1i32,p2i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper101"](p0i32,p1i32,p2i32);
-/******/ },
-/******/ "__wbindgen_closure_wrapper103": function(p0i32,p1i32,p2i32) {
-/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper103"](p0i32,p1i32,p2i32);
/******/ }
/******/ }
/******/ };
@@ -192,7 +192,7 @@
/******/ promises.push(installedWasmModuleData);
/******/ else {
/******/ var importObject = wasmImportObjects[wasmModuleId]();
-/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"9a826648f4cbc2bc8591"}[wasmModuleId] + ".module.wasm");
+/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"db8564aae9d99ec41b79"}[wasmModuleId] + ".module.wasm");
/******/ var promise;
/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {
/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {
diff --git a/docs/bench/db8564aae9d99ec41b79.module.wasm b/docs/bench/db8564aae9d99ec41b79.module.wasm
new file mode 100644
index 0000000..d66938d
Binary files /dev/null and b/docs/bench/db8564aae9d99ec41b79.module.wasm differ
diff --git a/docs/bootstrap.js b/docs/bootstrap.js
index 1c451f3..2200220 100644
--- a/docs/bootstrap.js
+++ b/docs/bootstrap.js
@@ -61,9 +61,6 @@
/******/ "__wbindgen_object_drop_ref": function(p0i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32);
/******/ },
-/******/ "__wbindgen_object_clone_ref": function(p0i32) {
-/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32);
-/******/ },
/******/ "__wbindgen_cb_forget": function(p0i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_cb_forget"](p0i32);
/******/ },
@@ -85,14 +82,17 @@
/******/ "__wbindgen_string_get": function(p0i32,p1i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_get"](p0i32,p1i32);
/******/ },
+/******/ "__wbindgen_object_clone_ref": function(p0i32) {
+/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32);
+/******/ },
/******/ "__wbindgen_throw": function(p0i32,p1i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_throw"](p0i32,p1i32);
/******/ },
+/******/ "__wbindgen_closure_wrapper99": function(p0i32,p1i32,p2i32) {
+/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper99"](p0i32,p1i32,p2i32);
+/******/ },
/******/ "__wbindgen_closure_wrapper101": function(p0i32,p1i32,p2i32) {
/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper101"](p0i32,p1i32,p2i32);
-/******/ },
-/******/ "__wbindgen_closure_wrapper103": function(p0i32,p1i32,p2i32) {
-/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper103"](p0i32,p1i32,p2i32);
/******/ }
/******/ }
/******/ };
@@ -192,7 +192,7 @@
/******/ promises.push(installedWasmModuleData);
/******/ else {
/******/ var importObject = wasmImportObjects[wasmModuleId]();
-/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"9a826648f4cbc2bc8591"}[wasmModuleId] + ".module.wasm");
+/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"db8564aae9d99ec41b79"}[wasmModuleId] + ".module.wasm");
/******/ var promise;
/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {
/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {
diff --git a/docs/db8564aae9d99ec41b79.module.wasm b/docs/db8564aae9d99ec41b79.module.wasm
new file mode 100644
index 0000000..d66938d
Binary files /dev/null and b/docs/db8564aae9d99ec41b79.module.wasm differ
diff --git a/nodejs/.gitignore b/nodejs/.gitignore
new file mode 100644
index 0000000..478f05e
--- /dev/null
+++ b/nodejs/.gitignore
@@ -0,0 +1,6 @@
+native/target
+native/index.node
+native/artifacts.json
+**/*~
+**/node_modules
+.idea
\ No newline at end of file
diff --git a/nodejs/README.md b/nodejs/README.md
new file mode 100644
index 0000000..02d46bd
--- /dev/null
+++ b/nodejs/README.md
@@ -0,0 +1,3 @@
+# jsonpath-rs
+
+JsonPath engine for NodeJs with Rust native implementation.
diff --git a/nodejs/lib/index.js b/nodejs/lib/index.js
new file mode 100644
index 0000000..4dc380a
--- /dev/null
+++ b/nodejs/lib/index.js
@@ -0,0 +1,34 @@
+const { Compile, Selector, selectStr } = require('../native');
+
+function compile(path) {
+ let compile = new Compile(path);
+ return (json) => {
+ if(typeof json != 'string') {
+ json = JSON.stringify(json)
+ }
+ return compile.template(json);
+ };
+}
+
+function selector(json) {
+ if(typeof json != 'string') {
+ json = JSON.stringify(json)
+ }
+ let selector = new Selector(json);
+ return (path) => {
+ return selector.selector(path);
+ }
+}
+
+function select(json, path) {
+ if(typeof json != 'string') {
+ json = JSON.stringify(json)
+ }
+ return selectStr(json, path);
+}
+
+module.exports = {
+ compile,
+ selector,
+ select
+};
\ No newline at end of file
diff --git a/nodejs/native/.gitignore b/nodejs/native/.gitignore
new file mode 100644
index 0000000..8647db2
--- /dev/null
+++ b/nodejs/native/.gitignore
@@ -0,0 +1,5 @@
+.idea/*
+.vscode
+!.idea/runConfigurations/
+/target/
+Cargo.lock
\ No newline at end of file
diff --git a/nodejs/native/Cargo.toml b/nodejs/native/Cargo.toml
new file mode 100644
index 0000000..0cf1cc6
--- /dev/null
+++ b/nodejs/native/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "jsonpath-rs"
+version = "0.1.0"
+authors = ["Changseok Han "]
+description = "JsonPath engine for NodeJs with Rust native implementation."
+keywords = ["library", "jsonpath", "json"]
+repository = "https://github.com/freestrings/jsonpath"
+license = "MIT"
+
+build = "build.rs"
+exclude = ["artifacts.json", "index.node"]
+
+[build-dependencies]
+neon-build = "0.2.0"
+
+[dependencies]
+jsonpath_lib = { path = "../../" }
+neon = "0.2.0"
+neon-serde = "0.1.1"
+serde_json = { version = "1.0", features = ["preserve_order"] }
+
+[lib]
+name = "jsonpath_rs"
+crate-type = ["dylib"]
\ No newline at end of file
diff --git a/nodejs/native/build.rs b/nodejs/native/build.rs
new file mode 100644
index 0000000..687a661
--- /dev/null
+++ b/nodejs/native/build.rs
@@ -0,0 +1,7 @@
+extern crate neon_build;
+
+fn main() {
+ neon_build::setup(); // must be called in build.rs
+
+ // add project-specific build logic here...
+}
diff --git a/nodejs/native/src/lib.rs b/nodejs/native/src/lib.rs
new file mode 100644
index 0000000..cefd707
--- /dev/null
+++ b/nodejs/native/src/lib.rs
@@ -0,0 +1,126 @@
+extern crate jsonpath_lib as jsonpath;
+#[macro_use]
+extern crate neon;
+extern crate neon_serde;
+extern crate serde_json;
+
+use jsonpath::prelude::*;
+use neon::prelude::*;
+use serde_json::Value;
+
+///
+/// `neon_serde::from_value` has very poor performance.
+///
+fn select(mut ctx: FunctionContext) -> JsResult {
+ let json_val = ctx.argument::(0)?;
+ let json: Value = neon_serde::from_value(&mut ctx, json_val)?;
+ let path = ctx.argument::(1)?.value();
+
+ match jsonpath::select(&json, path.as_str()) {
+ Ok(value) => Ok(neon_serde::to_value(&mut ctx, &value)?),
+ Err(e) => panic!("{:?}", e)
+ }
+}
+
+fn select_str(mut ctx: FunctionContext) -> JsResult {
+ let json_val = ctx.argument::(0)?.value();
+ let json: Value = match serde_json::from_str(json_val.as_str()) {
+ Ok(json) => json,
+ Err(e) => panic!("{:?}", e)
+ };
+ let path = ctx.argument::(1)?.value();
+ match jsonpath::select(&json, path.as_str()) {
+ Ok(value) => Ok(neon_serde::to_value(&mut ctx, &value)?),
+ Err(e) => panic!("{:?}", e)
+ }
+}
+
+pub struct Compile {
+ node: Node
+}
+
+pub struct Selector {
+ json: RefValueWrapper
+}
+
+declare_types! {
+ pub class JsCompile for Compile {
+ init(mut ctx) {
+ let path = ctx.argument::(0)?.value();
+ let mut parser = Parser::new(path.as_str());
+
+ let node = match parser.compile() {
+ Ok(node) => node,
+ Err(e) => panic!("{:?}", e)
+ };
+
+ Ok(Compile { node })
+ }
+
+ method template(mut ctx) {
+ let this = ctx.this();
+
+ let node = {
+ let guard = ctx.lock();
+ let this = this.borrow(&guard);
+ this.node.clone()
+ };
+
+// let o = ctx.argument::(0)?;
+// let json: Value = neon_serde::from_value(&mut ctx, o)?;
+ let json_str = ctx.argument::(0)?.value();
+ let json: Value = match serde_json::from_str(&json_str) {
+ Ok(json) => json,
+ Err(e) => panic!("{:?}", e)
+ };
+ let mut jf = JsonValueFilter::new_from_value((&json).into());
+ jf.visit(node);
+ let v = jf.take_value().into_value();
+ Ok(neon_serde::to_value(&mut ctx, &v)?)
+ }
+ }
+
+ pub class JsSelector for Selector {
+ init(mut ctx) {
+// let o = ctx.argument::(0)?;
+// let json: Value = neon_serde::from_value(&mut ctx, o)?;
+ let json_str = ctx.argument::(0)?.value();
+ let json: Value = match serde_json::from_str(&json_str) {
+ Ok(json) => json,
+ Err(e) => panic!("{:?}", e)
+ };
+
+ Ok(Selector { json: (&json).into() })
+ }
+
+ method selector(mut ctx) {
+ let this = ctx.this();
+
+ let json = {
+ let guard = ctx.lock();
+ let this = this.borrow(&guard);
+ this.json.clone()
+ };
+
+ let path = ctx.argument::(0)?.value();
+ let mut parser = Parser::new(path.as_str());
+
+ let node = match parser.compile() {
+ Ok(node) => node,
+ Err(e) => panic!("{:?}", e)
+ };
+
+ let mut jf = JsonValueFilter::new_from_value(json);
+ jf.visit(node);
+ let v = jf.take_value().into_value();
+ Ok(neon_serde::to_value(&mut ctx, &v)?)
+ }
+ }
+}
+register_module!(mut m, {
+ m.export_class::("Compile").expect("Compile class error");
+ m.export_class::("Selector").expect("Selector class error");
+ m.export_function("select", select)?;
+ m.export_function("selectStr", select_str)?;
+ Ok(())
+});
\ No newline at end of file
diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json
new file mode 100644
index 0000000..e8a63d1
--- /dev/null
+++ b/nodejs/package-lock.json
@@ -0,0 +1,3172 @@
+{
+ "name": "jsonpath-rs",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "requires": {
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
+ }
+ },
+ "ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+ "dev": true
+ },
+ "ansi-escape-sequences": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz",
+ "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==",
+ "requires": {
+ "array-back": "^3.0.1"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.0.1.tgz",
+ "integrity": "sha512-nzD+aqgQPTZlUGH6tE8JEjYPpnuBUFghPbq6zEWBHUmCHGQKWD9pf1PIuc2bMBtzi2OoIaoTJwgBV3h0ztdrFg=="
+ }
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "requires": {
+ "typical": "^2.6.1"
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
+ "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
+ "requires": {
+ "lodash": "^4.17.11"
+ }
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "requires": {
+ "inherits": "~2.0.0"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "builtins": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+ "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "camelcase": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz",
+ "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "chalk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
+ "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
+ "requires": {
+ "ansi-styles": "^3.1.0",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^4.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+ },
+ "cliui": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz",
+ "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==",
+ "requires": {
+ "array-back": "^2.0.0",
+ "find-replace": "^1.0.3",
+ "typical": "^2.6.1"
+ }
+ },
+ "command-line-commands": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-2.0.1.tgz",
+ "integrity": "sha512-m8c2p1DrNd2ruIAggxd/y6DgygQayf6r8RHwchhXryaLF8I6koYjoYroVP+emeROE9DXN5b9sP1Gh+WtvTTdtQ==",
+ "requires": {
+ "array-back": "^2.0.0"
+ }
+ },
+ "command-line-usage": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz",
+ "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==",
+ "requires": {
+ "ansi-escape-sequences": "^4.0.0",
+ "array-back": "^2.0.0",
+ "table-layout": "^0.4.2",
+ "typical": "^2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+ "optional": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "requires": {
+ "boom": "2.x.x"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "es-abstract": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
+ "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "is-callable": "^1.1.4",
+ "is-regex": "^1.0.4",
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "requires": {
+ "chardet": "^0.4.0",
+ "iconv-lite": "^0.4.17",
+ "tmp": "^0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "requires": {
+ "array-back": "^1.0.4",
+ "test-value": "^2.1.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "requires": {
+ "typical": "^2.6.0"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^3.1.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ }
+ },
+ "flat": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
+ "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "~2.0.3"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
+ "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
+ "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=",
+ "requires": {
+ "fstream": "^1.0.0",
+ "inherits": "2",
+ "minimatch": "^3.0.0"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "git-config": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/git-config/-/git-config-0.0.7.tgz",
+ "integrity": "sha1-qcij7wendsPXImE1bYtye2IgKyg=",
+ "requires": {
+ "iniparser": "~1.0.5"
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.15",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
+ "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
+ "requires": {
+ "async": "^2.5.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+ "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4="
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+ "requires": {
+ "ajv": "^4.9.1",
+ "har-schema": "^1.0.5"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "requires": {
+ "boom": "2.x.x",
+ "cryptiles": "2.x.x",
+ "hoek": "2.x.x",
+ "sntp": "1.x.x"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
+ },
+ "homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "^1.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "requires": {
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "iniparser": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/iniparser/-/iniparser-1.0.5.tgz",
+ "integrity": "sha1-g21r7+bfv87gvM8c+fKsxwJ/eD0="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^2.0.4",
+ "figures": "^2.0.0",
+ "lodash": "^4.3.0",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rx-lite": "^4.0.8",
+ "rx-lite-aggregates": "^4.0.8",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ }
+ },
+ "invert-kv": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.1"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "lcid": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "mem": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz",
+ "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==",
+ "dev": true,
+ "requires": {
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^2.0.0",
+ "p-is-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz",
+ "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==",
+ "dev": true
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "mime-db": {
+ "version": "1.38.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
+ "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg=="
+ },
+ "mime-types": {
+ "version": "2.1.22",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
+ "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+ "requires": {
+ "mime-db": "~1.38.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ }
+ }
+ },
+ "mocha": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.2.tgz",
+ "integrity": "sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "findup-sync": "2.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.12.0",
+ "log-symbols": "2.2.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.4",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "12.0.5",
+ "yargs-parser": "11.1.1",
+ "yargs-unparser": "1.5.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "neon-cli": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/neon-cli/-/neon-cli-0.2.0.tgz",
+ "integrity": "sha512-IsrxCyUcuAyWiq4Z+JnTXrjurj2SAL2VtWnCXS8iBYGJeIs1NIhFuLaM6fe7+rOyFfDcqUUTWGxZmkvUqwweRA==",
+ "requires": {
+ "chalk": "~2.1.0",
+ "command-line-args": "^4.0.2",
+ "command-line-commands": "^2.0.0",
+ "command-line-usage": "^4.0.0",
+ "git-config": "0.0.7",
+ "handlebars": "^4.0.3",
+ "inquirer": "^3.0.6",
+ "mkdirp": "^0.5.1",
+ "quickly-copy-file": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "rsvp": "^4.6.1",
+ "semver": "^5.1.0",
+ "toml": "^2.3.0",
+ "ts-typed-json": "^0.2.2",
+ "validate-npm-package-license": "^3.0.1",
+ "validate-npm-package-name": "^3.0.0"
+ }
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node-environment-flags": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz",
+ "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==",
+ "dev": true,
+ "requires": {
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz",
+ "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==",
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "hawk": "3.1.3",
+ "mkdirp": "^0.5.1",
+ "nopt": "^4.0.1",
+ "npmlog": "^4.0.2",
+ "rc": "^1.1.7",
+ "request": "2.81.0",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^2.2.1",
+ "tar-pack": "^3.4.0"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz",
+ "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.5.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+ "dev": true,
+ "requires": {
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-is-promise": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
+ "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+ "dev": true
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
+ },
+ "quickly-copy-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quickly-copy-file/-/quickly-copy-file-1.0.0.tgz",
+ "integrity": "sha1-n4/wZiMFEO50IrASFHKwk6hpCFk=",
+ "requires": {
+ "mkdirp": "~0.5.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc="
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+ "requires": {
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.1.1",
+ "har-validator": "~4.2.1",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "oauth-sign": "~0.8.1",
+ "performance-now": "^0.2.0",
+ "qs": "~6.4.0",
+ "safe-buffer": "^5.0.1",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.0.0"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rsvp": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz",
+ "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA=="
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "requires": {
+ "rx-lite": "*"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-resolve": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.1",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz",
+ "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g=="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
+ "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA=="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "^2.0.0"
+ }
+ },
+ "table-layout": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.4.tgz",
+ "integrity": "sha512-uNaR3SRMJwfdp9OUr36eyEi6LLsbcTqTO/hfTsNviKsNeyMBPICJCC7QXRF3+07bAP6FRwA8rczJPBqXDc0CkQ==",
+ "requires": {
+ "array-back": "^2.0.0",
+ "deep-extend": "~0.6.0",
+ "lodash.padend": "^4.6.1",
+ "typical": "^2.6.1",
+ "wordwrapjs": "^3.0.0"
+ }
+ },
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "requires": {
+ "block-stream": "*",
+ "fstream": "^1.0.2",
+ "inherits": "2"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz",
+ "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==",
+ "requires": {
+ "debug": "^2.2.0",
+ "fstream": "^1.0.10",
+ "fstream-ignore": "^1.0.5",
+ "once": "^1.3.3",
+ "readable-stream": "^2.1.4",
+ "rimraf": "^2.5.1",
+ "tar": "^2.2.1",
+ "uid-number": "^0.0.6"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "requires": {
+ "array-back": "^1.0.3",
+ "typical": "^2.6.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "requires": {
+ "typical": "^2.6.0"
+ }
+ }
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "toml": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "requires": {
+ "punycode": "^1.4.1"
+ }
+ },
+ "ts-typed-json": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/ts-typed-json/-/ts-typed-json-0.2.2.tgz",
+ "integrity": "sha1-UxhL7ok+RZkbc8jEY6OLWeJ81H4=",
+ "requires": {
+ "rsvp": "^3.5.0"
+ },
+ "dependencies": {
+ "rsvp": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz",
+ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw=="
+ }
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
+ },
+ "uglify-js": {
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+ "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+ "optional": true,
+ "requires": {
+ "commander": "~2.17.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
+ "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE="
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.1",
+ "to-object-path": "^0.3.0"
+ }
+ }
+ }
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "validate-npm-package-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+ "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+ "requires": {
+ "builtins": "^1.0.3"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "requires": {
+ "reduce-flatten": "^1.0.1",
+ "typical": "^2.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "12.0.5",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "yargs-unparser": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz",
+ "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==",
+ "dev": true,
+ "requires": {
+ "flat": "^4.1.0",
+ "lodash": "^4.17.11",
+ "yargs": "^12.0.5"
+ }
+ }
+ }
+}
diff --git a/nodejs/package.json b/nodejs/package.json
new file mode 100644
index 0000000..9b7c317
--- /dev/null
+++ b/nodejs/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "jsonpath-rs",
+ "version": "0.1.0",
+ "description": "JsonPath engine for NodeJs with Rust native implementation.",
+ "author": "Changseok Han ",
+ "repository": "git+https://github.com/freestrings/jsonpath",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "dependencies": {
+ "neon-cli": "^0.2.0",
+ "node-pre-gyp": "0.6"
+ },
+ "scripts": {
+ "install": "neon build --release",
+ "test": "mocha"
+ },
+ "devDependencies": {
+ "mocha": "^6.0.2"
+ }
+}
diff --git a/nodejs/test/index.spec.js b/nodejs/test/index.spec.js
new file mode 100644
index 0000000..751d3d0
--- /dev/null
+++ b/nodejs/test/index.spec.js
@@ -0,0 +1,30 @@
+const jsonpath = require('../lib/index.js');
+
+describe('compile test', () => {
+ it('basic', (done) => {
+ let template = jsonpath.compile('$.a');
+ let result = template({'a': 1});
+ if (result == 1) {
+ done();
+ }
+ });
+});
+
+describe('selector test', () => {
+ it('basic', (done) => {
+ let selector = jsonpath.selector({'a': 1});
+ let result = selector('$.a');
+ if (result == 1) {
+ done();
+ }
+ });
+});
+
+describe('select test', () => {
+ it('basic', (done) => {
+ let result = jsonpath.select({'a': 1}, '$.a');
+ if (result == 1) {
+ done();
+ }
+ });
+});
\ No newline at end of file
diff --git a/src/filter/mod.rs b/src/filter/mod.rs
index fe47e4f..dc1a333 100644
--- a/src/filter/mod.rs
+++ b/src/filter/mod.rs
@@ -1,353 +1,5 @@
-use super::parser::*;
-
mod cmp;
mod term;
-pub mod value_filter;
+mod value_filter;
mod value_wrapper;
-
-#[cfg(test)]
-mod tests {
- extern crate env_logger;
-
- use std::io::Read;
-
- use serde_json::Value;
-
- use super::parser::Parser;
- use super::value_filter::*;
-
- fn setup() {
- let _ = env_logger::try_init();
- }
-
- fn new_value_filter(file: &str) -> ValueFilter {
- let string = read_json(file);
- let json: Value = serde_json::from_str(string.as_str()).unwrap();
- ValueFilter::new(json.into(), false, false)
- }
-
- fn do_filter(path: &str, file: &str) -> JsonValueFilter {
- let string = read_json(file);
- let mut jf = JsonValueFilter::new(string.as_str()).unwrap();
- let mut parser = Parser::new(path);
- parser.parse(&mut jf).unwrap();
- jf
- }
-
- fn read_json(path: &str) -> String {
- let mut f = std::fs::File::open(path).unwrap();
- let mut contents = String::new();
- f.read_to_string(&mut contents).unwrap();
- contents
- }
-
- #[test]
- fn step_in() {
- setup();
-
- let mut jf = new_value_filter("./benches/data_obj.json");
- {
- let current = jf.step_in_str("friends");
- assert_eq!(current.is_array(), true);
- }
-
- let mut jf = new_value_filter("./benches/data_array.json");
- {
- let current = jf.step_in_num(&1.0);
- assert_eq!(current.get_val().is_object(), true);
- }
- {
- let current = jf.step_in_str("friends");
- assert_eq!(current.is_array(), true);
- }
- let mut jf = new_value_filter("./benches/data_obj.json");
- {
- jf.step_in_str("school");
- jf.step_in_str("friends");
- jf.step_in_all();
- let current = jf.step_in_str("name");
- let friends = json!([
- "Millicent Norman",
- "Vincent Cannon",
- "Gray Berry"
- ]);
- assert_eq!(friends, current.get_val().into_value());
- }
- let mut jf = new_value_filter("./benches/data_obj.json");
- {
- let current = jf.step_leaves_str("name");
- let names = json!([
- "Leonor Herman",
- "Millicent Norman",
- "Vincent Cannon",
- "Gray Berry",
- "Vincent Cannon",
- "Gray Berry"
- ]);
- assert_eq!(names, current.get_val().into_value());
- }
- }
-
- #[test]
- fn array() {
- setup();
-
- let friends = json!([
- {"id": 1, "name": "Vincent Cannon" },
- {"id": 2, "name": "Gray Berry"}
- ]);
-
- let jf = do_filter("$.school.friends[1, 2]", "./benches/data_obj.json");
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.school.friends[1:]", "./benches/data_obj.json");
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.school.friends[:-2]", "./benches/data_obj.json");
- let friends = json!([
- {"id": 0, "name": "Millicent Norman"}
- ]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$..friends[2].name", "./benches/data_obj.json");
- let friends = json!(["Gray Berry", "Gray Berry"]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$..friends[*].name", "./benches/data_obj.json");
- let friends = json!(["Vincent Cannon","Gray Berry","Millicent Norman","Vincent Cannon","Gray Berry"]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$['school']['friends'][*].['name']", "./benches/data_obj.json");
- let friends = json!(["Millicent Norman","Vincent Cannon","Gray Berry"]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$['school']['friends'][0].['name']", "./benches/data_obj.json");
- let friends = json!("Millicent Norman");
- assert_eq!(friends, jf.current_value().into_value());
- }
-
- #[test]
- fn return_type() {
- setup();
-
- let friends = json!({
- "friends": [
- {"id": 0, "name": "Millicent Norman"},
- {"id": 1, "name": "Vincent Cannon" },
- {"id": 2, "name": "Gray Berry"}
- ]
- });
-
- let jf = do_filter("$.school", "./benches/data_obj.json");
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.school[?(@.friends[0])]", "./benches/data_obj.json");
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.school[?(@.friends[10])]", "./benches/data_obj.json");
- assert_eq!(Value::Null, jf.current_value().into_value());
-
- let jf = do_filter("$.school[?(1==1)]", "./benches/data_obj.json");
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.school.friends[?(1==1)]", "./benches/data_obj.json");
- let friends = json!([
- {"id": 0, "name": "Millicent Norman"},
- {"id": 1, "name": "Vincent Cannon" },
- {"id": 2, "name": "Gray Berry"}
- ]);
- assert_eq!(friends, jf.current_value().into_value());
- }
-
- #[test]
- fn op() {
- setup();
-
- let jf = do_filter("$.school[?(@.friends == @.friends)]", "./benches/data_obj.json");
- let friends = json!({
- "friends": [
- {"id": 0, "name": "Millicent Norman"},
- {"id": 1, "name": "Vincent Cannon" },
- {"id": 2, "name": "Gray Berry"}
- ]
- });
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.friends[?(@.name)]", "./benches/data_obj.json");
- let friends = json!([
- { "id" : 1, "name" : "Vincent Cannon" },
- { "id" : 2, "name" : "Gray Berry" }
- ]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.friends[?(@.id >= 2)]", "./benches/data_obj.json");
- let friends = json!([
- { "id" : 2, "name" : "Gray Berry" }
- ]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.friends[?(@.id >= 2 || @.id == 1)]", "./benches/data_obj.json");
- let friends = json!([
- { "id" : 2, "name" : "Gray Berry" },
- { "id" : 1, "name" : "Vincent Cannon" }
- ]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]", "./benches/data_obj.json");
- assert_eq!(Value::Null, jf.current_value().into_value());
-
- let jf = do_filter("$..friends[?(@.id == $.index)].id", "./benches/data_obj.json");
- let friends = json!([0, 0]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$..book[?($.store.bicycle.price < @.price)].price", "./benches/example.json");
- let friends = json!([22.99]);
- assert_eq!(friends, jf.current_value().into_value());
-
- let jf = do_filter("$..book[?( (@.price == 12.99 || @.category == 'reference') && @.price > 10)].price", "./benches/example.json");
- let friends = json!([12.99]);
- assert_eq!(friends, jf.current_value().into_value());
- }
-
- #[test]
- fn example() {
- setup();
-
- let jf = do_filter("$.store.book[*].author", "./benches/example.json");
- let ret = json!(["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..author", "./benches/example.json");
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$.store.*", "./benches/example.json");
- let ret = json!([
- [
- {"category" : "reference", "author" : "Nigel Rees","title" : "Sayings of the Century", "price" : 8.95},
- {"category" : "fiction", "author" : "Evelyn Waugh","title" : "Sword of Honour","price" : 12.99},
- {"category" : "fiction", "author" : "Herman Melville","title" : "Moby Dick","isbn" : "0-553-21311-3","price" : 8.99},
- {"category" : "fiction", "author" : "J. R. R. Tolkien","title" : "The Lord of the Rings","isbn" : "0-395-19395-8","price" : 22.99}
- ],
- {"color" : "red","price" : 19.95},
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$.store..price", "./benches/example.json");
- let ret = json!([8.95, 12.99, 8.99, 22.99, 19.95]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[2]", "./benches/example.json");
- let ret = json!([{
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- }]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[-2]", "./benches/example.json");
- let ret = json!([{
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- }]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[0,1]", "./benches/example.json");
- let ret = json!([
- {
- "category" : "reference",
- "author" : "Nigel Rees",
- "title" : "Sayings of the Century",
- "price" : 8.95
- },
- {
- "category" : "fiction",
- "author" : "Evelyn Waugh",
- "title" : "Sword of Honour",
- "price" : 12.99
- }
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[:2]", "./benches/example.json");
- let ret = json!([
- {
- "category" : "reference",
- "author" : "Nigel Rees",
- "title" : "Sayings of the Century",
- "price" : 8.95
- },
- {
- "category" : "fiction",
- "author" : "Evelyn Waugh",
- "title" : "Sword of Honour",
- "price" : 12.99
- }
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[2:]", "./benches/example.json");
- let ret = json!([
- {
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- },
- {
- "category" : "fiction",
- "author" : "J. R. R. Tolkien",
- "title" : "The Lord of the Rings",
- "isbn" : "0-395-19395-8",
- "price" : 22.99
- }
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..book[?(@.isbn)]", "./benches/example.json");
- let ret = json!([
- {
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- },
- {
- "category" : "fiction",
- "author" : "J. R. R. Tolkien",
- "title" : "The Lord of the Rings",
- "isbn" : "0-395-19395-8",
- "price" : 22.99
- }
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$.store.book[?(@.price < 10)]", "./benches/example.json");
- let ret = json!([
- {
- "category" : "reference",
- "author" : "Nigel Rees",
- "title" : "Sayings of the Century",
- "price" : 8.95
- },
- {
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- }
- ]);
- assert_eq!(ret, jf.current_value().into_value());
-
- let jf = do_filter("$..*", "./benches/example.json");
- let json: Value = serde_json::from_str(read_json("./benches/giveme_every_thing_result.json").as_str()).unwrap();
- assert_eq!(json, jf.current_value().into_value());
- }
-}
\ No newline at end of file
+pub mod prelude;
\ No newline at end of file
diff --git a/src/filter/prelude.rs b/src/filter/prelude.rs
new file mode 100644
index 0000000..e79ac31
--- /dev/null
+++ b/src/filter/prelude.rs
@@ -0,0 +1 @@
+pub use super::value_filter::*;
\ No newline at end of file
diff --git a/src/filter/value_filter.rs b/src/filter/value_filter.rs
index 4a4c2d8..8b71639 100644
--- a/src/filter/value_filter.rs
+++ b/src/filter/value_filter.rs
@@ -1,13 +1,13 @@
use std::error::Error;
-use std::result;
-
-use ref_value::*;
+use std::result::Result;
use serde_json::Value;
-use super::parser::*;
-use super::term::*;
-use super::value_wrapper::*;
+use ref_value::*;
+
+use parser::prelude::*;
+use filter::term::*;
+use filter::value_wrapper::*;
trait ArrayIndex {
fn index(&self, v: &RefValueWrapper) -> usize;
@@ -277,10 +277,10 @@ pub struct JsonValueFilter {
}
impl JsonValueFilter {
- pub fn new(json: &str) -> result::Result {
+ pub fn new(json: &str) -> Result {
let json: Value = serde_json::from_str(json)
.map_err(|e| e.description().to_string())?;
- Ok(JsonValueFilter::new_from_value(json.into()))
+ Ok(JsonValueFilter::new_from_value((&json).into()))
}
pub fn new_from_value(json: RefValueWrapper) -> Self {
diff --git a/src/filter/value_wrapper.rs b/src/filter/value_wrapper.rs
index 10fb08d..355f279 100644
--- a/src/filter/value_wrapper.rs
+++ b/src/filter/value_wrapper.rs
@@ -1,4 +1,5 @@
use indexmap::map::IndexMap;
+
use ref_value::*;
use super::cmp::*;
diff --git a/src/lib.rs b/src/lib.rs
index 5b33663..8de9510 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -43,7 +43,7 @@
//! "expensive": 10
//! });
//!
-//! let mut selector = jsonpath::selector(json_obj);
+//! let mut selector = jsonpath::selector(&json_obj);
//!
//! //
//! // $.store.book[*].author
@@ -158,28 +158,22 @@
//! assert_eq!(ret, json);
//! ```
-
#[macro_use]
extern crate log;
extern crate env_logger;
-
-#[cfg(test)]
-#[macro_use] extern crate serde_json;
-#[cfg(not(test))]
extern crate serde_json;
-
-extern crate core;
extern crate indexmap;
#[doc(hidden)]
-pub mod parser;
+mod parser;
#[doc(hidden)]
-pub mod filter;
+mod filter;
#[doc(hidden)]
-pub mod ref_value;
+mod ref_value;
+pub mod prelude;
-use parser::parser::*;
-use filter::value_filter::*;
+use parser::prelude::*;
+use filter::prelude::*;
use std::result;
use serde_json::Value;
@@ -204,7 +198,7 @@ type Result = result::Result;
/// "friends": [ {"id": 0}, {"id": 1} ]
/// });
///
-/// let json = template(json_obj).unwrap();
+/// let json = template(&json_obj).unwrap();
/// let ret = json!([ {"id": 0}, {"id": 0} ]);
/// assert_eq!(json, ret);
///
@@ -216,11 +210,11 @@ type Result = result::Result;
/// "friends": [ {"id": 0}, {"id": 1} ]
/// });
///
-/// let json = template(json_obj).unwrap();
+/// let json = template(&json_obj).unwrap();
/// let ret = json!([ {"id": 0}, {"name": "Millicent Norman"} ]);
/// assert_eq!(json, ret);
/// ```
-pub fn compile<'a>(path: &'a str) -> impl FnMut(Value) -> Result + 'a {
+pub fn compile<'a>(path: &'a str) -> impl FnMut(&Value) -> Result + 'a {
let mut parser = Parser::new(path);
let node = parser.compile();
move |json| {
@@ -249,7 +243,7 @@ pub fn compile<'a>(path: &'a str) -> impl FnMut(Value) -> Result + 'a {
/// "friends": [{"id": 0},{"id": 1}]
/// });
///
-/// let mut selector = jsonpath::selector(json_obj);
+/// let mut selector = jsonpath::selector(&json_obj);
///
/// let json = selector("$..friends[0]").unwrap();
/// let ret = json!([ {"id": 0}, {"id": 0} ]);
@@ -259,7 +253,7 @@ pub fn compile<'a>(path: &'a str) -> impl FnMut(Value) -> Result + 'a {
/// let ret = json!([ {"id": 1}, {"id": 1} ]);
/// assert_eq!(json, ret);
/// ```
-pub fn selector(json: Value) -> impl FnMut(&str) -> Result {
+pub fn selector(json: &Value) -> impl FnMut(&str) -> Result {
let wrapper: RefValueWrapper = json.into();
move |path: &str| {
let mut jf = JsonValueFilter::new_from_value(wrapper.clone());
@@ -270,7 +264,7 @@ pub fn selector(json: Value) -> impl FnMut(&str) -> Result {
}
/// # Read the same Json multiple times using different JsonPath - Deprecated. use selector
-pub fn reader(json: Value) -> impl FnMut(&str) -> Result {
+pub fn reader(json: &Value) -> impl FnMut(&str) -> Result {
selector(json)
}
@@ -286,11 +280,11 @@ pub fn reader(json: Value) -> impl FnMut(&str) -> Result {
/// },
/// "friends": [{"id": 0}, {"id": 1}]
/// });
-/// let json = jsonpath::select(json_obj, "$..friends[0]").unwrap();
+/// let json = jsonpath::select(&json_obj, "$..friends[0]").unwrap();
/// let ret = json!([ {"id": 0}, {"id": 0} ]);
/// assert_eq!(json, ret);
/// ```
-pub fn select(json: Value, path: &str) -> Result {
+pub fn select(json: &Value, path: &str) -> Result {
let mut jf = JsonValueFilter::new_from_value(json.into());
let mut parser = Parser::new(path);
parser.parse(&mut jf)?;
@@ -298,73 +292,7 @@ pub fn select(json: Value, path: &str) -> Result {
}
/// # Read Json using JsonPath - Deprecated. use select
-pub fn read(json: Value, path: &str) -> Result {
+pub fn read(json: &Value, path: &str) -> Result {
select(json, path)
}
-#[cfg(test)]
-mod tests {
- use super::*;
-
- use std::io::Read;
-
- fn read_json(path: &str) -> Value {
- let mut f = std::fs::File::open(path).unwrap();
- let mut contents = String::new();
- f.read_to_string(&mut contents).unwrap();
- serde_json::from_str(contents.as_str()).unwrap()
- }
-
- #[test]
- fn compile() {
- let mut template = super::compile("$..friends[2]");
- let json_obj = read_json("./benches/data_obj.json");
- let json = template(json_obj).unwrap();
- let ret = json!([
- {"id": 2,"name": "Gray Berry"},
- {"id": 2,"name": "Gray Berry"}
- ]);
- assert_eq!(json, ret);
-
- let json_obj = read_json("./benches/data_array.json");
- let json = template(json_obj).unwrap();
- let ret = json!([
- {"id": 2,"name": "Gray Berry"},
- {"id": 2,"name": "Rosetta Erickson"}
- ]);
- assert_eq!(json, ret);
- }
-
- #[test]
- fn selector() {
- let json_obj = read_json("./benches/data_obj.json");
- let mut reader = super::selector(json_obj);
- let json = reader("$..friends[2]").unwrap();
- let ret = json!([
- {"id": 2,"name": "Gray Berry"},
- {"id": 2,"name": "Gray Berry"}
- ]);
- assert_eq!(json, ret);
-
- let json = reader("$..friends[0]").unwrap();
- let ret = json!([
- {"id": 0},
- {"id": 0,"name": "Millicent Norman"}
- ]);
- assert_eq!(json, ret);
- }
-
- #[test]
- fn select() {
- let json_obj = read_json("./benches/example.json");
- let json = super::select(json_obj, "$..book[2]").unwrap();
- let ret = json!([{
- "category" : "fiction",
- "author" : "Herman Melville",
- "title" : "Moby Dick",
- "isbn" : "0-553-21311-3",
- "price" : 8.99
- }]);
- assert_eq!(json, ret);
- }
-}
\ No newline at end of file
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 56097e6..f5c15ce 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -1,3 +1,4 @@
mod path_reader;
mod tokenizer;
-pub mod parser;
\ No newline at end of file
+mod parser;
+pub mod prelude;
\ No newline at end of file
diff --git a/src/parser/parser.rs b/src/parser/parser.rs
index 4639149..7b3432c 100644
--- a/src/parser/parser.rs
+++ b/src/parser/parser.rs
@@ -1,19 +1,14 @@
-use std::result;
+use std::result::Result;
-use super::tokenizer::{
- PreloadedTokenizer,
- Token,
- TokenError,
-};
+use super::tokenizer::*;
const DUMMY: usize = 0;
-type Result = result::Result;
+type ParseResult = Result;
mod utils {
- use std::result;
- pub fn string_to_isize(string: &String, msg_handler: F) -> result::Result
+ pub fn string_to_isize(string: &String, msg_handler: F) -> Result
where F: Fn() -> String {
match string.as_str().parse::() {
Ok(n) => Ok(n),
@@ -21,7 +16,7 @@ mod utils {
}
}
- pub fn string_to_f64(string: &String, msg_handler: F) -> result::Result
+ pub fn string_to_f64(string: &String, msg_handler: F) -> Result
where F: Fn() -> String {
match string.as_str().parse::() {
Ok(n) => Ok(n),
@@ -88,17 +83,17 @@ impl<'a> Parser<'a> {
Parser { tokenizer: PreloadedTokenizer::new(input) }
}
- pub fn compile(&mut self) -> Result {
+ pub fn compile(&mut self) -> ParseResult {
Ok(self.json_path()?)
}
- pub fn parse(&mut self, visitor: &mut V) -> Result<()> {
+ pub fn parse(&mut self, visitor: &mut V) -> ParseResult<()> {
let node = self.json_path()?;
visitor.visit(node);
Ok(())
}
- fn json_path(&mut self) -> Result {
+ fn json_path(&mut self) -> ParseResult {
debug!("#json_path");
match self.tokenizer.next_token() {
Ok(Token::Absolute(_)) => {
@@ -111,7 +106,7 @@ impl<'a> Parser<'a> {
}
}
- fn paths(&mut self, prev: Node) -> Result {
+ fn paths(&mut self, prev: Node) -> ParseResult {
debug!("#paths");
match self.tokenizer.peek_token() {
Ok(Token::Dot(_)) => {
@@ -130,7 +125,7 @@ impl<'a> Parser<'a> {
}
}
- fn paths_dot(&mut self, prev: Node) -> Result {
+ fn paths_dot(&mut self, prev: Node) -> ParseResult {
debug!("#paths_dot");
let node = self.path(prev)?;
match self.tokenizer.peek_token() {
@@ -150,7 +145,7 @@ impl<'a> Parser<'a> {
}
}
- fn path(&mut self, prev: Node) -> Result {
+ fn path(&mut self, prev: Node) -> ParseResult {
debug!("#path");
match self.tokenizer.peek_token() {
Ok(Token::Dot(_)) => {
@@ -172,7 +167,7 @@ impl<'a> Parser<'a> {
}
}
- fn path_leaves(&mut self, prev: Node) -> Result {
+ fn path_leaves(&mut self, prev: Node) -> ParseResult {
debug!("#path_leaves");
self.eat_token();
match self.tokenizer.peek_token() {
@@ -190,7 +185,7 @@ impl<'a> Parser<'a> {
}
}
- fn path_leaves_key(&mut self, prev: Node) -> Result {
+ fn path_leaves_key(&mut self, prev: Node) -> ParseResult {
debug!("#path_leaves_key");
Ok(Node {
token: ParseToken::Leaves,
@@ -199,7 +194,7 @@ impl<'a> Parser<'a> {
})
}
- fn path_leaves_all(&mut self, prev: Node) -> Result {
+ fn path_leaves_all(&mut self, prev: Node) -> ParseResult {
debug!("#path_leaves_all");
self.eat_token();
Ok(Node {
@@ -209,7 +204,7 @@ impl<'a> Parser<'a> {
})
}
- fn path_in_all(&mut self, prev: Node) -> Result {
+ fn path_in_all(&mut self, prev: Node) -> ParseResult {
debug!("#path_in_all");
self.eat_token();
Ok(Node {
@@ -219,7 +214,7 @@ impl<'a> Parser<'a> {
})
}
- fn path_in_key(&mut self, prev: Node) -> Result {
+ fn path_in_key(&mut self, prev: Node) -> ParseResult {
debug!("#path_in_key");
Ok(Node {
token: ParseToken::In,
@@ -228,7 +223,7 @@ impl<'a> Parser<'a> {
})
}
- fn key(&mut self) -> Result {
+ fn key(&mut self) -> ParseResult {
debug!("#key");
match self.tokenizer.next_token() {
Ok(Token::Key(_, v)) => {
@@ -240,7 +235,7 @@ impl<'a> Parser<'a> {
}
}
- fn array_quota_value(&mut self) -> Result {
+ fn array_quota_value(&mut self) -> ParseResult {
debug!("#array_quota_value");
match self.tokenizer.next_token() {
Ok(Token::SingleQuoted(_, val))
@@ -256,7 +251,7 @@ impl<'a> Parser<'a> {
}
}
- fn array_start(&mut self, prev: Node) -> Result {
+ fn array_start(&mut self, prev: Node) -> ParseResult {
debug!("#array_start");
match self.tokenizer.peek_token() {
Ok(Token::Question(_)) => {
@@ -285,14 +280,14 @@ impl<'a> Parser<'a> {
}
}
- fn array(&mut self, prev: Node) -> Result {
+ fn array(&mut self, prev: Node) -> ParseResult {
debug!("#array");
let ret = self.array_start(prev)?;
self.eat_whitespace();
self.close_token(ret, Token::CloseArray(DUMMY))
}
- fn array_value_key(&mut self) -> Result {
+ fn array_value_key(&mut self) -> ParseResult {
debug!("#array_value_key");
match self.tokenizer.next_token() {
Ok(Token::Key(pos, ref val)) => {
@@ -318,7 +313,7 @@ impl<'a> Parser<'a> {
}
- fn array_value(&mut self) -> Result {
+ fn array_value(&mut self) -> ParseResult {
debug!("#array_value");
match self.tokenizer.peek_token() {
Ok(Token::Key(_, _)) => {
@@ -342,7 +337,7 @@ impl<'a> Parser<'a> {
}
}
- fn union(&mut self, num: isize) -> Result {
+ fn union(&mut self, num: isize) -> ParseResult {
debug!("#union");
let mut values = vec![num];
while match self.tokenizer.peek_token() {
@@ -364,7 +359,7 @@ impl<'a> Parser<'a> {
Ok(self.node(ParseToken::Union(values)))
}
- fn range_from(&mut self, num: isize) -> Result {
+ fn range_from(&mut self, num: isize) -> ParseResult {
debug!("#range_from");
self.eat_token();
self.eat_whitespace();
@@ -378,7 +373,7 @@ impl<'a> Parser<'a> {
}
}
- fn range_to(&mut self) -> Result {
+ fn range_to(&mut self) -> ParseResult {
debug!("#range_to");
match self.tokenizer.next_token() {
Ok(Token::Key(pos, ref val)) => {
@@ -391,7 +386,7 @@ impl<'a> Parser<'a> {
}
}
- fn range(&mut self, num: isize) -> Result {
+ fn range(&mut self, num: isize) -> ParseResult {
debug!("#range");
match self.tokenizer.next_token() {
Ok(Token::Key(pos, ref val)) => {
@@ -404,7 +399,7 @@ impl<'a> Parser<'a> {
}
}
- fn filter(&mut self) -> Result {
+ fn filter(&mut self) -> ParseResult {
debug!("#filter");
match self.tokenizer.next_token() {
Ok(Token::OpenParenthesis(_)) => {
@@ -421,7 +416,7 @@ impl<'a> Parser<'a> {
}
}
- fn exprs(&mut self) -> Result {
+ fn exprs(&mut self) -> ParseResult {
self.eat_whitespace();
debug!("#exprs");
let node = match self.tokenizer.peek_token() {
@@ -441,7 +436,7 @@ impl<'a> Parser<'a> {
self.condition_expr(node)
}
- fn condition_expr(&mut self, prev: Node) -> Result {
+ fn condition_expr(&mut self, prev: Node) -> ParseResult {
debug!("#condition_expr");
match self.tokenizer.peek_token() {
Ok(Token::And(_)) => {
@@ -466,7 +461,7 @@ impl<'a> Parser<'a> {
}
}
- fn expr(&mut self) -> Result {
+ fn expr(&mut self) -> ParseResult {
debug!("#expr");
let has_prop_candidate = match self.tokenizer.peek_token() {
@@ -494,7 +489,7 @@ impl<'a> Parser<'a> {
}
}
- fn term_num(&mut self) -> Result {
+ fn term_num(&mut self) -> ParseResult {
debug!("#term_num");
match self.tokenizer.next_token() {
Ok(Token::Key(pos, val)) => {
@@ -517,7 +512,7 @@ impl<'a> Parser<'a> {
}
}
- fn term_num_float(&mut self, mut num: &str) -> Result {
+ fn term_num_float(&mut self, mut num: &str) -> ParseResult {
debug!("#term_num_float");
self.eat_token();
match self.tokenizer.next_token() {
@@ -535,7 +530,7 @@ impl<'a> Parser<'a> {
}
}
- fn term(&mut self) -> Result {
+ fn term(&mut self) -> ParseResult {
debug!("#term");
match self.tokenizer.peek_token() {
Ok(Token::At(_)) => {
@@ -568,7 +563,7 @@ impl<'a> Parser<'a> {
}
}
- fn op(&mut self, prev: Node) -> Result {
+ fn op(&mut self, prev: Node) -> ParseResult {
debug!("#op");
let token = match self.tokenizer.next_token() {
Ok(Token::Equal(_)) => {
@@ -620,7 +615,7 @@ impl<'a> Parser<'a> {
Node { left: None, right: None, token: token }
}
- fn close_token(&mut self, ret: Node, token: Token) -> Result {
+ fn close_token(&mut self, ret: Node, token: Token) -> ParseResult {
debug!("#close_token");
match self.tokenizer.next_token() {
Ok(ref t) if t.partial_eq(token) => {
@@ -679,319 +674,4 @@ pub trait NodeVisitor {
fn visit_token(&mut self, token: ParseToken);
fn end_term(&mut self) {}
-}
-
-#[cfg(test)]
-mod tests {
- extern crate env_logger;
-
- use super::*;
-
- struct NodeVisitorTestImpl<'a> {
- input: &'a str,
- stack: Vec,
- }
-
- impl<'a> NodeVisitorTestImpl<'a> {
- fn new(input: &'a str) -> Self {
- NodeVisitorTestImpl { input, stack: Vec::new() }
- }
-
- fn visit(&mut self) -> result::Result, String> {
- let tokenizer = PreloadedTokenizer::new(self.input);
- let mut parser = Parser { tokenizer };
- parser.parse(self)?;
- Ok(self.stack.split_off(0))
- }
- }
-
- impl<'a> NodeVisitor for NodeVisitorTestImpl<'a> {
- fn visit_token(&mut self, token: ParseToken) {
- self.stack.push(token);
- }
- }
-
- fn setup() {
- let _ = env_logger::try_init();
- }
-
- fn run(input: &str) -> result::Result, String> {
- let mut interpreter = NodeVisitorTestImpl::new(input);
- interpreter.visit()
- }
-
- #[test]
- fn parse_path() {
- setup();
-
- assert_eq!(run("$.aa"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::In,
- ParseToken::Key("aa".to_owned())
- ]));
-
- assert_eq!(run("$.00.a"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::In,
- ParseToken::Key("00".to_owned()),
- ParseToken::In,
- ParseToken::Key("a".to_owned())
- ]));
-
- assert_eq!(run("$.00.韓창.seok"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::In,
- ParseToken::Key("00".to_owned()),
- ParseToken::In,
- ParseToken::Key("韓창".to_owned()),
- ParseToken::In,
- ParseToken::Key("seok".to_owned())
- ]));
-
- assert_eq!(run("$.*"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::In,
- ParseToken::All
- ]));
-
- assert_eq!(run("$..*"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Leaves,
- ParseToken::All
- ]));
-
- assert_eq!(run("$..[0]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Leaves,
- ParseToken::Array,
- ParseToken::Number(0.0),
- ParseToken::ArrayEof
- ]));
-
- match run("$.") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$..") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$. a") {
- Ok(_) => panic!(),
- _ => {}
- }
- }
-
- #[test]
- fn parse_array_sytax() {
- setup();
-
- assert_eq!(run("$.book[?(@.isbn)]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::In,
- ParseToken::Key("book".to_string()),
- ParseToken::Array,
- ParseToken::Relative,
- ParseToken::In,
- ParseToken::Key("isbn".to_string()),
- ParseToken::ArrayEof
- ]));
-
- //
- // Array도 컨텍스트 In으로 간주 할거라서 중첩되면 하나만
- //
- assert_eq!(run("$.[*]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[*]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[*].가"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof,
- ParseToken::In, ParseToken::Key("가".to_owned())
- ]));
-
- assert_eq!(run("$.a[0][1]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Number(0_f64),
- ParseToken::ArrayEof,
- ParseToken::Array,
- ParseToken::Number(1_f64),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[1,2]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Union(vec![1, 2]),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[10:]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Range(Some(10), None),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[:11]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Range(None, Some(11)),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[-12:13]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Range(Some(-12), Some(13)),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[?(1>2)]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Greater),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$.a[?($.b>3)]"), Ok(vec![
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Array,
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("b".to_owned()), ParseToken::Number(3_f64), ParseToken::Filter(FilterToken::Greater),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$[?($.c>@.d && 1==2)]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("c".to_owned()),
- ParseToken::Relative, ParseToken::In, ParseToken::Key("d".to_owned()),
- ParseToken::Filter(FilterToken::Greater),
- ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Equal),
- ParseToken::Filter(FilterToken::And),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$[?($.c>@.d&&(1==2||3>=4))]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::Absolute, ParseToken::In, ParseToken::Key("c".to_owned()),
- ParseToken::Relative, ParseToken::In, ParseToken::Key("d".to_owned()),
- ParseToken::Filter(FilterToken::Greater),
- ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Equal),
- ParseToken::Number(3_f64), ParseToken::Number(4_f64), ParseToken::Filter(FilterToken::GreaterOrEqual),
- ParseToken::Filter(FilterToken::Or),
- ParseToken::Filter(FilterToken::And),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$[?(@.a<@.b)]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::Relative, ParseToken::In, ParseToken::Key("a".to_owned()),
- ParseToken::Relative, ParseToken::In, ParseToken::Key("b".to_owned()),
- ParseToken::Filter(FilterToken::Little),
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$[*][*][*]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof,
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof,
- ParseToken::Array,
- ParseToken::All,
- ParseToken::ArrayEof
- ]));
-
- assert_eq!(run("$['a']['bb']"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::Key("a".to_string()),
- ParseToken::ArrayEof,
- ParseToken::Array,
- ParseToken::Key("bb".to_string()),
- ParseToken::ArrayEof
- ]));
-
- match run("$[") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[a]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?($.a)]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?(@.a > @.b]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?(@.a < @.b&&(@.c < @.d)]") {
- Ok(_) => panic!(),
- _ => {}
- }
- }
-
- #[test]
- fn parse_array_float() {
- setup();
-
- assert_eq!(run("$[?(1.1<2.1)]"), Ok(vec![
- ParseToken::Absolute,
- ParseToken::Array,
- ParseToken::Number(1.1), ParseToken::Number(2.1), ParseToken::Filter(FilterToken::Little),
- ParseToken::ArrayEof
- ]));
-
- match run("$[1.1]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?(1.1<.2)]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?(1.1<2.)]") {
- Ok(_) => panic!(),
- _ => {}
- }
-
- match run("$[?(1.1<2.a)]") {
- Ok(_) => panic!(),
- _ => {}
- }
- }
}
\ No newline at end of file
diff --git a/src/parser/path_reader.rs b/src/parser/path_reader.rs
index b3e4da9..297821e 100644
--- a/src/parser/path_reader.rs
+++ b/src/parser/path_reader.rs
@@ -1,4 +1,4 @@
-use std::result;
+use std::result::Result;
#[derive(Debug, PartialEq)]
pub enum ReaderError {
@@ -18,12 +18,12 @@ impl<'a> PathReader<'a> {
}
}
- pub fn peek_char(&self) -> result::Result<(usize, char), ReaderError> {
+ pub fn peek_char(&self) -> Result<(usize, char), ReaderError> {
let ch = self.input.chars().next().ok_or(ReaderError::Eof)?;
Ok((self.pos + ch.len_utf8(), ch))
}
- pub fn take_while(&mut self, fun: F) -> result::Result<(usize, String), ReaderError>
+ pub fn take_while(&mut self, fun: F) -> Result<(usize, String), ReaderError>
where
F: Fn(&char) -> bool
{
@@ -42,7 +42,7 @@ impl<'a> PathReader<'a> {
Ok((self.pos, ret))
}
- pub fn next_char(&mut self) -> result::Result<(usize, char), ReaderError> {
+ pub fn next_char(&mut self) -> Result<(usize, char), ReaderError> {
let (_, ch) = self.peek_char()?;
self.input = &self.input[ch.len_utf8()..];
let ret = Ok((self.pos, ch));
diff --git a/src/parser/prelude.rs b/src/parser/prelude.rs
new file mode 100644
index 0000000..09315fa
--- /dev/null
+++ b/src/parser/prelude.rs
@@ -0,0 +1,2 @@
+pub use super::parser::*;
+pub use super::tokenizer::*;
\ No newline at end of file
diff --git a/src/parser/tokenizer.rs b/src/parser/tokenizer.rs
index d08b0a2..9090a06 100644
--- a/src/parser/tokenizer.rs
+++ b/src/parser/tokenizer.rs
@@ -1,10 +1,7 @@
-use std::result;
use std::io::Write;
+use std::result::Result;
-use super::path_reader::{
- ReaderError,
- PathReader,
-};
+use super::path_reader::{PathReader, ReaderError};
const ABSOLUTE: &'static str = "$";
const DOT: &'static str = ".";
@@ -90,7 +87,6 @@ pub enum Token {
}
impl Token {
-
pub fn partial_eq(&self, other: Token) -> bool {
self.to_simple() == other.to_simple()
}
@@ -152,19 +148,19 @@ impl<'a> Tokenizer<'a> {
}
}
- fn single_quota(&mut self, pos: usize, ch: char) -> result::Result {
+ fn single_quota(&mut self, pos: usize, ch: char) -> Result {
let (_, val) = self.input.take_while(|c| *c != ch).map_err(to_token_error)?;
self.input.next_char().map_err(to_token_error)?;
Ok(Token::SingleQuoted(pos, val))
}
- fn double_quota(&mut self, pos: usize, ch: char) -> result::Result {
+ fn double_quota(&mut self, pos: usize, ch: char) -> Result {
let (_, val) = self.input.take_while(|c| *c != ch).map_err(to_token_error)?;
self.input.next_char().map_err(to_token_error)?;
Ok(Token::DoubleQuoted(pos, val))
}
- fn equal(&mut self, pos: usize, _: char) -> result::Result {
+ fn equal(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_EQUAL => {
@@ -175,7 +171,7 @@ impl<'a> Tokenizer<'a> {
}
}
- fn not_equal(&mut self, pos: usize, _: char) -> result::Result {
+ fn not_equal(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_EQUAL => {
@@ -186,7 +182,7 @@ impl<'a> Tokenizer<'a> {
}
}
- fn little(&mut self, pos: usize, _: char) -> result::Result {
+ fn little(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_EQUAL => {
@@ -197,7 +193,7 @@ impl<'a> Tokenizer<'a> {
}
}
- fn greater(&mut self, pos: usize, _: char) -> result::Result {
+ fn greater(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_EQUAL => {
@@ -208,7 +204,7 @@ impl<'a> Tokenizer<'a> {
}
}
- fn and(&mut self, pos: usize, _: char) -> result::Result {
+ fn and(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_AMPERSAND => {
@@ -219,7 +215,7 @@ impl<'a> Tokenizer<'a> {
}
}
- fn or(&mut self, pos: usize, _: char) -> result::Result {
+ fn or(&mut self, pos: usize, _: char) -> Result {
let (_, ch) = self.input.peek_char().map_err(to_token_error)?;
match ch {
CH_PIPE => {
@@ -230,12 +226,12 @@ impl<'a> Tokenizer<'a> {
}
}
- fn whitespace(&mut self, pos: usize, _: char) -> result::Result {
+ fn whitespace(&mut self, pos: usize, _: char) -> Result {
let (_, vec) = self.input.take_while(|c| c.is_whitespace()).map_err(to_token_error)?;
Ok(Token::Whitespace(pos, vec.len()))
}
- fn other(&mut self, pos: usize, ch: char) -> result::Result {
+ fn other(&mut self, pos: usize, ch: char) -> Result {
let fun = |c: &char| {
match simple_matched_token(*c, pos) {
Some(_) => false,
@@ -253,7 +249,7 @@ impl<'a> Tokenizer<'a> {
Ok(Token::Key(pos, vec))
}
- pub fn next_token(&mut self) -> result::Result {
+ pub fn next_token(&mut self) -> Result {
let (pos, ch) = self.input.next_char().map_err(to_token_error)?;
match simple_matched_token(ch, pos) {
Some(t) => Ok(t),
@@ -309,7 +305,7 @@ impl<'a> PreloadedTokenizer<'a> {
}
}
- pub fn peek_token(&self) -> result::Result<&Token, TokenError> {
+ pub fn peek_token(&self) -> Result<&Token, TokenError> {
match self.tokens.last() {
Some((_, t)) => {
trace!("%{:?}", t);
@@ -322,7 +318,7 @@ impl<'a> PreloadedTokenizer<'a> {
}
}
- pub fn next_token(&mut self) -> result::Result {
+ pub fn next_token(&mut self) -> Result {
match self.tokens.pop() {
Some((pos, t)) => {
self.curr_pos = Some(pos);
@@ -356,205 +352,4 @@ impl<'a> PreloadedTokenizer<'a> {
}
}
}
-}
-
-#[cfg(test)]
-mod tests {
- use super::TokenError;
- use super::{
- Token,
- Tokenizer,
- PreloadedTokenizer,
- };
-
- fn collect_token(input: &str) -> (Vec, Option) {
- let mut tokenizer = Tokenizer::new(input);
- let mut vec = vec![];
- loop {
- match tokenizer.next_token() {
- Ok(t) => vec.push(t),
- Err(e) => return (vec, Some(e)),
- }
- }
- }
-
- fn run(input: &str, expected: (Vec, Option)) {
- let (vec, err) = collect_token(input.clone());
- assert_eq!((vec, err), expected, "\"{}\"", input);
- }
-
- #[test]
- fn peek() {
- let mut tokenizer = PreloadedTokenizer::new("$.a");
- match tokenizer.next_token() {
- Ok(t) => assert_eq!(Token::Absolute(0), t),
- _ => panic!()
- }
-
- match tokenizer.peek_token() {
- Ok(t) => assert_eq!(&Token::Dot(1), t),
- _ => panic!()
- }
-
- match tokenizer.peek_token() {
- Ok(t) => assert_eq!(&Token::Dot(1), t),
- _ => panic!()
- }
-
- match tokenizer.next_token() {
- Ok(t) => assert_eq!(Token::Dot(1), t),
- _ => panic!()
- }
- }
-
- #[test]
- fn token() {
- run("$.01.a",
- (
- vec![
- Token::Absolute(0),
- Token::Dot(1),
- Token::Key(2, "01".to_string()),
- Token::Dot(4),
- Token::Key(5, "a".to_string())
- ]
- , Some(TokenError::Eof)
- ));
-
- run("$. []",
- (
- vec![
- Token::Absolute(0),
- Token::Dot(1),
- Token::Whitespace(2, 2),
- Token::OpenArray(5),
- Token::CloseArray(6)
- ]
- , Some(TokenError::Eof)
- ));
-
- run("$..",
- (
- vec![
- Token::Absolute(0),
- Token::Dot(1),
- Token::Dot(2),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("$..ab",
- (
- vec![
- Token::Absolute(0),
- Token::Dot(1),
- Token::Dot(2),
- Token::Key(3, "ab".to_string())
- ]
- , Some(TokenError::Eof)
- ));
-
- run("$..가 [",
- (
- vec![
- Token::Absolute(0),
- Token::Dot(1),
- Token::Dot(2),
- Token::Key(3, "가".to_string()),
- Token::Whitespace(6, 0),
- Token::OpenArray(7),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("[-1, 2 ]",
- (
- vec![
- Token::OpenArray(0),
- Token::Key(1, "-1".to_string()),
- Token::Comma(3),
- Token::Whitespace(4, 0),
- Token::Key(5, "2".to_string()),
- Token::Whitespace(6, 0),
- Token::CloseArray(7),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("[ 1 2 , 3 \"abc\" : -10 ]",
- (
- vec![
- Token::OpenArray(0),
- Token::Whitespace(1, 0),
- Token::Key(2, "1".to_string()),
- Token::Whitespace(3, 0),
- Token::Key(4, "2".to_string()),
- Token::Whitespace(5, 0),
- Token::Comma(6),
- Token::Whitespace(7, 0),
- Token::Key(8, "3".to_string()),
- Token::Whitespace(9, 0),
- Token::DoubleQuoted(10, "abc".to_string()),
- Token::Whitespace(15, 0),
- Token::Split(16),
- Token::Whitespace(17, 0),
- Token::Key(18, "-10".to_string()),
- Token::Whitespace(21, 0),
- Token::CloseArray(22),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("?(@.a가 <41.01)",
- (
- vec![
- Token::Question(0),
- Token::OpenParenthesis(1),
- Token::At(2),
- Token::Dot(3),
- Token::Key(4, "a가".to_string()),
- Token::Whitespace(8, 0),
- Token::Little(9),
- Token::Key(10, "41".to_string()),
- Token::Dot(12),
- Token::Key(13, "01".to_string()),
- Token::CloseParenthesis(15),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("?(@.a <4a.01)",
- (
- vec![
- Token::Question(0),
- Token::OpenParenthesis(1),
- Token::At(2),
- Token::Dot(3),
- Token::Key(4, "a".to_string()),
- Token::Whitespace(5, 0),
- Token::Little(6),
- Token::Key(7, "4a".to_string()),
- Token::Dot(9),
- Token::Key(10, "01".to_string()),
- Token::CloseParenthesis(12),
- ]
- , Some(TokenError::Eof)
- ));
-
- run("?($.c>@.d)", (
- vec![
- Token::Question(0),
- Token::OpenParenthesis(1),
- Token::Absolute(2),
- Token::Dot(3),
- Token::Key(4, "c".to_string()),
- Token::Greater(5),
- Token::At(6),
- Token::Dot(7),
- Token::Key(8, "d".to_string()),
- Token::CloseParenthesis(9)
- ]
- , Some(TokenError::Eof)
- ));
- }
}
\ No newline at end of file
diff --git a/src/prelude.rs b/src/prelude.rs
new file mode 100644
index 0000000..91c3ae2
--- /dev/null
+++ b/src/prelude.rs
@@ -0,0 +1,3 @@
+pub use parser::prelude::*;
+pub use filter::prelude::*;
+pub use ref_value::*;
\ No newline at end of file
diff --git a/src/ref_value/mod.rs b/src/ref_value/mod.rs
index 761e10a..cb5310b 100644
--- a/src/ref_value/mod.rs
+++ b/src/ref_value/mod.rs
@@ -5,8 +5,7 @@ use std::sync::Arc;
use std::convert::Into;
use indexmap::map::IndexMap;
-use serde_json::Number;
-use serde_json::Value;
+use serde_json::{Number, Value};
pub type TypeRefValue = Arc>;
@@ -81,7 +80,7 @@ impl RefIndex for str {
match *v {
RefValue::Object(ref mut map) => {
map.entry(self.to_owned()).or_insert(RefValueWrapper::wrap(RefValue::Null))
- },
+ }
_ => panic!("cannot access key {:?} in JSON {:?}", self, v),
}
}
@@ -182,7 +181,7 @@ impl RefValueWrapper {
}
}
-impl Into for Value {
+impl Into for &Value {
fn into(self) -> RefValueWrapper {
let ref_val = RefValueConverter::new(self);
RefValueWrapper::new(ref_val)
@@ -275,7 +274,6 @@ impl RefValue {
}
impl Into for RefValue {
-
fn into(self) -> RefValueWrapper {
let wrap = RefValueWrapper::wrap(self);
RefValueWrapper::new(wrap)
@@ -285,11 +283,11 @@ impl Into for RefValue {
struct RefValueConverter;
impl RefValueConverter {
- fn new(value: Value) -> TypeRefValue {
+ fn new(value: &Value) -> TypeRefValue {
RefValueConverter {}.visit_value(value)
}
- fn visit_value(&self, value: Value) -> TypeRefValue {
+ fn visit_value(&self, value: &Value) -> TypeRefValue {
match value {
Value::Null => self.visit_null(),
Value::Bool(v) => self.visit_bool(v),
@@ -302,29 +300,29 @@ impl RefValueConverter {
fn visit_null(&self) -> TypeRefValue {
RefValueWrapper::wrap(RefValue::Null)
}
- fn visit_bool(&self, value: bool) -> TypeRefValue {
- RefValueWrapper::wrap(RefValue::Bool(value))
+ fn visit_bool(&self, value: &bool) -> TypeRefValue {
+ RefValueWrapper::wrap(RefValue::Bool(*value))
}
- fn visit_number(&self, value: serde_json::Number) -> TypeRefValue {
- RefValueWrapper::wrap(RefValue::Number(value))
+ fn visit_number(&self, value: &serde_json::Number) -> TypeRefValue {
+ RefValueWrapper::wrap(RefValue::Number(value.clone()))
}
- fn visit_string(&self, value: String) -> TypeRefValue {
+ fn visit_string(&self, value: &String) -> TypeRefValue {
RefValueWrapper::wrap(RefValue::String(value.to_string()))
}
- fn visit_array(&self, value: Vec) -> TypeRefValue {
+ fn visit_array(&self, value: &Vec) -> TypeRefValue {
let mut values = Vec::new();
for v in value {
values.push(self.visit_value(v));
}
RefValueWrapper::wrap(RefValue::Array(values))
}
- fn visit_object(&self, mut value: serde_json::Map) -> TypeRefValue {
+ fn visit_object(&self, value: &serde_json::Map) -> TypeRefValue {
let mut map = IndexMap::new();
let keys: Vec = value.keys().into_iter().map(|k| k.to_string()).collect();
for k in keys {
- let value = self.visit_value(match value.get_mut(&k) {
- Some(v) => v.take(),
- _ => Value::Null
+ let value = self.visit_value(match value.get(&k) {
+ Some(v) => v,
+ _ => &Value::Null
});
map.insert(k, value);
}
diff --git a/tests/filter.rs b/tests/filter.rs
new file mode 100644
index 0000000..7854698
--- /dev/null
+++ b/tests/filter.rs
@@ -0,0 +1,345 @@
+extern crate env_logger;
+extern crate jsonpath_lib as jsonpath;
+#[macro_use]
+extern crate serde_json;
+
+use std::io::Read;
+
+use serde_json::Value;
+
+use jsonpath::prelude::*;
+
+fn setup() {
+ let _ = env_logger::try_init();
+}
+
+fn new_value_filter(file: &str) -> ValueFilter {
+ let string = read_json(file);
+ let json: Value = serde_json::from_str(string.as_str()).unwrap();
+ ValueFilter::new((&json).into(), false, false)
+}
+
+fn do_filter(path: &str, file: &str) -> JsonValueFilter {
+ let string = read_json(file);
+ let mut jf = JsonValueFilter::new(string.as_str()).unwrap();
+ let mut parser = Parser::new(path);
+ parser.parse(&mut jf).unwrap();
+ jf
+}
+
+fn read_json(path: &str) -> String {
+ let mut f = std::fs::File::open(path).unwrap();
+ let mut contents = String::new();
+ f.read_to_string(&mut contents).unwrap();
+ contents
+}
+
+#[test]
+fn step_in() {
+ setup();
+
+ let mut jf = new_value_filter("./benches/data_obj.json");
+ {
+ let current = jf.step_in_str("friends");
+ assert_eq!(current.is_array(), true);
+ }
+
+ let mut jf = new_value_filter("./benches/data_array.json");
+ {
+ let current = jf.step_in_num(&1.0);
+ assert_eq!(current.get_val().is_object(), true);
+ }
+ {
+ let current = jf.step_in_str("friends");
+ assert_eq!(current.is_array(), true);
+ }
+ let mut jf = new_value_filter("./benches/data_obj.json");
+ {
+ jf.step_in_str("school");
+ jf.step_in_str("friends");
+ jf.step_in_all();
+ let current = jf.step_in_str("name");
+ let friends = json!([
+ "Millicent Norman",
+ "Vincent Cannon",
+ "Gray Berry"
+ ]);
+ assert_eq!(friends, current.get_val().into_value());
+ }
+ let mut jf = new_value_filter("./benches/data_obj.json");
+ {
+ let current = jf.step_leaves_str("name");
+ let names = json!([
+ "Leonor Herman",
+ "Millicent Norman",
+ "Vincent Cannon",
+ "Gray Berry",
+ "Vincent Cannon",
+ "Gray Berry"
+ ]);
+ assert_eq!(names, current.get_val().into_value());
+ }
+}
+
+#[test]
+fn array() {
+ setup();
+
+ let friends = json!([
+ {"id": 1, "name": "Vincent Cannon" },
+ {"id": 2, "name": "Gray Berry"}
+ ]);
+
+ let jf = do_filter("$.school.friends[1, 2]", "./benches/data_obj.json");
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.school.friends[1:]", "./benches/data_obj.json");
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.school.friends[:-2]", "./benches/data_obj.json");
+ let friends = json!([
+ {"id": 0, "name": "Millicent Norman"}
+ ]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$..friends[2].name", "./benches/data_obj.json");
+ let friends = json!(["Gray Berry", "Gray Berry"]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$..friends[*].name", "./benches/data_obj.json");
+ let friends = json!(["Vincent Cannon","Gray Berry","Millicent Norman","Vincent Cannon","Gray Berry"]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$['school']['friends'][*].['name']", "./benches/data_obj.json");
+ let friends = json!(["Millicent Norman","Vincent Cannon","Gray Berry"]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$['school']['friends'][0].['name']", "./benches/data_obj.json");
+ let friends = json!("Millicent Norman");
+ assert_eq!(friends, jf.current_value().into_value());
+}
+
+#[test]
+fn return_type() {
+ setup();
+
+ let friends = json!({
+ "friends": [
+ {"id": 0, "name": "Millicent Norman"},
+ {"id": 1, "name": "Vincent Cannon" },
+ {"id": 2, "name": "Gray Berry"}
+ ]
+ });
+
+ let jf = do_filter("$.school", "./benches/data_obj.json");
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.school[?(@.friends[0])]", "./benches/data_obj.json");
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.school[?(@.friends[10])]", "./benches/data_obj.json");
+ assert_eq!(Value::Null, jf.current_value().into_value());
+
+ let jf = do_filter("$.school[?(1==1)]", "./benches/data_obj.json");
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.school.friends[?(1==1)]", "./benches/data_obj.json");
+ let friends = json!([
+ {"id": 0, "name": "Millicent Norman"},
+ {"id": 1, "name": "Vincent Cannon" },
+ {"id": 2, "name": "Gray Berry"}
+ ]);
+ assert_eq!(friends, jf.current_value().into_value());
+}
+
+#[test]
+fn op() {
+ setup();
+
+ let jf = do_filter("$.school[?(@.friends == @.friends)]", "./benches/data_obj.json");
+ let friends = json!({
+ "friends": [
+ {"id": 0, "name": "Millicent Norman"},
+ {"id": 1, "name": "Vincent Cannon" },
+ {"id": 2, "name": "Gray Berry"}
+ ]
+ });
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.friends[?(@.name)]", "./benches/data_obj.json");
+ let friends = json!([
+ { "id" : 1, "name" : "Vincent Cannon" },
+ { "id" : 2, "name" : "Gray Berry" }
+ ]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.friends[?(@.id >= 2)]", "./benches/data_obj.json");
+ let friends = json!([
+ { "id" : 2, "name" : "Gray Berry" }
+ ]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.friends[?(@.id >= 2 || @.id == 1)]", "./benches/data_obj.json");
+ let friends = json!([
+ { "id" : 2, "name" : "Gray Berry" },
+ { "id" : 1, "name" : "Vincent Cannon" }
+ ]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]", "./benches/data_obj.json");
+ assert_eq!(Value::Null, jf.current_value().into_value());
+
+ let jf = do_filter("$..friends[?(@.id == $.index)].id", "./benches/data_obj.json");
+ let friends = json!([0, 0]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[?($.store.bicycle.price < @.price)].price", "./benches/example.json");
+ let friends = json!([22.99]);
+ assert_eq!(friends, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[?( (@.price == 12.99 || @.category == 'reference') && @.price > 10)].price", "./benches/example.json");
+ let friends = json!([12.99]);
+ assert_eq!(friends, jf.current_value().into_value());
+}
+
+#[test]
+fn example() {
+ setup();
+
+ let jf = do_filter("$.store.book[*].author", "./benches/example.json");
+ let ret = json!(["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..author", "./benches/example.json");
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$.store.*", "./benches/example.json");
+ let ret = json!([
+ [
+ {"category" : "reference", "author" : "Nigel Rees","title" : "Sayings of the Century", "price" : 8.95},
+ {"category" : "fiction", "author" : "Evelyn Waugh","title" : "Sword of Honour","price" : 12.99},
+ {"category" : "fiction", "author" : "Herman Melville","title" : "Moby Dick","isbn" : "0-553-21311-3","price" : 8.99},
+ {"category" : "fiction", "author" : "J. R. R. Tolkien","title" : "The Lord of the Rings","isbn" : "0-395-19395-8","price" : 22.99}
+ ],
+ {"color" : "red","price" : 19.95},
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$.store..price", "./benches/example.json");
+ let ret = json!([8.95, 12.99, 8.99, 22.99, 19.95]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[2]", "./benches/example.json");
+ let ret = json!([{
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ }]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[-2]", "./benches/example.json");
+ let ret = json!([{
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ }]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[0,1]", "./benches/example.json");
+ let ret = json!([
+ {
+ "category" : "reference",
+ "author" : "Nigel Rees",
+ "title" : "Sayings of the Century",
+ "price" : 8.95
+ },
+ {
+ "category" : "fiction",
+ "author" : "Evelyn Waugh",
+ "title" : "Sword of Honour",
+ "price" : 12.99
+ }
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[:2]", "./benches/example.json");
+ let ret = json!([
+ {
+ "category" : "reference",
+ "author" : "Nigel Rees",
+ "title" : "Sayings of the Century",
+ "price" : 8.95
+ },
+ {
+ "category" : "fiction",
+ "author" : "Evelyn Waugh",
+ "title" : "Sword of Honour",
+ "price" : 12.99
+ }
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[2:]", "./benches/example.json");
+ let ret = json!([
+ {
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ },
+ {
+ "category" : "fiction",
+ "author" : "J. R. R. Tolkien",
+ "title" : "The Lord of the Rings",
+ "isbn" : "0-395-19395-8",
+ "price" : 22.99
+ }
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..book[?(@.isbn)]", "./benches/example.json");
+ let ret = json!([
+ {
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ },
+ {
+ "category" : "fiction",
+ "author" : "J. R. R. Tolkien",
+ "title" : "The Lord of the Rings",
+ "isbn" : "0-395-19395-8",
+ "price" : 22.99
+ }
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$.store.book[?(@.price < 10)]", "./benches/example.json");
+ let ret = json!([
+ {
+ "category" : "reference",
+ "author" : "Nigel Rees",
+ "title" : "Sayings of the Century",
+ "price" : 8.95
+ },
+ {
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ }
+ ]);
+ assert_eq!(ret, jf.current_value().into_value());
+
+ let jf = do_filter("$..*", "./benches/example.json");
+ let json: Value = serde_json::from_str(read_json("./benches/giveme_every_thing_result.json").as_str()).unwrap();
+ assert_eq!(json, jf.current_value().into_value());
+}
\ No newline at end of file
diff --git a/tests/lib.rs b/tests/lib.rs
new file mode 100644
index 0000000..d19a9e1
--- /dev/null
+++ b/tests/lib.rs
@@ -0,0 +1,69 @@
+extern crate env_logger;
+extern crate jsonpath_lib as jsonpath;
+extern crate log;
+#[macro_use]
+extern crate serde_json;
+
+use std::io::Read;
+
+use serde_json::Value;
+
+fn read_json(path: &str) -> Value {
+ let mut f = std::fs::File::open(path).unwrap();
+ let mut contents = String::new();
+ f.read_to_string(&mut contents).unwrap();
+ serde_json::from_str(contents.as_str()).unwrap()
+}
+
+#[test]
+fn compile() {
+ let mut template = jsonpath::compile("$..friends[2]");
+ let json_obj = read_json("./benches/data_obj.json");
+ let json = template(&json_obj).unwrap();
+ let ret = json!([
+ {"id": 2,"name": "Gray Berry"},
+ {"id": 2,"name": "Gray Berry"}
+ ]);
+ assert_eq!(json, ret);
+
+ let json_obj = read_json("./benches/data_array.json");
+ let json = template(&json_obj).unwrap();
+ let ret = json!([
+ {"id": 2,"name": "Gray Berry"},
+ {"id": 2,"name": "Rosetta Erickson"}
+ ]);
+ assert_eq!(json, ret);
+}
+
+#[test]
+fn selector() {
+ let json_obj = read_json("./benches/data_obj.json");
+ let mut reader = jsonpath::selector(&json_obj);
+ let json = reader("$..friends[2]").unwrap();
+ let ret = json!([
+ {"id": 2,"name": "Gray Berry"},
+ {"id": 2,"name": "Gray Berry"}
+ ]);
+ assert_eq!(json, ret);
+
+ let json = reader("$..friends[0]").unwrap();
+ let ret = json!([
+ {"id": 0},
+ {"id": 0,"name": "Millicent Norman"}
+ ]);
+ assert_eq!(json, ret);
+}
+
+#[test]
+fn select() {
+ let json_obj = read_json("./benches/example.json");
+ let json = jsonpath::select(&json_obj, "$..book[2]").unwrap();
+ let ret = json!([{
+ "category" : "fiction",
+ "author" : "Herman Melville",
+ "title" : "Moby Dick",
+ "isbn" : "0-553-21311-3",
+ "price" : 8.99
+ }]);
+ assert_eq!(json, ret);
+}
\ No newline at end of file
diff --git a/tests/parser.rs b/tests/parser.rs
new file mode 100644
index 0000000..b51d0d3
--- /dev/null
+++ b/tests/parser.rs
@@ -0,0 +1,313 @@
+extern crate env_logger;
+extern crate jsonpath_lib as jsonpath;
+
+use std::result;
+
+use jsonpath::prelude::*;
+
+struct NodeVisitorTestImpl<'a> {
+ input: &'a str,
+ stack: Vec,
+}
+
+impl<'a> NodeVisitorTestImpl<'a> {
+ fn new(input: &'a str) -> Self {
+ NodeVisitorTestImpl { input, stack: Vec::new() }
+ }
+
+ fn visit(&mut self) -> result::Result, String> {
+ let mut parser = Parser::new(self.input);
+ parser.parse(self)?;
+ Ok(self.stack.split_off(0))
+ }
+}
+
+impl<'a> NodeVisitor for NodeVisitorTestImpl<'a> {
+ fn visit_token(&mut self, token: ParseToken) {
+ self.stack.push(token);
+ }
+}
+
+fn setup() {
+ let _ = env_logger::try_init();
+}
+
+fn run(input: &str) -> result::Result, String> {
+ let mut interpreter = NodeVisitorTestImpl::new(input);
+ interpreter.visit()
+}
+
+#[test]
+fn parse_path() {
+ setup();
+
+ assert_eq!(run("$.aa"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::In,
+ ParseToken::Key("aa".to_owned())
+ ]));
+
+ assert_eq!(run("$.00.a"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::In,
+ ParseToken::Key("00".to_owned()),
+ ParseToken::In,
+ ParseToken::Key("a".to_owned())
+ ]));
+
+ assert_eq!(run("$.00.韓창.seok"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::In,
+ ParseToken::Key("00".to_owned()),
+ ParseToken::In,
+ ParseToken::Key("韓창".to_owned()),
+ ParseToken::In,
+ ParseToken::Key("seok".to_owned())
+ ]));
+
+ assert_eq!(run("$.*"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::In,
+ ParseToken::All
+ ]));
+
+ assert_eq!(run("$..*"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Leaves,
+ ParseToken::All
+ ]));
+
+ assert_eq!(run("$..[0]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Leaves,
+ ParseToken::Array,
+ ParseToken::Number(0.0),
+ ParseToken::ArrayEof
+ ]));
+
+ match run("$.") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$..") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$. a") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+}
+
+#[test]
+fn parse_array_sytax() {
+ setup();
+
+ assert_eq!(run("$.book[?(@.isbn)]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::In,
+ ParseToken::Key("book".to_string()),
+ ParseToken::Array,
+ ParseToken::Relative,
+ ParseToken::In,
+ ParseToken::Key("isbn".to_string()),
+ ParseToken::ArrayEof
+ ]));
+
+ //
+ // Array도 컨텍스트 In으로 간주 할거라서 중첩되면 하나만
+ //
+ assert_eq!(run("$.[*]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[*]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[*].가"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof,
+ ParseToken::In, ParseToken::Key("가".to_owned())
+ ]));
+
+ assert_eq!(run("$.a[0][1]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Number(0_f64),
+ ParseToken::ArrayEof,
+ ParseToken::Array,
+ ParseToken::Number(1_f64),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[1,2]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Union(vec![1, 2]),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[10:]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Range(Some(10), None),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[:11]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Range(None, Some(11)),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[-12:13]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Range(Some(-12), Some(13)),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[?(1>2)]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Greater),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$.a[?($.b>3)]"), Ok(vec![
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Array,
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("b".to_owned()), ParseToken::Number(3_f64), ParseToken::Filter(FilterToken::Greater),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$[?($.c>@.d && 1==2)]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("c".to_owned()),
+ ParseToken::Relative, ParseToken::In, ParseToken::Key("d".to_owned()),
+ ParseToken::Filter(FilterToken::Greater),
+ ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Equal),
+ ParseToken::Filter(FilterToken::And),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$[?($.c>@.d&&(1==2||3>=4))]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::Absolute, ParseToken::In, ParseToken::Key("c".to_owned()),
+ ParseToken::Relative, ParseToken::In, ParseToken::Key("d".to_owned()),
+ ParseToken::Filter(FilterToken::Greater),
+ ParseToken::Number(1_f64), ParseToken::Number(2_f64), ParseToken::Filter(FilterToken::Equal),
+ ParseToken::Number(3_f64), ParseToken::Number(4_f64), ParseToken::Filter(FilterToken::GreaterOrEqual),
+ ParseToken::Filter(FilterToken::Or),
+ ParseToken::Filter(FilterToken::And),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$[?(@.a<@.b)]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::Relative, ParseToken::In, ParseToken::Key("a".to_owned()),
+ ParseToken::Relative, ParseToken::In, ParseToken::Key("b".to_owned()),
+ ParseToken::Filter(FilterToken::Little),
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$[*][*][*]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof,
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof,
+ ParseToken::Array,
+ ParseToken::All,
+ ParseToken::ArrayEof
+ ]));
+
+ assert_eq!(run("$['a']['bb']"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::Key("a".to_string()),
+ ParseToken::ArrayEof,
+ ParseToken::Array,
+ ParseToken::Key("bb".to_string()),
+ ParseToken::ArrayEof
+ ]));
+
+ match run("$[") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[a]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?($.a)]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?(@.a > @.b]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?(@.a < @.b&&(@.c < @.d)]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+}
+
+#[test]
+fn parse_array_float() {
+ setup();
+
+ assert_eq!(run("$[?(1.1<2.1)]"), Ok(vec![
+ ParseToken::Absolute,
+ ParseToken::Array,
+ ParseToken::Number(1.1), ParseToken::Number(2.1), ParseToken::Filter(FilterToken::Little),
+ ParseToken::ArrayEof
+ ]));
+
+ match run("$[1.1]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?(1.1<.2)]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?(1.1<2.)]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+
+ match run("$[?(1.1<2.a)]") {
+ Ok(_) => panic!(),
+ _ => {}
+ }
+}
\ No newline at end of file
diff --git a/tests/tokenizer.rs b/tests/tokenizer.rs
new file mode 100644
index 0000000..1e83c84
--- /dev/null
+++ b/tests/tokenizer.rs
@@ -0,0 +1,194 @@
+extern crate jsonpath_lib as jsonpath;
+
+use jsonpath::prelude::*;
+
+fn collect_token(input: &str) -> (Vec, Option) {
+ let mut tokenizer = Tokenizer::new(input);
+ let mut vec = vec![];
+ loop {
+ match tokenizer.next_token() {
+ Ok(t) => vec.push(t),
+ Err(e) => return (vec, Some(e)),
+ }
+ }
+}
+
+fn run(input: &str, expected: (Vec, Option)) {
+ let (vec, err) = collect_token(input.clone());
+ assert_eq!((vec, err), expected, "\"{}\"", input);
+}
+
+#[test]
+fn peek() {
+ let mut tokenizer = PreloadedTokenizer::new("$.a");
+ match tokenizer.next_token() {
+ Ok(t) => assert_eq!(Token::Absolute(0), t),
+ _ => panic!()
+ }
+
+ match tokenizer.peek_token() {
+ Ok(t) => assert_eq!(&Token::Dot(1), t),
+ _ => panic!()
+ }
+
+ match tokenizer.peek_token() {
+ Ok(t) => assert_eq!(&Token::Dot(1), t),
+ _ => panic!()
+ }
+
+ match tokenizer.next_token() {
+ Ok(t) => assert_eq!(Token::Dot(1), t),
+ _ => panic!()
+ }
+}
+
+#[test]
+fn token() {
+ run("$.01.a",
+ (
+ vec![
+ Token::Absolute(0),
+ Token::Dot(1),
+ Token::Key(2, "01".to_string()),
+ Token::Dot(4),
+ Token::Key(5, "a".to_string())
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("$. []",
+ (
+ vec![
+ Token::Absolute(0),
+ Token::Dot(1),
+ Token::Whitespace(2, 2),
+ Token::OpenArray(5),
+ Token::CloseArray(6)
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("$..",
+ (
+ vec![
+ Token::Absolute(0),
+ Token::Dot(1),
+ Token::Dot(2),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("$..ab",
+ (
+ vec![
+ Token::Absolute(0),
+ Token::Dot(1),
+ Token::Dot(2),
+ Token::Key(3, "ab".to_string())
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("$..가 [",
+ (
+ vec![
+ Token::Absolute(0),
+ Token::Dot(1),
+ Token::Dot(2),
+ Token::Key(3, "가".to_string()),
+ Token::Whitespace(6, 0),
+ Token::OpenArray(7),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("[-1, 2 ]",
+ (
+ vec![
+ Token::OpenArray(0),
+ Token::Key(1, "-1".to_string()),
+ Token::Comma(3),
+ Token::Whitespace(4, 0),
+ Token::Key(5, "2".to_string()),
+ Token::Whitespace(6, 0),
+ Token::CloseArray(7),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("[ 1 2 , 3 \"abc\" : -10 ]",
+ (
+ vec![
+ Token::OpenArray(0),
+ Token::Whitespace(1, 0),
+ Token::Key(2, "1".to_string()),
+ Token::Whitespace(3, 0),
+ Token::Key(4, "2".to_string()),
+ Token::Whitespace(5, 0),
+ Token::Comma(6),
+ Token::Whitespace(7, 0),
+ Token::Key(8, "3".to_string()),
+ Token::Whitespace(9, 0),
+ Token::DoubleQuoted(10, "abc".to_string()),
+ Token::Whitespace(15, 0),
+ Token::Split(16),
+ Token::Whitespace(17, 0),
+ Token::Key(18, "-10".to_string()),
+ Token::Whitespace(21, 0),
+ Token::CloseArray(22),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("?(@.a가 <41.01)",
+ (
+ vec![
+ Token::Question(0),
+ Token::OpenParenthesis(1),
+ Token::At(2),
+ Token::Dot(3),
+ Token::Key(4, "a가".to_string()),
+ Token::Whitespace(8, 0),
+ Token::Little(9),
+ Token::Key(10, "41".to_string()),
+ Token::Dot(12),
+ Token::Key(13, "01".to_string()),
+ Token::CloseParenthesis(15),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("?(@.a <4a.01)",
+ (
+ vec![
+ Token::Question(0),
+ Token::OpenParenthesis(1),
+ Token::At(2),
+ Token::Dot(3),
+ Token::Key(4, "a".to_string()),
+ Token::Whitespace(5, 0),
+ Token::Little(6),
+ Token::Key(7, "4a".to_string()),
+ Token::Dot(9),
+ Token::Key(10, "01".to_string()),
+ Token::CloseParenthesis(12),
+ ]
+ , Some(TokenError::Eof)
+ ));
+
+ run("?($.c>@.d)", (
+ vec![
+ Token::Question(0),
+ Token::OpenParenthesis(1),
+ Token::Absolute(2),
+ Token::Dot(3),
+ Token::Key(4, "c".to_string()),
+ Token::Greater(5),
+ Token::At(6),
+ Token::Dot(7),
+ Token::Key(8, "d".to_string()),
+ Token::CloseParenthesis(9)
+ ]
+ , Some(TokenError::Eof)
+ ));
+}
\ No newline at end of file
diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml
index 703770e..bfea118 100644
--- a/wasm/Cargo.toml
+++ b/wasm/Cargo.toml
@@ -2,11 +2,8 @@
name = "jsonpath-wasm"
version = "0.1.3"
authors = ["Changseok Han "]
-
description = "JsonPath Webassembly version compiled by Rust - Demo: https://freestrings.github.io/jsonpath"
-
keywords = ["library", "jsonpath", "json", "webassembly"]
-
repository = "https://github.com/freestrings/jsonpath"
license = "MIT"
diff --git a/wasm/build.sh b/wasm/build.sh
deleted file mode 100755
index 791d4d5..0000000
--- a/wasm/build.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# project_root/wasm
-DIR="$(pwd)"
-
-cd "${DIR}"/www && \
- rm -rf "${DIR}"/www/dist && \
- rm -rf "${DIR}"/www/node_modules && \
- rm -rf "${DIR}"/www_bench/dist && \
- rm -rf "${DIR}"/www_bench/node_modules && \
- npm install && \
- cd "${DIR}"
-
-echo "-------------------- start build nodejs pkg --------------------"
-echo
-
-rm -rf "${DIR}"/wasm/nodejs_pkg && \
-wasm-pack build --target=nodejs --scope nodejs --out-dir nodejs_pkg && \
-cd "${DIR}"/nodejs_pkg && npm link && \
-rm -rf "${DIR}"/../benches/javascript/node_modules && \
-cd "${DIR}"/../benches/javascript && npm install && \
-npm link @nodejs/jsonpath-wasm
-echo "-------------------- build nodejs pkg done --------------------"
-
-cd "${DIR}"
-
-echo
-echo
-echo
-echo
-echo
-echo
-echo "-------------------- start build browser pkg --------------------"
-echo
-rm -rf "${DIR}"/wasm/browser_pkg && \
-wasm-pack build --target=browser --scope browser --out-dir browser_pkg && \
-cd "${DIR}"/browser_pkg && npm link && \
-cd "${DIR}"/www && npm link @browser/jsonpath-wasm
-echo "-------------------- build browser pkg done --------------------"
-
-echo
-echo
-echo
-echo
-echo
-echo
-echo "-------------------- start build browser bench pkg --------------------"
-echo
-rm -rf "${DIR}"/www_bench/node_modules && \
-cd "${DIR}"/www_bench && npm install && npm link @browser/jsonpath-wasm
-echo "-------------------- build browser bench pkg done --------------------"
-
-echo
-echo
-echo
-echo
-echo
-echo
-echo "-------------------- start build docs --------------------"
-cd "${DIR}"/www && \
- npm run build && \
- rm -f "${DIR}"/../docs/*.js && rm -f "${DIR}"/../docs/*.wasm && rm -f "${DIR}"/../docs/*.html && \
- cp "${DIR}"/www/dist/*.* "${DIR}"/../docs/
-echo "-------------------- build docs done --------------------"
-
-echo
-echo
-echo
-echo
-echo
-echo
-echo "-------------------- start build docs bench --------------------"
-cd "${DIR}"/www_bench && \
- npm run build && \
- rm -f "${DIR}"/../docs/bench/*.js && rm -f "${DIR}"/../docs/bench/*.wasm && rm -f "${DIR}"/../docs/bench/*.html && \
- cp "${DIR}"/www_bench/dist/*.* "${DIR}"/../docs/bench/
-echo "-------------------- build docs bench done --------------------"
\ No newline at end of file
diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs
index 4cddbee..a104dcf 100644
--- a/wasm/src/lib.rs
+++ b/wasm/src/lib.rs
@@ -11,9 +11,7 @@ use std::result::Result;
use std::sync::Mutex;
use cfg_if::cfg_if;
-use jsonpath::filter::value_filter::*;
-use jsonpath::parser::parser::*;
-use jsonpath::ref_value::*;
+use jsonpath::prelude::*;
use serde_json::Value;
use wasm_bindgen::prelude::*;
use web_sys::console;
@@ -54,7 +52,7 @@ fn into_serde_json(js_value: &JsValue) -> Result {
fn into_ref_value(js_value: &JsValue, node: Node) -> JsValue {
match into_serde_json(js_value) {
- Ok(json) => filter_ref_value(json.into(), node),
+ Ok(json) => filter_ref_value((&json).into(), node),
Err(e) => JsValue::from_str(&format!("Json serialize error: {}", e))
}
}
@@ -87,7 +85,7 @@ pub fn alloc_json(js_value: JsValue) -> usize {
let mut idx = CACHE_JSON_IDX.lock().unwrap();
*idx += 1;
- map.insert(*idx, json.into());
+ map.insert(*idx, (&json).into());
*idx
}
Err(e) => {
@@ -138,7 +136,7 @@ pub fn selector(js_value: JsValue) -> JsValue {
}
_ => {
match into_serde_json(&js_value) {
- Ok(json) => json.into(),
+ Ok(json) => (&json).into(),
Err(e) => return JsValue::from_str(e.as_str())
}
}