diff --git a/README.md b/README.md index aba7261..e804f0f 100644 --- a/README.md +++ b/README.md @@ -16,21 +16,9 @@ It is an implementation for [JsonPath](https://goessner.net/articles/JsonPath/) To enjoy Rust! -## API +## Rust API -[With Javascript](#with-javascript) - -- [jsonpath-wasm library](#jsonpath-wasm-library) -- [jsonpath-rs library](#jsonpath-rs-library-only-nodejs) -- [Javascript - jsonpath.select(json: string|object, jsonpath: string)](#javascript---jsonpathselectjson-stringobject-jsonpath-string) -- [Javascript - jsonpath.compile(jsonpath: string)](#javascript---jsonpathcompilejsonpath-string) -- [Javascript - jsonpath.selector(json: string|object)](#javascript---jsonpathselectorjson-stringobject) -- [Javascript - alloc_json, dealloc_json](#javascript---alloc_json-dealloc_json) -- [Javascript-wasm - examples](https://github.com/freestrings/jsonpath/wiki/Javascript-examples) - -[With Rust](#with-rust) - -- [jsonpath_lib library](#jsonpath_lib-library) +- [jsonpath_lib crate](#jsonpath_lib-crate) - [Rust - jsonpath::Selector struct](#rust---jsonpathselector-struct) - [Rust - jsonpath::select(json: &serde_json::value::Value, jsonpath: &str)](#rust---jsonpathselectjson-serde_jsonvaluevalue-jsonpath-str) - [Rust - jsonpath::select_as_str(json_str: &str, jsonpath: &str)](#rust---jsonpathselect_as_strjson-str-jsonpath-str) @@ -40,15 +28,262 @@ To enjoy Rust! - [Rust - jsonpath::selector_as\(json: &serde_json::value::Value)](#rust---jsonpathselector_ast-serdededeserializeownedjson-serde_jsonvaluevalue) - [Rust - examples](https://github.com/freestrings/jsonpath/wiki/rust-examples) -[Simple time check - webassembly](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck---jsonpath-wasm) +## Javascript API -[Simple time check - native addon for NodeJs](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck-jsonpath-native) +- [npm package](#npm-package) +- [Javascript - jsonpath.Selector class](#javascript---selector-class) +- [Javascript - jsonpath.select(json: string|object, jsonpath: string)](#javascript---jsonpathselectjson-stringobject-jsonpath-string) +- [Javascript - jsonpath.compile(jsonpath: string)](#javascript---jsonpathcompilejsonpath-string) +- [Javascript - jsonpath.selector(json: string|object)](#javascript---jsonpathselectorjson-stringobject) +- [Javascript - allocJson, deallocJson (Webassembly Only)](#javascript---allocjson-deallocjson-webassembly-only) +- [Javascript - examples](https://github.com/freestrings/jsonpath/wiki/Javascript-examples) -## With Javascript +## Simple time check +- [jsonpath-wasm](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck---jsonpath-wasm) +- [jsonpath-rs](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck-jsonpath-native) -### jsonpath-wasm library +--- + +### Rust API + +#### jsonpath_lib crate +[Go to creates.io](https://crates.io/crates/jsonpath_lib) + +```rust +extern crate jsonpath_lib as jsonpath; +#[macro_use] +extern crate serde_json; +``` + +#### Rust - jsonpath::Selector struct + +```rust +#[derive(Serialize, Deserialize, PartialEq, Debug)] +struct Friend { + name: String, + age: Option, +} + +let json_obj = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} +]}); + +let mut selector = Selector::new(); + +let result = selector + .path("$..[?(@.age >= 30)]").unwrap() +// .value_from_str(&serde_json::to_string(&json_obj).unwrap() /*&str*/).unwrap() +// .value_from(&json_obj /*&impl serde::ser::Serialize*/).unwrap() + .value((&json_obj /*serde_json::value::Value*/ ).into()).unwrap() + .select_to_value().unwrap(); + +assert_eq!(json!([{"name": "친구3", "age": 30}]), result); + +let result = selector.select_to_str().unwrap(); +assert_eq!(r#"[{"name":"친구3","age":30}]"#, result); + +let result = selector.select_to::>().unwrap(); +assert_eq!(vec![Friend { name: "친구3".to_string(), age: Some(30) }], result); +``` + +#### Rust - jsonpath::select(json: &serde_json::value::Value, jsonpath: &str) + +```rust +let json_obj = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} +]}); + +let json = jsonpath::select(&json_obj, "$..friends[0]").unwrap(); + +let ret = json!([ + {"name": "친구3", "age": 30}, + {"name": "친구1", "age": 20} +]); +assert_eq!(json, ret); +``` + +#### Rust - jsonpath::select_as_str(json: &str, jsonpath: &str) + +```rust +let ret = jsonpath::select_as_str(r#" +{ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} + ] +} +"#, "$..friends[0]").unwrap(); + +assert_eq!(ret, r#"[{"name":"친구3","age":30},{"name":"친구1","age":20}]"#); +``` + +#### Rust - jsonpath::select_as\(json: &str, jsonpath: &str) + +```rust +#[derive(Deserialize, PartialEq, Debug)] +struct Person { + name: String, + age: u8, + phones: Vec, +} + +let ret: Person = jsonpath::select_as(r#" +{ + "person": + { + "name": "Doe John", + "age": 44, + "phones": [ + "+44 1234567", + "+44 2345678" + ] + } +} +"#, "$.person").unwrap(); + +let person = Person { + name: "Doe John".to_string(), + age: 44, + phones: vec!["+44 1234567".to_string(), "+44 2345678".to_string()], +}; + +assert_eq!(person, ret); +``` + +#### Rust - jsonpath::compile(jsonpath: &str) + +```rust +let mut template = jsonpath::compile("$..friends[0]"); + +let json_obj = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} +]}); + +let json = template(&json_obj).unwrap(); + +let ret = json!([ + {"name": "친구3", "age": 30}, + {"name": "친구1", "age": 20} +]); + +assert_eq!(json, ret); +``` + +#### Rust - jsonpath::selector(json: &serde_json::value::Value) + +```rust +let json_obj = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} +]}); + +let mut selector = jsonpath::selector(&json_obj); + +let json = selector("$..friends[0]").unwrap(); + +let ret = json!([ + {"name": "친구3", "age": 30}, + {"name": "친구1", "age": 20} +]); + +assert_eq!(json, ret); + +let json = selector("$..friends[1]").unwrap(); + +let ret = json!([ + {"name": "친구4"}, + {"name": "친구2", "age": 20} +]); + +assert_eq!(json, ret); +``` + +#### Rust - jsonpath::selector_as\(json: &serde_json::value::Value) + +```rust +let json_obj = json!({ + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} +]}); + +#[derive(Serialize, Deserialize, PartialEq, Debug)] +struct Friend { + name: String, + age: Option, +} + +let mut selector = jsonpath::selector_as::>(&json_obj); + +let json = selector("$..friends[0]").unwrap(); + +let ret = vec!( + Friend { name: "친구3".to_string(), age: Some(30) }, + Friend { name: "친구1".to_string(), age: Some(20) } +); +assert_eq!(json, ret); + +let json = selector("$..friends[1]").unwrap(); + +let ret = vec!( + Friend { name: "친구4".to_string(), age: None }, + Friend { name: "친구2".to_string(), age: Some(20) } +); + +assert_eq!(json, ret); +``` + +--- + +### Javascript API + +#### npm package + +##### jsonpath-wasm (Not yet published) -*(not yet published `jsonpath-wasm`)* ```javascript // browser import * as jsonpath from "jsonpath-wasm"; @@ -56,15 +291,92 @@ import * as jsonpath from "jsonpath-wasm"; const jsonpath = require('jsonpath-wasm'); ``` -### jsonpath-rs library (Only NodeJS) +##### jsonpath-rs (NodeJS only) -`jsonpath-rs` is native addon for NodeJs +[Goto npmjs.org](https://www.npmjs.com/package/jsonpath-rs) ```javascript const jsonpath = require('jsonpath-rs'); ``` -### Javascript - jsonpath.select(json: string|object, jsonpath: string) +#### javascript - Selector class + +##### jsonpath-wasm +`wasm-bindgen` 리턴타입 제약 때문에 빌더 패턴은 지원하지 않는다. + +It does not support `builder-pattern` due to the `return type` restriction of `wasm-bindgen`. + +```javascript +let jsonObj = { + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} + ] +}; + +let ret = [ + {"name": "친구3", "age": 30}, + {"name": "친구1", "age": 20} +]; + +let selector = new jsonpath.Selector(); +selector.path('$..friends[0]'); +selector.value(jsonObj); + +let selectToObj = selector.selectTo(); +let selectToString = selector.selectToStr(); + +console.log( + JSON.stringify(ret) == JSON.stringify(selectToObj), + JSON.stringify(ret) == selectToString +); + +// => true, true +``` + +##### jsonpath-rs + +```javascript +let jsonObj = { + "school": { + "friends": [ + {"name": "친구1", "age": 20}, + {"name": "친구2", "age": 20} + ] + }, + "friends": [ + {"name": "친구3", "age": 30}, + {"name": "친구4"} + ] +}; + +let ret = [ + {"name": "친구3", "age": 30}, + {"name": "친구1", "age": 20} +]; + +let selector = new jsonpath.Selector() + .path('$..friends[0]') + .value(jsonObj); + +let selectToObj = selector.selectTo(); +let selectToString = selector.selectToStr(); + +console.log( + JSON.stringify(ret) == JSON.stringify(selectToObj), + JSON.stringify(ret) == selectToString +); + +// => true, true +``` + +#### Javascript - jsonpath.select(json: string|object, jsonpath: string) ```javascript let jsonObj = { @@ -97,7 +409,7 @@ console.log( // => true, true ``` -### Javascript - jsonpath.compile(jsonpath: string) +#### Javascript - jsonpath.compile(jsonpath: string) ```javascript let template = jsonpath.compile('$..friends[0]'); @@ -156,7 +468,7 @@ console.log( // => true, true ``` -### Javascript - jsonpath.selector(json: string|object) +#### Javascript - jsonpath.selector(json: string|object) ```javascript let jsonObj = { @@ -197,13 +509,10 @@ console.log( // => true, true ``` -### Javascript - alloc_json, dealloc_json +#### Javascript - allocJson, deallocJson (Webassembly Only) +wasm-bindgen은 Javascript와 Webassembly간 값을 주고받을 때 JSON 객체는 String으로 변환되기 때문에, 반복해서 사용되는 JSON 객체는 Webassembly 영역에 생성해 두면 성능에 도움이 된다. -*(not supported in `jsonpath-rs`)* - -wasm-bindgen은 Javascript와 Webassembly 간 값을 주고받을 때 JSON 객체는 String으로 변환되기 때문에, 반복해서 사용되는 JSON 객체를 Webassembly 영역에 생성해 두면 성능에 도움이 된다. - -Since wasm-bindgen converts JSON objects to String when exchanging values between Javascript and Webassembly, it is helpful to create repeated Json objects in Webassembly area. +Since wasm-bindgen converts JSON objects to String when exchanging values between Javascript and Webassembly, creating frequently used JSON objects in the WebAssembly area helps performance. ```javascript const jsonpath = require('@nodejs/jsonpath-wasm'); @@ -222,7 +531,7 @@ let jsonObj = { }; // allocate jsonObj in webassembly -let ptr = jsonpath.alloc_json(jsonObj); +let ptr = jsonpath.allocJson(jsonObj); // `0` is invalid pointer if(ptr == 0) { @@ -253,236 +562,5 @@ console.log( // => true true true true true -jsonpath.dealloc_json(ptr); +jsonpath.deallocJson(ptr); ``` - -## With Rust - -### jsonpath_lib library - -```rust -extern crate jsonpath_lib as jsonpath; -#[macro_use] -extern crate serde_json; -``` - -### Rust - jsonpath::Selector struct - -```rust -#[derive(Serialize, Deserialize, PartialEq, Debug)] -struct Friend { - name: String, - age: Option, -} - -let json_obj = json!({ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} -]}); - -let mut selector = Selector::new(); - -let result = selector - .path("$..[?(@.age >= 30)]").unwrap() -// .value_from_str(&serde_json::to_string(&json_obj).unwrap() /*&str*/).unwrap() -// .value_from(&json_obj /*&impl serde::ser::Serialize*/).unwrap() - .value((&json_obj /*serde_json::value::Value*/ ).into()).unwrap() - .select_to_value().unwrap(); - -assert_eq!(json!([{"name": "친구3", "age": 30}]), result); - -let result = selector.select_to_str().unwrap(); -assert_eq!(r#"[{"name":"친구3","age":30}]"#, result); - -let result = selector.select_to::>().unwrap(); -assert_eq!(vec![Friend { name: "친구3".to_string(), age: Some(30) }], result); -``` - -### rust - jsonpath::select(json: &serde_json::value::Value, jsonpath: &str) - -```rust -let json_obj = json!({ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} -]}); - -let json = jsonpath::select(&json_obj, "$..friends[0]").unwrap(); - -let ret = json!([ - {"name": "친구3", "age": 30}, - {"name": "친구1", "age": 20} -]); -assert_eq!(json, ret); -``` - -### Rust - jsonpath::select_as_str(json: &str, jsonpath: &str) - -```rust -let ret = jsonpath::select_as_str(r#" -{ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} - ] -} -"#, "$..friends[0]").unwrap(); - -assert_eq!(ret, r#"[{"name":"친구3","age":30},{"name":"친구1","age":20}]"#); -``` - -### Rust - jsonpath::select_as\(json: &str, jsonpath: &str) - -```rust -#[derive(Deserialize, PartialEq, Debug)] -struct Person { - name: String, - age: u8, - phones: Vec, -} - -let ret: Person = jsonpath::select_as(r#" -{ - "person": - { - "name": "Doe John", - "age": 44, - "phones": [ - "+44 1234567", - "+44 2345678" - ] - } -} -"#, "$.person").unwrap(); - -let person = Person { - name: "Doe John".to_string(), - age: 44, - phones: vec!["+44 1234567".to_string(), "+44 2345678".to_string()], -}; - -assert_eq!(person, ret); -``` - -### Rust - jsonpath::compile(jsonpath: &str) - -```rust -let mut template = jsonpath::compile("$..friends[0]"); - -let json_obj = json!({ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} -]}); - -let json = template(&json_obj).unwrap(); - -let ret = json!([ - {"name": "친구3", "age": 30}, - {"name": "친구1", "age": 20} -]); - -assert_eq!(json, ret); -``` - -### Rust - jsonpath::selector(json: &serde_json::value::Value) - -```rust -let json_obj = json!({ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} -]}); - -let mut selector = jsonpath::selector(&json_obj); - -let json = selector("$..friends[0]").unwrap(); - -let ret = json!([ - {"name": "친구3", "age": 30}, - {"name": "친구1", "age": 20} -]); - -assert_eq!(json, ret); - -let json = selector("$..friends[1]").unwrap(); - -let ret = json!([ - {"name": "친구4"}, - {"name": "친구2", "age": 20} -]); - -assert_eq!(json, ret); -``` - -### Rust - jsonpath::selector_as\(json: &serde_json::value::Value) - -```rust -let json_obj = json!({ - "school": { - "friends": [ - {"name": "친구1", "age": 20}, - {"name": "친구2", "age": 20} - ] - }, - "friends": [ - {"name": "친구3", "age": 30}, - {"name": "친구4"} -]}); - -#[derive(Serialize, Deserialize, PartialEq, Debug)] -struct Friend { - name: String, - age: Option, -} - -let mut selector = jsonpath::selector_as::>(&json_obj); - -let json = selector("$..friends[0]").unwrap(); - -let ret = vec!( - Friend { name: "친구3".to_string(), age: Some(30) }, - Friend { name: "친구1".to_string(), age: Some(20) } -); -assert_eq!(json, ret); - -let json = selector("$..friends[1]").unwrap(); - -let ret = vec!( - Friend { name: "친구4".to_string(), age: None }, - Friend { name: "친구2".to_string(), age: Some(20) } -); - -assert_eq!(json, ret); -``` \ No newline at end of file diff --git a/benches/bench_wasm.sh b/benches/bench_wasm.sh index 1ed41db..56f419a 100755 --- a/benches/bench_wasm.sh +++ b/benches/bench_wasm.sh @@ -37,6 +37,8 @@ __extra () { printf "\n" sleep 1 cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - compile-alloc: " && time ./bench.sh wasmCompileAlloc ${ITER} + sleep 1 + cd "${DIR}"/javascript && echo "NodeJs - jsonpath-wasm - Selector: " && time ./bench.sh wasmSelectorClass ${ITER} } if [ "$1" = "extra" ]; then diff --git a/benches/javascript/bench.js b/benches/javascript/bench.js index 562bea3..e74d15a 100644 --- a/benches/javascript/bench.js +++ b/benches/javascript/bench.js @@ -86,7 +86,7 @@ function wasmCompile() { } function wasmCompileAlloc() { - let ptr = jpw.alloc_json(getJson()); + let ptr = jpw.allocJson(getJson()); if (ptr == 0) { console.error('Invalid pointer'); return; @@ -98,7 +98,7 @@ function wasmCompileAlloc() { let _ = template(ptr); } } finally { - jpw.dealloc_json(ptr); + jpw.deallocJson(ptr); } } @@ -109,7 +109,7 @@ function wasmSelect() { } function wasmSelectAlloc() { - let ptr = jpw.alloc_json(getJson()); + let ptr = jpw.allocJson(getJson()); if (ptr == 0) { console.error('Invalid pointer'); return; @@ -120,7 +120,16 @@ function wasmSelectAlloc() { let _ = jpw.select(ptr, path); } } finally { - jpw.dealloc_json(ptr); + jpw.deallocJson(ptr); + } +} + +function wasmSelectorClass() { + let selector = new jpw.Selector(); + for (var i = 0; i < iter; i++) { + selector.path(path); + selector.value(jsonStr); + let _ = selector.selectToStr(); } } diff --git a/build.sh b/build.sh index a229421..92a408a 100755 --- a/build.sh +++ b/build.sh @@ -54,11 +54,11 @@ echo echo __msg "wasm-pack" cd "${WASM}" && \ - wasm-pack build --target=nodejs --scope nodejs --out-dir nodejs_pkg && \ + wasm-pack build --release --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 && \ + wasm-pack build --release --target=browser --scope browser --out-dir browser_pkg && \ cd "${WASM_BROWSER_PKG}" && npm link echo diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js index fabb139..715084d 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, selector, select, 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_wrapper77, __wbindgen_closure_wrapper79, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_throw */ +/*! exports provided: allocJson, deallocJson, compile, selector, select, 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_rethrow, __wbindgen_closure_wrapper103, __wbindgen_closure_wrapper105, Selector, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __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__, \"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__, \"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_wrapper77\", function() { return __wbindgen_closure_wrapper77; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper79\", function() { return __wbindgen_closure_wrapper79; });\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* @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* @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_wrapper77(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_wrapper79(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(18);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(19);\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__, \"allocJson\", function() { return allocJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deallocJson\", function() { return deallocJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\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__, \"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_rethrow\", function() { return __wbindgen_rethrow; });\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_closure_wrapper105\", function() { return __wbindgen_closure_wrapper105; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\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 allocJson(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"allocJson\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction deallocJson(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"deallocJson\"](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* @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* @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_rethrow(idx) { throw takeObject(idx); }\n\nfunction __wbindgen_closure_wrapper103(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(19);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(20);\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_closure_wrapper105(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(18);\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 freeSelector(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass Selector {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelector(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n }\n /**\n * @param {string} arg0\n * @returns {void}\n */\n path(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n }\n /**\n * @param {any} arg0\n * @returns {void}\n */\n value(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {any}\n */\n selectToStr() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_selectToStr\"](this.ptr));\n }\n /**\n * @returns {any}\n */\n selectTo() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_selectTo\"](this.ptr));\n }\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?"); /***/ }), @@ -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, selector, select, testa, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_free, __wbg_function_table */ +/*! exports provided: memory, allocJson, deallocJson, compile, selector, select, __wbg_selector_free, selector_new, selector_path, selector_value, selector_selectToStr, selector_selectTo, testa, __wbindgen_malloc, __wbindgen_realloc, __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/215c5418dd8b4be64f60.module.wasm b/docs/215c5418dd8b4be64f60.module.wasm deleted file mode 100644 index 45a54e0..0000000 Binary files a/docs/215c5418dd8b4be64f60.module.wasm and /dev/null differ diff --git a/docs/68fa958468b8cdcb12e4.module.wasm b/docs/68fa958468b8cdcb12e4.module.wasm new file mode 100644 index 0000000..2b382a9 Binary files /dev/null and b/docs/68fa958468b8cdcb12e4.module.wasm differ diff --git a/docs/bench/0.bootstrap.js b/docs/bench/0.bootstrap.js index 2d534e6..345a611 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, selector, select, 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_wrapper77, __wbindgen_closure_wrapper79, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_throw */ +/*! exports provided: allocJson, deallocJson, compile, selector, select, 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_rethrow, __wbindgen_closure_wrapper103, __wbindgen_closure_wrapper105, Selector, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __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__, \"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__, \"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_wrapper77\", function() { return __wbindgen_closure_wrapper77; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper79\", function() { return __wbindgen_closure_wrapper79; });\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* @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* @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_wrapper77(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_wrapper79(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(18);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(19);\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__, \"allocJson\", function() { return allocJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deallocJson\", function() { return deallocJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compile\", function() { return compile; });\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__, \"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_rethrow\", function() { return __wbindgen_rethrow; });\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_closure_wrapper105\", function() { return __wbindgen_closure_wrapper105; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\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 allocJson(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"allocJson\"](addHeapObject(arg0));\n}\n\n/**\n* @param {number} arg0\n* @returns {boolean}\n*/\nfunction deallocJson(arg0) {\n return (_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"deallocJson\"](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* @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* @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_rethrow(idx) { throw takeObject(idx); }\n\nfunction __wbindgen_closure_wrapper103(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(19);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(20);\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_closure_wrapper105(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(17);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(18);\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 freeSelector(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selector_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass Selector {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelector(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_new\"]();\n }\n /**\n * @param {string} arg0\n * @returns {void}\n */\n path(arg0) {\n const ptr0 = passStringToWasm(arg0);\n const len0 = WASM_VECTOR_LEN;\n try {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_path\"](this.ptr, ptr0, len0);\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr0, len0 * 1);\n\n }\n\n }\n /**\n * @param {any} arg0\n * @returns {void}\n */\n value(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {any}\n */\n selectToStr() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_selectToStr\"](this.ptr));\n }\n /**\n * @returns {any}\n */\n selectTo() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_selectTo\"](this.ptr));\n }\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?"); /***/ }), @@ -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, selector, select, testa, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_free, __wbg_function_table */ +/*! exports provided: memory, allocJson, deallocJson, compile, selector, select, __wbg_selector_free, selector_new, selector_path, selector_value, selector_selectToStr, selector_selectTo, testa, __wbindgen_malloc, __wbindgen_realloc, __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 = 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?"); +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__[\"allocJson\"](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__[\"deallocJson\"](ptr)) {\n console.error('fail to dealloc');\n }\n });\n\n\n//# sourceURL=webpack:///./index.js?"); /***/ }) diff --git a/docs/bench/215c5418dd8b4be64f60.module.wasm b/docs/bench/215c5418dd8b4be64f60.module.wasm deleted file mode 100644 index 45a54e0..0000000 Binary files a/docs/bench/215c5418dd8b4be64f60.module.wasm and /dev/null differ diff --git a/docs/bench/68fa958468b8cdcb12e4.module.wasm b/docs/bench/68fa958468b8cdcb12e4.module.wasm new file mode 100644 index 0000000..2b382a9 Binary files /dev/null and b/docs/bench/68fa958468b8cdcb12e4.module.wasm differ diff --git a/docs/bench/bootstrap.js b/docs/bench/bootstrap.js index f5d7e56..16fdfd2 100644 --- a/docs/bench/bootstrap.js +++ b/docs/bench/bootstrap.js @@ -88,11 +88,14 @@ /******/ "__wbindgen_throw": function(p0i32,p1i32) { /******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_throw"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_closure_wrapper77": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper77"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_rethrow": function(p0i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper79": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper79"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper103": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper103"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbindgen_closure_wrapper105": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper105"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -192,7 +195,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"215c5418dd8b4be64f60"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"68fa958468b8cdcb12e4"}[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/bootstrap.js b/docs/bootstrap.js index cb9a046..d4f6d1e 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -88,11 +88,14 @@ /******/ "__wbindgen_throw": function(p0i32,p1i32) { /******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_throw"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_closure_wrapper77": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper77"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_rethrow": function(p0i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper79": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper79"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper103": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper103"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbindgen_closure_wrapper105": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../browser_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper105"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -192,7 +195,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"215c5418dd8b4be64f60"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../browser_pkg/jsonpath_wasm_bg.wasm":"68fa958468b8cdcb12e4"}[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/nodejs/package-lock.json b/nodejs/package-lock.json index c782ed6..721ef4e 100644 --- a/nodejs/package-lock.json +++ b/nodejs/package-lock.json @@ -1,6 +1,6 @@ { "name": "jsonpath-rs", - "version": "0.1.6", + "version": "0.1.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index b83380a..b000f38 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "jsonpath-wasm" +name = "jsonpath_wasm" version = "0.1.7" authors = ["Changseok Han "] description = "JsonPath Webassembly version compiled by Rust - Demo: https://freestrings.github.io/jsonpath" @@ -26,6 +26,9 @@ web-sys = { version = "0.3", features = ['console'] } [dev-dependencies] wasm-bindgen-test = "0.2" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +js-sys = "0.3" [profile.release] opt-level = "s" diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index ac126b7..bd22601 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -7,17 +7,19 @@ extern crate wasm_bindgen; extern crate web_sys; use std::collections::HashMap; +use std::ops::Deref; use std::result::Result; use std::sync::Mutex; -use std::ops::Deref; use cfg_if::cfg_if; -use wasm_bindgen::prelude::*; -use web_sys::console; - use jsonpath::filter::value_filter::JsonValueFilter; use jsonpath::parser::parser::{Node, NodeVisitor, Parser}; use jsonpath::ref_value::model::{RefValue, RefValueWrapper}; +use jsonpath::Selector as _Selector; +use wasm_bindgen::prelude::*; +use web_sys::console; + +use std::result; cfg_if! { if #[cfg(feature = "wee_alloc")] { @@ -85,8 +87,8 @@ lazy_static! { static ref CACHE_JSON_IDX: Mutex = Mutex::new(0); } -#[wasm_bindgen] -pub fn alloc_json(js_value: JsValue) -> usize { +#[wasm_bindgen(js_name = allocJson)] +pub extern fn alloc_json(js_value: JsValue) -> usize { match into_serde_json(&js_value) { Ok(json) => { let mut map = CACHE_JSON.lock().unwrap(); @@ -106,8 +108,8 @@ pub fn alloc_json(js_value: JsValue) -> usize { } } -#[wasm_bindgen] -pub fn dealloc_json(ptr: usize) -> bool { +#[wasm_bindgen(js_name = deallocJson)] +pub extern fn dealloc_json(ptr: usize) -> bool { let mut map = CACHE_JSON.lock().unwrap(); map.remove(&ptr).is_some() } @@ -167,5 +169,49 @@ pub fn select(js_value: JsValue, path: &str) -> JsValue { } } +/// +/// `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다. +/// +#[wasm_bindgen] +pub struct Selector { + selector: _Selector +} + +#[wasm_bindgen] +impl Selector { + + #[wasm_bindgen(constructor)] + pub fn new() -> Self { + Selector { selector: _Selector::new() } + } + + #[wasm_bindgen(catch)] + pub fn path(&mut self, path: &str) -> result::Result<(), JsValue> { + let _ = self.selector.path(path)?; + Ok(()) + } + + #[wasm_bindgen(catch)] + pub fn value(&mut self, value: JsValue) -> result::Result<(), JsValue> { + let ref_value = into_serde_json(&value)?; + let _ = self.selector.value(ref_value)?; + Ok(()) + } + + #[wasm_bindgen(catch, js_name = selectToStr)] + pub fn select_to_str(&mut self) -> result::Result { + let json_str = self.selector.select_to_str()?; + Ok(JsValue::from_str(&json_str)) + } + + #[wasm_bindgen(catch, js_name = selectTo)] + pub fn select_to(&mut self) -> result::Result { + let ref_value = self.selector.select_to::() + .map_err(|e| JsValue::from_str(&e))?; + Ok(JsValue::from_serde(&ref_value) + .map_err(|e| JsValue::from_str(&format!("{:?}", e)))?) + } +} + #[wasm_bindgen] pub fn testa() {} \ No newline at end of file diff --git a/wasm/tests/web.rs b/wasm/tests/web.rs index de5c1da..cf5fba9 100644 --- a/wasm/tests/web.rs +++ b/wasm/tests/web.rs @@ -1,13 +1,118 @@ -//! Test suite for the Web and headless browsers. - #![cfg(target_arch = "wasm32")] +extern crate core; +extern crate js_sys; +extern crate jsonpath_wasm as jsonpath; +#[macro_use] +extern crate serde_json; +extern crate wasm_bindgen; extern crate wasm_bindgen_test; + +use serde_json::Value; +use wasm_bindgen::*; use wasm_bindgen_test::*; wasm_bindgen_test_configure!(run_in_browser); -#[wasm_bindgen_test] -fn pass() { - assert_eq!(1 + 1, 2); +fn json_str() -> &'static str { + r#" + { + "store": { + "book": [ + { + "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 + } + ], + "bicycle": { + "color": "red", + "price": 19.95 + } + }, + "expensive": 10 + } + "# } + +fn target_json() -> Value { + json!([{ + "category" : "fiction", + "author" : "Herman Melville", + "title" : "Moby Dick", + "isbn" : "0-553-21311-3", + "price" : 8.99 + }]) +} + +#[wasm_bindgen_test] +fn select() { + let json: Value = jsonpath::select(JsValue::from_str(json_str()), "$..book[2]").into_serde().unwrap(); + assert_eq!(json, target_json()); +} + +#[wasm_bindgen_test] +fn compile() { + let js_value = jsonpath::compile("$..book[2]"); + assert_eq!(js_value.is_function(), true); + + let cb: &js_sys::Function = JsCast::unchecked_ref(js_value.as_ref()); + let cb_result: JsValue = cb.call1(&js_value, &JsValue::from_str(json_str())).unwrap(); + let json: Value = cb_result.into_serde().unwrap(); + assert_eq!(json, target_json()); +} + +#[wasm_bindgen_test] +fn selector() { + let js_value = jsonpath::selector(JsValue::from_str(json_str())); + assert_eq!(js_value.is_function(), true); + + let cb: &js_sys::Function = JsCast::unchecked_ref(js_value.as_ref()); + let cb_result: JsValue = cb.call1(&js_value, &JsValue::from_str("$..book[2]")).unwrap(); + let json: Value = cb_result.into_serde().unwrap(); + assert_eq!(json, target_json()); +} + +#[wasm_bindgen_test] +fn alloc_dealloc_json() { + let ptr = jsonpath::alloc_json(JsValue::from_str(json_str())); + assert_eq!(ptr > 0, true); + + let json: Value = jsonpath::select(JsValue::from_f64(ptr as f64), "$..book[2]").into_serde().unwrap(); + assert_eq!(json, target_json()); + + assert_eq!(jsonpath::dealloc_json(ptr), true); + + let err = jsonpath::select(JsValue::from_f64(ptr as f64), "$..book[2]").as_string().unwrap(); + assert_eq!(err, "Invalid pointer".to_string()); +} + +#[wasm_bindgen_test] +fn selector_struct() { + let mut selector = jsonpath::Selector::new(); + selector.path("$..book[2]").unwrap(); + selector.value(JsValue::from_str(json_str())).unwrap(); + let json: Value = selector.select_to().unwrap().into_serde().unwrap(); + assert_eq!(json, target_json()); +} \ No newline at end of file diff --git a/wasm/www_bench/index.js b/wasm/www_bench/index.js index e5e3fce..a6dcab9 100644 --- a/wasm/www_bench/index.js +++ b/wasm/www_bench/index.js @@ -61,7 +61,7 @@ let path = '$..book[?(@.price<30 && @.category=="fiction")]'; let template = jpw.compile(path); let selector = jpw.selector(json); -let ptr = jpw.alloc_json(json); +let ptr = jpw.allocJson(json); if(ptr == 0) console.error('invalid ptr'); let iterCount = 2000; @@ -83,7 +83,7 @@ run('jsonpath', iterCount, function() { jp.query(json, path) }) return run('jsonpath-wasm- select-alloc', iterCount, function() { jpw.select(ptr, path) }); }) .finally(function() { - if(!jpw.dealloc_json(ptr)) { + if(!jpw.deallocJson(ptr)) { console.error('fail to dealloc'); } });