@fluixi/utils 1.0.0-alpha.100
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 +68 -0
- package/dist/index.cjs +2858 -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 +2838 -0
- package/dist/lib/array/advanced.cjs +2227 -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 +2204 -0
- package/dist/lib/array/array.cjs +57 -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 +36 -0
- package/dist/lib/array/index.cjs +2344 -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 +2322 -0
- package/dist/lib/array/utils.cjs +103 -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 +82 -0
- package/dist/lib/color/color.cjs +2190 -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 +2167 -0
- package/dist/lib/color/constants.cjs +380 -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 +359 -0
- package/dist/lib/color/conversions.cjs +629 -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 +608 -0
- package/dist/lib/color/helpers.cjs +2534 -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 +2511 -0
- package/dist/lib/color/index.cjs +2641 -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 +2619 -0
- package/dist/lib/color/types.cjs +18 -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 +962 -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 +939 -0
- package/dist/lib/compare/comparators.cjs +171 -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 +150 -0
- package/dist/lib/compare/index.cjs +172 -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 +152 -0
- package/dist/lib/cookie/codec.cjs +72 -0
- package/dist/lib/cookie/codec.d.ts +22 -0
- package/dist/lib/cookie/codec.d.ts.map +1 -0
- package/dist/lib/cookie/codec.js +67 -0
- package/dist/lib/cookie/codec.mjs +51 -0
- package/dist/lib/cookie/index.cjs +75 -0
- package/dist/lib/cookie/index.d.ts +2 -0
- package/dist/lib/cookie/index.d.ts.map +1 -0
- package/dist/lib/cookie/index.js +1 -0
- package/dist/lib/cookie/index.mjs +53 -0
- package/dist/lib/crypto/hash.cjs +83 -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 +62 -0
- package/dist/lib/crypto/index.cjs +85 -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 +62 -0
- package/dist/lib/dom/events.cjs +40 -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 +19 -0
- package/dist/lib/dom/index.cjs +78 -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 +56 -0
- package/dist/lib/dom/utils.cjs +57 -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 +36 -0
- package/dist/lib/functions/functions.cjs +366 -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 +345 -0
- package/dist/lib/functions/index.cjs +369 -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 +347 -0
- package/dist/lib/functions/types.cjs +18 -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 +78 -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 +59 -0
- package/dist/lib/index.cjs +2857 -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 +2836 -0
- package/dist/lib/maths/constants.cjs +70 -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 +50 -0
- package/dist/lib/maths/fn/advanced.cjs +231 -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 +208 -0
- package/dist/lib/maths/fn/basic.cjs +212 -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 +191 -0
- package/dist/lib/maths/fn/complex.cjs +268 -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 +247 -0
- package/dist/lib/maths/fn/index.cjs +877 -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 +855 -0
- package/dist/lib/maths/fn/trigo.cjs +179 -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 +156 -0
- package/dist/lib/maths/fn/vector.cjs +728 -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 +707 -0
- package/dist/lib/maths/formatter.cjs +61 -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 +40 -0
- package/dist/lib/maths/guards.cjs +164 -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 +144 -0
- package/dist/lib/maths/index.cjs +1152 -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 +1130 -0
- package/dist/lib/maths/parser.cjs +75 -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 +54 -0
- package/dist/lib/maths/random.cjs +49 -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 +28 -0
- package/dist/lib/maths/types/advanced.cjs +18 -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 +18 -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 +19 -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 +1 -0
- package/dist/lib/maths/types/negative.cjs +18 -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 +18 -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 +88 -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 +65 -0
- package/dist/lib/object/diff.cjs +573 -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 +550 -0
- package/dist/lib/object/getter-setter.cjs +2351 -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 +2330 -0
- package/dist/lib/object/index.cjs +3956 -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 +3936 -0
- package/dist/lib/object/merge.cjs +1029 -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 +1006 -0
- package/dist/lib/object/object.cjs +280 -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 +257 -0
- package/dist/lib/object/omit.cjs +2022 -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 +1999 -0
- package/dist/lib/object/reconcile.cjs +126 -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 +105 -0
- package/dist/lib/object/selector.cjs +303 -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 +282 -0
- package/dist/lib/object/sort.cjs +209 -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 +186 -0
- package/dist/lib/object/transform.cjs +2211 -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 +2190 -0
- package/dist/lib/object/types.cjs +18 -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 +326 -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 +305 -0
- package/dist/lib/primitive/boolean/boolean.cjs +407 -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 +386 -0
- package/dist/lib/primitive/boolean/index.cjs +382 -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 +359 -0
- package/dist/lib/primitive/boolean/types.cjs +18 -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 +1126 -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 +1105 -0
- package/dist/lib/primitive/date/index.cjs +1128 -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 +1105 -0
- package/dist/lib/primitive/date/types.cjs +18 -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 +2338 -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 +2316 -0
- package/dist/lib/primitive/string/index.cjs +875 -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 +852 -0
- package/dist/lib/primitive/string/parser-2.cjs +543 -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 +522 -0
- package/dist/lib/primitive/string/parser.cjs +236 -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 +215 -0
- package/dist/lib/primitive/string/string.cjs +926 -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 +903 -0
- package/dist/lib/primitive/string/types.cjs +18 -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 +18 -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 +327 -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 +304 -0
- package/dist/lib/url/parser.cjs +325 -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 +304 -0
- package/dist/lib/url/types.cjs +18 -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 +127 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// src/lib/object/selector.ts
|
|
2
|
+
var parseSelector = (selector, options = {}) => {
|
|
3
|
+
const { type = "auto", throwOnError = false } = options;
|
|
4
|
+
if (!selector || typeof selector !== "string") {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const segments = [];
|
|
8
|
+
let current = "";
|
|
9
|
+
let inBrackets = false;
|
|
10
|
+
let inQuotes = false;
|
|
11
|
+
let quoteChar = "";
|
|
12
|
+
let bracketContent = "";
|
|
13
|
+
let bracketDepth = 0;
|
|
14
|
+
const detectType = (str) => {
|
|
15
|
+
if (str.includes("..")) return "descendant";
|
|
16
|
+
if (str.includes("[?(")) return "filter";
|
|
17
|
+
if (str.includes("[:") || str.includes("[0:")) return "slice";
|
|
18
|
+
if (str.includes("[,") || str.includes("[0,1]")) return "union";
|
|
19
|
+
if (str.includes("[*]") || str.includes(".*.")) return "wildcard";
|
|
20
|
+
if (str.includes("[]")) return "array-wildcard";
|
|
21
|
+
if (str.includes("[") && str.includes("]")) return "bracket";
|
|
22
|
+
return "dot";
|
|
23
|
+
};
|
|
24
|
+
const actualType = type === "auto" ? detectType(selector) : type;
|
|
25
|
+
const parseBracketContent = (content) => {
|
|
26
|
+
const trimmed = content.trim();
|
|
27
|
+
if (trimmed === "*" || trimmed === "") {
|
|
28
|
+
return {
|
|
29
|
+
type: "wildcard",
|
|
30
|
+
value: trimmed === "" ? "[]" : "*",
|
|
31
|
+
raw: trimmed === "" ? "[]" : content
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (trimmed === "[]") {
|
|
35
|
+
return { type: "wildcard", value: "[]", raw: content };
|
|
36
|
+
}
|
|
37
|
+
if (/^-?\d+$/.test(trimmed)) {
|
|
38
|
+
return { type: "index", value: parseInt(trimmed, 10), raw: content };
|
|
39
|
+
}
|
|
40
|
+
if (trimmed.includes(":")) {
|
|
41
|
+
const parts = trimmed.split(":").map((p) => p.trim());
|
|
42
|
+
const start = parts[0] === "" ? 0 : parseInt(parts[0], 10);
|
|
43
|
+
const end = parts[1] === "" ? Infinity : parseInt(parts[1], 10);
|
|
44
|
+
if (isNaN(start) || isNaN(end)) {
|
|
45
|
+
if (throwOnError) throw new Error(`Invalid slice notation: ${content}`);
|
|
46
|
+
return { type: "wildcard", value: "*", raw: content };
|
|
47
|
+
}
|
|
48
|
+
return { type: "slice", value: [start, end], raw: content };
|
|
49
|
+
}
|
|
50
|
+
if (trimmed.includes(",")) {
|
|
51
|
+
const indices = trimmed.split(",").map((p) => {
|
|
52
|
+
const num = parseInt(p.trim(), 10);
|
|
53
|
+
return isNaN(num) ? -1 : num;
|
|
54
|
+
}).filter((n) => n >= 0);
|
|
55
|
+
if (indices.length === 0) {
|
|
56
|
+
if (throwOnError) throw new Error(`Invalid union notation: ${content}`);
|
|
57
|
+
return { type: "wildcard", value: "*", raw: content };
|
|
58
|
+
}
|
|
59
|
+
return { type: "union", value: indices, raw: content };
|
|
60
|
+
}
|
|
61
|
+
if (trimmed.startsWith("?(") && trimmed.endsWith(")")) {
|
|
62
|
+
const expr = trimmed.slice(2, -1);
|
|
63
|
+
try {
|
|
64
|
+
const filterFn = createFilterFunction(expr);
|
|
65
|
+
return { type: "filter", value: filterFn, raw: content };
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (throwOnError) throw error;
|
|
68
|
+
return { type: "wildcard", value: "*", raw: content };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
|
|
72
|
+
return { type: "property", value: trimmed.slice(1, -1), raw: content };
|
|
73
|
+
}
|
|
74
|
+
return { type: "property", value: trimmed, raw: content };
|
|
75
|
+
};
|
|
76
|
+
for (let i = 0; i < selector.length; i++) {
|
|
77
|
+
const char = selector[i];
|
|
78
|
+
const nextChar = selector[i + 1];
|
|
79
|
+
if ((char === '"' || char === "'") && !inQuotes) {
|
|
80
|
+
inQuotes = true;
|
|
81
|
+
quoteChar = char;
|
|
82
|
+
continue;
|
|
83
|
+
} else if (char === quoteChar && inQuotes) {
|
|
84
|
+
inQuotes = false;
|
|
85
|
+
quoteChar = "";
|
|
86
|
+
if (!(char === '"' || char === "'")) {
|
|
87
|
+
if (inBrackets) {
|
|
88
|
+
bracketContent += char;
|
|
89
|
+
} else {
|
|
90
|
+
current += char;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (inQuotes) {
|
|
96
|
+
if (inBrackets) {
|
|
97
|
+
bracketContent += char;
|
|
98
|
+
} else {
|
|
99
|
+
current += char;
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (char === "[" && !inBrackets) {
|
|
104
|
+
if (current) {
|
|
105
|
+
segments.push({ type: "property", value: current, raw: current });
|
|
106
|
+
current = "";
|
|
107
|
+
}
|
|
108
|
+
inBrackets = true;
|
|
109
|
+
bracketContent = "";
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (char === "]" && inBrackets && !inQuotes) {
|
|
113
|
+
inBrackets = false;
|
|
114
|
+
const segment = parseBracketContent(bracketContent);
|
|
115
|
+
segments.push(segment);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
let lastDot = segments.length > 0 ? segments[segments.length - 1] : null;
|
|
119
|
+
if (char === "." && !inBrackets && !inQuotes) {
|
|
120
|
+
if (nextChar === ".") {
|
|
121
|
+
const l = selector.split("..")[0];
|
|
122
|
+
segments.push({ type: "property", value: l, raw: l });
|
|
123
|
+
segments.push({ type: "descendant", value: "..", raw: ".." });
|
|
124
|
+
i++;
|
|
125
|
+
} else if (current) {
|
|
126
|
+
if (current === "*") {
|
|
127
|
+
segments.push({ type: "wildcard", value: current, raw: current });
|
|
128
|
+
} else {
|
|
129
|
+
segments.push({ type: "property", value: current, raw: current });
|
|
130
|
+
}
|
|
131
|
+
current = "";
|
|
132
|
+
}
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (inBrackets) {
|
|
136
|
+
bracketContent += char;
|
|
137
|
+
} else {
|
|
138
|
+
if (lastDot && lastDot.type !== "descendant") {
|
|
139
|
+
current += char;
|
|
140
|
+
} else {
|
|
141
|
+
const l = selector.split(lastDot?.raw)[1];
|
|
142
|
+
if (l !== void 0) {
|
|
143
|
+
current = l;
|
|
144
|
+
} else {
|
|
145
|
+
current += char;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (current) {
|
|
151
|
+
segments.push({ type: "property", value: current, raw: current });
|
|
152
|
+
}
|
|
153
|
+
return segments.map((segment) => {
|
|
154
|
+
if (segment.type === "property" && typeof segment.value === "string") {
|
|
155
|
+
if (/^-?\d+$/.test(segment.value)) {
|
|
156
|
+
const num = parseInt(segment.value, 10);
|
|
157
|
+
if (!isNaN(num)) {
|
|
158
|
+
return { ...segment, type: "index", value: num };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return segment;
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
var createFilterFunction = (expr) => {
|
|
166
|
+
const safeExpr = expr.replace(/@\.([a-zA-Z_$][\w$]*)/g, (_, prop) => `item.${prop}`).replace(/@/g, "item");
|
|
167
|
+
try {
|
|
168
|
+
return new Function("item", `return ${safeExpr}`);
|
|
169
|
+
} catch (error) {
|
|
170
|
+
throw new Error(`Invalid filter expression: ${expr}`);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
var stringifySelector = (segments) => {
|
|
174
|
+
const parts = [];
|
|
175
|
+
for (let i = 0; i < segments.length; i++) {
|
|
176
|
+
const segment = segments[i];
|
|
177
|
+
const prevSegment = i > 0 ? segments[i - 1] : null;
|
|
178
|
+
switch (segment.type) {
|
|
179
|
+
case "property":
|
|
180
|
+
const needsQuotes = /[\.\[\]\s]/.test(String(segment.value));
|
|
181
|
+
if (needsQuotes) {
|
|
182
|
+
parts.push(`["${segment.value}"]`);
|
|
183
|
+
} else {
|
|
184
|
+
if (prevSegment && prevSegment.type !== "descendant") {
|
|
185
|
+
parts.push(".");
|
|
186
|
+
}
|
|
187
|
+
parts.push(String(segment.value));
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
case "index":
|
|
191
|
+
parts.push(`[${segment.value}]`);
|
|
192
|
+
break;
|
|
193
|
+
case "wildcard":
|
|
194
|
+
if (segment.value === "[]") {
|
|
195
|
+
parts.push("[]");
|
|
196
|
+
} else {
|
|
197
|
+
parts.push("[*]");
|
|
198
|
+
}
|
|
199
|
+
break;
|
|
200
|
+
case "slice":
|
|
201
|
+
const [start, end] = segment.value;
|
|
202
|
+
parts.push(`[${start}:${end === Infinity ? "" : end}]`);
|
|
203
|
+
break;
|
|
204
|
+
case "union":
|
|
205
|
+
const indices = segment.value;
|
|
206
|
+
parts.push(`[${indices.join(",")}]`);
|
|
207
|
+
break;
|
|
208
|
+
case "filter":
|
|
209
|
+
parts.push(`[?(${segment.raw?.slice(2, -1) || ""})]`);
|
|
210
|
+
break;
|
|
211
|
+
case "descendant":
|
|
212
|
+
parts.push("..");
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return parts.join("").replace(/\.\[/g, "[");
|
|
217
|
+
};
|
|
218
|
+
var validateSelector = (selector, options = {}) => {
|
|
219
|
+
if (Array.isArray(selector)) {
|
|
220
|
+
return selector.map(
|
|
221
|
+
(sel) => validateSelector(sel, options)
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
if (!/^[a-zA-Z]/.test(selector)) {
|
|
225
|
+
return {
|
|
226
|
+
valid: false,
|
|
227
|
+
error: `Selector starts with '.'`,
|
|
228
|
+
type: detectSelectorType(selector)
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (!/[a-zA-Z]$/.test(selector)) {
|
|
232
|
+
return {
|
|
233
|
+
valid: false,
|
|
234
|
+
error: `Selector end with '.'`,
|
|
235
|
+
type: detectSelectorType(selector)
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
const segments = parseSelector(selector, { throwOnError: true });
|
|
240
|
+
const type = detectSelectorType(selector);
|
|
241
|
+
if (options.allowedTypes) {
|
|
242
|
+
if (!options.allowedTypes.includes(type)) {
|
|
243
|
+
return {
|
|
244
|
+
valid: false,
|
|
245
|
+
error: `Selector type ${type} not allowed. Allowed: ${options.allowedTypes.join(
|
|
246
|
+
", "
|
|
247
|
+
)}`,
|
|
248
|
+
type
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return { valid: true, type: detectSelectorType(selector) };
|
|
253
|
+
} catch (error) {
|
|
254
|
+
return { valid: false, error: error.message };
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
var detectSelectorType = (selector) => {
|
|
258
|
+
if (selector.includes("..")) return "descendant";
|
|
259
|
+
if (selector.includes("[?(")) return "filter";
|
|
260
|
+
if (selector.includes("[:") || selector.includes("[0:")) return "slice";
|
|
261
|
+
if (/\[[^\]]*,[^\]]*\]/.test(selector)) return "union";
|
|
262
|
+
if (selector.includes("[*]") || selector.includes(".*.")) return "wildcard";
|
|
263
|
+
if (selector.includes("[]")) return "array-wildcard";
|
|
264
|
+
if (selector.includes("[") && selector.includes("]")) return "bracket";
|
|
265
|
+
return "dot";
|
|
266
|
+
};
|
|
267
|
+
var createSelector = (template, replacements) => {
|
|
268
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
269
|
+
if (key in replacements) {
|
|
270
|
+
return String(replacements[key]);
|
|
271
|
+
}
|
|
272
|
+
return `{${key}}`;
|
|
273
|
+
});
|
|
274
|
+
};
|
|
275
|
+
export {
|
|
276
|
+
createFilterFunction,
|
|
277
|
+
createSelector,
|
|
278
|
+
detectSelectorType,
|
|
279
|
+
parseSelector,
|
|
280
|
+
stringifySelector,
|
|
281
|
+
validateSelector
|
|
282
|
+
};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/lib/object/sort.ts
|
|
21
|
+
var sort_exports = {};
|
|
22
|
+
__export(sort_exports, {
|
|
23
|
+
move: () => move,
|
|
24
|
+
reorder: () => reorder,
|
|
25
|
+
sort: () => sort,
|
|
26
|
+
sortBy: () => sortBy,
|
|
27
|
+
sortKeys: () => sortKeys,
|
|
28
|
+
swap: () => swap
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(sort_exports);
|
|
31
|
+
|
|
32
|
+
// src/lib/object/utils.ts
|
|
33
|
+
function isPlainObject(v) {
|
|
34
|
+
if (typeof v !== "object" || v === null) return false;
|
|
35
|
+
const proto = Object.getPrototypeOf(v);
|
|
36
|
+
return proto === Object.prototype || proto === null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/lib/object/sort.ts
|
|
40
|
+
function getAtPath(obj, path) {
|
|
41
|
+
if (obj == null) return void 0;
|
|
42
|
+
let cur = obj;
|
|
43
|
+
for (const segment of path.split(".")) {
|
|
44
|
+
if (cur == null) return void 0;
|
|
45
|
+
cur = cur[segment];
|
|
46
|
+
}
|
|
47
|
+
return cur;
|
|
48
|
+
}
|
|
49
|
+
function compareValues(a, b, locale, localeOptions) {
|
|
50
|
+
const aN = a == null;
|
|
51
|
+
const bN = b == null;
|
|
52
|
+
if (aN && bN) return 0;
|
|
53
|
+
if (aN) return 1;
|
|
54
|
+
if (bN) return -1;
|
|
55
|
+
const aNaN = typeof a === "number" && Number.isNaN(a);
|
|
56
|
+
const bNaN = typeof b === "number" && Number.isNaN(b);
|
|
57
|
+
if (aNaN && bNaN) return 0;
|
|
58
|
+
if (aNaN) return 1;
|
|
59
|
+
if (bNaN) return -1;
|
|
60
|
+
if (a instanceof Date && b instanceof Date) {
|
|
61
|
+
return a.getTime() - b.getTime();
|
|
62
|
+
}
|
|
63
|
+
if (typeof a === "boolean" && typeof b === "boolean") {
|
|
64
|
+
return a === b ? 0 : a ? 1 : -1;
|
|
65
|
+
}
|
|
66
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
67
|
+
return a - b;
|
|
68
|
+
}
|
|
69
|
+
if (typeof a === "string" && typeof b === "string") {
|
|
70
|
+
return a.localeCompare(b, locale, localeOptions);
|
|
71
|
+
}
|
|
72
|
+
return String(a).localeCompare(String(b), locale, localeOptions);
|
|
73
|
+
}
|
|
74
|
+
function dirFor(order, i) {
|
|
75
|
+
const o = Array.isArray(order) ? order[i] ?? "asc" : order ?? "asc";
|
|
76
|
+
return o === "desc" ? -1 : 1;
|
|
77
|
+
}
|
|
78
|
+
function sortPrimitiveArray(arr, options) {
|
|
79
|
+
const { order, locale, localeOptions, nullsLast = true } = options;
|
|
80
|
+
const dir = dirFor(order, 0);
|
|
81
|
+
return arr.slice().sort((a, b) => {
|
|
82
|
+
const aN = a == null;
|
|
83
|
+
const bN = b == null;
|
|
84
|
+
if (aN && bN) return 0;
|
|
85
|
+
if (aN) return nullsLast ? 1 : -1;
|
|
86
|
+
if (bN) return nullsLast ? -1 : 1;
|
|
87
|
+
return compareValues(a, b, locale, localeOptions) * dir;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function sortObjectArray(arr, keys, options) {
|
|
91
|
+
const { order, locale, localeOptions, nullsLast = true, comparator } = options;
|
|
92
|
+
if (comparator) {
|
|
93
|
+
return arr.slice().sort(comparator);
|
|
94
|
+
}
|
|
95
|
+
return arr.slice().sort((a, b) => {
|
|
96
|
+
for (let i = 0; i < keys.length; i++) {
|
|
97
|
+
const aVal = getAtPath(a, keys[i]);
|
|
98
|
+
const bVal = getAtPath(b, keys[i]);
|
|
99
|
+
const aN = aVal == null;
|
|
100
|
+
const bN = bVal == null;
|
|
101
|
+
if (aN && bN) continue;
|
|
102
|
+
if (aN) return nullsLast ? 1 : -1;
|
|
103
|
+
if (bN) return nullsLast ? -1 : 1;
|
|
104
|
+
const cmp = compareValues(aVal, bVal, locale, localeOptions);
|
|
105
|
+
if (cmp !== 0) return cmp * dirFor(order, i);
|
|
106
|
+
}
|
|
107
|
+
return 0;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function sortRecord(record, options) {
|
|
111
|
+
const { order, priorityKeys = [], locale, localeOptions, deep } = options;
|
|
112
|
+
const dir = dirFor(order, 0);
|
|
113
|
+
const prioritySet = new Set(priorityKeys);
|
|
114
|
+
const rest = Object.keys(record).filter((k) => !prioritySet.has(k));
|
|
115
|
+
rest.sort(
|
|
116
|
+
(a, b) => a.localeCompare(b, locale, localeOptions) * dir
|
|
117
|
+
);
|
|
118
|
+
const ordered = [...priorityKeys.filter((k) => k in record), ...rest];
|
|
119
|
+
const result = {};
|
|
120
|
+
for (const key of ordered) {
|
|
121
|
+
result[key] = deep ? sortDeep(record[key], options) : record[key];
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
function sortDeep(value, options) {
|
|
126
|
+
if (Array.isArray(value)) {
|
|
127
|
+
const deepSorted = value.map((item) => sortDeep(item, options));
|
|
128
|
+
return sortArrayValue(deepSorted, options);
|
|
129
|
+
}
|
|
130
|
+
if (isPlainObject(value)) {
|
|
131
|
+
return sortRecord(value, options);
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
function applyIndices(arr, indices) {
|
|
136
|
+
const len = arr.length;
|
|
137
|
+
const used = /* @__PURE__ */ new Set();
|
|
138
|
+
const result = [];
|
|
139
|
+
for (const idx of indices) {
|
|
140
|
+
if (idx >= 0 && idx < len && !used.has(idx)) {
|
|
141
|
+
result.push(arr[idx]);
|
|
142
|
+
used.add(idx);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (let i = 0; i < len; i++) {
|
|
146
|
+
if (!used.has(i)) result.push(arr[i]);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
function sortArrayValue(arr, options) {
|
|
151
|
+
const { by, comparator, indices, order } = options;
|
|
152
|
+
if (indices) {
|
|
153
|
+
const permuted = applyIndices(arr, indices);
|
|
154
|
+
return dirFor(order, 0) === -1 ? permuted.reverse() : permuted;
|
|
155
|
+
}
|
|
156
|
+
if (comparator) {
|
|
157
|
+
return arr.slice().sort(comparator);
|
|
158
|
+
}
|
|
159
|
+
if (by) {
|
|
160
|
+
const keys = Array.isArray(by) ? by : [by];
|
|
161
|
+
return sortObjectArray(arr, keys, options);
|
|
162
|
+
}
|
|
163
|
+
const firstReal = arr.find((x) => x != null);
|
|
164
|
+
if (firstReal != null && isPlainObject(firstReal)) {
|
|
165
|
+
return dirFor(order, 0) === -1 ? arr.slice().reverse() : arr.slice();
|
|
166
|
+
}
|
|
167
|
+
return sortPrimitiveArray(arr, options);
|
|
168
|
+
}
|
|
169
|
+
function sort(input, options = {}) {
|
|
170
|
+
const { deep } = options;
|
|
171
|
+
if (Array.isArray(input)) {
|
|
172
|
+
const items = deep ? input.map((item) => sortDeep(item, options)) : input;
|
|
173
|
+
return sortArrayValue(items, options);
|
|
174
|
+
}
|
|
175
|
+
if (isPlainObject(input)) {
|
|
176
|
+
return sortRecord(input, options);
|
|
177
|
+
}
|
|
178
|
+
return input;
|
|
179
|
+
}
|
|
180
|
+
function sortBy(arr, by, order = "asc", options = {}) {
|
|
181
|
+
return sort(arr, { ...options, by, order });
|
|
182
|
+
}
|
|
183
|
+
function sortKeys(record, options = {}) {
|
|
184
|
+
return sort(record, options);
|
|
185
|
+
}
|
|
186
|
+
function move(arr, from, to) {
|
|
187
|
+
const len = arr.length;
|
|
188
|
+
if (len === 0) return arr.slice();
|
|
189
|
+
const f = Math.max(0, Math.min(len - 1, from));
|
|
190
|
+
const t = Math.max(0, Math.min(len - 1, to));
|
|
191
|
+
if (f === t) return arr.slice();
|
|
192
|
+
const result = arr.slice();
|
|
193
|
+
const [item] = result.splice(f, 1);
|
|
194
|
+
result.splice(t, 0, item);
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
function swap(arr, i, j) {
|
|
198
|
+
const len = arr.length;
|
|
199
|
+
if (i < 0 || i >= len) throw new RangeError(`swap: index ${i} out of range`);
|
|
200
|
+
if (j < 0 || j >= len) throw new RangeError(`swap: index ${j} out of range`);
|
|
201
|
+
if (i === j) return arr.slice();
|
|
202
|
+
const result = arr.slice();
|
|
203
|
+
result[i] = arr[j];
|
|
204
|
+
result[j] = arr[i];
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
function reorder(arr, indices, order = "asc") {
|
|
208
|
+
return sort(arr, { indices, order });
|
|
209
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { AnyObject, SelectorFor } from './types.js';
|
|
2
|
+
export type SortOrder = 'asc' | 'desc';
|
|
3
|
+
/**
|
|
4
|
+
* Options for `sort()`.
|
|
5
|
+
*
|
|
6
|
+
* @template T - Element type when sorting an array, or the record type.
|
|
7
|
+
*
|
|
8
|
+
* Array sorting
|
|
9
|
+
* sort(users, { by: 'name' })
|
|
10
|
+
* sort(users, { by: ['lastName', 'firstName'], order: ['asc', 'asc'] })
|
|
11
|
+
* sort(scores, { order: 'desc' })
|
|
12
|
+
* sort(items, { comparator: (a, b) => a.priority - b.priority })
|
|
13
|
+
*
|
|
14
|
+
* Record sorting (orders keys)
|
|
15
|
+
* sort(config, { priorityKeys: ['id', 'name'] })
|
|
16
|
+
*
|
|
17
|
+
* Deep / recursive
|
|
18
|
+
* sort(tree, { deep: true })
|
|
19
|
+
*/
|
|
20
|
+
export interface SortOptions<T = any> {
|
|
21
|
+
/**
|
|
22
|
+
* Key path(s) used to compare object array elements.
|
|
23
|
+
* Supports dot-notation for nested access: `'address.city'`.
|
|
24
|
+
* When multiple keys are given, they act as tie-breakers left-to-right.
|
|
25
|
+
* Only meaningful for object arrays; ignored for primitive arrays and records.
|
|
26
|
+
*/
|
|
27
|
+
by?: T extends AnyObject ? SelectorFor<T> | SelectorFor<T>[] : string | string[];
|
|
28
|
+
/**
|
|
29
|
+
* Sort direction. When `by` is an array you may supply a parallel array
|
|
30
|
+
* of directions: one per key. A single value applies to all keys.
|
|
31
|
+
* Default: `'asc'`.
|
|
32
|
+
*/
|
|
33
|
+
order?: SortOrder | SortOrder[];
|
|
34
|
+
/**
|
|
35
|
+
* Recursively sort nested arrays and plain-object values.
|
|
36
|
+
* Default: `false`.
|
|
37
|
+
*/
|
|
38
|
+
deep?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* For record-key sorting: these keys are placed first, in the given order,
|
|
41
|
+
* before the remaining keys are sorted alphabetically.
|
|
42
|
+
*/
|
|
43
|
+
priorityKeys?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* Put `null` / `undefined` array elements at the end regardless of direction.
|
|
46
|
+
* Default: `true`.
|
|
47
|
+
*/
|
|
48
|
+
nullsLast?: boolean;
|
|
49
|
+
/** BCP 47 locale tag used for string comparison, e.g. `'en-US'`. */
|
|
50
|
+
locale?: string;
|
|
51
|
+
/** Additional options forwarded to `Intl.Collator` when comparing strings. */
|
|
52
|
+
localeOptions?: Intl.CollatorOptions;
|
|
53
|
+
/**
|
|
54
|
+
* Explicit index permutation for arrays.
|
|
55
|
+
* `indices[i]` is the source index in the input array that should appear at
|
|
56
|
+
* position `i` in the output.
|
|
57
|
+
*
|
|
58
|
+
* - Input elements not referenced by any index are appended at the end in
|
|
59
|
+
* their original relative order.
|
|
60
|
+
* - Out-of-range indices are silently skipped.
|
|
61
|
+
* - When combined with `order: 'desc'`, the permuted result is reversed.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* sort(['a','b','c'], { indices: [2, 0, 1] }) // ['c', 'a', 'b']
|
|
65
|
+
* sort(['a','b','c'], { indices: [1, 0] }) // ['b', 'a', 'c'] ('c' appended)
|
|
66
|
+
* sort(users, { indices: [3, 1, 0, 2] }) // explicit UI reorder
|
|
67
|
+
*/
|
|
68
|
+
indices?: number[];
|
|
69
|
+
/**
|
|
70
|
+
* Fully custom comparator. When supplied it overrides `by`, `order`, and
|
|
71
|
+
* locale settings; only `deep` and `priorityKeys` still apply.
|
|
72
|
+
*/
|
|
73
|
+
comparator?: (a: T, b: T) => number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Sort an array of any element type.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* sort([3, 1, 2]) // [1, 2, 3]
|
|
80
|
+
* sort(['banana', 'apple', 'cherry']) // ['apple', 'banana', 'cherry']
|
|
81
|
+
* sort(users, { by: 'name' })
|
|
82
|
+
* sort(users, { by: ['role', 'name'], order: ['asc', 'desc'] })
|
|
83
|
+
* sort(items, { order: 'desc', deep: true })
|
|
84
|
+
*/
|
|
85
|
+
export declare function sort<T>(input: T[], options?: SortOptions<T>): T[];
|
|
86
|
+
/**
|
|
87
|
+
* Sort the keys of a plain-object record, returning a new object with the
|
|
88
|
+
* same entries but with keys in alphabetical order.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* sort({ z: 1, a: 2, m: 3 }) // { a: 2, m: 3, z: 1 }
|
|
92
|
+
* sort(config, { priorityKeys: ['id', 'name'] })
|
|
93
|
+
* sort(tree, { deep: true })
|
|
94
|
+
*/
|
|
95
|
+
export declare function sort<T extends Record<string, any>>(input: T, options?: SortOptions): T;
|
|
96
|
+
/**
|
|
97
|
+
* Sort an array of objects by one or more key paths, returning a new array.
|
|
98
|
+
* Shorthand for `sort(arr, { by: key, order })`.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* sortBy(users, 'name')
|
|
102
|
+
* sortBy(users, ['lastName', 'firstName'], 'asc')
|
|
103
|
+
* sortBy(products, 'price', 'desc')
|
|
104
|
+
*/
|
|
105
|
+
export declare function sortBy<T extends object>(arr: T[], by: T extends AnyObject ? SelectorFor<T> | SelectorFor<T>[] : string | string[], order?: SortOrder | SortOrder[], options?: Omit<SortOptions<T>, 'by' | 'order'>): T[];
|
|
106
|
+
/**
|
|
107
|
+
* Sort the keys of a record object, returning a new object.
|
|
108
|
+
* Shorthand for `sort(record, { order, priorityKeys, deep })`.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* sortKeys({ z: 1, a: 2 }) // { a: 2, z: 1 }
|
|
112
|
+
* sortKeys(obj, { priorityKeys: ['id', 'type'] })
|
|
113
|
+
* sortKeys(tree, { deep: true })
|
|
114
|
+
*/
|
|
115
|
+
export declare function sortKeys<T extends Record<string, any>>(record: T, options?: Pick<SortOptions, 'order' | 'priorityKeys' | 'deep' | 'locale' | 'localeOptions'>): T;
|
|
116
|
+
/**
|
|
117
|
+
* Move an element from one index to another, shifting the elements in between.
|
|
118
|
+
* Returns a new array; the original is not mutated.
|
|
119
|
+
*
|
|
120
|
+
* - Clamps `from` and `to` to valid array bounds.
|
|
121
|
+
* - When `from === to` the original array is returned as-is (same reference).
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* move(['a','b','c','d'], 0, 2) // ['b','c','a','d'] (first → third)
|
|
125
|
+
* move(['a','b','c','d'], 3, 1) // ['a','d','b','c'] (last → second)
|
|
126
|
+
* move(users, fromIndex, toIndex)
|
|
127
|
+
*/
|
|
128
|
+
export declare function move<T>(arr: T[], from: number, to: number): T[];
|
|
129
|
+
/**
|
|
130
|
+
* Swap two elements by index, returning a new array.
|
|
131
|
+
* The original array is not mutated.
|
|
132
|
+
* Out-of-range indices throw a `RangeError`.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* swap(['a','b','c'], 0, 2) // ['c','b','a']
|
|
136
|
+
* swap(users, 1, 3)
|
|
137
|
+
*/
|
|
138
|
+
export declare function swap<T>(arr: T[], i: number, j: number): T[];
|
|
139
|
+
/**
|
|
140
|
+
* Reorder an array by providing the full desired sequence of source indices.
|
|
141
|
+
* Shorthand for `sort(arr, { indices })`.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* reorder(['a','b','c'], [2, 0, 1]) // ['c','a','b']
|
|
145
|
+
* reorder(tabs, newIndexOrder) // apply UI drag-and-drop result
|
|
146
|
+
* reorder(rows, [3,1,0,2], 'desc') // permute then reverse
|
|
147
|
+
*/
|
|
148
|
+
export declare function reorder<T>(arr: T[], indices: number[], order?: SortOrder): T[];
|
|
149
|
+
//# sourceMappingURL=sort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../../src/lib/object/sort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC;;;;;OAKG;IACH,EAAE,CAAC,EAAE,CAAC,SAAS,SAAS,GACpB,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GACjC,MAAM,GAAG,MAAM,EAAE,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAEhC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC;IAErC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;CACrC;AA2OD;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAEnE;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChD,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,WAAW,GACpB,CAAC,CAAC;AAwBL;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EACrC,GAAG,EAAE,CAAC,EAAE,EACR,EAAE,EAAE,CAAC,SAAS,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,EAC/E,KAAK,GAAE,SAAS,GAAG,SAAS,EAAU,EACtC,OAAO,GAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAM,GACjD,CAAC,EAAE,CAEL;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpD,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,eAAe,CAAM,GAC9F,CAAC,CAEH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,CAY/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAU3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,EAAE,EACR,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,GAAE,SAAiB,GACvB,CAAC,EAAE,CAEL"}
|