@fluixi/utils 1.0.0-alpha.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/lib/array/advanced.cjs +1 -0
- package/dist/lib/array/advanced.d.ts +1116 -0
- package/dist/lib/array/advanced.d.ts.map +1 -0
- package/dist/lib/array/advanced.js +2429 -0
- package/dist/lib/array/advanced.mjs +1 -0
- package/dist/lib/array/array.cjs +1 -0
- package/dist/lib/array/array.d.ts +6 -0
- package/dist/lib/array/array.d.ts.map +1 -0
- package/dist/lib/array/array.js +31 -0
- package/dist/lib/array/array.mjs +1 -0
- package/dist/lib/array/index.cjs +1 -0
- package/dist/lib/array/index.d.ts +4 -0
- package/dist/lib/array/index.d.ts.map +1 -0
- package/dist/lib/array/index.js +3 -0
- package/dist/lib/array/index.mjs +1 -0
- package/dist/lib/array/utils.cjs +1 -0
- package/dist/lib/array/utils.d.ts +100 -0
- package/dist/lib/array/utils.d.ts.map +1 -0
- package/dist/lib/array/utils.js +165 -0
- package/dist/lib/array/utils.mjs +1 -0
- package/dist/lib/color/color.cjs +1 -0
- package/dist/lib/color/color.d.ts +366 -0
- package/dist/lib/color/color.d.ts.map +1 -0
- package/dist/lib/color/color.js +722 -0
- package/dist/lib/color/color.mjs +1 -0
- package/dist/lib/color/constants.cjs +1 -0
- package/dist/lib/color/constants.d.ts +361 -0
- package/dist/lib/color/constants.d.ts.map +1 -0
- package/dist/lib/color/constants.js +358 -0
- package/dist/lib/color/constants.mjs +1 -0
- package/dist/lib/color/conversions.cjs +1 -0
- package/dist/lib/color/conversions.d.ts +166 -0
- package/dist/lib/color/conversions.d.ts.map +1 -0
- package/dist/lib/color/conversions.js +766 -0
- package/dist/lib/color/conversions.mjs +1 -0
- package/dist/lib/color/helpers.cjs +1 -0
- package/dist/lib/color/helpers.d.ts +75 -0
- package/dist/lib/color/helpers.d.ts.map +1 -0
- package/dist/lib/color/helpers.js +419 -0
- package/dist/lib/color/helpers.mjs +1 -0
- package/dist/lib/color/index.cjs +1 -0
- package/dist/lib/color/index.d.ts +12 -0
- package/dist/lib/color/index.d.ts.map +1 -0
- package/dist/lib/color/index.js +15 -0
- package/dist/lib/color/index.mjs +1 -0
- package/dist/lib/color/types.cjs +1 -0
- package/dist/lib/color/types.d.ts +179 -0
- package/dist/lib/color/types.d.ts.map +1 -0
- package/dist/lib/color/types.js +1 -0
- package/dist/lib/color/types.mjs +0 -0
- package/dist/lib/color/utils.cjs +1 -0
- package/dist/lib/color/utils.d.ts +199 -0
- package/dist/lib/color/utils.d.ts.map +1 -0
- package/dist/lib/color/utils.js +858 -0
- package/dist/lib/color/utils.mjs +1 -0
- package/dist/lib/compare/comparators.cjs +1 -0
- package/dist/lib/compare/comparators.d.ts +65 -0
- package/dist/lib/compare/comparators.d.ts.map +1 -0
- package/dist/lib/compare/comparators.js +210 -0
- package/dist/lib/compare/comparators.mjs +1 -0
- package/dist/lib/compare/index.cjs +1 -0
- package/dist/lib/compare/index.d.ts +2 -0
- package/dist/lib/compare/index.d.ts.map +1 -0
- package/dist/lib/compare/index.js +1 -0
- package/dist/lib/compare/index.mjs +1 -0
- package/dist/lib/crypto/hash.cjs +1 -0
- package/dist/lib/crypto/hash.d.ts +6 -0
- package/dist/lib/crypto/hash.d.ts.map +1 -0
- package/dist/lib/crypto/hash.js +53 -0
- package/dist/lib/crypto/hash.mjs +1 -0
- package/dist/lib/crypto/index.cjs +1 -0
- package/dist/lib/crypto/index.d.ts +2 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +1 -0
- package/dist/lib/crypto/index.mjs +1 -0
- package/dist/lib/dom/events.cjs +1 -0
- package/dist/lib/dom/events.d.ts +159 -0
- package/dist/lib/dom/events.d.ts.map +1 -0
- package/dist/lib/dom/events.js +50 -0
- package/dist/lib/dom/events.mjs +1 -0
- package/dist/lib/dom/index.cjs +1 -0
- package/dist/lib/dom/index.d.ts +3 -0
- package/dist/lib/dom/index.d.ts.map +1 -0
- package/dist/lib/dom/index.js +2 -0
- package/dist/lib/dom/index.mjs +1 -0
- package/dist/lib/dom/utils.cjs +1 -0
- package/dist/lib/dom/utils.d.ts +6 -0
- package/dist/lib/dom/utils.d.ts.map +1 -0
- package/dist/lib/dom/utils.js +37 -0
- package/dist/lib/dom/utils.mjs +1 -0
- package/dist/lib/functions/functions.cjs +1 -0
- package/dist/lib/functions/functions.d.ts +329 -0
- package/dist/lib/functions/functions.d.ts.map +1 -0
- package/dist/lib/functions/functions.js +585 -0
- package/dist/lib/functions/functions.mjs +1 -0
- package/dist/lib/functions/index.cjs +1 -0
- package/dist/lib/functions/index.d.ts +3 -0
- package/dist/lib/functions/index.d.ts.map +1 -0
- package/dist/lib/functions/index.js +1 -0
- package/dist/lib/functions/index.mjs +1 -0
- package/dist/lib/functions/types.cjs +1 -0
- package/dist/lib/functions/types.d.ts +2 -0
- package/dist/lib/functions/types.d.ts.map +1 -0
- package/dist/lib/functions/types.js +1 -0
- package/dist/lib/functions/types.mjs +0 -0
- package/dist/lib/helpers.cjs +1 -0
- package/dist/lib/helpers.d.ts +13 -0
- package/dist/lib/helpers.d.ts.map +1 -0
- package/dist/lib/helpers.js +66 -0
- package/dist/lib/helpers.mjs +1 -0
- package/dist/lib/index.cjs +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.mjs +1 -0
- package/dist/lib/maths/constants.cjs +1 -0
- package/dist/lib/maths/constants.d.ts +84 -0
- package/dist/lib/maths/constants.d.ts.map +1 -0
- package/dist/lib/maths/constants.js +79 -0
- package/dist/lib/maths/constants.mjs +1 -0
- package/dist/lib/maths/fn/advanced.cjs +1 -0
- package/dist/lib/maths/fn/advanced.d.ts +149 -0
- package/dist/lib/maths/fn/advanced.d.ts.map +1 -0
- package/dist/lib/maths/fn/advanced.js +264 -0
- package/dist/lib/maths/fn/advanced.mjs +1 -0
- package/dist/lib/maths/fn/basic.cjs +1 -0
- package/dist/lib/maths/fn/basic.d.ts +182 -0
- package/dist/lib/maths/fn/basic.d.ts.map +1 -0
- package/dist/lib/maths/fn/basic.js +343 -0
- package/dist/lib/maths/fn/basic.mjs +1 -0
- package/dist/lib/maths/fn/complex.cjs +1 -0
- package/dist/lib/maths/fn/complex.d.ts +153 -0
- package/dist/lib/maths/fn/complex.d.ts.map +1 -0
- package/dist/lib/maths/fn/complex.js +383 -0
- package/dist/lib/maths/fn/complex.mjs +1 -0
- package/dist/lib/maths/fn/index.cjs +1 -0
- package/dist/lib/maths/fn/index.d.ts +10 -0
- package/dist/lib/maths/fn/index.d.ts.map +1 -0
- package/dist/lib/maths/fn/index.js +9 -0
- package/dist/lib/maths/fn/index.mjs +1 -0
- package/dist/lib/maths/fn/trigo.cjs +1 -0
- package/dist/lib/maths/fn/trigo.d.ts +147 -0
- package/dist/lib/maths/fn/trigo.d.ts.map +1 -0
- package/dist/lib/maths/fn/trigo.js +227 -0
- package/dist/lib/maths/fn/trigo.mjs +1 -0
- package/dist/lib/maths/fn/vector.cjs +1 -0
- package/dist/lib/maths/fn/vector.d.ts +512 -0
- package/dist/lib/maths/fn/vector.d.ts.map +1 -0
- package/dist/lib/maths/fn/vector.js +1136 -0
- package/dist/lib/maths/fn/vector.mjs +1 -0
- package/dist/lib/maths/formatter.cjs +1 -0
- package/dist/lib/maths/formatter.d.ts +35 -0
- package/dist/lib/maths/formatter.d.ts.map +1 -0
- package/dist/lib/maths/formatter.js +56 -0
- package/dist/lib/maths/formatter.mjs +1 -0
- package/dist/lib/maths/guards.cjs +1 -0
- package/dist/lib/maths/guards.d.ts +166 -0
- package/dist/lib/maths/guards.d.ts.map +1 -0
- package/dist/lib/maths/guards.js +315 -0
- package/dist/lib/maths/guards.mjs +1 -0
- package/dist/lib/maths/index.cjs +1 -0
- package/dist/lib/maths/index.d.ts +24 -0
- package/dist/lib/maths/index.d.ts.map +1 -0
- package/dist/lib/maths/index.js +29 -0
- package/dist/lib/maths/index.mjs +1 -0
- package/dist/lib/maths/parser.cjs +1 -0
- package/dist/lib/maths/parser.d.ts +20 -0
- package/dist/lib/maths/parser.d.ts.map +1 -0
- package/dist/lib/maths/parser.js +78 -0
- package/dist/lib/maths/parser.mjs +1 -0
- package/dist/lib/maths/random.cjs +1 -0
- package/dist/lib/maths/random.d.ts +27 -0
- package/dist/lib/maths/random.d.ts.map +1 -0
- package/dist/lib/maths/random.js +49 -0
- package/dist/lib/maths/random.mjs +1 -0
- package/dist/lib/maths/types/advanced.cjs +1 -0
- package/dist/lib/maths/types/advanced.d.ts +357 -0
- package/dist/lib/maths/types/advanced.d.ts.map +1 -0
- package/dist/lib/maths/types/advanced.js +5 -0
- package/dist/lib/maths/types/advanced.mjs +0 -0
- package/dist/lib/maths/types/basic.cjs +1 -0
- package/dist/lib/maths/types/basic.d.ts +95 -0
- package/dist/lib/maths/types/basic.d.ts.map +1 -0
- package/dist/lib/maths/types/basic.js +5 -0
- package/dist/lib/maths/types/basic.mjs +0 -0
- package/dist/lib/maths/types/index.cjs +1 -0
- package/dist/lib/maths/types/index.d.ts +4 -0
- package/dist/lib/maths/types/index.d.ts.map +1 -0
- package/dist/lib/maths/types/index.js +3 -0
- package/dist/lib/maths/types/index.mjs +0 -0
- package/dist/lib/maths/types/negative.cjs +1 -0
- package/dist/lib/maths/types/negative.d.ts +51 -0
- package/dist/lib/maths/types/negative.d.ts.map +1 -0
- package/dist/lib/maths/types/negative.js +5 -0
- package/dist/lib/maths/types/negative.mjs +0 -0
- package/dist/lib/maths/types/operations.cjs +1 -0
- package/dist/lib/maths/types/operations.d.ts +188 -0
- package/dist/lib/maths/types/operations.d.ts.map +1 -0
- package/dist/lib/maths/types/operations.js +6 -0
- package/dist/lib/maths/types/operations.mjs +0 -0
- package/dist/lib/object/clone.cjs +1 -0
- package/dist/lib/object/clone.d.ts +46 -0
- package/dist/lib/object/clone.d.ts.map +1 -0
- package/dist/lib/object/clone.js +104 -0
- package/dist/lib/object/clone.mjs +1 -0
- package/dist/lib/object/diff.cjs +1 -0
- package/dist/lib/object/diff.d.ts +203 -0
- package/dist/lib/object/diff.d.ts.map +1 -0
- package/dist/lib/object/diff.js +805 -0
- package/dist/lib/object/diff.mjs +1 -0
- package/dist/lib/object/getter-setter.cjs +1 -0
- package/dist/lib/object/getter-setter.d.ts +361 -0
- package/dist/lib/object/getter-setter.d.ts.map +1 -0
- package/dist/lib/object/getter-setter.js +1771 -0
- package/dist/lib/object/getter-setter.mjs +1 -0
- package/dist/lib/object/index.cjs +6 -0
- package/dist/lib/object/index.d.ts +13 -0
- package/dist/lib/object/index.d.ts.map +1 -0
- package/dist/lib/object/index.js +12 -0
- package/dist/lib/object/index.mjs +6 -0
- package/dist/lib/object/merge.cjs +1 -0
- package/dist/lib/object/merge.d.ts +93 -0
- package/dist/lib/object/merge.d.ts.map +1 -0
- package/dist/lib/object/merge.js +474 -0
- package/dist/lib/object/merge.mjs +1 -0
- package/dist/lib/object/object.cjs +1 -0
- package/dist/lib/object/object.d.ts +128 -0
- package/dist/lib/object/object.d.ts.map +1 -0
- package/dist/lib/object/object.js +432 -0
- package/dist/lib/object/object.mjs +1 -0
- package/dist/lib/object/omit.cjs +1 -0
- package/dist/lib/object/omit.d.ts +351 -0
- package/dist/lib/object/omit.d.ts.map +1 -0
- package/dist/lib/object/omit.js +656 -0
- package/dist/lib/object/omit.mjs +1 -0
- package/dist/lib/object/reconcile.cjs +1 -0
- package/dist/lib/object/reconcile.d.ts +7 -0
- package/dist/lib/object/reconcile.d.ts.map +1 -0
- package/dist/lib/object/reconcile.js +122 -0
- package/dist/lib/object/reconcile.mjs +1 -0
- package/dist/lib/object/selector.cjs +1 -0
- package/dist/lib/object/selector.d.ts +50 -0
- package/dist/lib/object/selector.d.ts.map +1 -0
- package/dist/lib/object/selector.js +371 -0
- package/dist/lib/object/selector.mjs +1 -0
- package/dist/lib/object/sort.cjs +1 -0
- package/dist/lib/object/sort.d.ts +149 -0
- package/dist/lib/object/sort.d.ts.map +1 -0
- package/dist/lib/object/sort.js +298 -0
- package/dist/lib/object/sort.mjs +1 -0
- package/dist/lib/object/transform.cjs +1 -0
- package/dist/lib/object/transform.d.ts +620 -0
- package/dist/lib/object/transform.d.ts.map +1 -0
- package/dist/lib/object/transform.js +1058 -0
- package/dist/lib/object/transform.mjs +1 -0
- package/dist/lib/object/types.cjs +1 -0
- package/dist/lib/object/types.d.ts +250 -0
- package/dist/lib/object/types.d.ts.map +1 -0
- package/dist/lib/object/types.js +1 -0
- package/dist/lib/object/types.mjs +0 -0
- package/dist/lib/object/utils.cjs +6 -0
- package/dist/lib/object/utils.d.ts +165 -0
- package/dist/lib/object/utils.d.ts.map +1 -0
- package/dist/lib/object/utils.js +444 -0
- package/dist/lib/object/utils.mjs +6 -0
- package/dist/lib/primitive/boolean/boolean.cjs +1 -0
- package/dist/lib/primitive/boolean/boolean.d.ts +276 -0
- package/dist/lib/primitive/boolean/boolean.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/boolean.js +615 -0
- package/dist/lib/primitive/boolean/boolean.mjs +1 -0
- package/dist/lib/primitive/boolean/index.cjs +1 -0
- package/dist/lib/primitive/boolean/index.d.ts +3 -0
- package/dist/lib/primitive/boolean/index.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/index.js +2 -0
- package/dist/lib/primitive/boolean/index.mjs +1 -0
- package/dist/lib/primitive/boolean/types.cjs +1 -0
- package/dist/lib/primitive/boolean/types.d.ts +14 -0
- package/dist/lib/primitive/boolean/types.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/types.js +1 -0
- package/dist/lib/primitive/boolean/types.mjs +0 -0
- package/dist/lib/primitive/date/date.cjs +1 -0
- package/dist/lib/primitive/date/date.d.ts +641 -0
- package/dist/lib/primitive/date/date.d.ts.map +1 -0
- package/dist/lib/primitive/date/date.js +1998 -0
- package/dist/lib/primitive/date/date.mjs +1 -0
- package/dist/lib/primitive/date/index.cjs +1 -0
- package/dist/lib/primitive/date/index.d.ts +3 -0
- package/dist/lib/primitive/date/index.d.ts.map +1 -0
- package/dist/lib/primitive/date/index.js +2 -0
- package/dist/lib/primitive/date/index.mjs +1 -0
- package/dist/lib/primitive/date/types.cjs +1 -0
- package/dist/lib/primitive/date/types.d.ts +205 -0
- package/dist/lib/primitive/date/types.d.ts.map +1 -0
- package/dist/lib/primitive/date/types.js +7 -0
- package/dist/lib/primitive/date/types.mjs +0 -0
- package/dist/lib/primitive/index.cjs +5 -0
- package/dist/lib/primitive/index.d.ts +5 -0
- package/dist/lib/primitive/index.d.ts.map +1 -0
- package/dist/lib/primitive/index.js +4 -0
- package/dist/lib/primitive/index.mjs +5 -0
- package/dist/lib/primitive/string/index.cjs +5 -0
- package/dist/lib/primitive/string/index.d.ts +3 -0
- package/dist/lib/primitive/string/index.d.ts.map +1 -0
- package/dist/lib/primitive/string/index.js +2 -0
- package/dist/lib/primitive/string/index.mjs +5 -0
- package/dist/lib/primitive/string/parser-2.cjs +8 -0
- package/dist/lib/primitive/string/parser-2.d.ts +17 -0
- package/dist/lib/primitive/string/parser-2.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser-2.js +656 -0
- package/dist/lib/primitive/string/parser-2.mjs +8 -0
- package/dist/lib/primitive/string/parser.cjs +3 -0
- package/dist/lib/primitive/string/parser.d.ts +9 -0
- package/dist/lib/primitive/string/parser.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser.js +775 -0
- package/dist/lib/primitive/string/parser.mjs +3 -0
- package/dist/lib/primitive/string/string.cjs +5 -0
- package/dist/lib/primitive/string/string.d.ts +535 -0
- package/dist/lib/primitive/string/string.d.ts.map +1 -0
- package/dist/lib/primitive/string/string.js +1301 -0
- package/dist/lib/primitive/string/string.mjs +5 -0
- package/dist/lib/primitive/string/types.cjs +1 -0
- package/dist/lib/primitive/string/types.d.ts +318 -0
- package/dist/lib/primitive/string/types.d.ts.map +1 -0
- package/dist/lib/primitive/string/types.js +5 -0
- package/dist/lib/primitive/string/types.mjs +0 -0
- package/dist/lib/primitive/types.cjs +1 -0
- package/dist/lib/primitive/types.d.ts +27 -0
- package/dist/lib/primitive/types.d.ts.map +1 -0
- package/dist/lib/primitive/types.js +1 -0
- package/dist/lib/primitive/types.mjs +0 -0
- package/dist/lib/url/index.cjs +1 -0
- package/dist/lib/url/index.d.ts +3 -0
- package/dist/lib/url/index.d.ts.map +1 -0
- package/dist/lib/url/index.js +2 -0
- package/dist/lib/url/index.mjs +1 -0
- package/dist/lib/url/parser.cjs +1 -0
- package/dist/lib/url/parser.d.ts +216 -0
- package/dist/lib/url/parser.d.ts.map +1 -0
- package/dist/lib/url/parser.js +488 -0
- package/dist/lib/url/parser.mjs +1 -0
- package/dist/lib/url/types.cjs +1 -0
- package/dist/lib/url/types.d.ts +18 -0
- package/dist/lib/url/types.d.ts.map +1 -0
- package/dist/lib/url/types.js +1 -0
- package/dist/lib/url/types.mjs +0 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +150 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=e=>e==null||Array.isArray(e)||typeof e=="function"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof Error?!1:typeof e=="object";function k(e){if(typeof e!="object"||e===null)return!1;let a=Object.getPrototypeOf(e);return a===Object.prototype||a===null}var w=(e,a,i,r)=>{if(i>r)return;if(a.length===0)return e;let n=a[0],f=a.slice(1);if(n.type==="descendant"){let o=w(e,f,i+1,r);if(o!==void 0)return o;if(e&&typeof e=="object")if(Array.isArray(e)){let t=[];for(let l=0;l<e.length;l++){let s=w(e[l],a,i+1,r);s!==void 0&&(t[l]=s)}return t.length>0?t:void 0}else{let t={};for(let l in e)if(e.hasOwnProperty(l)){let s=w(e[l],a,i+1,r);s!==void 0&&(t[l]=s)}return Object.keys(t).length>0?t:void 0}return}switch(n.type){case"property":if(m(e)&&n.value&&String(n.value)in e){let o=e[String(n.value)],t=w(o,f,i+1,r);if(t!==void 0)return{[String(n.value)]:t}}break;case"index":if(Array.isArray(e)){let o=n.value;if(o>=0&&o<e.length){let t=w(e[o],f,i+1,r);if(t!==void 0){let l=new Array(e.length).filter(s=>s!==void 0);return l[o]=t,l}}}else if(e&&typeof e=="object"){let o=String(n.value);if(o in e){let t=w(e[o],f,i+1,r);if(t!==void 0)return{[o]:t}}}break;case"wildcard":if(e&&typeof e=="object")if(Array.isArray(e)){let o=[],t=!1;for(let l=0;l<e.length;l++){let s=w(e[l],f,i+1,r);s!==void 0&&(o[l]=s,t=!0)}return t?o:void 0}else{let o={},t=!1;for(let l in e)if(e.hasOwnProperty(l)){let s=w(e[l],f,i+1,r);s!==void 0&&(o[l]=s,t=!0)}return t?o:void 0}break;case"slice":if(Array.isArray(e)){let[o,t]=n.value,l=Math.max(0,o),s=Math.min(e.length,t===1/0?e.length:t),y=[],g=!1;for(let A=l;A<s;A++){let p=w(e[A],f,i+1,r);p!==void 0&&(y[A]=p,g=!0)}return g?y:void 0}break;case"union":if(Array.isArray(e)){let o=n.value,t=[],l=!1;for(let s of o)if(s>=0&&s<e.length){let y=w(e[s],f,i+1,r);y!==void 0&&(t[s]=y,l=!0)}return l?t:void 0}break;case"filter":if(Array.isArray(e)){let o=n.value,t=[],l=!1;for(let s=0;s<e.length;s++)if(o(e[s])){let y=w(e[s],f,i+1,r);y!==void 0&&(t[s]=y,l=!0)}return l?t:void 0}break}};var O=(e,a)=>{if(e==null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let i=new Map;return e.forEach((r,n)=>{(!a||!a.some(f=>f.toString()===n.toString()))&&i.set(n,O(r))}),i}if(e instanceof Set){let i=new Set;return e.forEach(r=>{i.add(O(r))}),i}if(Array.isArray(e))return Array.from(e).map(i=>O(i));if(m(e)){let i={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(!a||!a.some(f=>f.toString()===n.toString()))&&(i[n]=O(e[n]));let r=Object.getOwnPropertySymbols(e);for(let n of r)(!a||!a.some(f=>f.toString()===n.toString()))&&(i[n]=O(e[n]));return i}return e};var W=(e,a)=>e===a,V=(e,a)=>{if(e.length!==a.length)return!1;for(let i=0;i<e.length;i++)if(Array.isArray(e[i])&&Array.isArray(a[i])){if(!V(e[i],a[i]))return!1}else if(m(e[i])&&m(a[i])){if(!D(e[i],a[i]))return!1}else if(e[i]!==a[i])return!1;return!0},D=(e,a)=>{let i=Object.keys(e),r=Object.keys(a);if(i.length!==r.length)return!1;for(let n of i){if(!(n in a))return!1;let f=e[n],o=a[n];if(Array.isArray(f)&&Array.isArray(o)){if(!V(f,o))return!1}else if(m(f)&&m(o)){if(!D(f,o))return!1}else if(f!==o)return!1}return!0},N=(e,a,i={})=>{let{includeDeleted:r=!1,includeAdded:n=!0,deepArrayComparison:f=!0,equalityFn:o=W,preserveStructure:t=!1}=i;if(e==null&&a==null)return{};if(e==null)return n?{...a}:{};if(a==null){if(r){let y={};for(let g in e)y[g]=void 0;return y}return{}}if(!m(e)||!m(a))return o(e,a)?{}:a;let l={},s=new Set;for(let y in a){s.add(y);let g=e[y],A=a[y];if(!(y in e)){n&&(l[y]=A);continue}if(Array.isArray(g)&&Array.isArray(A)){f?V(g,A)?t&&(l[y]=void 0):l[y]=A:g!==A?l[y]=A:t&&(l[y]=void 0);continue}if(m(g)&&m(A)){let p=N(g,A,i);Object.keys(p).length>0?l[y]=p:t&&(l[y]=void 0);continue}o(g,A)?t&&(l[y]=void 0):l[y]=A}if(r)for(let y in e)s.has(y)||(l[y]=void 0);return l},j=(e,a,i={})=>{let r=[],n=[],f=[],o={},{includeDeleted:t=!1,includeAdded:l=!0,deepArrayComparison:s=!0,equalityFn:y=W}=i;if(Array.isArray(e)&&Array.isArray(a)){let p=Math.max(e.length,a.length),d=[],c=!1;for(let u=0;u<p;u++){let T=`[${u}]`;if(u>=e.length)r.push(T),d[u]=a[u],c=!0;else if(u>=a.length)n.push(T),c=!0;else{let x=e[u],h=a[u];m(x)&&m(h)||Array.isArray(x)&&Array.isArray(h)?j(x,h,i).hasChanges?(f.push(T),d[u]=h,c=!0):d[u]=x:y(x,h)?d[u]=x:(f.push(T),d[u]=h,c=!0)}}return{changes:c?d:{},added:r,deleted:n,modified:f,hasChanges:c||n.length>0}}let g=(p,d,c="")=>{let u={added:[],deleted:[],modified:[]};if(Array.isArray(p)&&Array.isArray(d)){let T=Math.max(p.length,d.length);for(let x=0;x<T;x++){let h=c?`${c}[${x}]`:`[${x}]`;if(x>=p.length)u.added.push(h);else if(x>=d.length)u.deleted.push(h);else{let S=p[x],b=d[x];if(m(S)&&m(b)){let K=g(S,b,h);u.added.push(...K.added),u.deleted.push(...K.deleted),u.modified.push(...K.modified)}else if(Array.isArray(S)&&Array.isArray(b)){let K=g(S,b,h);u.added.push(...K.added),u.deleted.push(...K.deleted),u.modified.push(...K.modified)}else S!==b&&u.modified.push(h)}}return u}if(m(p)&&m(d)){let T=new Set([...Object.keys(p||{}),...Object.keys(d||{})]);for(let x of T){let h=p?.[x],S=d?.[x],b=c?`${c}.${x}`:x;if(!(x in(p||{})))u.added.push(b);else if(!(x in(d||{})))u.deleted.push(b);else if(Array.isArray(h)&&Array.isArray(S)){if(!V(h,S)){let K=g(h,S,b);u.added.push(...K.added),u.deleted.push(...K.deleted),u.modified.push(...K.modified)}}else if(m(h)&&m(S)){let K=g(h,S,b);u.added.push(...K.added),u.deleted.push(...K.deleted),u.modified.push(...K.modified)}else h!==S&&u.modified.push(b)}}return u};if(e==null&&a==null)return{changes:{},added:r,deleted:n,modified:f,hasChanges:!1};if(e==null){if(l&&a)for(let p in a)r.push(p),o[p]=a[p];return{changes:o,added:r,deleted:n,modified:f,hasChanges:r.length>0}}if(a==null){if(t)for(let p in e)n.push(p),o[p]=void 0;return{changes:o,added:r,deleted:n,modified:f,hasChanges:n.length>0}}let A=new Set;for(let p in a){A.add(p);let d=e[p],c=a[p];if(!(p in e)){l&&(r.push(p),o[p]=c);continue}let u=!1;if(Array.isArray(d)&&Array.isArray(c)){if(u=s?!V(d,c):d!==c,u){let T=g(d,c,p);r.push(...T.added),n.push(...T.deleted),f.push(...T.modified),o[p]=c}}else if(m(d)&&m(c)){let T=N(d,c,i);if(u=Object.keys(T).length>0,u){let x=g(d,c,p);r.push(...x.added),n.push(...x.deleted),f.push(...x.modified),o[p]=T}}else u=!y(d,c),u&&(f.push(p),o[p]=c)}for(let p in e)A.has(p)||(n.push(p),o[p]=void 0);return{changes:o,added:r,deleted:n,modified:f,hasChanges:r.length>0||n.length>0||f.length>0}};function L(e){return!!(e&&(e.diff||e.changes)&&(e.modified||e.deleted||e.hasChanges))}var F=(e,a,i)=>{if(!L(a)){let u=a,T=i||!1;if(Array.isArray(e)&&Array.isArray(u)){let h=T?e:[...e];u.length<h.length&&(h.length=u.length);for(let S=0;S<u.length;S++){let b=u[S];b!==void 0&&(m(h[S])&&m(b)||Array.isArray(h[S])&&Array.isArray(b)?h[S]=F(h[S],b,T):h[S]=b)}return h}if(!m(e))return u;if(!m(u))return e;let x=T?e:{...e};for(let h in u){let S=u[h];S===void 0?delete x[h]:Array.isArray(x[h])&&Array.isArray(S)||m(x[h])&&m(S)?x[h]=F(x[h],S,T):x[h]=S}return x}let{diff:r,added:n=[],deleted:f=[],modified:o=[],changes:t,keepRef:l}=a,s=i!==void 0?i:l,y=t||r;if(!y)return e;let g=new Set(n),A=new Set(f),p=new Set(o),d=u=>{if(n.length===0&&f.length===0&&o.length===0)return!0;let T=u.split(/[.\[\]]+/).filter(Boolean);for(let x=0;x<=T.length;x++){let h=T.slice(0,x).join("."),S=T.slice(0,x).map((b,K)=>/^\d+$/.test(b)?`[${b}]`:K>0?`.${b}`:b).join("");if(g.has(h)||g.has(S)||A.has(h)||A.has(S)||p.has(h)||p.has(S))return!0}return!1};if(Array.isArray(e)&&Array.isArray(y)){let u=s?e:[...e];u.length=y.length;for(let T=0;T<y.length;T++){let x=`[${T}]`,h=y[T];h!==void 0&&d(x)&&(m(u[T])&&m(h)||Array.isArray(u[T])&&Array.isArray(h)?u[T]=F(u[T],h,s):u[T]=h)}return u}if(!m(e))return y;if(!m(y))return e;let c=s?e:{...e};for(let u of f)u.includes(".")||u.includes("[")||d(u)&&delete c[u];for(let u in y){let T=y[u];d(u)&&(T===void 0?delete c[u]:Array.isArray(c[u])&&Array.isArray(T)||m(c[u])&&m(T)?c[u]=F(c[u],T,s):c[u]=T)}return c};var P=(e,a={})=>{let{type:i="auto",throwOnError:r=!1}=a;if(!e||typeof e!="string")return[];let n=[],f="",o=!1,t=!1,l="",s="",y=0,A=i==="auto"?(d=>d.includes("..")?"descendant":d.includes("[?(")?"filter":d.includes("[:")||d.includes("[0:")?"slice":d.includes("[,")||d.includes("[0,1]")?"union":d.includes("[*]")||d.includes(".*.")?"wildcard":d.includes("[]")?"array-wildcard":d.includes("[")&&d.includes("]")?"bracket":"dot")(e):i,p=d=>{let c=d.trim();if(c==="*"||c==="")return{type:"wildcard",value:c===""?"[]":"*",raw:c===""?"[]":d};if(c==="[]")return{type:"wildcard",value:"[]",raw:d};if(/^-?\d+$/.test(c))return{type:"index",value:parseInt(c,10),raw:d};if(c.includes(":")){let u=c.split(":").map(h=>h.trim()),T=u[0]===""?0:parseInt(u[0],10),x=u[1]===""?1/0:parseInt(u[1],10);if(isNaN(T)||isNaN(x)){if(r)throw new Error(`Invalid slice notation: ${d}`);return{type:"wildcard",value:"*",raw:d}}return{type:"slice",value:[T,x],raw:d}}if(c.includes(",")){let u=c.split(",").map(T=>{let x=parseInt(T.trim(),10);return isNaN(x)?-1:x}).filter(T=>T>=0);if(u.length===0){if(r)throw new Error(`Invalid union notation: ${d}`);return{type:"wildcard",value:"*",raw:d}}return{type:"union",value:u,raw:d}}if(c.startsWith("?(")&&c.endsWith(")")){let u=c.slice(2,-1);try{return{type:"filter",value:z(u),raw:d}}catch(T){if(r)throw T;return{type:"wildcard",value:"*",raw:d}}}return c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'")?{type:"property",value:c.slice(1,-1),raw:d}:{type:"property",value:c,raw:d}};for(let d=0;d<e.length;d++){let c=e[d],u=e[d+1];if((c==='"'||c==="'")&&!t){t=!0,l=c;continue}else if(c===l&&t){t=!1,l="",c==='"'||c==="'"||(o?s+=c:f+=c);continue}if(t){o?s+=c:f+=c;continue}if(c==="["&&!o){f&&(n.push({type:"property",value:f,raw:f}),f=""),o=!0,s="";continue}if(c==="]"&&o&&!t){o=!1;let x=p(s);n.push(x);continue}let T=n.length>0?n[n.length-1]:null;if(c==="."&&!o&&!t){if(u==="."){let x=e.split("..")[0];n.push({type:"property",value:x,raw:x}),n.push({type:"descendant",value:"..",raw:".."}),d++}else f&&(f==="*"?n.push({type:"wildcard",value:f,raw:f}):n.push({type:"property",value:f,raw:f}),f="");continue}if(o)s+=c;else if(T&&T.type!=="descendant")f+=c;else{let x=e.split(T?.raw)[1];x!==void 0?f=x:f+=c}}return f&&n.push({type:"property",value:f,raw:f}),n.map(d=>{if(d.type==="property"&&typeof d.value=="string"&&/^-?\d+$/.test(d.value)){let c=parseInt(d.value,10);if(!isNaN(c))return{...d,type:"index",value:c}}return d})},z=e=>{let a=e.replace(/@\.([a-zA-Z_$][\w$]*)/g,(i,r)=>`item.${r}`).replace(/@/g,"item");try{return new Function("item",`return ${a}`)}catch{throw new Error(`Invalid filter expression: ${e}`)}},E=e=>{let a=[];for(let i=0;i<e.length;i++){let r=e[i],n=i>0?e[i-1]:null;switch(r.type){case"property":/[\.\[\]\s]/.test(String(r.value))?a.push(`["${r.value}"]`):(n&&n.type!=="descendant"&&a.push("."),a.push(String(r.value)));break;case"index":a.push(`[${r.value}]`);break;case"wildcard":r.value==="[]"?a.push("[]"):a.push("[*]");break;case"slice":let[o,t]=r.value;a.push(`[${o}:${t===1/0?"":t}]`);break;case"union":let l=r.value;a.push(`[${l.join(",")}]`);break;case"filter":a.push(`[?(${r.raw?.slice(2,-1)||""})]`);break;case"descendant":a.push("..");break}}return a.join("").replace(/\.\[/g,"[")};function Q(e,a){for(let i in a){let r=e[i],n=a[i],f=j(r,n);Array.isArray(r)&&Array.isArray(n)?(r.length=0,r.push(...n)):typeof r=="object"&&typeof n=="object"&&r&&n&&f.hasChanges?F(r,n):e[i]=n}}function $(e,...a){if(a.length===0)return O(e);let i={preserveTarget:!1,strict:!1},r=a,n=a[a.length-1];n&&typeof n=="object"&&("preserveTarget"in n||"strict"in n)&&(i={...i,...n},r=a.slice(0,-1));let f=i.preserveTarget?e:O(e),o=Array.isArray(f);for(let t of r)if(t&&Array.isArray(t)!==o)throw new Error("Cannot mix arrays and objects in deepMergeWithOptions");for(let t of r)if(t!=null)if(o){let l=f,s=t;if(i.strict)for(let y=0;y<l.length&&y<s.length;y++)k(l[y])&&k(s[y])?l[y]=$(l[y],s[y],i):typeof l[y]==typeof s[y]&&(l[y]=O(s[y]));else Q(l,s)}else{if(!k(t))continue;let l=f,s=t;for(let g in s){if(!Object.prototype.hasOwnProperty.call(s,g))continue;let A=s[g];if(i.strict&&!(g in l))continue;let p=l[g];p===void 0?l[g]=O(A):Array.isArray(A)&&Array.isArray(p)?i.strict?l[g]=$(p,A,i):l[g]=[...p,...A.map(d=>O(d))]:k(A)&&k(p)?l[g]=$(p,A,i):l[g]=O(A)}let y=Object.getOwnPropertySymbols(s);for(let g of y){if(i.strict&&!(g in l))continue;let A=s[g],p=l[g];p===void 0?l[g]=O(A):Array.isArray(A)&&Array.isArray(p)?i.strict?l[g]=$(p,A,i):l[g]=[...p,...A.map(d=>O(d))]:k(A)&&k(p)?l[g]=$(p,A,i):l[g]=O(A)}}return f}function U(e,...a){return $(e,...a,{preserveTarget:!0})}var B=(e,a,i)=>{let r=P(a),n=e;for(let f=0;f<r.length;f++){let o=r[f],t=f===r.length-1;switch(o.type){case"property":if(t)n[String(o.value)]=i;else{if(!n[String(o.value)]){let s=r[f+1];n[String(o.value)]=s.type==="index"||s.type==="slice"||s.type==="union"||s.type==="wildcard"?[]:{}}n=n[String(o.value)]}break;case"index":Array.isArray(n)||(n=[]);let l=o.value;if(t){if(l>=n.length)for(let s=n.length;s<=l;s++)n.push(void 0);n[l]=i}else{if(!n[l]){let s=r[f+1];n[l]=s.type==="index"||s.type==="slice"||s.type==="union"||s.type==="wildcard"?[]:{}}n=n[l]}break;case"wildcard":if(Array.isArray(n))if(t)for(let s=0;s<n.length;s++)n[s]=i;else{let s=r[f+1];for(let y=0;y<n.length;y++)n[y]||(n[y]=s.type==="index"||s.type==="slice"||s.type==="union"||s.type==="wildcard"?[]:{});n.length>0&&(n=n[0])}break}}};function I(e,a,i={}){let{preserveStructure:r,multiple:n,throwOnError:f=!1,defaultValue:o,maxDepth:t=20}=i;if(!e||typeof e!="object")return o;if(!a)return e;if(Array.isArray(a))if(r){let y={};for(let g of a){let A=I(e,g,{...i,preserveStructure:!1});A!==void 0&&B(y,g,A)}return y}else return a.map(y=>I(e,y,{...i,preserveStructure:!1}));let l=P(a,{...i,throwOnError:f});if(l.length===0)return e;if(typeof r>"u"||r===!1){let y=Z(e,a);return n===!1&&Array.isArray(y)?y[0]:y===void 0&&o!==void 0?o:y}let s=w(e,l,0,t);return s===void 0&&o!==void 0?o:s}function Z(e,a,i={}){let{createMissing:r=!1,add:n=!1,debug:f=!1}=i,o=P(a),t=e,l=!1,s="",y=a;if(typeof t=="object"&&!Array.isArray(t)&&y.length>0&&t[y])return t=t[y],t;for(let g=0;g<o.length;g++){let A=o[g],p=o.length>1?g===o.length-1:!1;if(t===null&&!r)return;let d=o[g+1];switch(A.type){case"property":if(t&&typeof t=="object")if(Array.isArray(t)){if(typeof A.value=="number"){let c=A.value;if(r&&c>=t.length)for(let u=t.length;u<=c;u++)t.push(void 0);if(r&&(t[c]===null||t[c]===void 0)&&(!p||l)&&(d?t[c]=d.type==="index"||d.type==="slice"||d.type==="union"||d.type==="wildcard"?[]:{}:t[c]=null,l=!1),t=t[c],d){l=!0;continue}}else n?t.push({[String(A.value)]:null}):t=t.map(c=>c[String(A.value)]);if(d)continue;return _(t)}else{if(t[s]&&s.split(".").length>=2){t=t[s];continue}if(r&&(t[String(A.value)]===null||t[String(A.value)]===void 0)&&(!p||l)&&(d?t[String(A.value)]=d.type==="index"||d.type==="slice"||d.type==="union"||d.type==="wildcard"?[]:{}:t[String(A.value)]=null,l=!1,t=t[String(A.value)],d)){l=!0;continue}if(t?(!t[String(A.value)]&&r&&(t[String(A.value)]=null),t=t[String(A.value)]):t={[String(A.value)]:null},d)continue}else if(r)t={},t[String(A.value)]=d.type==="index"||d.type==="slice"||d.type==="union"||d.type==="wildcard"||i.type==="array"?[]:{},t=t[String(A.value)];else return;break;case"index":case"wildcard":if(Array.isArray(t)){if(A.type==="index"){let c=A.value;if(c<0){t=t[t.length-Math.abs(c)];continue}if(r&&(c>=t.length||t[c]==null||t[c]==null)&&!p){for(let u=t.length;u<=c;u++)t.push(void 0);d&&(t[c]=d.type==="index"||d.type==="slice"||d.type==="union"||d.type==="wildcard"?[]:{})}t=t[c]}else if(!p)continue}else if(r){let c=o[g+1];t=[];let u=A.value;for(let T=0;T<=u;T++)t.push(void 0);t[u]=c.type==="index"||c.type==="slice"||c.type==="union"||c.type==="wildcard"||i.type==="array"?[]:{},t=t[u]}else{if(A.type==="index"&&typeof t=="object"&&t&&t[String(A.value)]!==void 0){t=t[String(A.value)];continue}if(typeof t=="object"){t=Object.values(t);continue}return}break;default:return}}return _(t)}function _(e){return Array.isArray(e)?e.filter(a=>typeof a<"u"):e}var R=(e,a,i={})=>{let{throwOnError:r=!1}=i;if(Array.isArray(a))return a.map(t=>R(e,t,i));let n=P(a,{throwOnError:r});if(n.length===0)return!1;let f=n[n.length-1];if(n.some(t=>t.type==="wildcard"||t.type==="slice"||t.type==="union")){let t=q(e,a,i),l=!1;for(let s of t)G(e,s)&&(l=!0);return l}let o=e;for(let t=0;t<n.length-1;t++){let l=n[t];if(o==null)return!1;switch(l.type){case"property":o=o[String(l.value)];break;case"index":if(!Array.isArray(o))return!1;let s=l.value;if(s<0||s>=o.length)return!1;o=o[s];break;default:return!1}}if(o==null)return!1;switch(f.type){case"property":if(String(f.value)in o)return delete o[String(f.value)],!0;break;case"index":if(!Array.isArray(o))return!1;let t=f.value;if(t>=0&&t<o.length)return o.splice(t,1),!0;break}return!1},G=(e,a)=>{let i=P(a);if(i.length===0)return!1;let r=i[i.length-1],n=e;for(let f=0;f<i.length-1;f++){let o=i[f];if(n==null)return!1;switch(o.type){case"property":n=n[String(o.value)];break;case"index":if(!Array.isArray(n))return!1;let t=o.value;if(t<0||t>=n.length)return!1;n=n[t];break;default:return!1}}if(n==null)return!1;switch(r.type){case"property":if(String(r.value)in n)return delete n[String(r.value)],!0;break;case"index":if(!Array.isArray(n))return!1;let f=r.value;if(f>=0&&f<n.length)return n.splice(f,1),!0;break}return!1},q=(e,a,i={})=>{let{format:r="selector",maxDepth:n=20}=i;if(a&&Array.isArray(a)){let t=[];for(let l of a){let s=q(e,l,i);t.push(...s)}return t}if(a){let t=P(a,i);return v(e,t,0,n).map(s=>r==="selector"?s.path:s.stringPath)}let f=[],o=(t,l=[],s=[],y=0)=>{if(!(y>n)){if(l.length>0){let g=E(l);f.push({path:g,stringPath:s.join(".")})}if(t&&typeof t=="object")if(Array.isArray(t))for(let g=0;g<t.length;g++)o(t[g],[...l,{type:"index",value:g,raw:`[${g}]`}],[...s,`[${g}]`],y+1);else for(let g in t)t.hasOwnProperty(g)&&o(t[g],[...l,{type:"property",value:g,raw:g}],[...s,g],y+1)}};return o(e),f.map(t=>r==="selector"?t.path:t.stringPath)};function v(e,a,i,r,n=[],f=[]){if(i>r)return[];if(a.length===0)return[{value:e,path:E(n),stringPath:f.join(".")}];let o=a[0],t=a.slice(1),l=[];if(o.type==="descendant"){if(l.push(...v(e,t,i+1,r,n,f)),e&&typeof e=="object")if(Array.isArray(e))for(let s=0;s<e.length;s++)l.push(...v(e[s],a,i+1,r,[...n,{type:"index",value:s,raw:`[${s}]`}],[...f,`[${s}]`]));else for(let s in e)e.hasOwnProperty(s)&&l.push(...v(e[s],a,i+1,r,[...n,{type:"property",value:s,raw:s}],[...f,s]));return l}switch(o.type){case"property":if(e&&typeof e=="object"&&String(o.value)in e){let s=e[String(o.value)];l.push(...v(s,t,i+1,r,[...n,o],[...f,String(o.value)]))}break;case"index":if(Array.isArray(e)){let s=o.value;s>=0&&s<e.length&&l.push(...v(e[s],t,i+1,r,[...n,o],[...f,`[${s}]`]))}else if(e&&typeof e=="object"){let s=String(o.value);s in e&&l.push(...v(e[s],t,i+1,r,[...n,{...o,type:"property"}],[...f,s]))}break;case"wildcard":if(e&&typeof e=="object")if(Array.isArray(e))for(let s=0;s<e.length;s++)l.push(...v(e[s],t,i+1,r,[...n,{type:"index",value:s,raw:`[${s}]`}],[...f,`[${s}]`]));else for(let s in e)e.hasOwnProperty(s)&&l.push(...v(e[s],t,i+1,r,[...n,{type:"property",value:s,raw:s}],[...f,s]));break;case"slice":if(Array.isArray(e)){let[s,y]=o.value,g=Math.max(0,s),A=Math.min(e.length,y===1/0?e.length:y);for(let p=g;p<A;p++)l.push(...v(e[p],t,i+1,r,[...n,{type:"index",value:p,raw:`[${p}]`}],[...f,`[${p}]`]))}break;case"union":if(Array.isArray(e)){let s=o.value;for(let y of s)y>=0&&y<e.length&&l.push(...v(e[y],t,i+1,r,[...n,{type:"index",value:y,raw:`[${y}]`}],[...f,`[${y}]`]))}break;case"filter":if(Array.isArray(e)){let s=o.value;for(let y=0;y<e.length;y++)s(e[y])&&l.push(...v(e[y],t,i+1,r,[...n,{type:"index",value:y,raw:`[${y}]`}],[...f,`[${y}]`]))}break}return l}function me(e,a){if(!m(e))return{};let i={...e};for(let r of a)delete i[r];return i}function J(e,a){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(r=>J(r,a));let i={};for(let[r,n]of Object.entries(e))a.includes(r)||(i[r]=J(n,a));return i}function Se(e){return a=>{if(!m(a))return{};let i={...a};for(let r of e)r in i&&delete i[r];return i}}function H(e,a){if(!m(e))return{};let i={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&!a(e[r],r,e)&&(i[r]=e[r]);return i}function Ke(e){return H(e,a=>a==null)}function be(e,a){if(!m(e))return{};let i={};for(let r of a)r in e&&(i[r]=e[r]);return i}function Oe(e,a){if(!m(e))return{};let i={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&a(e[r],r,e)&&(i[r]=e[r]);return i}function we(e,a,i){if(!m(e))return{};let r=JSON.parse(JSON.stringify(e)),n=Array.isArray(a)?a:[a];for(let o=0;o<n.length;o++){let t=n[o],l=n[o+1];if(!t||t==="")continue;let s=P(t);if(t.includes("*")||t.includes("[")||s.length>1){let A=function(p,d=""){if(m(p)){if(Array.isArray(p)){p.forEach((c,u)=>{A(c,d?`${d}[${u}]`:`[${u}]`)});return}for(let c in p)if(Object.prototype.hasOwnProperty.call(p,c)){let u=d?`${d}.${c}`:c;g.push({fullPath:u,segments:P(u)}),A(p[c],u)}}};var f=A;let y=I(r,t,{preserveStructure:!0});if(y===void 0)continue;let g=[];A(y);for(let{fullPath:p,segments:d}of g){let c=[...d],u=c.pop();if(!u)continue;let T=c.map(K=>K.type==="index"?`[${K.value}]`:K.value).join(".").replace(/\.\[/g,"["),x=I(r,T.length>0?T:p,{preserveStructure:!0}),h=T?x:r;if(!h)continue;let S=String(u.value),b=h[S];if(i){let K=i(b,p,r);if(K===!0)if(u.type==="index"&&Array.isArray(h)){let C=u.value;C>=0&&C<h.length&&h.splice(C,1)}else R(r,n[o]);else K!==!1&&(h[S]=K)}else if(u.type==="index"&&Array.isArray(h)){let K=u.value;K>=0&&K<h.length&&h.splice(K,1)}else R(r,n[o])}}else{let y=t;if(typeof y=="string"&&y in r)if(i){let g=i(r[y],t,r);g===!0?delete r[y]:g!==!1&&(r[y]=g)}else R(r,n[o])}}return r}function ve(e,a,i){if(!m(e))return{};if(Array.isArray(a)){let f={};for(let o of a){let t=I(e,o,{preserveStructure:!0});if(t!==void 0)if(i){let l=(y,g)=>{if(m(y)){if(Array.isArray(y))return y.map((p,d)=>l(p,`${g}[${d}]`));let A={};for(let p in y)if(Object.prototype.hasOwnProperty.call(y,p)){let d=g?`${g}.${p}`:p;A[p]=l(y[p],d)}return A}return i(y,g,e)},s=l(t,o);U(f,s)}else Object.assign(f,U(f,t))}return f}let r=Array.isArray(a)?a[0]:a,n=I(e,r,{preserveStructure:!0});if(n===void 0)return{};if(i){let f=(o,t)=>{if(m(o)){if(Array.isArray(o))return o.map((s,y)=>f(s,`${t}[${y}]`));let l={};for(let s in o)if(Object.prototype.hasOwnProperty.call(o,s)){let y=t?`${t}.${s}`:s;l[s]=f(o[s],y)}return l}return i(o,t,e)};return f(n,r)}return n}function M(e,a){if(!m(e))return e;if(Array.isArray(e))return e.map(r=>M(r,a));let i={};for(let r in e){if(!Object.prototype.hasOwnProperty.call(e,r))continue;let n=e[r];a(n,r,e)||(m(n)?i[r]=M(n,a):Array.isArray(n)?i[r]=n.map(f=>M(f,a)):i[r]=n)}return i}export{Se as createOmitter,J as deepOmit,M as deepOmitBy,me as omit,H as omitBy,Ke as omitNil,we as omitPath,be as pick,Oe as pickBy,ve as pickPath};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var g=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var j=(i,e)=>{for(var r in e)g(i,r,{get:e[r],enumerable:!0})},A=(i,e,r,f)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of w(e))!b.call(i,a)&&a!==r&&g(i,a,{get:()=>e[a],enumerable:!(f=O(e,a))||f.enumerable});return i};var h=i=>A(g({},"__esModule",{value:!0}),i);var v={};j(v,{reconcile:()=>q});module.exports=h(v);function p(i){if(i==null||typeof i!="object")return!1;let e=Object.getPrototypeOf(i);return e===Object.prototype||e===null}function k(i,e,r){return i===e?e:Array.isArray(i)?T(i,Array.isArray(e)?e:[],r):p(i)?m(i,p(e)?e:{},r):i}function T(i,e,r){let{key:f,keepRef:a}=r,u=e.length,o=i.length,s=new Array(u);for(let n=0;n<u;n++)s[n]=e[n];if(f===!1){if(a){for(let l=0;l<o;l++){let R=k(i[l],s[l],r);R!==s[l]&&(e[l]=R)}return u>o&&e.splice(o),e}let n=o!==u,t=new Array(o);for(let l=0;l<o;l++)t[l]=k(i[l],s[l],r),t[l]!==s[l]&&(n=!0);return n?t:e}let d=new Map;for(let n=0;n<u;n++){let t=s[n];t!=null&&typeof t=="object"&&f in t&&d.set(t[f],t)}let y=new Array(o);for(let n=0;n<o;n++){let t=i[n];t!=null&&typeof t=="object"&&f in t?y[n]=k(t,d.get(t[f]),r):y[n]=k(t,s[n],r)}if(a){for(let n=0;n<o;n++)y[n]!==s[n]&&(e[n]=y[n]);return u>o&&e.splice(o),e}let c=o!==u;for(let n=0;!c&&n<o;n++)y[n]!==s[n]&&(c=!0);return c?y:e}function m(i,e,r){let{merge:f,keepRef:a}=r,u=Object.keys(i),o=Object.keys(e),s=Object.create(null);for(let c=0;c<o.length;c++)s[o[c]]=e[o[c]];let d=null,y=()=>(d||(d=a?e:{...s}),d);if(!f)for(let c=0;c<o.length;c++){let n=o[c];n in i||delete y()[n]}for(let c=0;c<u.length;c++){let n=u[c],t=s[n],l=k(i[n],t,r);(l!==t||!(n in s))&&(y()[n]=l)}return d??e}function q(i,e){let r={key:e?.key!==void 0?e.key:"id",merge:e?.merge??!1,keepRef:e?.keepRef??!1};return f=>f==null?i:k(i,f,r)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../src/lib/object/reconcile.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqHD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,CAU/F"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
function isPlain(v) {
|
|
2
|
+
if (v == null || typeof v !== 'object')
|
|
3
|
+
return false;
|
|
4
|
+
const p = Object.getPrototypeOf(v);
|
|
5
|
+
return p === Object.prototype || p === null;
|
|
6
|
+
}
|
|
7
|
+
function reconcileValue(next, current, opts) {
|
|
8
|
+
if (next === current)
|
|
9
|
+
return current;
|
|
10
|
+
if (Array.isArray(next))
|
|
11
|
+
return reconcileArr(next, Array.isArray(current) ? current : [], opts);
|
|
12
|
+
if (isPlain(next))
|
|
13
|
+
return reconcileObj(next, isPlain(current) ? current : {}, opts);
|
|
14
|
+
return next;
|
|
15
|
+
}
|
|
16
|
+
function reconcileArr(next, current, opts) {
|
|
17
|
+
const { key, keepRef } = opts;
|
|
18
|
+
const curLen = current.length;
|
|
19
|
+
const nextLen = next.length;
|
|
20
|
+
// Snapshot once — avoids repeated proxy reads returning different references
|
|
21
|
+
const curItems = new Array(curLen);
|
|
22
|
+
for (let i = 0; i < curLen; i++)
|
|
23
|
+
curItems[i] = current[i];
|
|
24
|
+
if (key === false) {
|
|
25
|
+
// Index-based
|
|
26
|
+
if (keepRef) {
|
|
27
|
+
for (let i = 0; i < nextLen; i++) {
|
|
28
|
+
const rv = reconcileValue(next[i], curItems[i], opts);
|
|
29
|
+
if (rv !== curItems[i])
|
|
30
|
+
current[i] = rv;
|
|
31
|
+
}
|
|
32
|
+
if (curLen > nextLen)
|
|
33
|
+
current.splice(nextLen);
|
|
34
|
+
return current;
|
|
35
|
+
}
|
|
36
|
+
let changed = nextLen !== curLen;
|
|
37
|
+
const out = new Array(nextLen);
|
|
38
|
+
for (let i = 0; i < nextLen; i++) {
|
|
39
|
+
out[i] = reconcileValue(next[i], curItems[i], opts);
|
|
40
|
+
if (out[i] !== curItems[i])
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
return changed ? out : current;
|
|
44
|
+
}
|
|
45
|
+
// Key-based: build lookup from snapshot
|
|
46
|
+
const currentMap = new Map();
|
|
47
|
+
for (let i = 0; i < curLen; i++) {
|
|
48
|
+
const item = curItems[i];
|
|
49
|
+
if (item != null && typeof item === 'object' && key in item) {
|
|
50
|
+
currentMap.set(item[key], item);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const resolved = new Array(nextLen);
|
|
54
|
+
for (let i = 0; i < nextLen; i++) {
|
|
55
|
+
const n = next[i];
|
|
56
|
+
if (n != null && typeof n === 'object' && key in n) {
|
|
57
|
+
resolved[i] = reconcileValue(n, currentMap.get(n[key]), opts);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
resolved[i] = reconcileValue(n, curItems[i], opts);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (keepRef) {
|
|
64
|
+
for (let i = 0; i < nextLen; i++) {
|
|
65
|
+
if (resolved[i] !== curItems[i])
|
|
66
|
+
current[i] = resolved[i];
|
|
67
|
+
}
|
|
68
|
+
if (curLen > nextLen)
|
|
69
|
+
current.splice(nextLen);
|
|
70
|
+
return current;
|
|
71
|
+
}
|
|
72
|
+
// Immutable: compare resolved positions against snapshotted positions
|
|
73
|
+
let changed = nextLen !== curLen;
|
|
74
|
+
for (let i = 0; !changed && i < nextLen; i++) {
|
|
75
|
+
if (resolved[i] !== curItems[i])
|
|
76
|
+
changed = true;
|
|
77
|
+
}
|
|
78
|
+
return changed ? resolved : current;
|
|
79
|
+
}
|
|
80
|
+
function reconcileObj(next, current, opts) {
|
|
81
|
+
const { merge, keepRef } = opts;
|
|
82
|
+
const nextKeys = Object.keys(next);
|
|
83
|
+
const currentKeys = Object.keys(current);
|
|
84
|
+
// Snapshot current values once to avoid repeated proxy reads
|
|
85
|
+
const curValues = Object.create(null);
|
|
86
|
+
for (let i = 0; i < currentKeys.length; i++) {
|
|
87
|
+
curValues[currentKeys[i]] = current[currentKeys[i]];
|
|
88
|
+
}
|
|
89
|
+
let out = null;
|
|
90
|
+
const getOut = () => {
|
|
91
|
+
if (!out)
|
|
92
|
+
out = keepRef ? current : { ...curValues };
|
|
93
|
+
return out;
|
|
94
|
+
};
|
|
95
|
+
if (!merge) {
|
|
96
|
+
for (let i = 0; i < currentKeys.length; i++) {
|
|
97
|
+
const k = currentKeys[i];
|
|
98
|
+
if (!(k in next))
|
|
99
|
+
delete getOut()[k];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
for (let i = 0; i < nextKeys.length; i++) {
|
|
103
|
+
const k = nextKeys[i];
|
|
104
|
+
const cv = curValues[k];
|
|
105
|
+
const rv = reconcileValue(next[k], cv, opts);
|
|
106
|
+
if (rv !== cv || !(k in curValues))
|
|
107
|
+
getOut()[k] = rv;
|
|
108
|
+
}
|
|
109
|
+
return out ?? current;
|
|
110
|
+
}
|
|
111
|
+
export function reconcile(next, options) {
|
|
112
|
+
const opts = {
|
|
113
|
+
key: options?.key !== undefined ? options.key : 'id',
|
|
114
|
+
merge: options?.merge ?? false,
|
|
115
|
+
keepRef: options?.keepRef ?? false,
|
|
116
|
+
};
|
|
117
|
+
return (current) => {
|
|
118
|
+
if (current === undefined || current === null)
|
|
119
|
+
return next;
|
|
120
|
+
return reconcileValue(next, current, opts);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function R(i){if(i==null||typeof i!="object")return!1;let n=Object.getPrototypeOf(i);return n===Object.prototype||n===null}function d(i,n,f){return i===n?n:Array.isArray(i)?p(i,Array.isArray(n)?n:[],f):R(i)?O(i,R(n)?n:{},f):i}function p(i,n,f){let{key:s,keepRef:k}=f,a=n.length,o=i.length,c=new Array(a);for(let e=0;e<a;e++)c[e]=n[e];if(s===!1){if(k){for(let r=0;r<o;r++){let g=d(i[r],c[r],f);g!==c[r]&&(n[r]=g)}return a>o&&n.splice(o),n}let e=o!==a,t=new Array(o);for(let r=0;r<o;r++)t[r]=d(i[r],c[r],f),t[r]!==c[r]&&(e=!0);return e?t:n}let y=new Map;for(let e=0;e<a;e++){let t=c[e];t!=null&&typeof t=="object"&&s in t&&y.set(t[s],t)}let u=new Array(o);for(let e=0;e<o;e++){let t=i[e];t!=null&&typeof t=="object"&&s in t?u[e]=d(t,y.get(t[s]),f):u[e]=d(t,c[e],f)}if(k){for(let e=0;e<o;e++)u[e]!==c[e]&&(n[e]=u[e]);return a>o&&n.splice(o),n}let l=o!==a;for(let e=0;!l&&e<o;e++)u[e]!==c[e]&&(l=!0);return l?u:n}function O(i,n,f){let{merge:s,keepRef:k}=f,a=Object.keys(i),o=Object.keys(n),c=Object.create(null);for(let l=0;l<o.length;l++)c[o[l]]=n[o[l]];let y=null,u=()=>(y||(y=k?n:{...c}),y);if(!s)for(let l=0;l<o.length;l++){let e=o[l];e in i||delete u()[e]}for(let l=0;l<a.length;l++){let e=a[l],t=c[e],r=d(i[e],t,f);(r!==t||!(e in c))&&(u()[e]=r)}return y??n}function w(i,n){let f={key:n?.key!==void 0?n.key:"id",merge:n?.merge??!1,keepRef:n?.keepRef??!1};return s=>s==null?i:d(i,s,f)}export{w as reconcile};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var h=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var k=(e,n)=>{for(var a in n)h(e,a,{get:n[a],enumerable:!0})},I=(e,n,a,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let l of T(n))!x.call(e,l)&&l!==a&&h(e,l,{get:()=>n[l],enumerable:!(i=$(n,l))||i.enumerable});return e};var N=e=>I(h({},"__esModule",{value:!0}),e);var W={};k(W,{createFilterFunction:()=>g,createSelector:()=>E,detectSelectorType:()=>w,parseSelector:()=>v,stringifySelector:()=>A,validateSelector:()=>S});module.exports=N(W);var v=(e,n={})=>{let{type:a="auto",throwOnError:i=!1}=n;if(!e||typeof e!="string")return[];let l=[],s="",o=!1,d=!1,f="",y="",j=0,O=a==="auto"?(t=>t.includes("..")?"descendant":t.includes("[?(")?"filter":t.includes("[:")||t.includes("[0:")?"slice":t.includes("[,")||t.includes("[0,1]")?"union":t.includes("[*]")||t.includes(".*.")?"wildcard":t.includes("[]")?"array-wildcard":t.includes("[")&&t.includes("]")?"bracket":"dot")(e):a,m=t=>{let r=t.trim();if(r==="*"||r==="")return{type:"wildcard",value:r===""?"[]":"*",raw:r===""?"[]":t};if(r==="[]")return{type:"wildcard",value:"[]",raw:t};if(/^-?\d+$/.test(r))return{type:"index",value:parseInt(r,10),raw:t};if(r.includes(":")){let c=r.split(":").map(b=>b.trim()),u=c[0]===""?0:parseInt(c[0],10),p=c[1]===""?1/0:parseInt(c[1],10);if(isNaN(u)||isNaN(p)){if(i)throw new Error(`Invalid slice notation: ${t}`);return{type:"wildcard",value:"*",raw:t}}return{type:"slice",value:[u,p],raw:t}}if(r.includes(",")){let c=r.split(",").map(u=>{let p=parseInt(u.trim(),10);return isNaN(p)?-1:p}).filter(u=>u>=0);if(c.length===0){if(i)throw new Error(`Invalid union notation: ${t}`);return{type:"wildcard",value:"*",raw:t}}return{type:"union",value:c,raw:t}}if(r.startsWith("?(")&&r.endsWith(")")){let c=r.slice(2,-1);try{return{type:"filter",value:g(c),raw:t}}catch(u){if(i)throw u;return{type:"wildcard",value:"*",raw:t}}}return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?{type:"property",value:r.slice(1,-1),raw:t}:{type:"property",value:r,raw:t}};for(let t=0;t<e.length;t++){let r=e[t],c=e[t+1];if((r==='"'||r==="'")&&!d){d=!0,f=r;continue}else if(r===f&&d){d=!1,f="",r==='"'||r==="'"||(o?y+=r:s+=r);continue}if(d){o?y+=r:s+=r;continue}if(r==="["&&!o){s&&(l.push({type:"property",value:s,raw:s}),s=""),o=!0,y="";continue}if(r==="]"&&o&&!d){o=!1;let p=m(y);l.push(p);continue}let u=l.length>0?l[l.length-1]:null;if(r==="."&&!o&&!d){if(c==="."){let p=e.split("..")[0];l.push({type:"property",value:p,raw:p}),l.push({type:"descendant",value:"..",raw:".."}),t++}else s&&(s==="*"?l.push({type:"wildcard",value:s,raw:s}):l.push({type:"property",value:s,raw:s}),s="");continue}if(o)y+=r;else if(u&&u.type!=="descendant")s+=r;else{let p=e.split(u?.raw)[1];p!==void 0?s=p:s+=r}}return s&&l.push({type:"property",value:s,raw:s}),l.map(t=>{if(t.type==="property"&&typeof t.value=="string"&&/^-?\d+$/.test(t.value)){let r=parseInt(t.value,10);if(!isNaN(r))return{...t,type:"index",value:r}}return t})},g=e=>{let n=e.replace(/@\.([a-zA-Z_$][\w$]*)/g,(a,i)=>`item.${i}`).replace(/@/g,"item");try{return new Function("item",`return ${n}`)}catch{throw new Error(`Invalid filter expression: ${e}`)}},A=e=>{let n=[];for(let a=0;a<e.length;a++){let i=e[a],l=a>0?e[a-1]:null;switch(i.type){case"property":/[\.\[\]\s]/.test(String(i.value))?n.push(`["${i.value}"]`):(l&&l.type!=="descendant"&&n.push("."),n.push(String(i.value)));break;case"index":n.push(`[${i.value}]`);break;case"wildcard":i.value==="[]"?n.push("[]"):n.push("[*]");break;case"slice":let[o,d]=i.value;n.push(`[${o}:${d===1/0?"":d}]`);break;case"union":let f=i.value;n.push(`[${f.join(",")}]`);break;case"filter":n.push(`[?(${i.raw?.slice(2,-1)||""})]`);break;case"descendant":n.push("..");break}}return n.join("").replace(/\.\[/g,"[")},S=(e,n={})=>{if(Array.isArray(e))return e.map(a=>S(a,n));if(!/^[a-zA-Z]/.test(e))return{valid:!1,error:"Selector starts with '.'",type:w(e)};if(!/[a-zA-Z]$/.test(e))return{valid:!1,error:"Selector end with '.'",type:w(e)};try{let a=v(e,{throwOnError:!0}),i=w(e);return n.allowedTypes&&!n.allowedTypes.includes(i)?{valid:!1,error:`Selector type ${i} not allowed. Allowed: ${n.allowedTypes.join(", ")}`,type:i}:{valid:!0,type:w(e)}}catch(a){return{valid:!1,error:a.message}}},w=e=>e.includes("..")?"descendant":e.includes("[?(")?"filter":e.includes("[:")||e.includes("[0:")?"slice":/\[[^\]]*,[^\]]*\]/.test(e)?"union":e.includes("[*]")||e.includes(".*.")?"wildcard":e.includes("[]")?"array-wildcard":e.includes("[")&&e.includes("]")?"bracket":"dot",E=(e,n)=>e.replace(/\{(\w+)\}/g,(a,i)=>i in n?String(n[i]):`{${i}}`);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Selector, SelectorOptions, SelectorSegment, SelectorType } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced selector string parsing with multiple notations
|
|
4
|
+
* @param selector - Selector string
|
|
5
|
+
* @param options - Parsing options
|
|
6
|
+
* @returns Array of selector segments
|
|
7
|
+
* @example
|
|
8
|
+
* parseSelector('users[0].name') // [{type: 'property', value: 'users'}, {type: 'index', value: 0}, ...]
|
|
9
|
+
*/
|
|
10
|
+
export declare const parseSelector: (selector: string, options?: SelectorOptions) => SelectorSegment[];
|
|
11
|
+
/**
|
|
12
|
+
* Creates a filter function from expression string
|
|
13
|
+
* @param expr - Filter expression (e.g., '@.age > 18')
|
|
14
|
+
* @returns Filter function
|
|
15
|
+
*/
|
|
16
|
+
export declare const createFilterFunction: (expr: string) => ((item: any) => boolean);
|
|
17
|
+
/**
|
|
18
|
+
* Stringifies selector segments back to string
|
|
19
|
+
*/
|
|
20
|
+
export declare const stringifySelector: (segments: SelectorSegment[]) => string;
|
|
21
|
+
/**
|
|
22
|
+
* Checks if selector matches type signature
|
|
23
|
+
*/
|
|
24
|
+
export declare const validateSelector: (selector: Selector, options?: {
|
|
25
|
+
allowedTypes?: SelectorType[];
|
|
26
|
+
}) => {
|
|
27
|
+
valid: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
type?: SelectorType;
|
|
30
|
+
} | {
|
|
31
|
+
valid: boolean;
|
|
32
|
+
error?: string;
|
|
33
|
+
type?: SelectorType;
|
|
34
|
+
}[];
|
|
35
|
+
/**
|
|
36
|
+
* Detects selector type from string
|
|
37
|
+
*/
|
|
38
|
+
export declare const detectSelectorType: (selector: string) => SelectorType;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a selector from a template
|
|
41
|
+
* @param template - Template string
|
|
42
|
+
* @param replacements - Replacements object
|
|
43
|
+
* @example
|
|
44
|
+
* createSelector('a.{id}', {id: 1}) // 'a.1'
|
|
45
|
+
* createSelector('a.{id}.{name}', {id: 1, name: 'John'}) // 'a.1.John'
|
|
46
|
+
* createSelector('a.{id}.{name}.{age}', {id: 1, name: 'John', age: 30}) // 'a.1.John.30'
|
|
47
|
+
* createSelector('users[{id}].{property}', {id: 1}) // 'users[1].property'
|
|
48
|
+
*/
|
|
49
|
+
export declare const createSelector: (template: string, replacements: Record<string, string | number>) => string;
|
|
50
|
+
//# sourceMappingURL=selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../../src/lib/object/selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,EAChB,UAAS,eAAoB,KAC5B,eAAe,EA0NjB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,MAAM,KACX,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAazB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,eAAe,EAAE,KAAG,MAsD/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,QAAQ,EAClB,UAAS;IAAE,YAAY,CAAC,EAAE,YAAY,EAAE,CAAA;CAAO,KAE7C;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,YAAY,CAAA;CAAE,GACvD;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,YAAY,CAAA;CAAE,EAiD1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,YAUrD,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAC5C,MAOF,CAAC"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced selector string parsing with multiple notations
|
|
3
|
+
* @param selector - Selector string
|
|
4
|
+
* @param options - Parsing options
|
|
5
|
+
* @returns Array of selector segments
|
|
6
|
+
* @example
|
|
7
|
+
* parseSelector('users[0].name') // [{type: 'property', value: 'users'}, {type: 'index', value: 0}, ...]
|
|
8
|
+
*/
|
|
9
|
+
export const parseSelector = (selector, options = {}) => {
|
|
10
|
+
const { type = 'auto', throwOnError = false } = options;
|
|
11
|
+
if (!selector || typeof selector !== 'string') {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const segments = [];
|
|
15
|
+
let current = '';
|
|
16
|
+
let inBrackets = false;
|
|
17
|
+
let inQuotes = false;
|
|
18
|
+
let quoteChar = '';
|
|
19
|
+
let bracketContent = '';
|
|
20
|
+
let bracketDepth = 0;
|
|
21
|
+
const detectType = (str) => {
|
|
22
|
+
if (str.includes('..'))
|
|
23
|
+
return 'descendant';
|
|
24
|
+
if (str.includes('[?('))
|
|
25
|
+
return 'filter';
|
|
26
|
+
if (str.includes('[:') || str.includes('[0:'))
|
|
27
|
+
return 'slice';
|
|
28
|
+
if (str.includes('[,') || str.includes('[0,1]'))
|
|
29
|
+
return 'union';
|
|
30
|
+
if (str.includes('[*]') || str.includes('.*.'))
|
|
31
|
+
return 'wildcard';
|
|
32
|
+
if (str.includes('[]'))
|
|
33
|
+
return 'array-wildcard';
|
|
34
|
+
if (str.includes('[') && str.includes(']'))
|
|
35
|
+
return 'bracket';
|
|
36
|
+
return 'dot';
|
|
37
|
+
};
|
|
38
|
+
const actualType = type === 'auto' ? detectType(selector) : type;
|
|
39
|
+
const parseBracketContent = (content) => {
|
|
40
|
+
const trimmed = content.trim();
|
|
41
|
+
// Wildcard
|
|
42
|
+
if (trimmed === '*' || trimmed === '') {
|
|
43
|
+
return {
|
|
44
|
+
type: 'wildcard',
|
|
45
|
+
value: trimmed === '' ? '[]' : '*',
|
|
46
|
+
raw: trimmed === '' ? '[]' : content,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Array wildcard
|
|
50
|
+
if (trimmed === '[]') {
|
|
51
|
+
return { type: 'wildcard', value: '[]', raw: content };
|
|
52
|
+
}
|
|
53
|
+
// Numeric index
|
|
54
|
+
if (/^-?\d+$/.test(trimmed)) {
|
|
55
|
+
return { type: 'index', value: parseInt(trimmed, 10), raw: content };
|
|
56
|
+
}
|
|
57
|
+
// Slice notation [start:end:step] or [start:end]
|
|
58
|
+
if (trimmed.includes(':')) {
|
|
59
|
+
const parts = trimmed.split(':').map((p) => p.trim());
|
|
60
|
+
const start = parts[0] === '' ? 0 : parseInt(parts[0], 10);
|
|
61
|
+
const end = parts[1] === '' ? Infinity : parseInt(parts[1], 10);
|
|
62
|
+
if (isNaN(start) || isNaN(end)) {
|
|
63
|
+
if (throwOnError)
|
|
64
|
+
throw new Error(`Invalid slice notation: ${content}`);
|
|
65
|
+
return { type: 'wildcard', value: '*', raw: content };
|
|
66
|
+
}
|
|
67
|
+
return { type: 'slice', value: [start, end], raw: content };
|
|
68
|
+
}
|
|
69
|
+
// Union notation [0,2,4]
|
|
70
|
+
if (trimmed.includes(',')) {
|
|
71
|
+
const indices = trimmed
|
|
72
|
+
.split(',')
|
|
73
|
+
.map((p) => {
|
|
74
|
+
const num = parseInt(p.trim(), 10);
|
|
75
|
+
return isNaN(num) ? -1 : num;
|
|
76
|
+
})
|
|
77
|
+
.filter((n) => n >= 0);
|
|
78
|
+
if (indices.length === 0) {
|
|
79
|
+
if (throwOnError)
|
|
80
|
+
throw new Error(`Invalid union notation: ${content}`);
|
|
81
|
+
return { type: 'wildcard', value: '*', raw: content };
|
|
82
|
+
}
|
|
83
|
+
return { type: 'union', value: indices, raw: content };
|
|
84
|
+
}
|
|
85
|
+
// Filter notation [?(@.age > 18)]
|
|
86
|
+
if (trimmed.startsWith('?(') && trimmed.endsWith(')')) {
|
|
87
|
+
const expr = trimmed.slice(2, -1);
|
|
88
|
+
try {
|
|
89
|
+
const filterFn = createFilterFunction(expr);
|
|
90
|
+
return { type: 'filter', value: filterFn, raw: content };
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (throwOnError)
|
|
94
|
+
throw error;
|
|
95
|
+
return { type: 'wildcard', value: '*', raw: content };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Quoted property
|
|
99
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
100
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
101
|
+
return { type: 'property', value: trimmed.slice(1, -1), raw: content };
|
|
102
|
+
}
|
|
103
|
+
// Regular property
|
|
104
|
+
return { type: 'property', value: trimmed, raw: content };
|
|
105
|
+
};
|
|
106
|
+
for (let i = 0; i < selector.length; i++) {
|
|
107
|
+
const char = selector[i];
|
|
108
|
+
const nextChar = selector[i + 1];
|
|
109
|
+
// Handle quotes
|
|
110
|
+
if ((char === '"' || char === "'") && !inQuotes) {
|
|
111
|
+
inQuotes = true;
|
|
112
|
+
quoteChar = char;
|
|
113
|
+
// if (inBrackets) {
|
|
114
|
+
// bracketContent += char;
|
|
115
|
+
// } else {
|
|
116
|
+
// current += char;
|
|
117
|
+
// }
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
else if (char === quoteChar && inQuotes) {
|
|
121
|
+
inQuotes = false;
|
|
122
|
+
quoteChar = '';
|
|
123
|
+
if (!(char === '"' || char === "'")) {
|
|
124
|
+
if (inBrackets) {
|
|
125
|
+
bracketContent += char;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
current += char;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Inside quotes, just add character
|
|
134
|
+
if (inQuotes) {
|
|
135
|
+
if (inBrackets) {
|
|
136
|
+
bracketContent += char;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
current += char;
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Handle bracket start
|
|
144
|
+
if (char === '[' && !inBrackets) {
|
|
145
|
+
if (current) {
|
|
146
|
+
segments.push({ type: 'property', value: current, raw: current });
|
|
147
|
+
current = '';
|
|
148
|
+
}
|
|
149
|
+
inBrackets = true;
|
|
150
|
+
bracketContent = '';
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// Handle bracket end
|
|
154
|
+
if (char === ']' && inBrackets && !inQuotes) {
|
|
155
|
+
inBrackets = false;
|
|
156
|
+
const segment = parseBracketContent(bracketContent);
|
|
157
|
+
segments.push(segment);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
let lastDot = segments.length > 0 ? segments[segments.length - 1] : null;
|
|
161
|
+
// Handle dots
|
|
162
|
+
if (char === '.' && !inBrackets && !inQuotes) {
|
|
163
|
+
// Check for descendant selector (..)
|
|
164
|
+
if (nextChar === '.') {
|
|
165
|
+
// lastDot = true
|
|
166
|
+
const l = selector.split('..')[0];
|
|
167
|
+
segments.push({ type: 'property', value: l, raw: l });
|
|
168
|
+
segments.push({ type: 'descendant', value: '..', raw: '..' });
|
|
169
|
+
i++; // Skip next dot
|
|
170
|
+
}
|
|
171
|
+
else if (current) {
|
|
172
|
+
if (current === '*') {
|
|
173
|
+
segments.push({ type: 'wildcard', value: current, raw: current });
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
segments.push({ type: 'property', value: current, raw: current });
|
|
177
|
+
}
|
|
178
|
+
current = '';
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// Add character to current buffer
|
|
183
|
+
if (inBrackets) {
|
|
184
|
+
bracketContent += char;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
if (lastDot && lastDot.type !== 'descendant') {
|
|
188
|
+
current += char;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const l = selector.split(lastDot?.raw)[1];
|
|
192
|
+
if (l !== undefined) {
|
|
193
|
+
// current = l;
|
|
194
|
+
current = l;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
current += char;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (current) {
|
|
203
|
+
segments.push({ type: 'property', value: current, raw: current });
|
|
204
|
+
}
|
|
205
|
+
// console.log('checking for last', segments);
|
|
206
|
+
// Convert numeric strings in property segments
|
|
207
|
+
return segments.map((segment) => {
|
|
208
|
+
if (segment.type === 'property' && typeof segment.value === 'string') {
|
|
209
|
+
if (/^-?\d+$/.test(segment.value)) {
|
|
210
|
+
const num = parseInt(segment.value, 10);
|
|
211
|
+
if (!isNaN(num)) {
|
|
212
|
+
// return { ...segment, type: 'property', value: String(num) };
|
|
213
|
+
return { ...segment, type: 'index', value: num };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return segment;
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Creates a filter function from expression string
|
|
222
|
+
* @param expr - Filter expression (e.g., '@.age > 18')
|
|
223
|
+
* @returns Filter function
|
|
224
|
+
*/
|
|
225
|
+
export const createFilterFunction = (expr) => {
|
|
226
|
+
// Simple expression parser
|
|
227
|
+
// Supports: @.property, comparisons, logical operators
|
|
228
|
+
const safeExpr = expr
|
|
229
|
+
.replace(/@\.([a-zA-Z_$][\w$]*)/g, (_, prop) => `item.${prop}`)
|
|
230
|
+
.replace(/@/g, 'item');
|
|
231
|
+
try {
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
233
|
+
return new Function('item', `return ${safeExpr}`);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
throw new Error(`Invalid filter expression: ${expr}`);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* Stringifies selector segments back to string
|
|
241
|
+
*/
|
|
242
|
+
export const stringifySelector = (segments) => {
|
|
243
|
+
const parts = [];
|
|
244
|
+
for (let i = 0; i < segments.length; i++) {
|
|
245
|
+
const segment = segments[i];
|
|
246
|
+
const prevSegment = i > 0 ? segments[i - 1] : null;
|
|
247
|
+
switch (segment.type) {
|
|
248
|
+
case 'property':
|
|
249
|
+
// Check if property needs quotes
|
|
250
|
+
const needsQuotes = /[\.\[\]\s]/.test(String(segment.value));
|
|
251
|
+
if (needsQuotes) {
|
|
252
|
+
parts.push(`["${segment.value}"]`);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
if (prevSegment && prevSegment.type !== 'descendant') {
|
|
256
|
+
parts.push('.');
|
|
257
|
+
}
|
|
258
|
+
parts.push(String(segment.value));
|
|
259
|
+
}
|
|
260
|
+
break;
|
|
261
|
+
case 'index':
|
|
262
|
+
parts.push(`[${segment.value}]`);
|
|
263
|
+
break;
|
|
264
|
+
case 'wildcard':
|
|
265
|
+
if (segment.value === '[]') {
|
|
266
|
+
parts.push('[]');
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
parts.push('[*]');
|
|
270
|
+
}
|
|
271
|
+
break;
|
|
272
|
+
case 'slice':
|
|
273
|
+
const [start, end] = segment.value;
|
|
274
|
+
parts.push(`[${start}:${end === Infinity ? '' : end}]`);
|
|
275
|
+
break;
|
|
276
|
+
case 'union':
|
|
277
|
+
const indices = segment.value;
|
|
278
|
+
parts.push(`[${indices.join(',')}]`);
|
|
279
|
+
break;
|
|
280
|
+
case 'filter':
|
|
281
|
+
parts.push(`[?(${segment.raw?.slice(2, -1) || ''})]`);
|
|
282
|
+
break;
|
|
283
|
+
case 'descendant':
|
|
284
|
+
parts.push('..');
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return parts.join('').replace(/\.\[/g, '[');
|
|
289
|
+
};
|
|
290
|
+
/**
|
|
291
|
+
* Checks if selector matches type signature
|
|
292
|
+
*/
|
|
293
|
+
export const validateSelector = (selector, options = {}) => {
|
|
294
|
+
// Handle array of selectors
|
|
295
|
+
if (Array.isArray(selector)) {
|
|
296
|
+
return selector.map((sel) => validateSelector(sel, options));
|
|
297
|
+
}
|
|
298
|
+
//check if selector starts with alphabet
|
|
299
|
+
if (!/^[a-zA-Z]/.test(selector)) {
|
|
300
|
+
return {
|
|
301
|
+
valid: false,
|
|
302
|
+
error: `Selector starts with '.'`,
|
|
303
|
+
type: detectSelectorType(selector),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
//check if selector ends with alphabet
|
|
307
|
+
if (!/[a-zA-Z]$/.test(selector)) {
|
|
308
|
+
return {
|
|
309
|
+
valid: false,
|
|
310
|
+
error: `Selector end with '.'`,
|
|
311
|
+
type: detectSelectorType(selector),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const segments = parseSelector(selector, { throwOnError: true });
|
|
316
|
+
const type = detectSelectorType(selector);
|
|
317
|
+
// console.log('validate', segments, type);
|
|
318
|
+
if (options.allowedTypes) {
|
|
319
|
+
if (!options.allowedTypes.includes(type)) {
|
|
320
|
+
return {
|
|
321
|
+
valid: false,
|
|
322
|
+
error: `Selector type ${type} not allowed. Allowed: ${options.allowedTypes.join(', ')}`,
|
|
323
|
+
type,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return { valid: true, type: detectSelectorType(selector) };
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
return { valid: false, error: error.message };
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
/**
|
|
334
|
+
* Detects selector type from string
|
|
335
|
+
*/
|
|
336
|
+
export const detectSelectorType = (selector) => {
|
|
337
|
+
if (selector.includes('..'))
|
|
338
|
+
return 'descendant';
|
|
339
|
+
if (selector.includes('[?('))
|
|
340
|
+
return 'filter';
|
|
341
|
+
if (selector.includes('[:') || selector.includes('[0:'))
|
|
342
|
+
return 'slice';
|
|
343
|
+
// we need regex to test union but the actually regex catch brackets
|
|
344
|
+
if (/\[[^\]]*,[^\]]*\]/.test(selector))
|
|
345
|
+
return 'union';
|
|
346
|
+
if (selector.includes('[*]') || selector.includes('.*.'))
|
|
347
|
+
return 'wildcard';
|
|
348
|
+
if (selector.includes('[]'))
|
|
349
|
+
return 'array-wildcard';
|
|
350
|
+
if (selector.includes('[') && selector.includes(']'))
|
|
351
|
+
return 'bracket';
|
|
352
|
+
return 'dot';
|
|
353
|
+
};
|
|
354
|
+
/**
|
|
355
|
+
* Creates a selector from a template
|
|
356
|
+
* @param template - Template string
|
|
357
|
+
* @param replacements - Replacements object
|
|
358
|
+
* @example
|
|
359
|
+
* createSelector('a.{id}', {id: 1}) // 'a.1'
|
|
360
|
+
* createSelector('a.{id}.{name}', {id: 1, name: 'John'}) // 'a.1.John'
|
|
361
|
+
* createSelector('a.{id}.{name}.{age}', {id: 1, name: 'John', age: 30}) // 'a.1.John.30'
|
|
362
|
+
* createSelector('users[{id}].{property}', {id: 1}) // 'users[1].property'
|
|
363
|
+
*/
|
|
364
|
+
export const createSelector = (template, replacements) => {
|
|
365
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
366
|
+
if (key in replacements) {
|
|
367
|
+
return String(replacements[key]);
|
|
368
|
+
}
|
|
369
|
+
return `{${key}}`;
|
|
370
|
+
});
|
|
371
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=(t,n={})=>{let{type:l="auto",throwOnError:i=!1}=n;if(!t||typeof t!="string")return[];let s=[],a="",o=!1,d=!1,f="",y="",b=0,T=l==="auto"?(r=>r.includes("..")?"descendant":r.includes("[?(")?"filter":r.includes("[:")||r.includes("[0:")?"slice":r.includes("[,")||r.includes("[0,1]")?"union":r.includes("[*]")||r.includes(".*.")?"wildcard":r.includes("[]")?"array-wildcard":r.includes("[")&&r.includes("]")?"bracket":"dot")(t):l,h=r=>{let e=r.trim();if(e==="*"||e==="")return{type:"wildcard",value:e===""?"[]":"*",raw:e===""?"[]":r};if(e==="[]")return{type:"wildcard",value:"[]",raw:r};if(/^-?\d+$/.test(e))return{type:"index",value:parseInt(e,10),raw:r};if(e.includes(":")){let c=e.split(":").map(v=>v.trim()),u=c[0]===""?0:parseInt(c[0],10),p=c[1]===""?1/0:parseInt(c[1],10);if(isNaN(u)||isNaN(p)){if(i)throw new Error(`Invalid slice notation: ${r}`);return{type:"wildcard",value:"*",raw:r}}return{type:"slice",value:[u,p],raw:r}}if(e.includes(",")){let c=e.split(",").map(u=>{let p=parseInt(u.trim(),10);return isNaN(p)?-1:p}).filter(u=>u>=0);if(c.length===0){if(i)throw new Error(`Invalid union notation: ${r}`);return{type:"wildcard",value:"*",raw:r}}return{type:"union",value:c,raw:r}}if(e.startsWith("?(")&&e.endsWith(")")){let c=e.slice(2,-1);try{return{type:"filter",value:S(c),raw:r}}catch(u){if(i)throw u;return{type:"wildcard",value:"*",raw:r}}}return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?{type:"property",value:e.slice(1,-1),raw:r}:{type:"property",value:e,raw:r}};for(let r=0;r<t.length;r++){let e=t[r],c=t[r+1];if((e==='"'||e==="'")&&!d){d=!0,f=e;continue}else if(e===f&&d){d=!1,f="",e==='"'||e==="'"||(o?y+=e:a+=e);continue}if(d){o?y+=e:a+=e;continue}if(e==="["&&!o){a&&(s.push({type:"property",value:a,raw:a}),a=""),o=!0,y="";continue}if(e==="]"&&o&&!d){o=!1;let p=h(y);s.push(p);continue}let u=s.length>0?s[s.length-1]:null;if(e==="."&&!o&&!d){if(c==="."){let p=t.split("..")[0];s.push({type:"property",value:p,raw:p}),s.push({type:"descendant",value:"..",raw:".."}),r++}else a&&(a==="*"?s.push({type:"wildcard",value:a,raw:a}):s.push({type:"property",value:a,raw:a}),a="");continue}if(o)y+=e;else if(u&&u.type!=="descendant")a+=e;else{let p=t.split(u?.raw)[1];p!==void 0?a=p:a+=e}}return a&&s.push({type:"property",value:a,raw:a}),s.map(r=>{if(r.type==="property"&&typeof r.value=="string"&&/^-?\d+$/.test(r.value)){let e=parseInt(r.value,10);if(!isNaN(e))return{...r,type:"index",value:e}}return r})},S=t=>{let n=t.replace(/@\.([a-zA-Z_$][\w$]*)/g,(l,i)=>`item.${i}`).replace(/@/g,"item");try{return new Function("item",`return ${n}`)}catch{throw new Error(`Invalid filter expression: ${t}`)}},x=t=>{let n=[];for(let l=0;l<t.length;l++){let i=t[l],s=l>0?t[l-1]:null;switch(i.type){case"property":/[\.\[\]\s]/.test(String(i.value))?n.push(`["${i.value}"]`):(s&&s.type!=="descendant"&&n.push("."),n.push(String(i.value)));break;case"index":n.push(`[${i.value}]`);break;case"wildcard":i.value==="[]"?n.push("[]"):n.push("[*]");break;case"slice":let[o,d]=i.value;n.push(`[${o}:${d===1/0?"":d}]`);break;case"union":let f=i.value;n.push(`[${f.join(",")}]`);break;case"filter":n.push(`[?(${i.raw?.slice(2,-1)||""})]`);break;case"descendant":n.push("..");break}}return n.join("").replace(/\.\[/g,"[")},m=(t,n={})=>{if(Array.isArray(t))return t.map(l=>m(l,n));if(!/^[a-zA-Z]/.test(t))return{valid:!1,error:"Selector starts with '.'",type:w(t)};if(!/[a-zA-Z]$/.test(t))return{valid:!1,error:"Selector end with '.'",type:w(t)};try{let l=g(t,{throwOnError:!0}),i=w(t);return n.allowedTypes&&!n.allowedTypes.includes(i)?{valid:!1,error:`Selector type ${i} not allowed. Allowed: ${n.allowedTypes.join(", ")}`,type:i}:{valid:!0,type:w(t)}}catch(l){return{valid:!1,error:l.message}}},w=t=>t.includes("..")?"descendant":t.includes("[?(")?"filter":t.includes("[:")||t.includes("[0:")?"slice":/\[[^\]]*,[^\]]*\]/.test(t)?"union":t.includes("[*]")||t.includes(".*.")?"wildcard":t.includes("[]")?"array-wildcard":t.includes("[")&&t.includes("]")?"bracket":"dot",k=(t,n)=>t.replace(/\{(\w+)\}/g,(l,i)=>i in n?String(n[i]):`{${i}}`);export{S as createFilterFunction,k as createSelector,w as detectSelectorType,g as parseSelector,x as stringifySelector,m as validateSelector};
|