diff --git a/Cargo.toml b/Cargo.toml index 3daccb5..afda4ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jsonpath_lib" -version = "0.2.0" +version = "0.2.2" authors = ["Changseok Han "] description = "It is JsonPath engine written in Rust. it provide a similar API interface in Webassembly and Javascript also. - Webassembly Demo: https://freestrings.github.io/jsonpath" diff --git a/docs/0.bootstrap.js b/docs/0.bootstrap.js index b181fc3..12547e0 100644 --- a/docs/0.bootstrap.js +++ b/docs/0.bootstrap.js @@ -4,11 +4,11 @@ /*!***********************************!*\ !*** ../all_pkg/jsonpath_wasm.js ***! \***********************************/ -/*! exports provided: __wbg_error_af8a3e3880eae1c8, compile, selector, select, deleteValue, replaceWith, __wbg_call_88d2a6153573084e, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_string_new, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_rethrow, __wbindgen_closure_wrapper22, __wbindgen_closure_wrapper24, SelectorMut, Selector, __wbindgen_throw */ +/*! exports provided: __wbg_error_8015049cb5adfca2, compile, selector, select, deleteValue, replaceWith, __wbg_call_972de3aa550c37b2, __wbindgen_string_new, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_rethrow, __wbindgen_throw, __wbindgen_closure_wrapper18, __wbindgen_closure_wrapper20, Selector, SelectorMut, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_af8a3e3880eae1c8\", function() { return __wbg_error_af8a3e3880eae1c8; });\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__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_88d2a6153573084e\", function() { return __wbg_call_88d2a6153573084e; });\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_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_debug_string\", function() { return __wbindgen_debug_string; });\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_wrapper22\", function() { return __wbindgen_closure_wrapper22; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper24\", function() { return __wbindgen_closure_wrapper24; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\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 */ \"../all_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nlet cachedTextDecoder = new TextDecoder('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\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbg_error_af8a3e3880eae1c8(arg0, arg1) {\n let varg0 = getStringFromWasm(arg0, arg1);\n console.error(varg0);\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\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\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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\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 {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* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction deleteValue(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__[\"deleteValue\"](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* @param {any} arg0\n* @param {string} arg1\n* @param {any} arg2\n* @returns {any}\n*/\nfunction replaceWith(arg0, arg1, arg2) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(arg0), ptr1, len1, addHeapObject(arg2)));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\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 handleError(exnptr, e) {\n const view = getUint32Memory();\n view[exnptr / 4] = 1;\n view[exnptr / 4 + 1] = addHeapObject(e);\n}\n\nfunction __wbg_call_88d2a6153573084e(arg0, arg1, arg2, exnptr) {\n try {\n return addHeapObject(getObject(arg0).call(getObject(arg1), getObject(arg2)));\n } catch (e) {\n handleError(exnptr, e);\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_string_new(p, l) {\n return addHeapObject(getStringFromWasm(p, l));\n}\n\nfunction __wbindgen_is_string(i) {\n return typeof(getObject(i)) === 'string' ? 1 : 0;\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\nfunction __wbindgen_debug_string(i, len_ptr) {\n const toString = Object.prototype.toString;\n const debug_str = val => {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debug_str(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debug_str(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\n ${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n};\nconst val = getObject(i);\nconst debug = debug_str(val);\nconst ptr = passStringToWasm(debug);\ngetUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\nreturn 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_rethrow(idx) { throw takeObject(idx); }\n\nfunction __wbindgen_closure_wrapper22(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(9);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(10);\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_wrapper24(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(7);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(8);\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 freeSelectorMut(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass SelectorMut {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelectorMut(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_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__[\"selectormut_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__[\"selectormut_value\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {void}\n */\n deleteValue() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {any} arg0\n * @returns {void}\n */\n replaceWith(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {any}\n */\n take() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr));\n }\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* lifetime 제약으로 Selector를 사용 할 수 없다.\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 select() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr));\n }\n}\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_8015049cb5adfca2\", function() { return __wbg_error_8015049cb5adfca2; });\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__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_972de3aa550c37b2\", function() { return __wbg_call_972de3aa550c37b2; });\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_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_debug_string\", function() { return __wbindgen_debug_string; });\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_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper18\", function() { return __wbindgen_closure_wrapper18; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper20\", function() { return __wbindgen_closure_wrapper20; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\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 import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../all_pkg/jsonpath_wasm_bg.wasm\");\n\n\nlet cachedTextDecoder = new TextDecoder('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\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbg_error_8015049cb5adfca2(arg0, arg1) {\n let varg0 = getStringFromWasm(arg0, arg1);\n console.error(varg0);\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet passStringToWasm;\nif (typeof cachedTextEncoder.encodeInto === 'function') {\n passStringToWasm = function(arg) {\n\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let offset = 0;\n {\n const mem = getUint8Memory();\n for (; offset < arg.length; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n }\n\n if (offset !== arg.length) {\n arg = arg.slice(offset);\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size = offset + arg.length * 3);\n const view = getUint8Memory().subarray(ptr + offset, ptr + size);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n }\n WASM_VECTOR_LEN = offset;\n return ptr;\n };\n} else {\n passStringToWasm = function(arg) {\n\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let offset = 0;\n {\n const mem = getUint8Memory();\n for (; offset < arg.length; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n }\n\n if (offset !== arg.length) {\n const buf = cachedTextEncoder.encode(arg.slice(offset));\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size = offset + buf.length);\n getUint8Memory().set(buf, ptr + offset);\n offset += buf.length;\n }\n WASM_VECTOR_LEN = offset;\n return ptr;\n };\n}\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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} path\n* @returns {any}\n*/\nfunction compile(path) {\n const ptr0 = passStringToWasm(path);\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\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} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value)));\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), 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* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), 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* @param {any} js_value\n* @param {string} path\n* @param {any} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr1, len1, addHeapObject(fun)));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\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 handleError(exnptr, e) {\n const view = getUint32Memory();\n view[exnptr / 4] = 1;\n view[exnptr / 4 + 1] = addHeapObject(e);\n}\n\nfunction __wbg_call_972de3aa550c37b2(arg0, arg1, arg2, exnptr) {\n try {\n return addHeapObject(getObject(arg0).call(getObject(arg1), getObject(arg2)));\n } catch (e) {\n handleError(exnptr, e);\n }\n}\n\nfunction __wbindgen_string_new(p, l) { return addHeapObject(getStringFromWasm(p, l)); }\n\nfunction __wbindgen_is_string(i) { return typeof(getObject(i)) === 'string' ? 1 : 0; }\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\nfunction __wbindgen_debug_string(i, len_ptr) {\n const debug_str =\n val => {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debug_str(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debug_str(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\n ${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n;\nconst toString = Object.prototype.toString;\nconst val = getObject(i);\nconst debug = debug_str(val);\nconst ptr = passStringToWasm(debug);\ngetUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\nreturn 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_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\nfunction __wbindgen_closure_wrapper18(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(9);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(10);\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 === 0) { d(this.a, b); this.a = 0; }\n\n }\n\n};\ncb.a = a;\ncb.cnt = 1;\nlet real = cb.bind(cb);\nreal.original = cb;\nreturn addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper20(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(7);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(8);\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 === 0) { d(this.a, b); this.a = 0; }\n\n }\n\n};\ncb.a = a;\ncb.cnt = 1;\nlet real = cb.bind(cb);\nreal.original = cb;\nreturn 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* lifetime 제약으로 Selector를 사용 할 수 없다.\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} path\n * @returns {void}\n */\n path(path) {\n const ptr0 = passStringToWasm(path);\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} value\n * @returns {void}\n */\n value(value) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr));\n }\n}\n\nfunction freeSelectorMut(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass SelectorMut {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelectorMut(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n }\n /**\n * @param {string} path\n * @returns {void}\n */\n path(path) {\n const ptr0 = passStringToWasm(path);\n const len0 = WASM_VECTOR_LEN;\n try {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_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} value\n * @returns {void}\n */\n value(value) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {void}\n */\n deleteValue() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {any} fun\n * @returns {void}\n */\n replaceWith(fun) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](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\n\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm.js?"); /***/ }), @@ -16,7 +16,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!****************************************!*\ !*** ../all_pkg/jsonpath_wasm_bg.wasm ***! \****************************************/ -/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, __wbindgen_malloc, __wbindgen_free, __wbg_function_table */ +/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, __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 */ \"../all_pkg/jsonpath_wasm.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm_bg.wasm?"); diff --git a/docs/7a2fe8020c3403dd4ce6.module.wasm b/docs/7a2fe8020c3403dd4ce6.module.wasm deleted file mode 100644 index 7d333be..0000000 Binary files a/docs/7a2fe8020c3403dd4ce6.module.wasm and /dev/null differ diff --git a/docs/936e94ea88fa30f5750a.module.wasm b/docs/936e94ea88fa30f5750a.module.wasm new file mode 100644 index 0000000..7fd477f Binary files /dev/null and b/docs/936e94ea88fa30f5750a.module.wasm differ diff --git a/docs/bench/0.bootstrap.js b/docs/bench/0.bootstrap.js index 98c8e94..f3300df 100644 --- a/docs/bench/0.bootstrap.js +++ b/docs/bench/0.bootstrap.js @@ -4,11 +4,11 @@ /*!***********************************!*\ !*** ../all_pkg/jsonpath_wasm.js ***! \***********************************/ -/*! exports provided: __wbg_error_af8a3e3880eae1c8, compile, selector, select, deleteValue, replaceWith, __wbg_call_88d2a6153573084e, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_string_new, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_rethrow, __wbindgen_closure_wrapper22, __wbindgen_closure_wrapper24, SelectorMut, Selector, __wbindgen_throw */ +/*! exports provided: __wbg_error_8015049cb5adfca2, compile, selector, select, deleteValue, replaceWith, __wbg_call_972de3aa550c37b2, __wbindgen_string_new, __wbindgen_is_string, __wbindgen_string_get, __wbindgen_debug_string, __wbindgen_cb_forget, __wbindgen_json_parse, __wbindgen_json_serialize, __wbindgen_rethrow, __wbindgen_throw, __wbindgen_closure_wrapper18, __wbindgen_closure_wrapper20, Selector, SelectorMut, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_af8a3e3880eae1c8\", function() { return __wbg_error_af8a3e3880eae1c8; });\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__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_88d2a6153573084e\", function() { return __wbg_call_88d2a6153573084e; });\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_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_debug_string\", function() { return __wbindgen_debug_string; });\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_wrapper22\", function() { return __wbindgen_closure_wrapper22; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper24\", function() { return __wbindgen_closure_wrapper24; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\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 */ \"../all_pkg/jsonpath_wasm_bg.wasm\");\n/* tslint:disable */\n\n\nlet cachedTextDecoder = new TextDecoder('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\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbg_error_af8a3e3880eae1c8(arg0, arg1) {\n let varg0 = getStringFromWasm(arg0, arg1);\n console.error(varg0);\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\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\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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\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 {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* @param {any} arg0\n* @param {string} arg1\n* @returns {any}\n*/\nfunction deleteValue(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__[\"deleteValue\"](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* @param {any} arg0\n* @param {string} arg1\n* @param {any} arg2\n* @returns {any}\n*/\nfunction replaceWith(arg0, arg1, arg2) {\n const ptr1 = passStringToWasm(arg1);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(arg0), ptr1, len1, addHeapObject(arg2)));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\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 handleError(exnptr, e) {\n const view = getUint32Memory();\n view[exnptr / 4] = 1;\n view[exnptr / 4 + 1] = addHeapObject(e);\n}\n\nfunction __wbg_call_88d2a6153573084e(arg0, arg1, arg2, exnptr) {\n try {\n return addHeapObject(getObject(arg0).call(getObject(arg1), getObject(arg2)));\n } catch (e) {\n handleError(exnptr, e);\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_string_new(p, l) {\n return addHeapObject(getStringFromWasm(p, l));\n}\n\nfunction __wbindgen_is_string(i) {\n return typeof(getObject(i)) === 'string' ? 1 : 0;\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\nfunction __wbindgen_debug_string(i, len_ptr) {\n const toString = Object.prototype.toString;\n const debug_str = val => {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debug_str(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debug_str(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\n ${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n};\nconst val = getObject(i);\nconst debug = debug_str(val);\nconst ptr = passStringToWasm(debug);\ngetUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\nreturn 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_rethrow(idx) { throw takeObject(idx); }\n\nfunction __wbindgen_closure_wrapper22(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(9);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(10);\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_wrapper24(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(7);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(8);\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 freeSelectorMut(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass SelectorMut {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelectorMut(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_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__[\"selectormut_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__[\"selectormut_value\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {void}\n */\n deleteValue() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {any} arg0\n * @returns {void}\n */\n replaceWith(arg0) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(arg0));\n }\n /**\n * @returns {any}\n */\n take() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](this.ptr));\n }\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* lifetime 제약으로 Selector를 사용 할 수 없다.\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 select() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr));\n }\n}\n\nfunction __wbindgen_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\n\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_error_8015049cb5adfca2\", function() { return __wbg_error_8015049cb5adfca2; });\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__, \"deleteValue\", function() { return deleteValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceWith\", function() { return replaceWith; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_972de3aa550c37b2\", function() { return __wbg_call_972de3aa550c37b2; });\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_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_debug_string\", function() { return __wbindgen_debug_string; });\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_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper18\", function() { return __wbindgen_closure_wrapper18; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper20\", function() { return __wbindgen_closure_wrapper20; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Selector\", function() { return Selector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SelectorMut\", function() { return SelectorMut; });\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 import */ var _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonpath_wasm_bg */ \"../all_pkg/jsonpath_wasm_bg.wasm\");\n\n\nlet cachedTextDecoder = new TextDecoder('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\nfunction getStringFromWasm(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));\n}\n\nfunction __wbg_error_8015049cb5adfca2(arg0, arg1) {\n let varg0 = getStringFromWasm(arg0, arg1);\n console.error(varg0);\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nlet passStringToWasm;\nif (typeof cachedTextEncoder.encodeInto === 'function') {\n passStringToWasm = function(arg) {\n\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let offset = 0;\n {\n const mem = getUint8Memory();\n for (; offset < arg.length; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n }\n\n if (offset !== arg.length) {\n arg = arg.slice(offset);\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size = offset + arg.length * 3);\n const view = getUint8Memory().subarray(ptr + offset, ptr + size);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n }\n WASM_VECTOR_LEN = offset;\n return ptr;\n };\n} else {\n passStringToWasm = function(arg) {\n\n\n let size = arg.length;\n let ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_malloc\"](size);\n let offset = 0;\n {\n const mem = getUint8Memory();\n for (; offset < arg.length; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n }\n\n if (offset !== arg.length) {\n const buf = cachedTextEncoder.encode(arg.slice(offset));\n ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_realloc\"](ptr, size, size = offset + buf.length);\n getUint8Memory().set(buf, ptr + offset);\n offset += buf.length;\n }\n WASM_VECTOR_LEN = offset;\n return ptr;\n };\n}\n\nconst heap = new Array(32);\n\nheap.fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\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} path\n* @returns {any}\n*/\nfunction compile(path) {\n const ptr0 = passStringToWasm(path);\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\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} js_value\n* @returns {any}\n*/\nfunction selector(js_value) {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector\"](addHeapObject(js_value)));\n}\n\n/**\n* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction select(js_value, path) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"select\"](addHeapObject(js_value), 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* @param {any} js_value\n* @param {string} path\n* @returns {any}\n*/\nfunction deleteValue(js_value, path) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"deleteValue\"](addHeapObject(js_value), 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* @param {any} js_value\n* @param {string} path\n* @param {any} fun\n* @returns {any}\n*/\nfunction replaceWith(js_value, path, fun) {\n const ptr1 = passStringToWasm(path);\n const len1 = WASM_VECTOR_LEN;\n try {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"replaceWith\"](addHeapObject(js_value), ptr1, len1, addHeapObject(fun)));\n\n } finally {\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_free\"](ptr1, len1 * 1);\n\n }\n\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 handleError(exnptr, e) {\n const view = getUint32Memory();\n view[exnptr / 4] = 1;\n view[exnptr / 4 + 1] = addHeapObject(e);\n}\n\nfunction __wbg_call_972de3aa550c37b2(arg0, arg1, arg2, exnptr) {\n try {\n return addHeapObject(getObject(arg0).call(getObject(arg1), getObject(arg2)));\n } catch (e) {\n handleError(exnptr, e);\n }\n}\n\nfunction __wbindgen_string_new(p, l) { return addHeapObject(getStringFromWasm(p, l)); }\n\nfunction __wbindgen_is_string(i) { return typeof(getObject(i)) === 'string' ? 1 : 0; }\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\nfunction __wbindgen_debug_string(i, len_ptr) {\n const debug_str =\n val => {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debug_str(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debug_str(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\n ${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n;\nconst toString = Object.prototype.toString;\nconst val = getObject(i);\nconst debug = debug_str(val);\nconst ptr = passStringToWasm(debug);\ngetUint32Memory()[len_ptr / 4] = WASM_VECTOR_LEN;\nreturn 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_throw(ptr, len) {\n throw new Error(getStringFromWasm(ptr, len));\n}\n\nfunction __wbindgen_closure_wrapper18(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(9);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(10);\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 === 0) { d(this.a, b); this.a = 0; }\n\n }\n\n};\ncb.a = a;\ncb.cnt = 1;\nlet real = cb.bind(cb);\nreal.original = cb;\nreturn addHeapObject(real);\n}\n\nfunction __wbindgen_closure_wrapper20(a, b, _ignored) {\n const f = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(7);\n const d = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_function_table\"].get(8);\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 === 0) { d(this.a, b); this.a = 0; }\n\n }\n\n};\ncb.a = a;\ncb.cnt = 1;\nlet real = cb.bind(cb);\nreal.original = cb;\nreturn 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* lifetime 제약으로 Selector를 사용 할 수 없다.\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} path\n * @returns {void}\n */\n path(path) {\n const ptr0 = passStringToWasm(path);\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} value\n * @returns {void}\n */\n value(value) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {any}\n */\n select() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selector_select\"](this.ptr));\n }\n}\n\nfunction freeSelectorMut(ptr) {\n\n _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_selectormut_free\"](ptr);\n}\n/**\n*\n* `wasm_bindgen` 제약으로 builder-pattern을 구사 할 수 없다.\n*\n*/\nclass SelectorMut {\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n freeSelectorMut(ptr);\n }\n\n /**\n * @returns {}\n */\n constructor() {\n this.ptr = _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_new\"]();\n }\n /**\n * @param {string} path\n * @returns {void}\n */\n path(path) {\n const ptr0 = passStringToWasm(path);\n const len0 = WASM_VECTOR_LEN;\n try {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_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} value\n * @returns {void}\n */\n value(value) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_value\"](this.ptr, addHeapObject(value));\n }\n /**\n * @returns {void}\n */\n deleteValue() {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_deleteValue\"](this.ptr);\n }\n /**\n * @param {any} fun\n * @returns {void}\n */\n replaceWith(fun) {\n return _jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_replaceWith\"](this.ptr, addHeapObject(fun));\n }\n /**\n * @returns {any}\n */\n take() {\n return takeObject(_jsonpath_wasm_bg__WEBPACK_IMPORTED_MODULE_0__[\"selectormut_take\"](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\n\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm.js?"); /***/ }), @@ -16,7 +16,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!****************************************!*\ !*** ../all_pkg/jsonpath_wasm_bg.wasm ***! \****************************************/ -/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, __wbindgen_malloc, __wbindgen_free, __wbg_function_table */ +/*! exports provided: memory, compile, selector, select, deleteValue, replaceWith, __wbg_selector_free, selector_new, selector_path, selector_value, selector_select, __wbg_selectormut_free, selectormut_new, selectormut_path, selectormut_value, selectormut_deleteValue, selectormut_replaceWith, selectormut_take, __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 */ \"../all_pkg/jsonpath_wasm.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../all_pkg/jsonpath_wasm_bg.wasm?"); diff --git a/docs/bench/7a2fe8020c3403dd4ce6.module.wasm b/docs/bench/7a2fe8020c3403dd4ce6.module.wasm deleted file mode 100644 index 7d333be..0000000 Binary files a/docs/bench/7a2fe8020c3403dd4ce6.module.wasm and /dev/null differ diff --git a/docs/bench/936e94ea88fa30f5750a.module.wasm b/docs/bench/936e94ea88fa30f5750a.module.wasm new file mode 100644 index 0000000..7fd477f Binary files /dev/null and b/docs/bench/936e94ea88fa30f5750a.module.wasm differ diff --git a/docs/bench/bootstrap.js b/docs/bench/bootstrap.js index e3ada36..4884f06 100644 --- a/docs/bench/bootstrap.js +++ b/docs/bench/bootstrap.js @@ -58,23 +58,26 @@ /******/ "__wbindgen_cb_forget": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_cb_forget"](p0i32); /******/ }, -/******/ "__wbg_error_af8a3e3880eae1c8": function(p0i32,p1i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_error_af8a3e3880eae1c8"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_object_drop_ref": function(p0i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32); -/******/ }, -/******/ "__wbindgen_string_new": function(p0i32,p1i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_new"](p0i32,p1i32); -/******/ }, /******/ "__wbindgen_json_parse": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); /******/ }, /******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); /******/ }, -/******/ "__wbg_call_88d2a6153573084e": function(p0i32,p1i32,p2i32,p3i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_call_88d2a6153573084e"](p0i32,p1i32,p2i32,p3i32); +/******/ "__wbg_error_8015049cb5adfca2": function(p0i32,p1i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_error_8015049cb5adfca2"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_object_drop_ref": function(p0i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32); +/******/ }, +/******/ "__wbindgen_object_clone_ref": function(p0i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32); +/******/ }, +/******/ "__wbindgen_string_new": function(p0i32,p1i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_new"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_call_972de3aa550c37b2": function(p0i32,p1i32,p2i32,p3i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_call_972de3aa550c37b2"](p0i32,p1i32,p2i32,p3i32); /******/ }, /******/ "__wbindgen_is_string": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_is_string"](p0i32); @@ -82,9 +85,6 @@ /******/ "__wbindgen_string_get": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_get"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_object_clone_ref": function(p0i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32); -/******/ }, /******/ "__wbindgen_debug_string": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_debug_string"](p0i32,p1i32); /******/ }, @@ -94,11 +94,11 @@ /******/ "__wbindgen_rethrow": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper22": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper22"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper18": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper18"](p0i32,p1i32,p2i32); /******/ }, -/******/ "__wbindgen_closure_wrapper24": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper24"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper20": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper20"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -198,7 +198,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../all_pkg/jsonpath_wasm_bg.wasm":"7a2fe8020c3403dd4ce6"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../all_pkg/jsonpath_wasm_bg.wasm":"936e94ea88fa30f5750a"}[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 d541c0e..39dac25 100644 --- a/docs/bootstrap.js +++ b/docs/bootstrap.js @@ -58,23 +58,26 @@ /******/ "__wbindgen_cb_forget": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_cb_forget"](p0i32); /******/ }, -/******/ "__wbg_error_af8a3e3880eae1c8": function(p0i32,p1i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_error_af8a3e3880eae1c8"](p0i32,p1i32); -/******/ }, -/******/ "__wbindgen_object_drop_ref": function(p0i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32); -/******/ }, -/******/ "__wbindgen_string_new": function(p0i32,p1i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_new"](p0i32,p1i32); -/******/ }, /******/ "__wbindgen_json_parse": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_json_parse"](p0i32,p1i32); /******/ }, /******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); /******/ }, -/******/ "__wbg_call_88d2a6153573084e": function(p0i32,p1i32,p2i32,p3i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_call_88d2a6153573084e"](p0i32,p1i32,p2i32,p3i32); +/******/ "__wbg_error_8015049cb5adfca2": function(p0i32,p1i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_error_8015049cb5adfca2"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_object_drop_ref": function(p0i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_drop_ref"](p0i32); +/******/ }, +/******/ "__wbindgen_object_clone_ref": function(p0i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32); +/******/ }, +/******/ "__wbindgen_string_new": function(p0i32,p1i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_new"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_call_972de3aa550c37b2": function(p0i32,p1i32,p2i32,p3i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbg_call_972de3aa550c37b2"](p0i32,p1i32,p2i32,p3i32); /******/ }, /******/ "__wbindgen_is_string": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_is_string"](p0i32); @@ -82,9 +85,6 @@ /******/ "__wbindgen_string_get": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_string_get"](p0i32,p1i32); /******/ }, -/******/ "__wbindgen_object_clone_ref": function(p0i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_object_clone_ref"](p0i32); -/******/ }, /******/ "__wbindgen_debug_string": function(p0i32,p1i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_debug_string"](p0i32,p1i32); /******/ }, @@ -94,11 +94,11 @@ /******/ "__wbindgen_rethrow": function(p0i32) { /******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_rethrow"](p0i32); /******/ }, -/******/ "__wbindgen_closure_wrapper22": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper22"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper18": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper18"](p0i32,p1i32,p2i32); /******/ }, -/******/ "__wbindgen_closure_wrapper24": function(p0i32,p1i32,p2i32) { -/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper24"](p0i32,p1i32,p2i32); +/******/ "__wbindgen_closure_wrapper20": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../all_pkg/jsonpath_wasm.js"].exports["__wbindgen_closure_wrapper20"](p0i32,p1i32,p2i32); /******/ } /******/ } /******/ }; @@ -198,7 +198,7 @@ /******/ promises.push(installedWasmModuleData); /******/ else { /******/ var importObject = wasmImportObjects[wasmModuleId](); -/******/ var req = fetch(__webpack_require__.p + "" + {"../all_pkg/jsonpath_wasm_bg.wasm":"7a2fe8020c3403dd4ce6"}[wasmModuleId] + ".module.wasm"); +/******/ var req = fetch(__webpack_require__.p + "" + {"../all_pkg/jsonpath_wasm_bg.wasm":"936e94ea88fa30f5750a"}[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/test/index.spec.js b/nodejs/test/index.spec.js index c948aae..eff1496 100644 --- a/nodejs/test/index.spec.js +++ b/nodejs/test/index.spec.js @@ -398,6 +398,93 @@ describe('filter test', () => { run (done, i, list[i]); }) } + + it('object equal', (done) => { + let selector = new jsonpath.Selector(); + selector.path('$..[?(@.a == 1)]'); + selector.value({ + 'a': 1, + 'b': {'a': 1}, + 'c': {'a': 1}, + }); + let result = selector.select(); + if (JSON.stringify(result) === JSON.stringify([{'a': 1}, {'a': 1}])) { + done(); + } + }); + + // it('escaped single quote notation', (done) => { + // let result = jsonpath.select({"single'quote":"value"}, "$['single\\'quote']"); + // if (JSON.stringify(result) === JSON.stringify(["value"])) { + // done(); + // } + // }); + // + // it('escaped double quote notation', (done) => { + // let result = jsonpath.select({"single\"quote":"value"}, "$['single\"quote']"); + // if (JSON.stringify(result) === JSON.stringify(["value"])) { + // done(); + // } + // }); + // + // it('array range with step - $[::]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[::]"); + // if (JSON.stringify(result) === JSON.stringify(["first", "second", "third", "forth", "fifth"])) { + // done(); + // } + // }); + // + // it('array range with step - $[::2]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[::2]"); + // if (JSON.stringify(result) === JSON.stringify(["first", "third", "fifth"])) { + // done(); + // } + // }); + // + // it('array range with step - $[1: :]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1: :]"); + // if (JSON.stringify(result) === JSON.stringify(["second", "third", "forth", "fifth"])) { + // done(); + // } + // }); + // + // it('array range with step - $[1:2:]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1:2:]"); + // if (JSON.stringify(result) === JSON.stringify(["second"])) { + // done(); + // } + // }); + // + // it('array range with step - $[1::2]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1::2]"); + // if (JSON.stringify(result) === JSON.stringify(["second", "forth"])) { + // done(); + // } + // }); + // + // it('array range with step - $[0:3:1]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[0:3:1]"); + // if (JSON.stringify(result) === JSON.stringify(["first", "second", "third"])) { + // done(); + // } + // }); + // + // it('array range with step - $[0:3:2]', (done) => { + // let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[0:3:2]"); + // if (JSON.stringify(result) === JSON.stringify(["first", "third"])) { + // done(); + // } + // }); + // + // it('array keys', (done) => { + // let result = jsonpath.select({ + // "key1": "value1", + // "key2": 2 + // }, "$['key1', 'key2']"); + // if (JSON.stringify(result) === JSON.stringify(["value1", 2])) { + // done(); + // } + // }); }); describe('SelectorMut test', () => { @@ -797,4 +884,13 @@ describe('README test', () => { done(); } }); -}); \ No newline at end of file +}); + +// describe('ISSUE test', () => { +// it('Results do not match other implementations #6', (done) => { +// let result = jsonpath.select(["first", "second"], "$[:]"); +// if (JSON.stringify(result) === JSON.stringify(["first", "second"])) { +// done(); +// } +// }); +// }); \ No newline at end of file diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 42ac385..f3b5c17 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -4,7 +4,7 @@ pub mod parser; #[cfg(test)] mod parser_tests { - use parser::parser::{ParseToken, Parser, NodeVisitor, FilterToken}; + use parser::parser::{FilterToken, NodeVisitor, Parser, ParseToken}; struct NodeVisitorTestImpl<'a> { input: &'a str, @@ -162,21 +162,63 @@ mod parser_tests { assert_eq!(run("$.a[10:]"), Ok(vec![ ParseToken::Absolute, ParseToken::In, ParseToken::Key("a".to_owned()), ParseToken::Array, - ParseToken::Range(Some(10), None), + ParseToken::Range(Some(10), None, 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::Range(None, Some(11), None), 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::Range(Some(-12), Some(13), None), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$[0:3:2]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(Some(0), Some(3), Some(2)), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$[:3:2]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, Some(3), Some(2)), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$[:]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$[::]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$[::2]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, Some(2)), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$["a", 'b']"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Keys(vec!["a".to_string(), "b".to_string()]), ParseToken::ArrayEof ])); @@ -263,6 +305,27 @@ mod parser_tests { ParseToken::ArrayEof ])); + assert_eq!(run("$[:]"), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Range(None, None, None), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$['single\'quote']"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key("single'quote".to_string()), + ParseToken::ArrayEof + ])); + + assert_eq!(run(r#"$["single\"quote"]"#), Ok(vec![ + ParseToken::Absolute, + ParseToken::Array, + ParseToken::Key(r#"single"quote"#.to_string()), + ParseToken::ArrayEof + ])); + match run("$[") { Ok(_) => panic!(), _ => {} @@ -331,6 +394,10 @@ mod parser_tests { mod tokenizer_tests { use parser::tokenizer::{Token, TokenError, Tokenizer, TokenReader}; + fn setup() { + let _ = env_logger::try_init(); + } + fn collect_token(input: &str) -> (Vec, Option) { let mut tokenizer = Tokenizer::new(input); let mut vec = vec![]; @@ -373,6 +440,8 @@ mod tokenizer_tests { #[test] fn token() { + setup(); + run("$.01.a", ( vec![ @@ -520,5 +589,26 @@ mod tokenizer_tests { ] , Some(TokenError::Eof) )); + + run("$[:]", (vec![ + Token::Absolute(0), + Token::OpenArray(1), + Token::Split(2), + Token::CloseArray(3) + ], Some(TokenError::Eof))); + + run(r#"$['single\'quote']"#, (vec![ + Token::Absolute(0), + Token::OpenArray(1), + Token::SingleQuoted(2, "single\'quote".to_string()), + Token::CloseArray(17) + ], Some(TokenError::Eof))); + + run(r#"$["double\"quote"]"#, (vec![ + Token::Absolute(0), + Token::OpenArray(1), + Token::DoubleQuoted(2, "double\"quote".to_string()), + Token::CloseArray(17) + ], Some(TokenError::Eof))); } } \ No newline at end of file diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 4c76103..3258dec 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use super::tokenizer::*; const DUMMY: usize = 0; @@ -5,17 +7,12 @@ const DUMMY: usize = 0; type ParseResult = Result; mod utils { - pub fn string_to_isize(string: &String, msg_handler: F) -> Result - where F: Fn() -> String { - match string.as_str().parse::() { - Ok(n) => Ok(n), - _ => Err(msg_handler()) - } - } + use std::str::FromStr; - pub fn string_to_f64(string: &String, msg_handler: F) -> Result - where F: Fn() -> String { - match string.as_str().parse::() { + pub fn string_to_num(string: &String, msg_handler: F) -> Result + where F: Fn() -> String + { + match string.as_str().parse() { Ok(n) => Ok(n), _ => Err(msg_handler()) } @@ -36,6 +33,7 @@ pub enum ParseToken { All, Key(String), + Keys(Vec), // [] Array, // 메타토큰 @@ -43,7 +41,7 @@ pub enum ParseToken { // ?( filter ) Filter(FilterToken), // 1 : 2 - Range(Option, Option), + Range(Option, Option, Option), // 1, 2, 3 Union(Vec), @@ -235,12 +233,39 @@ impl Parser { } } - fn array_quota_value(tokenizer: &mut TokenReader) -> ParseResult { - debug!("#array_quota_value"); + fn array_keys(tokenizer: &mut TokenReader, first_key: String) -> ParseResult { + let mut keys = vec![first_key]; + while tokenizer.peek_is(COMMA) { + Self::eat_token(tokenizer); + Self::eat_whitespace(tokenizer); + + if !(tokenizer.peek_is(SINGLE_QUOTE) || tokenizer.peek_is(DOUBLE_QUOTE)) { + return Err(tokenizer.err_msg()); + } + + match tokenizer.next_token() { + Ok(Token::SingleQuoted(_, val)) + | Ok(Token::DoubleQuoted(_, val)) => { + keys.push(val); + } + _ => {} + } + + Self::eat_whitespace(tokenizer); + } + + Ok(Self::node(ParseToken::Keys(keys))) + } + + fn array_quote_value(tokenizer: &mut TokenReader) -> ParseResult { + debug!("#array_quote_value"); match tokenizer.next_token() { - Ok(Token::SingleQuoted(_, val)) - | Ok(Token::DoubleQuoted(_, val)) => { - Ok(Self::node(ParseToken::Key(val))) + Ok(Token::SingleQuoted(_, val)) | Ok(Token::DoubleQuoted(_, val)) => { + if !tokenizer.peek_is(COMMA) { + Ok(Self::node(ParseToken::Key(val))) + } else { + Self::array_keys(tokenizer, val) + } } Err(TokenError::Eof) => { Ok(Self::node(ParseToken::Eof)) @@ -291,7 +316,7 @@ impl Parser { debug!("#array_value_key"); match tokenizer.next_token() { Ok(Token::Key(pos, ref val)) => { - let digit = utils::string_to_isize(val, || tokenizer.err_msg_with_pos(pos))?; + let digit = utils::string_to_num(val, || tokenizer.err_msg_with_pos(pos))?; Self::eat_whitespace(tokenizer); match tokenizer.peek_token() { @@ -325,7 +350,7 @@ impl Parser { } Ok(Token::DoubleQuoted(_, _)) | Ok(Token::SingleQuoted(_, _)) => { - Self::array_quota_value(tokenizer) + Self::array_quote_value(tokenizer) } Err(TokenError::Eof) => { Ok(Self::node(ParseToken::Eof)) @@ -348,7 +373,7 @@ impl Parser { Self::eat_whitespace(tokenizer); match tokenizer.next_token() { Ok(Token::Key(pos, ref val)) => { - let digit = utils::string_to_isize(val, || tokenizer.err_msg_with_pos(pos))?; + let digit = utils::string_to_num(val, || tokenizer.err_msg_with_pos(pos))?; values.push(digit); } _ => { @@ -359,26 +384,70 @@ impl Parser { Ok(Self::node(ParseToken::Union(values))) } - fn range_from(num: isize, tokenizer: &mut TokenReader) -> ParseResult { + fn range_value(tokenizer: &mut TokenReader) -> Result, String> { + if tokenizer.peek_is(SPLIT) { + Self::eat_token(tokenizer); + Self::eat_whitespace(tokenizer); + + if tokenizer.peek_is(KEY) { + match tokenizer.next_token() { + Ok(Token::Key(pos, str_step)) => { + match utils::string_to_num(&str_step, || tokenizer.err_msg_with_pos(pos)) { + Ok(step) => Ok(Some(step)), + Err(e) => Err(e) + } + } + _ => Ok(None) + } + } else { + Ok(None) + } + } else { + Ok(None) + } + } + + fn range_from(from: isize, tokenizer: &mut TokenReader) -> ParseResult { debug!("#range_from"); Self::eat_token(tokenizer); Self::eat_whitespace(tokenizer); + match tokenizer.peek_token() { Ok(Token::Key(_, _)) => { - Self::range(num, tokenizer) + Self::range(from, tokenizer) + } + Ok(Token::Split(_)) => { + match Self::range_value(tokenizer)? { + Some(step) => Ok(Self::node(ParseToken::Range(Some(from), None, Some(step)))), + _ => Ok(Self::node(ParseToken::Range(Some(from), None, None))) + } } _ => { - Ok(Self::node(ParseToken::Range(Some(num), None))) + Ok(Self::node(ParseToken::Range(Some(from), None, None))) } } } fn range_to(tokenizer: &mut TokenReader) -> ParseResult { debug!("#range_to"); + + match Self::range_value(tokenizer)? { + Some(step) => return Ok(Self::node(ParseToken::Range(None, None, Some(step)))), + _ => {} + } + + match tokenizer.peek_token() { + Ok(Token::CloseArray(_)) => { + return Ok(Self::node(ParseToken::Range(None, None, None))); + } + _ => {} + } + match tokenizer.next_token() { - Ok(Token::Key(pos, ref val)) => { - let digit = utils::string_to_isize(val, || tokenizer.err_msg_with_pos(pos))?; - Ok(Self::node(ParseToken::Range(None, Some(digit)))) + Ok(Token::Key(pos, ref to_str)) => { + let to = utils::string_to_num(to_str, || tokenizer.err_msg_with_pos(pos))?; + let step = Self::range_value(tokenizer)?; + Ok(Self::node(ParseToken::Range(None, Some(to), step))) } _ => { Err(tokenizer.err_msg()) @@ -386,12 +455,13 @@ impl Parser { } } - fn range(num: isize, tokenizer: &mut TokenReader) -> ParseResult { + fn range(from: isize, tokenizer: &mut TokenReader) -> ParseResult { debug!("#range"); match tokenizer.next_token() { - Ok(Token::Key(pos, ref val)) => { - let digit = utils::string_to_isize(val, || tokenizer.err_msg_with_pos(pos))?; - Ok(Self::node(ParseToken::Range(Some(num), Some(digit)))) + Ok(Token::Key(pos, ref str_to)) => { + let to = utils::string_to_num(str_to, || tokenizer.err_msg_with_pos(pos))?; + let step = Self::range_value(tokenizer)?; + Ok(Self::node(ParseToken::Range(Some(from), Some(to), step))) } _ => { Err(tokenizer.err_msg()) @@ -498,7 +568,7 @@ impl Parser { Self::term_num_float(val.as_str(), tokenizer) } _ => { - let number = utils::string_to_f64(&val, || tokenizer.err_msg_with_pos(pos))?; + let number = utils::string_to_num(&val, || tokenizer.err_msg_with_pos(pos))?; Ok(Self::node(ParseToken::Number(number))) } } @@ -521,7 +591,7 @@ impl Parser { f.push_str(&mut num); f.push('.'); f.push_str(frac.as_str()); - let number = utils::string_to_f64(&f, || tokenizer.err_msg_with_pos(pos))?; + let number = utils::string_to_num(&f, || tokenizer.err_msg_with_pos(pos))?; Ok(Self::node(ParseToken::Number(number))) } _ => { @@ -560,8 +630,8 @@ impl Parser { return Self::json_path(tokenizer); } - if tokenizer.peek_is(DOUBLE_QUOTA) || tokenizer.peek_is(SINGLE_QUOTA) { - return Self::array_quota_value(tokenizer); + if tokenizer.peek_is(DOUBLE_QUOTE) || tokenizer.peek_is(SINGLE_QUOTE) { + return Self::array_quote_value(tokenizer); } if tokenizer.peek_is(KEY) { @@ -652,7 +722,8 @@ pub trait NodeVisitor { | ParseToken::Relative | ParseToken::All | ParseToken::Key(_) - | ParseToken::Range(_, _) + | ParseToken::Keys(_) + | ParseToken::Range(_, _, _) | ParseToken::Union(_) | ParseToken::Number(_) | ParseToken::Bool(_) => { diff --git a/src/parser/tokenizer.rs b/src/parser/tokenizer.rs index 23a3ac7..638f166 100644 --- a/src/parser/tokenizer.rs +++ b/src/parser/tokenizer.rs @@ -15,8 +15,8 @@ pub const SPLIT: &'static str = ":"; pub const OPEN_PARENTHESIS: &'static str = "("; pub const CLOSE_PARENTHESIS: &'static str = ")"; pub const KEY: &'static str = "Key"; -pub const DOUBLE_QUOTA: &'static str = "\""; -pub const SINGLE_QUOTA: &'static str = "'"; +pub const DOUBLE_QUOTE: &'static str = "\""; +pub const SINGLE_QUOTE: &'static str = "'"; pub const EQUAL: &'static str = "=="; pub const GREATER_OR_EQUAL: &'static str = ">="; pub const GREATER: &'static str = ">"; @@ -44,8 +44,8 @@ const CH_PIPE: char = '|'; const CH_LITTLE: char = '<'; const CH_GREATER: char = '>'; const CH_EXCLAMATION: char = '!'; -const CH_SINGLE_QUOTA: char = '\''; -const CH_DOUBLE_QUOTA: char = '"'; +const CH_SINGLE_QUOTE: char = '\''; +const CH_DOUBLE_QUOTE: char = '"'; #[derive(Debug, Clone, PartialEq)] pub enum TokenError { @@ -109,8 +109,8 @@ impl Token { Token::OpenParenthesis(_) => OPEN_PARENTHESIS, Token::CloseParenthesis(_) => CLOSE_PARENTHESIS, Token::Key(_, _) => KEY, - Token::DoubleQuoted(_, _) => DOUBLE_QUOTA, - Token::SingleQuoted(_, _) => SINGLE_QUOTA, + Token::DoubleQuoted(_, _) => DOUBLE_QUOTE, + Token::SingleQuoted(_, _) => SINGLE_QUOTE, Token::Equal(_) => EQUAL, Token::GreaterOrEqual(_) => GREATER_OR_EQUAL, Token::Greater(_) => GREATER, @@ -147,20 +147,36 @@ pub struct Tokenizer<'a> { impl<'a> Tokenizer<'a> { pub fn new(input: &'a str) -> Self { + trace!("input: {}", input); Tokenizer { input: PathReader::new(input), } } - 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)?; + fn quote(&mut self, ch: char) -> Result { + let (_, mut val) = self.input.take_while(|c| *c != ch).map_err(to_token_error)?; + + if let Some('\\') = val.chars().last() { + self.input.next_char().map_err(to_token_error)?; + let _ = val.pop(); + let (_, mut val_remain) = self.input.take_while(|c| *c != ch).map_err(to_token_error)?; + self.input.next_char().map_err(to_token_error)?; + val.push(ch); + val.push_str(val_remain.as_str()); + } else { + self.input.next_char().map_err(to_token_error)?; + } + + Ok(val) + } + + fn single_quote(&mut self, pos: usize, ch: char) -> Result { + let val = self.quote(ch)?; Ok(Token::SingleQuoted(pos, val)) } - 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)?; + fn double_quote(&mut self, pos: usize, ch: char) -> Result { + let val = self.quote(ch)?; Ok(Token::DoubleQuoted(pos, val)) } @@ -259,8 +275,8 @@ impl<'a> Tokenizer<'a> { Some(t) => Ok(t), None => { match ch { - CH_SINGLE_QUOTA => self.single_quota(pos, ch), - CH_DOUBLE_QUOTA => self.double_quota(pos, ch), + CH_SINGLE_QUOTE => self.single_quote(pos, ch), + CH_DOUBLE_QUOTE => self.double_quote(pos, ch), CH_EQUAL => self.equal(pos, ch), CH_GREATER => self.greater(pos, ch), CH_LITTLE => self.little(pos, ch), diff --git a/src/select/mod.rs b/src/select/mod.rs index f2b19ea..ffce0d7 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -693,20 +693,22 @@ impl<'a, 'b> Selector<'a, 'b> { debug!("next_from_current_with_num : {:?}, {:?}", &index, self.current); } - fn next_from_current_with_str(&mut self, key: &str) { - fn _collect<'a>(v: &'a Value, tmp: &mut Vec<&'a Value>, key: &str, visited: &mut HashSet<*const Value>) { + fn next_from_current_with_str(&mut self, keys: &Vec) { + fn _collect<'a>(v: &'a Value, tmp: &mut Vec<&'a Value>, keys: &Vec, visited: &mut HashSet<*const Value>) { match v { Value::Object(map) => { - if let Some(v) = map.get(key) { - let ptr = v as *const Value; - if !visited.contains(&ptr) { - visited.insert(ptr); - tmp.push(v) + for key in keys { + if let Some(v) = map.get(key) { + let ptr = v as *const Value; + if !visited.contains(&ptr) { + visited.insert(ptr); + tmp.push(v) + } } } } Value::Array(vec) => for v in vec { - _collect(v, tmp, key, visited); + _collect(v, tmp, keys, visited); } _ => {} } @@ -716,12 +718,12 @@ impl<'a, 'b> Selector<'a, 'b> { let mut tmp = Vec::new(); let mut visited = HashSet::new(); for c in current { - _collect(c, &mut tmp, key, &mut visited); + _collect(c, &mut tmp, keys, &mut visited); } self.current = Some(tmp); } - debug!("next_from_current_with_str : {}, {:?}", key, self.current); + debug!("next_from_current_with_str : {:?}, {:?}", keys, self.current); } fn next_all_from_current(&mut self) { @@ -838,7 +840,7 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { self.next_from_current_with_num(to_f64(&n)); } ExprTerm::String(key) => { - self.next_from_current_with_str(&key); + self.next_from_current_with_str(&vec![key]); } ExprTerm::Json(_, v) => { if v.is_empty() { @@ -886,7 +888,7 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { self.all_from_current_with_str(key.as_str()) } ParseToken::In => { - self.next_from_current_with_str(key.as_str()) + self.next_from_current_with_str(&vec![key.clone()]) } _ => {} } @@ -905,6 +907,17 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { _ => {} } } + ParseToken::Keys(keys) => { + if !self.terms.is_empty() { + unimplemented!("keys in filter"); + } + + if let Some(ParseToken::Array) = self.tokens.pop() { + self.next_from_current_with_str(keys); + } else { + unreachable!(); + } + } ParseToken::Number(v) => { self.terms.push(Some(ExprTerm::Number(Number::from_f64(*v).unwrap()))); } @@ -933,7 +946,7 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { unreachable!() } } - ParseToken::Range(from, to) => { + ParseToken::Range(from, to, step) => { if !self.terms.is_empty() { unimplemented!("range syntax in filter"); } @@ -955,7 +968,10 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { vec.len() }; - for i in from..to { + for i in (from..to).step_by(match step { + Some(step) => *step, + _ => 1 + }) { if let Some(v) = vec.get(i) { tmp.push(v); } diff --git a/tests/filter.rs b/tests/filter.rs index 101ec8e..9193ce4 100644 --- a/tests/filter.rs +++ b/tests/filter.rs @@ -40,6 +40,10 @@ fn array() { select_and_then_compare("$['school']['friends'][0].['name']", read_json("./benches/data_obj.json"), json!([ "Millicent Norman" ])); + + select_and_then_compare(r#"$.["eyeColor", "name"]"#, read_json("./benches/data_obj.json"), json!([ + "blue", "Leonor Herman" + ])); } #[test] @@ -349,4 +353,26 @@ fn filer_same_obj() { {"a": 1}, {"a": 1} ])); +} + +#[test] +fn range() { + setup(); + + select_and_then_compare("$[:]", json!(["first", "second"]), json!(["first", "second"])); + select_and_then_compare("$[::]", json!(["first", "second", "third", "forth", "fifth"]), json!(["first", "second", "third", "forth", "fifth"])); + select_and_then_compare("$[::2]", json!(["first", "second", "third", "forth", "fifth"]), json!(["first", "third", "fifth"])); + select_and_then_compare("$[1: :]", json!(["first", "second", "third", "forth", "fifth"]), json!(["second", "third", "forth", "fifth"])); + select_and_then_compare("$[1:2:]", json!(["first", "second", "third", "forth", "fifth"]), json!(["second"])); + select_and_then_compare("$[1::2]", json!(["first", "second", "third", "forth", "fifth"]), json!(["second", "forth"])); + select_and_then_compare("$[0:3:1]", json!(["first", "second", "third", "forth", "fifth"]), json!(["first", "second", "third"])); + select_and_then_compare("$[0:3:2]", json!(["first", "second", "third", "forth", "fifth"]), json!(["first", "third"])); +} + +#[test] +fn quote() { + setup(); + + select_and_then_compare(r#"$['single\'quote']"#, json!({"single'quote":"value"}), json!(["value"])); + select_and_then_compare(r#"$["double\"quote"]"#, json!({"double\"quote":"value"}), json!(["value"])); } \ No newline at end of file diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index c089ee4..5517b21 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jsonpath-wasm" -version = "0.2.1" +version = "0.2.2" authors = ["Changseok Han "] description = "It is Webassembly version of jsonpath_lib that is JsonPath engine written in Rust - Demo: https://freestrings.github.io/jsonpath" keywords = ["jsonpath", "json", "webassembly", "parsing", "rust"] diff --git a/wasm/tests/test/index.spec.js b/wasm/tests/test/index.spec.js index 97d7dc7..10e960c 100644 --- a/wasm/tests/test/index.spec.js +++ b/wasm/tests/test/index.spec.js @@ -412,6 +412,79 @@ describe('filter test', () => { done(); } }); + + it('escaped single quote notation', (done) => { + let result = jsonpath.select({"single'quote":"value"}, "$['single\\'quote']"); + if (JSON.stringify(result) === JSON.stringify(["value"])) { + done(); + } + }); + + it('escaped double quote notation', (done) => { + let result = jsonpath.select({"single\"quote":"value"}, "$['single\"quote']"); + if (JSON.stringify(result) === JSON.stringify(["value"])) { + done(); + } + }); + + it('array range with step - $[::]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[::]"); + if (JSON.stringify(result) === JSON.stringify(["first", "second", "third", "forth", "fifth"])) { + done(); + } + }); + + it('array range with step - $[::2]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[::2]"); + if (JSON.stringify(result) === JSON.stringify(["first", "third", "fifth"])) { + done(); + } + }); + + it('array range with step - $[1: :]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1: :]"); + if (JSON.stringify(result) === JSON.stringify(["second", "third", "forth", "fifth"])) { + done(); + } + }); + + it('array range with step - $[1:2:]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1:2:]"); + if (JSON.stringify(result) === JSON.stringify(["second"])) { + done(); + } + }); + + it('array range with step - $[1::2]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[1::2]"); + if (JSON.stringify(result) === JSON.stringify(["second", "forth"])) { + done(); + } + }); + + it('array range with step - $[0:3:1]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[0:3:1]"); + if (JSON.stringify(result) === JSON.stringify(["first", "second", "third"])) { + done(); + } + }); + + it('array range with step - $[0:3:2]', (done) => { + let result = jsonpath.select(["first", "second", "third", "forth", "fifth"], "$[0:3:2]"); + if (JSON.stringify(result) === JSON.stringify(["first", "third"])) { + done(); + } + }); + + it('array keys', (done) => { + let result = jsonpath.select({ + "key1": "value1", + "key2": 2 + }, "$['key1', 'key2']"); + if (JSON.stringify(result) === JSON.stringify(["value1", 2])) { + done(); + } + }); }); describe('SelectorMut test', () => { @@ -821,4 +894,13 @@ describe('README test', () => { done(); } }); +}); + +describe('ISSUE test', () => { + it('Results do not match other implementations #6', (done) => { + let result = jsonpath.select(["first", "second"], "$[:]"); + if (JSON.stringify(result) === JSON.stringify(["first", "second"])) { + done(); + } + }); }); \ No newline at end of file