@vielzeug/arsenal 26.10.7 → 26.10.10

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/README.md CHANGED
@@ -37,6 +37,8 @@ pool.dispose();
37
37
  ## Features
38
38
 
39
39
  - `compressBytes` / `decompressBytes`: native compression streams with a required decompressed-byte limit, available from the root and `/encoding` entry points.
40
+ - `paginate`: cut one page and its totals out of a list in a one- or zero-based page base, available from the root and `/array` entry points.
41
+ - `sort`: one entry point for a selector, a `{ key: direction }` object, or ordered grid criteria with safe nested paths, available from the root and `/array` entry points.
40
42
 
41
43
  ## Documentation
42
44
 
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunk.cjs"),t=require("./compact.cjs"),n=require("./compare.cjs"),r=require("./compareBy.cjs"),i=require("./contains.cjs"),a=require("./countBy.cjs"),o=require("./difference.cjs"),s=require("./drop.cjs"),c=require("./dropLast.cjs"),l=require("./filterMap.cjs"),u=require("./first.cjs"),d=require("./groupBy.cjs"),f=require("./indexBy.cjs"),p=require("./intersection.cjs"),m=require("./last.cjs"),h=require("./partition.cjs"),g=require("./replace.cjs"),_=require("./rotate.cjs"),v=require("./search.cjs"),y=require("./sort.cjs"),b=require("./take.cjs"),x=require("./takeLast.cjs"),S=require("./toggle.cjs"),C=require("./union.cjs"),w=require("./uniq.cjs"),T=require("./unzip.cjs"),E=require("./zip.cjs");exports.chunk=e.chunk,exports.compact=t.compact,exports.compare=n.compare,exports.compareBy=r.compareBy,exports.contains=i.contains,exports.countBy=a.countBy,exports.difference=o.difference,exports.drop=s.drop,exports.dropLast=c.dropLast,exports.filterMap=l.filterMap,exports.first=u.first,exports.fuzzyFilter=v.fuzzyFilter,exports.fuzzyScore=v.fuzzyScore,exports.groupBy=d.groupBy,exports.indexBy=f.indexBy,exports.intersection=p.intersection,exports.last=m.last,exports.partition=h.partition,exports.replace=g.replace,exports.rotate=_.rotate,exports.sort=y.sort,exports.take=b.take,exports.takeLast=x.takeLast,exports.toggle=S.toggle,exports.union=C.union,exports.uniq=w.uniq,exports.unzip=T.unzip,exports.zip=E.zip;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunk.cjs"),t=require("./compact.cjs"),n=require("./compare.cjs"),r=require("./compareBy.cjs"),i=require("./contains.cjs"),a=require("./countBy.cjs"),o=require("./difference.cjs"),s=require("./drop.cjs"),c=require("./dropLast.cjs"),l=require("./filterMap.cjs"),u=require("./first.cjs"),d=require("./groupBy.cjs"),f=require("./indexBy.cjs"),p=require("./intersection.cjs"),m=require("./last.cjs"),h=require("./paginate.cjs"),g=require("./partition.cjs"),_=require("./replace.cjs"),v=require("./rotate.cjs"),y=require("./search.cjs"),b=require("./sort.cjs"),x=require("./take.cjs"),S=require("./takeLast.cjs"),C=require("./toggle.cjs"),w=require("./union.cjs"),T=require("./uniq.cjs"),E=require("./unzip.cjs"),D=require("./zip.cjs");exports.chunk=e.chunk,exports.compact=t.compact,exports.compare=n.compare,exports.compareBy=r.compareBy,exports.contains=i.contains,exports.countBy=a.countBy,exports.difference=o.difference,exports.drop=s.drop,exports.dropLast=c.dropLast,exports.filterMap=l.filterMap,exports.first=u.first,exports.fuzzyFilter=y.fuzzyFilter,exports.fuzzyScore=y.fuzzyScore,exports.groupBy=d.groupBy,exports.indexBy=f.indexBy,exports.intersection=p.intersection,exports.last=m.last,exports.paginate=h.paginate,exports.partition=g.partition,exports.replace=_.replace,exports.rotate=v.rotate,exports.sort=b.sort,exports.take=x.take,exports.takeLast=S.takeLast,exports.toggle=C.toggle,exports.union=w.union,exports.uniq=T.uniq,exports.unzip=E.unzip,exports.zip=D.zip;
@@ -13,6 +13,7 @@ export * from './groupBy';
13
13
  export * from './indexBy';
14
14
  export * from './intersection';
15
15
  export * from './last';
16
+ export * from './paginate';
16
17
  export * from './partition';
17
18
  export * from './replace';
18
19
  export * from './rotate';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/array/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/array/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
@@ -1 +1 @@
1
- import{chunk as e}from"./chunk.js";import{compact as t}from"./compact.js";import{compare as n}from"./compare.js";import{compareBy as r}from"./compareBy.js";import{contains as i}from"./contains.js";import{countBy as a}from"./countBy.js";import{difference as o}from"./difference.js";import{drop as s}from"./drop.js";import{dropLast as c}from"./dropLast.js";import{filterMap as l}from"./filterMap.js";import{first as u}from"./first.js";import{groupBy as d}from"./groupBy.js";import{indexBy as f}from"./indexBy.js";import{intersection as p}from"./intersection.js";import{last as m}from"./last.js";import{partition as h}from"./partition.js";import{replace as g}from"./replace.js";import{rotate as _}from"./rotate.js";import{fuzzyFilter as v,fuzzyScore as y}from"./search.js";import{sort as b}from"./sort.js";import{take as x}from"./take.js";import{takeLast as S}from"./takeLast.js";import{toggle as C}from"./toggle.js";import{union as w}from"./union.js";import{uniq as T}from"./uniq.js";import{unzip as E}from"./unzip.js";import{zip as D}from"./zip.js";export{e as chunk,t as compact,n as compare,r as compareBy,i as contains,a as countBy,o as difference,s as drop,c as dropLast,l as filterMap,u as first,v as fuzzyFilter,y as fuzzyScore,d as groupBy,f as indexBy,p as intersection,m as last,h as partition,g as replace,_ as rotate,b as sort,x as take,S as takeLast,C as toggle,w as union,T as uniq,E as unzip,D as zip};
1
+ import{chunk as e}from"./chunk.js";import{compact as t}from"./compact.js";import{compare as n}from"./compare.js";import{compareBy as r}from"./compareBy.js";import{contains as i}from"./contains.js";import{countBy as a}from"./countBy.js";import{difference as o}from"./difference.js";import{drop as s}from"./drop.js";import{dropLast as c}from"./dropLast.js";import{filterMap as l}from"./filterMap.js";import{first as u}from"./first.js";import{groupBy as d}from"./groupBy.js";import{indexBy as f}from"./indexBy.js";import{intersection as p}from"./intersection.js";import{last as m}from"./last.js";import{paginate as h}from"./paginate.js";import{partition as g}from"./partition.js";import{replace as _}from"./replace.js";import{rotate as v}from"./rotate.js";import{fuzzyFilter as y,fuzzyScore as b}from"./search.js";import{sort as x}from"./sort.js";import{take as S}from"./take.js";import{takeLast as C}from"./takeLast.js";import{toggle as w}from"./toggle.js";import{union as T}from"./union.js";import{uniq as E}from"./uniq.js";import{unzip as D}from"./unzip.js";import{zip as O}from"./zip.js";export{e as chunk,t as compact,n as compare,r as compareBy,i as contains,a as countBy,o as difference,s as drop,c as dropLast,l as filterMap,u as first,y as fuzzyFilter,b as fuzzyScore,d as groupBy,f as indexBy,p as intersection,m as last,h as paginate,g as partition,_ as replace,v as rotate,x as sort,S as take,C as takeLast,w as toggle,T as union,E as uniq,D as unzip,O as zip};
@@ -0,0 +1,2 @@
1
+ function paginate(e,t={}){if(!Array.isArray(e))throw TypeError(`paginate: first argument must be an array`);let{pageOffset:n=1,pageSize:r=20}=t,i=t.page??n;if(!Number.isInteger(r)||r<1)throw RangeError(`paginate: pageSize must be a positive integer`);if(!Number.isInteger(i)||i<n)throw RangeError(`paginate: page must be an integer >= ${n}`);let a=Math.max(1,Math.ceil(e.length/r)),o=(i-n)*r;return{items:e.slice(o,o+r),page:i,pageSize:r,totalItems:e.length,totalPages:a}}exports.paginate=paginate;
2
+ //# sourceMappingURL=paginate.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.cjs","names":[],"sources":["../../src/array/paginate.ts"],"sourcesContent":["/**\n * A page of items plus the arithmetic that produced it, in the caller's own page base.\n * Deliberately server-neutral: it models no HTTP dialect (Spring, JSON:API, RFC 9457);\n * adapters map their response onto this shape and map this shape back out.\n */\nexport type PageEnvelope<T> = Readonly<{\n /** The page's items; empty when `page` is past the last page. */\n items: readonly T[];\n /** The requested page, echoed in the caller's base. */\n page: number;\n /** Items per page. */\n pageSize: number;\n /** Size of the full list the page was cut from. */\n totalItems: number;\n /** At least 1, even for an empty list, so `page < totalPages` never underflows. */\n totalPages: number;\n}>;\n\nexport type PaginateOptions = Readonly<{\n /** Page to cut, in the caller's base. Defaults to the first page of that base. */\n page?: number;\n /** Items per page. Default 20. */\n pageSize?: number;\n /** Base of `page`: 0 for zero-based servers (Spring), 1 for one-based (default). */\n pageOffset?: 0 | 1;\n}>;\n\n/**\n * Cuts one page out of an in-memory list.\n *\n * @example\n * ```ts\n * paginate([1, 2, 3, 4, 5], { page: 2, pageSize: 2 });\n * // { items: [3, 4], page: 2, pageSize: 2, totalItems: 5, totalPages: 3 }\n *\n * paginate(items, { page: springPage, pageOffset: 0 }); // zero-based caller\n * ```\n *\n * @param items - The full list to page over.\n * @param options - Page number (in `pageOffset`'s base), page size, and base.\n * @returns The page envelope. Pages past the last yield empty `items`; the request is echoed, not clamped.\n *\n * @throws {TypeError} If the first argument is not an array.\n * @throws {RangeError} If `page` is not an integer in the base, or `pageSize` is not a positive integer.\n */\nexport function paginate<T>(items: readonly T[], options: PaginateOptions = {}): PageEnvelope<T> {\n if (!Array.isArray(items)) throw new TypeError('paginate: first argument must be an array');\n\n const { pageOffset = 1, pageSize = 20 } = options;\n const page = options.page ?? pageOffset;\n\n if (!Number.isInteger(pageSize) || pageSize < 1)\n throw new RangeError('paginate: pageSize must be a positive integer');\n if (!Number.isInteger(page) || page < pageOffset)\n throw new RangeError(`paginate: page must be an integer >= ${pageOffset}`);\n\n const totalPages = Math.max(1, Math.ceil(items.length / pageSize));\n const start = (page - pageOffset) * pageSize;\n\n return {\n items: items.slice(start, start + pageSize),\n page,\n pageSize,\n totalItems: items.length,\n totalPages,\n };\n}\n"],"mappings":"AA6CA,SAAgB,SAAY,EAAqB,EAA2B,CAAC,EAAoB,CAC/F,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,2CAA2C,EAE1F,GAAM,CAAE,aAAa,EAAG,WAAW,IAAO,EACpC,EAAO,EAAQ,MAAQ,EAE7B,GAAI,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,EAC5C,MAAU,WAAW,+CAA+C,EACtE,GAAI,CAAC,OAAO,UAAU,CAAI,GAAK,EAAO,EACpC,MAAU,WAAW,wCAAwC,GAAY,EAE3E,IAAM,EAAa,KAAK,IAAI,EAAG,KAAK,KAAK,EAAM,OAAS,CAAQ,CAAC,EAC3D,GAAS,EAAO,GAAc,EAEpC,MAAO,CACL,MAAO,EAAM,MAAM,EAAO,EAAQ,CAAQ,EAC1C,OACA,WACA,WAAY,EAAM,OAClB,YACF,CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * A page of items plus the arithmetic that produced it, in the caller's own page base.
3
+ * Deliberately server-neutral: it models no HTTP dialect (Spring, JSON:API, RFC 9457);
4
+ * adapters map their response onto this shape and map this shape back out.
5
+ */
6
+ export type PageEnvelope<T> = Readonly<{
7
+ /** The page's items; empty when `page` is past the last page. */
8
+ items: readonly T[];
9
+ /** The requested page, echoed in the caller's base. */
10
+ page: number;
11
+ /** Items per page. */
12
+ pageSize: number;
13
+ /** Size of the full list the page was cut from. */
14
+ totalItems: number;
15
+ /** At least 1, even for an empty list, so `page < totalPages` never underflows. */
16
+ totalPages: number;
17
+ }>;
18
+ export type PaginateOptions = Readonly<{
19
+ /** Page to cut, in the caller's base. Defaults to the first page of that base. */
20
+ page?: number;
21
+ /** Items per page. Default 20. */
22
+ pageSize?: number;
23
+ /** Base of `page`: 0 for zero-based servers (Spring), 1 for one-based (default). */
24
+ pageOffset?: 0 | 1;
25
+ }>;
26
+ /**
27
+ * Cuts one page out of an in-memory list.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * paginate([1, 2, 3, 4, 5], { page: 2, pageSize: 2 });
32
+ * // { items: [3, 4], page: 2, pageSize: 2, totalItems: 5, totalPages: 3 }
33
+ *
34
+ * paginate(items, { page: springPage, pageOffset: 0 }); // zero-based caller
35
+ * ```
36
+ *
37
+ * @param items - The full list to page over.
38
+ * @param options - Page number (in `pageOffset`'s base), page size, and base.
39
+ * @returns The page envelope. Pages past the last yield empty `items`; the request is echoed, not clamped.
40
+ *
41
+ * @throws {TypeError} If the first argument is not an array.
42
+ * @throws {RangeError} If `page` is not an integer in the base, or `pageSize` is not a positive integer.
43
+ */
44
+ export declare function paginate<T>(items: readonly T[], options?: PaginateOptions): PageEnvelope<T>;
45
+ //# sourceMappingURL=paginate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../src/array/paginate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;IACrC,iEAAiE;IACjE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,CAAC,CAAC,CAAC,CAqB/F"}
@@ -0,0 +1,2 @@
1
+ function paginate(e,t={}){if(!Array.isArray(e))throw TypeError(`paginate: first argument must be an array`);let{pageOffset:n=1,pageSize:r=20}=t,i=t.page??n;if(!Number.isInteger(r)||r<1)throw RangeError(`paginate: pageSize must be a positive integer`);if(!Number.isInteger(i)||i<n)throw RangeError(`paginate: page must be an integer >= ${n}`);let a=Math.max(1,Math.ceil(e.length/r)),o=(i-n)*r;return{items:e.slice(o,o+r),page:i,pageSize:r,totalItems:e.length,totalPages:a}}export{paginate};
2
+ //# sourceMappingURL=paginate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.js","names":[],"sources":["../../src/array/paginate.ts"],"sourcesContent":["/**\n * A page of items plus the arithmetic that produced it, in the caller's own page base.\n * Deliberately server-neutral: it models no HTTP dialect (Spring, JSON:API, RFC 9457);\n * adapters map their response onto this shape and map this shape back out.\n */\nexport type PageEnvelope<T> = Readonly<{\n /** The page's items; empty when `page` is past the last page. */\n items: readonly T[];\n /** The requested page, echoed in the caller's base. */\n page: number;\n /** Items per page. */\n pageSize: number;\n /** Size of the full list the page was cut from. */\n totalItems: number;\n /** At least 1, even for an empty list, so `page < totalPages` never underflows. */\n totalPages: number;\n}>;\n\nexport type PaginateOptions = Readonly<{\n /** Page to cut, in the caller's base. Defaults to the first page of that base. */\n page?: number;\n /** Items per page. Default 20. */\n pageSize?: number;\n /** Base of `page`: 0 for zero-based servers (Spring), 1 for one-based (default). */\n pageOffset?: 0 | 1;\n}>;\n\n/**\n * Cuts one page out of an in-memory list.\n *\n * @example\n * ```ts\n * paginate([1, 2, 3, 4, 5], { page: 2, pageSize: 2 });\n * // { items: [3, 4], page: 2, pageSize: 2, totalItems: 5, totalPages: 3 }\n *\n * paginate(items, { page: springPage, pageOffset: 0 }); // zero-based caller\n * ```\n *\n * @param items - The full list to page over.\n * @param options - Page number (in `pageOffset`'s base), page size, and base.\n * @returns The page envelope. Pages past the last yield empty `items`; the request is echoed, not clamped.\n *\n * @throws {TypeError} If the first argument is not an array.\n * @throws {RangeError} If `page` is not an integer in the base, or `pageSize` is not a positive integer.\n */\nexport function paginate<T>(items: readonly T[], options: PaginateOptions = {}): PageEnvelope<T> {\n if (!Array.isArray(items)) throw new TypeError('paginate: first argument must be an array');\n\n const { pageOffset = 1, pageSize = 20 } = options;\n const page = options.page ?? pageOffset;\n\n if (!Number.isInteger(pageSize) || pageSize < 1)\n throw new RangeError('paginate: pageSize must be a positive integer');\n if (!Number.isInteger(page) || page < pageOffset)\n throw new RangeError(`paginate: page must be an integer >= ${pageOffset}`);\n\n const totalPages = Math.max(1, Math.ceil(items.length / pageSize));\n const start = (page - pageOffset) * pageSize;\n\n return {\n items: items.slice(start, start + pageSize),\n page,\n pageSize,\n totalItems: items.length,\n totalPages,\n };\n}\n"],"mappings":"AA6CA,SAAgB,SAAY,EAAqB,EAA2B,CAAC,EAAoB,CAC/F,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,2CAA2C,EAE1F,GAAM,CAAE,aAAa,EAAG,WAAW,IAAO,EACpC,EAAO,EAAQ,MAAQ,EAE7B,GAAI,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,EAC5C,MAAU,WAAW,+CAA+C,EACtE,GAAI,CAAC,OAAO,UAAU,CAAI,GAAK,EAAO,EACpC,MAAU,WAAW,wCAAwC,GAAY,EAE3E,IAAM,EAAa,KAAK,IAAI,EAAG,KAAK,KAAK,EAAM,OAAS,CAAQ,CAAC,EAC3D,GAAS,EAAO,GAAc,EAEpC,MAAO,CACL,MAAO,EAAM,MAAM,EAAO,EAAQ,CAAQ,EAC1C,OACA,WACA,WAAY,EAAM,OAClB,YACF,CACF"}
@@ -1,2 +1,2 @@
1
- const e=require("./compare.cjs"),t=require("./compareBy.cjs");function sort(n,r,i=`asc`){if(!Array.isArray(n))throw TypeError(`sort: first argument must be an array`);if(typeof r==`function`){let t=i===`desc`?-1:1;return[...n].sort((n,i)=>e.compare(r(n),r(i))*t)}return[...n].sort(t.compareBy(r))}exports.sort=sort;
1
+ const e=require("./compare.cjs"),t=require("./compareBy.cjs"),n=require("../object/getPath.cjs");function isCriteriaForm(e){return Array.isArray(e)}function sort(r,i,a=`asc`){if(!Array.isArray(r))throw TypeError(`sort: first argument must be an array`);if(typeof i==`function`){let t=a===`desc`?-1:1;return[...r].sort((n,r)=>e.compare(i(n),i(r))*t)}if(isCriteriaForm(i)){let t=i.map(({direction:e=`asc`,key:t})=>({multiplier:e===`desc`?-1:1,path:String(t)}));return[...r].sort((r,i)=>{for(let{multiplier:a,path:o}of t){let t=e.compare(n.getPath(r,o),n.getPath(i,o))*a;if(t!==0)return t}return 0})}return[...r].sort(t.compareBy(i))}exports.sort=sort;
2
2
  //# sourceMappingURL=sort.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort.cjs","names":[],"sources":["../../src/array/sort.ts"],"sourcesContent":["import { compare } from './compare';\nimport { compareBy } from './compareBy';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;\n\n/**\n * Sorts an array by a selector function (single-field) or by a multi-field\n * object of `{ key: 'asc' | 'desc' }` entries.\n *\n * @example\n * ```ts\n * // Single field\n * sort([{ a: 2 }, { a: 1 }], item => item.a); // [{ a:1 }, { a:2 }]\n * sort([{ a: 2 }, { a: 1 }], item => item.a, 'desc'); // [{ a:2 }, { a:1 }]\n *\n * // Multi-field\n * sort(users, { name: 'asc', age: 'desc' });\n * ```\n *\n * @param array - The array to sort.\n * @param selector - A function extracting the sort key, or a multi-field object.\n * @param direction - `'asc'` (default) or `'desc'`: only applies to single-field mode.\n * @returns A new sorted array.\n *\n * @throws {TypeError} If the first argument is not an array.\n */\nexport function sort<T>(array: readonly T[], selector: (item: T) => unknown, direction?: SortDirection): T[];\nexport function sort<T>(array: readonly T[], selectors: SortSelectors<T>): T[];\nexport function sort<T>(\n array: readonly T[],\n selectorOrSelectors: ((item: T) => unknown) | SortSelectors<T>,\n direction: SortDirection = 'asc',\n): T[] {\n if (!Array.isArray(array)) throw new TypeError('sort: first argument must be an array');\n\n if (typeof selectorOrSelectors === 'function') {\n const multiplier = direction === 'desc' ? -1 : 1;\n\n return [...array].sort((a, b) => compare(selectorOrSelectors(a), selectorOrSelectors(b)) * multiplier);\n }\n\n return [...array].sort(compareBy(selectorOrSelectors));\n}\n"],"mappings":"8DA6BA,SAAgB,KACd,EACA,EACA,EAA2B,MACtB,CACL,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,uCAAuC,EAEtF,GAAI,OAAO,GAAwB,WAAY,CAC7C,IAAM,EAAa,IAAc,OAAS,GAAK,EAE/C,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAA,QAAQ,EAAoB,CAAC,EAAG,EAAoB,CAAC,CAAC,EAAI,CAAU,CACvG,CAEA,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,EAAA,UAAU,CAAmB,CAAC,CACvD"}
1
+ {"version":3,"file":"sort.cjs","names":[],"sources":["../../src/array/sort.ts"],"sourcesContent":["import { getPath } from '../object/getPath';\nimport { compare } from './compare';\nimport { compareBy } from './compareBy';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;\n\n/**\n * One ordering term: a dot-notation path into the item plus its direction.\n *\n * `key` accepts a `keyof T` or any dotted/bracketed path (`'address.city'`,\n * `'tags[0]'`), because a data grid's sortable columns are strings known only at\n * runtime. Values are resolved with `getPath`, which refuses prototype-access segments.\n */\nexport type SortCriterion<T> = Readonly<{\n key: keyof T | (string & {});\n direction?: SortDirection;\n}>;\n\n/**\n * Criteria arrive as a plain or frozen array from callers; `Array.isArray` alone cannot\n * narrow a `ReadonlyArray` member out of a union, so the discriminant gets a name.\n */\nfunction isCriteriaForm<T>(\n value: ((item: T) => unknown) | ReadonlyArray<SortCriterion<T>> | SortSelectors<T>,\n): value is ReadonlyArray<SortCriterion<T>> {\n return Array.isArray(value);\n}\n\n/**\n * Sorts an array by a selector function (single-field), by a multi-field object of\n * `{ key: 'asc' | 'desc' }` entries, or by an ordered list of path criteria.\n *\n * The criteria form is the one a grid or table hands over: column ids arrive as\n * runtime strings, so they cannot be typed `keyof T` keys. Ordering is delegated to\n * `compare`, which means a column mixing incompatible value types (a number beside a\n * string) throws a `TypeError` instead of guessing an order — keep columns typed.\n *\n * Ties keep their input order: `Array.prototype.sort` is stable in every supported\n * engine and no tiebreaker is layered on top.\n *\n * @example\n * ```ts\n * // Single field\n * sort([{ a: 2 }, { a: 1 }], item => item.a); // [{ a:1 }, { a:2 }]\n * sort([{ a: 2 }, { a: 1 }], item => item.a, 'desc'); // [{ a:2 }, { a:1 }]\n *\n * // Multi-field by key\n * sort(users, { name: 'asc', age: 'desc' });\n *\n * // Ordered path criteria, nested paths included\n * sort(rows, [{ key: 'address.city' }, { key: 'age', direction: 'desc' }]);\n * ```\n *\n * @param array - The array to sort.\n * @param selector - A function extracting the sort key, a multi-field object, or path criteria.\n * @param direction - `'asc'` (default) or `'desc'`: only applies to single-field mode.\n * @returns A new sorted array.\n *\n * @throws {TypeError} If the first argument is not an array, or a column mixes value types.\n */\nexport function sort<T>(array: readonly T[], selector: (item: T) => unknown, direction?: SortDirection): T[];\nexport function sort<T>(array: readonly T[], selectors: SortSelectors<T>): T[];\nexport function sort<T>(array: readonly T[], criteria: ReadonlyArray<SortCriterion<T>>): T[];\nexport function sort<T>(\n array: readonly T[],\n selectorOrSelectors: ((item: T) => unknown) | ReadonlyArray<SortCriterion<T>> | SortSelectors<T>,\n direction: SortDirection = 'asc',\n): T[] {\n if (!Array.isArray(array)) throw new TypeError('sort: first argument must be an array');\n\n if (typeof selectorOrSelectors === 'function') {\n const multiplier = direction === 'desc' ? -1 : 1;\n\n return [...array].sort((a, b) => compare(selectorOrSelectors(a), selectorOrSelectors(b)) * multiplier);\n }\n\n if (isCriteriaForm(selectorOrSelectors)) {\n const criteria = selectorOrSelectors.map(({ direction: dir = 'asc', key }) => ({\n multiplier: dir === 'desc' ? -1 : 1,\n path: String(key),\n }));\n\n return [...array].sort((a, b) => {\n for (const { multiplier, path } of criteria) {\n const result = compare(getPath(a, path), getPath(b, path)) * multiplier;\n\n if (result !== 0) return result;\n }\n\n return 0;\n });\n }\n\n return [...array].sort(compareBy(selectorOrSelectors));\n}\n"],"mappings":"iGAuBA,SAAS,eACP,EAC0C,CAC1C,OAAO,MAAM,QAAQ,CAAK,CAC5B,CAqCA,SAAgB,KACd,EACA,EACA,EAA2B,MACtB,CACL,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,uCAAuC,EAEtF,GAAI,OAAO,GAAwB,WAAY,CAC7C,IAAM,EAAa,IAAc,OAAS,GAAK,EAE/C,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAA,QAAQ,EAAoB,CAAC,EAAG,EAAoB,CAAC,CAAC,EAAI,CAAU,CACvG,CAEA,GAAI,eAAe,CAAmB,EAAG,CACvC,IAAM,EAAW,EAAoB,KAAK,CAAE,UAAW,EAAM,MAAO,UAAW,CAC7E,WAAY,IAAQ,OAAS,GAAK,EAClC,KAAM,OAAO,CAAG,CAClB,EAAE,EAEF,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,CAC/B,IAAK,GAAM,CAAE,aAAY,UAAU,EAAU,CAC3C,IAAM,EAAS,EAAA,QAAQ,EAAA,QAAQ,EAAG,CAAI,EAAG,EAAA,QAAQ,EAAG,CAAI,CAAC,EAAI,EAE7D,GAAI,IAAW,EAAG,OAAO,CAC3B,CAEA,MAAO,EACT,CAAC,CACH,CAEA,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,EAAA,UAAU,CAAmB,CAAC,CACvD"}
@@ -1,8 +1,27 @@
1
1
  export type SortDirection = 'asc' | 'desc';
2
2
  export type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;
3
3
  /**
4
- * Sorts an array by a selector function (single-field) or by a multi-field
5
- * object of `{ key: 'asc' | 'desc' }` entries.
4
+ * One ordering term: a dot-notation path into the item plus its direction.
5
+ *
6
+ * `key` accepts a `keyof T` or any dotted/bracketed path (`'address.city'`,
7
+ * `'tags[0]'`), because a data grid's sortable columns are strings known only at
8
+ * runtime. Values are resolved with `getPath`, which refuses prototype-access segments.
9
+ */
10
+ export type SortCriterion<T> = Readonly<{
11
+ key: keyof T | (string & {});
12
+ direction?: SortDirection;
13
+ }>;
14
+ /**
15
+ * Sorts an array by a selector function (single-field), by a multi-field object of
16
+ * `{ key: 'asc' | 'desc' }` entries, or by an ordered list of path criteria.
17
+ *
18
+ * The criteria form is the one a grid or table hands over: column ids arrive as
19
+ * runtime strings, so they cannot be typed `keyof T` keys. Ordering is delegated to
20
+ * `compare`, which means a column mixing incompatible value types (a number beside a
21
+ * string) throws a `TypeError` instead of guessing an order — keep columns typed.
22
+ *
23
+ * Ties keep their input order: `Array.prototype.sort` is stable in every supported
24
+ * engine and no tiebreaker is layered on top.
6
25
  *
7
26
  * @example
8
27
  * ```ts
@@ -10,17 +29,21 @@ export type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;
10
29
  * sort([{ a: 2 }, { a: 1 }], item => item.a); // [{ a:1 }, { a:2 }]
11
30
  * sort([{ a: 2 }, { a: 1 }], item => item.a, 'desc'); // [{ a:2 }, { a:1 }]
12
31
  *
13
- * // Multi-field
32
+ * // Multi-field by key
14
33
  * sort(users, { name: 'asc', age: 'desc' });
34
+ *
35
+ * // Ordered path criteria, nested paths included
36
+ * sort(rows, [{ key: 'address.city' }, { key: 'age', direction: 'desc' }]);
15
37
  * ```
16
38
  *
17
39
  * @param array - The array to sort.
18
- * @param selector - A function extracting the sort key, or a multi-field object.
40
+ * @param selector - A function extracting the sort key, a multi-field object, or path criteria.
19
41
  * @param direction - `'asc'` (default) or `'desc'`: only applies to single-field mode.
20
42
  * @returns A new sorted array.
21
43
  *
22
- * @throws {TypeError} If the first argument is not an array.
44
+ * @throws {TypeError} If the first argument is not an array, or a column mixes value types.
23
45
  */
24
46
  export declare function sort<T>(array: readonly T[], selector: (item: T) => unknown, direction?: SortDirection): T[];
25
47
  export declare function sort<T>(array: readonly T[], selectors: SortSelectors<T>): T[];
48
+ export declare function sort<T>(array: readonly T[], criteria: ReadonlyArray<SortCriterion<T>>): T[];
26
49
  //# sourceMappingURL=sort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../src/array/sort.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAC3C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC;AAC7G,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../src/array/sort.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAC3C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,QAAQ,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC,CAAC;AAYH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC;AAC7G,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/E,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- import{compare as e}from"./compare.js";import{compareBy as t}from"./compareBy.js";function sort(n,r,i=`asc`){if(!Array.isArray(n))throw TypeError(`sort: first argument must be an array`);if(typeof r==`function`){let t=i===`desc`?-1:1;return[...n].sort((n,i)=>e(r(n),r(i))*t)}return[...n].sort(t(r))}export{sort};
1
+ import{compare as e}from"./compare.js";import{compareBy as t}from"./compareBy.js";import{getPath as n}from"../object/getPath.js";function isCriteriaForm(e){return Array.isArray(e)}function sort(r,i,a=`asc`){if(!Array.isArray(r))throw TypeError(`sort: first argument must be an array`);if(typeof i==`function`){let t=a===`desc`?-1:1;return[...r].sort((n,r)=>e(i(n),i(r))*t)}if(isCriteriaForm(i)){let t=i.map(({direction:e=`asc`,key:t})=>({multiplier:e===`desc`?-1:1,path:String(t)}));return[...r].sort((r,i)=>{for(let{multiplier:a,path:o}of t){let t=e(n(r,o),n(i,o))*a;if(t!==0)return t}return 0})}return[...r].sort(t(i))}export{sort};
2
2
  //# sourceMappingURL=sort.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort.js","names":[],"sources":["../../src/array/sort.ts"],"sourcesContent":["import { compare } from './compare';\nimport { compareBy } from './compareBy';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;\n\n/**\n * Sorts an array by a selector function (single-field) or by a multi-field\n * object of `{ key: 'asc' | 'desc' }` entries.\n *\n * @example\n * ```ts\n * // Single field\n * sort([{ a: 2 }, { a: 1 }], item => item.a); // [{ a:1 }, { a:2 }]\n * sort([{ a: 2 }, { a: 1 }], item => item.a, 'desc'); // [{ a:2 }, { a:1 }]\n *\n * // Multi-field\n * sort(users, { name: 'asc', age: 'desc' });\n * ```\n *\n * @param array - The array to sort.\n * @param selector - A function extracting the sort key, or a multi-field object.\n * @param direction - `'asc'` (default) or `'desc'`: only applies to single-field mode.\n * @returns A new sorted array.\n *\n * @throws {TypeError} If the first argument is not an array.\n */\nexport function sort<T>(array: readonly T[], selector: (item: T) => unknown, direction?: SortDirection): T[];\nexport function sort<T>(array: readonly T[], selectors: SortSelectors<T>): T[];\nexport function sort<T>(\n array: readonly T[],\n selectorOrSelectors: ((item: T) => unknown) | SortSelectors<T>,\n direction: SortDirection = 'asc',\n): T[] {\n if (!Array.isArray(array)) throw new TypeError('sort: first argument must be an array');\n\n if (typeof selectorOrSelectors === 'function') {\n const multiplier = direction === 'desc' ? -1 : 1;\n\n return [...array].sort((a, b) => compare(selectorOrSelectors(a), selectorOrSelectors(b)) * multiplier);\n }\n\n return [...array].sort(compareBy(selectorOrSelectors));\n}\n"],"mappings":"kFA6BA,SAAgB,KACd,EACA,EACA,EAA2B,MACtB,CACL,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,uCAAuC,EAEtF,GAAI,OAAO,GAAwB,WAAY,CAC7C,IAAM,EAAa,IAAc,OAAS,GAAK,EAE/C,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAQ,EAAoB,CAAC,EAAG,EAAoB,CAAC,CAAC,EAAI,CAAU,CACvG,CAEA,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,EAAU,CAAmB,CAAC,CACvD"}
1
+ {"version":3,"file":"sort.js","names":[],"sources":["../../src/array/sort.ts"],"sourcesContent":["import { getPath } from '../object/getPath';\nimport { compare } from './compare';\nimport { compareBy } from './compareBy';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortSelectors<T> = Partial<Record<keyof T, SortDirection>>;\n\n/**\n * One ordering term: a dot-notation path into the item plus its direction.\n *\n * `key` accepts a `keyof T` or any dotted/bracketed path (`'address.city'`,\n * `'tags[0]'`), because a data grid's sortable columns are strings known only at\n * runtime. Values are resolved with `getPath`, which refuses prototype-access segments.\n */\nexport type SortCriterion<T> = Readonly<{\n key: keyof T | (string & {});\n direction?: SortDirection;\n}>;\n\n/**\n * Criteria arrive as a plain or frozen array from callers; `Array.isArray` alone cannot\n * narrow a `ReadonlyArray` member out of a union, so the discriminant gets a name.\n */\nfunction isCriteriaForm<T>(\n value: ((item: T) => unknown) | ReadonlyArray<SortCriterion<T>> | SortSelectors<T>,\n): value is ReadonlyArray<SortCriterion<T>> {\n return Array.isArray(value);\n}\n\n/**\n * Sorts an array by a selector function (single-field), by a multi-field object of\n * `{ key: 'asc' | 'desc' }` entries, or by an ordered list of path criteria.\n *\n * The criteria form is the one a grid or table hands over: column ids arrive as\n * runtime strings, so they cannot be typed `keyof T` keys. Ordering is delegated to\n * `compare`, which means a column mixing incompatible value types (a number beside a\n * string) throws a `TypeError` instead of guessing an order — keep columns typed.\n *\n * Ties keep their input order: `Array.prototype.sort` is stable in every supported\n * engine and no tiebreaker is layered on top.\n *\n * @example\n * ```ts\n * // Single field\n * sort([{ a: 2 }, { a: 1 }], item => item.a); // [{ a:1 }, { a:2 }]\n * sort([{ a: 2 }, { a: 1 }], item => item.a, 'desc'); // [{ a:2 }, { a:1 }]\n *\n * // Multi-field by key\n * sort(users, { name: 'asc', age: 'desc' });\n *\n * // Ordered path criteria, nested paths included\n * sort(rows, [{ key: 'address.city' }, { key: 'age', direction: 'desc' }]);\n * ```\n *\n * @param array - The array to sort.\n * @param selector - A function extracting the sort key, a multi-field object, or path criteria.\n * @param direction - `'asc'` (default) or `'desc'`: only applies to single-field mode.\n * @returns A new sorted array.\n *\n * @throws {TypeError} If the first argument is not an array, or a column mixes value types.\n */\nexport function sort<T>(array: readonly T[], selector: (item: T) => unknown, direction?: SortDirection): T[];\nexport function sort<T>(array: readonly T[], selectors: SortSelectors<T>): T[];\nexport function sort<T>(array: readonly T[], criteria: ReadonlyArray<SortCriterion<T>>): T[];\nexport function sort<T>(\n array: readonly T[],\n selectorOrSelectors: ((item: T) => unknown) | ReadonlyArray<SortCriterion<T>> | SortSelectors<T>,\n direction: SortDirection = 'asc',\n): T[] {\n if (!Array.isArray(array)) throw new TypeError('sort: first argument must be an array');\n\n if (typeof selectorOrSelectors === 'function') {\n const multiplier = direction === 'desc' ? -1 : 1;\n\n return [...array].sort((a, b) => compare(selectorOrSelectors(a), selectorOrSelectors(b)) * multiplier);\n }\n\n if (isCriteriaForm(selectorOrSelectors)) {\n const criteria = selectorOrSelectors.map(({ direction: dir = 'asc', key }) => ({\n multiplier: dir === 'desc' ? -1 : 1,\n path: String(key),\n }));\n\n return [...array].sort((a, b) => {\n for (const { multiplier, path } of criteria) {\n const result = compare(getPath(a, path), getPath(b, path)) * multiplier;\n\n if (result !== 0) return result;\n }\n\n return 0;\n });\n }\n\n return [...array].sort(compareBy(selectorOrSelectors));\n}\n"],"mappings":"iIAuBA,SAAS,eACP,EAC0C,CAC1C,OAAO,MAAM,QAAQ,CAAK,CAC5B,CAqCA,SAAgB,KACd,EACA,EACA,EAA2B,MACtB,CACL,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,UAAU,uCAAuC,EAEtF,GAAI,OAAO,GAAwB,WAAY,CAC7C,IAAM,EAAa,IAAc,OAAS,GAAK,EAE/C,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAQ,EAAoB,CAAC,EAAG,EAAoB,CAAC,CAAC,EAAI,CAAU,CACvG,CAEA,GAAI,eAAe,CAAmB,EAAG,CACvC,IAAM,EAAW,EAAoB,KAAK,CAAE,UAAW,EAAM,MAAO,UAAW,CAC7E,WAAY,IAAQ,OAAS,GAAK,EAClC,KAAM,OAAO,CAAG,CAClB,EAAE,EAEF,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,CAC/B,IAAK,GAAM,CAAE,aAAY,UAAU,EAAU,CAC3C,IAAM,EAAS,EAAQ,EAAQ,EAAG,CAAI,EAAG,EAAQ,EAAG,CAAI,CAAC,EAAI,EAE7D,GAAI,IAAW,EAAG,OAAO,CAC3B,CAEA,MAAO,EACT,CAAC,CACH,CAEA,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,EAAU,CAAmB,CAAC,CACvD"}
package/dist/arsenal.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function chunk(e,t=2){if(!Array.isArray(e)&&typeof e!=`string`)throw TypeError(`chunk: argument must be an array or string`);if(!Number.isInteger(t)||t<1)throw RangeError(`chunk: size must be a positive integer`);return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,r*t+t))}function filterMap(e,t){let n=[];for(let r=0;r<e.length;r++){let i=t(e[r],r,e);i!==void 0&&n.push(i)}return n}var e=new Set([`__proto__`,`constructor`,`prototype`]);function isUnsafeKey(t){return typeof t==`string`&&e.has(t)}function groupBy(e,t){let n={};for(let r of e){let e=t(r),i=e==null?`_`:String(e);isUnsafeKey(i)||(n[i]||(n[i]=[]),n[i].push(r))}return n}function indexBy(e,t){let n={};for(let r of e){let e=String(t(r));isUnsafeKey(e)||(n[e]=r)}return n}function partition(e,t){let n=[],r=[];for(let i=0;i<e.length;i++)t(e[i],i,e)?n.push(e[i]):r.push(e[i]);return[n,r]}var compare=(e,t)=>{if(e===t)return 0;if(e===void 0)return 1;if(t===void 0)return-1;if(e===null)return t===null?0:-1;if(t===null)return 1;if(typeof e==`string`&&typeof t==`string`)return e.localeCompare(t);if(typeof e==`number`&&typeof t==`number`)return e===t?0:e>t?1:-1;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n===r?0:n>r?1:-1}throw TypeError(`compare: unsupported types "${typeof e}" and "${typeof t}". Supported: number, string, Date, null, undefined.`)},compareBy=e=>{let t=Object.entries(e);return(e,n)=>{for(let[r,i]of t){let t=e[r],a=n[r],o=i===`desc`?-1:1,s=compare(t,a);if(s!==0)return s*o}return 0}};function sort(e,t,n=`asc`){if(!Array.isArray(e))throw TypeError(`sort: first argument must be an array`);if(typeof t==`function`){let r=n===`desc`?-1:1;return[...e].sort((e,n)=>compare(t(e),t(n))*r)}return[...e].sort(compareBy(t))}function dedupeBySelector(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)||(n.add(e),r.push(i))}return r}function uniq(e,t){return e.length<=1?[...e]:t?dedupeBySelector(e,t):[...new Set(e)]}function abortError(e,t=`Aborted`){return e?.reason??new DOMException(t,`AbortError`)}function abortable(e,t){return t.aborted?Promise.reject(abortError(t)):new Promise((n,r)=>{let onAbort=()=>r(abortError(t));t.addEventListener(`abort`,onAbort,{once:!0}),e.then(e=>n(e)).catch(e=>r(e)).finally(()=>t.removeEventListener(`abort`,onAbort))})}function isOk(e){return e.ok===!0}function isFail(e){return e.ok===!1}async function attempt(e){try{return{ok:!0,value:await e()}}catch(e){return{error:e,ok:!1}}}function backoff(e,t=3e4){return Math.min(1e3*2**Math.max(0,Number.isNaN(e)?0:Math.floor(e)),t)}async function parallel(e,t,n={}){let{abortOnError:r=!1,limit:i=1/0,signal:a}=n;if(i<1)throw RangeError(`parallel: limit must be at least 1, got ${i}`);if(a?.aborted)throw abortError(a);if(e.length===0)return[];let o=Array(e.length),s=0,c=r?new AbortController:void 0,worker=async()=>{for(;;){if(a?.aborted)throw abortError(a);if(c?.signal.aborted||s>=e.length)return;let n=s++;try{o[n]=await t(e[n],n,e)}catch(e){throw c?.abort(),e}}},l=Math.min(i,e.length),u=Array.from({length:l},()=>worker());return await Promise.all(u),o}async function sleep(e,t){return t?t.aborted?Promise.reject(abortError(t)):new Promise((n,r)=>{let i=setTimeout(()=>{t.removeEventListener(`abort`,onAbort),n()},e),onAbort=()=>{clearTimeout(i),t.removeEventListener(`abort`,onAbort),r(abortError(t))};t.addEventListener(`abort`,onAbort)}):new Promise(t=>setTimeout(t,e))}function buildSignal(e,t){let n=[e===void 0?void 0:AbortSignal.timeout(e),t].filter(e=>e!=null);if(n.length!==0)return n.length===1?n[0]:AbortSignal.any(n)}async function retry(e,{delay:t=250,shouldRetry:n,signal:r,timeout:i,times:a=3}={}){if(!Number.isInteger(a)||a<1)throw RangeError(`retry: times must be a positive integer, got ${a}`);for(let o=1;o<=a;o++){if(r?.aborted)throw abortError(r);let s=buildSignal(i,r);try{return await e(s)}catch(e){if(o===a||n&&!n(e,o-1))throw e;let i=typeof t==`function`?t(o-1):t;i>0&&await sleep(i,r)}}}function taskPool({concurrency:e=1}={}){if(!Number.isInteger(e)||e<1)throw RangeError(`taskPool: concurrency must be a positive integer`);let t=new AbortController,n=[],r=0,i=!1,a,resolveIdle=()=>{r===0&&n.length===0&&(a?.resolve(),a=void 0)},start=()=>{for(;r<e&&n.length>0;){let e=n.shift();r++,Promise.resolve().then(()=>e.run(t.signal)).then(e.resolve,e.reject).finally(()=>{r--,start(),resolveIdle()})}};return{get active(){return r},get disposalSignal(){return t.signal},dispose:(e=new DOMException(`Task pool disposed`,`AbortError`))=>{if(!i){i=!0,t.abort(e);for(let t of n.splice(0))t.reject(e);resolveIdle()}},get disposed(){return i},idle:()=>r===0&&n.length===0?Promise.resolve():(a??=Promise.withResolvers(),a.promise),get pending(){return n.length},run:e=>{let r=Promise.withResolvers();return i?(r.reject(t.signal.reason),r.promise):(n.push({reject:r.reject,resolve:r.resolve,run:e}),start(),r.promise)},[Symbol.dispose](){this.dispose()}}}async function waitFor(e,{interval:t=100,signal:n,timeout:r=5e3}={}){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;for(a.throwIfAborted();;){if(a.throwIfAborted(),await e(a))return;await sleep(t,a)}}function cache({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,advanceRevision=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},expiresAt=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},read=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},trim=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},set=(e,t,i={})=>{advanceRevision(e),r.delete(e),r.set(e,{expiresAt:expiresAt(i.ttlMs??n),value:t}),trim()},getOrLoad=(e,t)=>{let n=read(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let s=i.get(e);if(s)return s;let c=o,l=advanceRevision(e),u=t().then(t=>(i.get(e)===u&&i.delete(e),o===c&&a.get(e)===l&&set(e,t),t),t=>{throw i.get(e)===u&&i.delete(e),t});return i.set(e,u),u};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),advanceRevision(e),r.delete(e)),entries:()=>(trim(),[...r].map(([e,t])=>[e,t.value])),get:read,getOrLoad,set,get size(){return r.size}}}var LruMap=class extends Map{maxSize;constructor(e){super(),this.maxSize=e}set(e,t){return this.has(e)&&this.delete(e),super.set(e,t),this.size>this.maxSize&&this.evictOldest(),this}evictOldest(e=()=>!0){for(let[t,n]of this)if(e(t,n))return this.delete(t),!0;return!1}},ArsenalError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},ArsenalSerializationError=class extends ArsenalError{},ShareCodeError=class extends ArsenalError{reason;constructor(e,t,n){super(t,n),this.reason=e}},t=`\0undefined\0`,n=`\0NaN\0`,r=`\0+Infinity\0`,i=`\0-Infinity\0`,a=`\0function\0`,o=0,s=new WeakMap;function idForFunction(e){let t=s.get(e);return t===void 0&&(t=o++,s.set(e,t)),t}var defaultKey=e=>{try{return JSON.stringify(e,(e,o)=>o===void 0?t:typeof o==`number`&&Number.isNaN(o)?n:o===1/0?r:o===-1/0?i:typeof o==`function`?`${a}${idForFunction(o)}`:o)}catch(e){throw new ArsenalSerializationError(`[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${e instanceof Error&&e.message?` Reason: ${e.message}`:``}`,{cause:e})}};function memo(e,{key:t,maxSize:n=1/0}={}){if(n!==1/0&&(!Number.isInteger(n)||n<1))throw RangeError(`memo: maxSize must be a positive integer or Infinity, got ${n}`);let r=new LruMap(n),resolveKey=(...e)=>t?t(...e):defaultKey(e),memoized=(...t)=>{let n=resolveKey(...t);if(r.has(n)){let e=r.get(n);return r.set(n,e),e}let i=e(...t);return r.set(n,i),i},i=Object.assign(memoized,{clear:()=>r.clear(),invalidate:(...e)=>{r.delete(resolveKey(...e))}});return Object.defineProperty(i,"size",{get:()=>r.size}),i}var c=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,l=new Map([...c].map((e,t)=>[e,t]));function bytesToBase64Url(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=e[n+1],a=e[n+2];t+=c[r>>2],t+=c[(r&3)<<4|(i??0)>>4],i!==void 0&&(t+=c[(i&15)<<2|(a??0)>>6]),a!==void 0&&(t+=c[a&63])}return t}function base64UrlToBytes(e){let t=[],n=0,r=0;for(let i of e){let e=l.get(i);if(e===void 0)throw Error(`Invalid base64url character "${i}"`);n=n<<6|e,r+=6,r>=8&&(r-=8,t.push(n>>r&255))}return new Uint8Array(t)}var u=new TextEncoder,d=new TextDecoder;function textToBase64Url(e){return bytesToBase64Url(u.encode(e))}function base64UrlToText(e){return d.decode(base64UrlToBytes(e))}function utf8Bytes(e){return u.encode(e).length}async function transformBytes(e,t,n){let r=new ReadableStream({start(t){t.enqueue(new Uint8Array(e)),t.close()}}).pipeThrough(t).getReader(),i=[],a=0;try{for(;;){let{done:e,value:t}=await r.read();if(e)break;if(a+=t.byteLength,a>n)throw new ArsenalSerializationError(`Decompressed data exceeds the byte limit.`);i.push(t)}}catch(e){throw await r.cancel(e).catch(()=>void 0),e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Unable to transform compressed data.`,{cause:e})}finally{r.releaseLock()}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return o}async function compressBytes(e,t={}){try{return await transformBytes(e,new CompressionStream(t.format??`deflate-raw`),1/0)}catch(e){throw e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Compression is unavailable for this format.`,{cause:e})}}async function decompressBytes(e,t){if(!Number.isSafeInteger(t.maxOutputBytes)||t.maxOutputBytes<0)throw new ArsenalSerializationError(`maxOutputBytes must be a non-negative safe integer.`);try{return await transformBytes(e,new DecompressionStream(t.format??`deflate-raw`),t.maxOutputBytes)}catch(e){throw e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Decompression is unavailable for this format.`,{cause:e})}}var f=new TextEncoder,p=new TextDecoder(`utf-8`,{fatal:!0});function assertOptions({maxBytes:e,prefix:t}){if(!Number.isSafeInteger(e)||e<=0)throw new ShareCodeError(`invalid`,`maxBytes must be a positive safe integer.`);if(!/^[A-Za-z0-9]{1,8}$/.test(t))throw new ShareCodeError(`invalid`,`The prefix must be 1–8 alphanumeric characters.`)}function streamsAvailable(){try{return new CompressionStream(`deflate-raw`),new DecompressionStream(`deflate-raw`),!0}catch{return!1}}function decompressionAvailable(){try{return new DecompressionStream(`deflate-raw`),!0}catch{return!1}}async function pack(e,t){assertOptions(t);let{maxBytes:n,prefix:r}=t,i;try{i=JSON.stringify(e)}catch(e){throw new ShareCodeError(`invalid`,`The share payload is not JSON-serializable.`,{cause:e})}if(i===void 0)throw new ShareCodeError(`invalid`,`The share payload is not JSON-serializable.`);let a=f.encode(i);if(a.length>n)throw new ShareCodeError(`too-large`,`The share payload exceeds the byte limit.`);let o=`${r}r.${bytesToBase64Url(a)}`;if(!streamsAvailable())return o;let s=`${r}d.${bytesToBase64Url(await compressBytes(a))}`;return s.length<o.length?s:o}async function unpack(e,t){assertOptions(t);let{maxBytes:n,prefix:r}=t,i=e.trim(),a=Math.ceil(n*4/3)+r.length+2;if(i.length>a)throw new ShareCodeError(`too-large`,`The share code exceeds the length limit.`);let o=i.slice(r.length,r.length+1);if(!i.startsWith(r)||o!==`r`&&o!==`d`||i[r.length+1]!==`.`)throw new ShareCodeError(`invalid`,`That share code format is not supported.`);let s=i.slice(r.length+2);if(!/^[A-Za-z0-9_-]+$/.test(s))throw new ShareCodeError(`invalid`,`Malformed share code.`);let c=base64UrlToBytes(s);if(bytesToBase64Url(c)!==s)throw new ShareCodeError(`invalid`,`Malformed share code.`);if(o===`d`&&!decompressionAvailable())throw new ShareCodeError(`compression-unavailable`,`Raw-DEFLATE decompression is unavailable in this browser.`);let l=o===`d`?await decompressBytes(c,{maxOutputBytes:n}):c;if(l.length>n)throw new ShareCodeError(`too-large`,`The share payload exceeds the byte limit.`);try{return JSON.parse(p.decode(l))}catch(e){throw new ShareCodeError(`invalid`,`The share code payload is not valid UTF-8 JSON.`,{cause:e})}}function debounce(e,t=300,n={leading:!1,trailing:!0}){let r=n.leading??!1,i=n.trailing??!0,a,o,s,c=!1,clearTimer=()=>{a!==void 0&&(clearTimeout(a),a=void 0)},invokeTrailing=()=>{if(clearTimer(),c=!1,!o)return;let t=o;return o=void 0,s=e(...t),s};return Object.assign((...n)=>(o=n,r&&!c&&(c=!0,s=e(...n),o=void 0,!i)?(a=setTimeout(()=>{a=void 0,c=!1},t),s):r&&!i&&c?s:(clearTimer(),a=setTimeout(invokeTrailing,t),s)),{cancel:()=>{clearTimer(),o=void 0,c=!1},flush:()=>invokeTrailing(),pending:()=>a!==void 0})}var once=e=>{let t,n=!1,wrappedFn=((...r)=>(n||=(t=e(...r),!0),t));return wrappedFn.reset=()=>{t=void 0,n=!1},wrappedFn};function pipe(...e){if(e.length===0)return e=>e;let[t,...n]=e;return(...e)=>n.reduce((e,t)=>t(e),t(...e))}var noop=()=>{};function tapper(){let e=new Set;return{clear(){e.clear()},emit(t){if(e.size!==0)for(let n of[...e])try{n(t)}catch{}},get size(){return e.size},tap(t,n){let r=n?.signal;if(r?.aborted)return noop;e.add(t);let detach=()=>{e.delete(t),r?.removeEventListener(`abort`,detach)};return r?.addEventListener(`abort`,detach,{once:!0}),detach}}}function throttle(e,t=700,n={leading:!0,trailing:!1}){let r=n.leading??!0,i=n.trailing??!1,a,o=-1/0,s,c,clearTimer=()=>{a!==void 0&&(clearTimeout(a),a=void 0)},scheduleTimer=e=>{a=setTimeout(timerExpired,e)},invoke=t=>{if(o=t,clearTimer(),!s)return;let n=s;return s=void 0,c=e(...n),c},remaining=e=>t-(e-o),timerExpired=()=>{let e=Date.now();s&&remaining(e)<=0?invoke(e):s?scheduleTimer(remaining(e)):clearTimer()};return Object.assign((...e)=>{let t=Date.now();o===-1/0&&!r&&(o=t),s=e;let n=remaining(t);return n<=0?invoke(t):(i&&!a&&scheduleTimer(n),c)},{cancel:()=>{clearTimer(),s=void 0,o=-1/0},flush:()=>{if(s)return invoke(Date.now())},pending:()=>s!==void 0||a!==void 0})}function allOf(...e){return t=>e.every(e=>e(t))}function anyOf(...e){return t=>e.some(e=>e(t))}function noneOf(...e){return t=>e.every(e=>!e(t))}function not(e){return t=>!e(t)}function isDefined(e){return e!==void 0}function isEqual(e,t){return safeIsEqual(e,t,new WeakMap)}function safeIsEqual(e,t,n){if(e===t)return!0;if(e==null||t==null||typeof e!=typeof t||typeof e!=`object`||typeof t!=`object`)return!1;if(n.has(e))return n.get(e)===t;if(n.set(e,t),Array.isArray(e)||Array.isArray(t))return!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?!1:e.every((e,r)=>safeIsEqual(e,t[r],n));if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(let[r,i]of e)if(!t.has(r)||!safeIsEqual(i,t.get(r),n))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;let r=[...t];for(let i of e)if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`||i==null){if(!t.has(i))return!1}else if(!r.some(e=>safeIsEqual(i,e,n)))return!1;return!0}if(e instanceof RegExp||t instanceof RegExp)return e instanceof RegExp&&t instanceof RegExp&&e.source===t.source&&e.flags===t.flags;if(e instanceof Map||t instanceof Map||e instanceof Set||t instanceof Set)return!1;let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r)if(!Object.hasOwn(t,i)||!safeIsEqual(e[i],t[i],n))return!1;return!0}function isNil(e){return e==null}function isPlainObject(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function allocate(e,t){if(typeof t==`number`&&(!Number.isInteger(t)||t<1))throw RangeError(`allocate: parts must be a positive integer, got ${t}`);let n=Array.isArray(t)?t:Array(t).fill(1);if(n.length===0)throw RangeError(`Ratios array cannot be empty`);if(n.some(e=>e<0))throw RangeError(`Ratios must be non-negative`);let r=n.reduce((e,t)=>e+t,0);if(r===0)throw RangeError(`Total ratio cannot be zero`);if(typeof e==`bigint`){let t=BigInt(r),i=Array.from({length:n.length-1},(r,i)=>e*BigInt(n[i])/t);return i.push(e-i.reduce((e,t)=>e+t,0n)),i}let i=Array.from({length:n.length-1},(t,i)=>Math.floor(e*n[i]/r));return i.push(e-i.reduce((e,t)=>e+t,0)),i}function clamp(e,t,n){return t!=null&&e<t?t:n!=null&&e>n?n:e}function range(e,t,n){let[r,i,a]=t===void 0?[0,e,1]:n===void 0?[e,t,1]:[e,t,n];if(!Number.isFinite(r)||!Number.isFinite(i)||!Number.isFinite(a))throw RangeError(`range: start, stop, and step must be finite numbers`);if(a===0)throw RangeError(`range: step cannot be 0`);if(r===i)return[];let o=(i-r)/a,s=Math.max(0,Number.isInteger(o)?o:Math.ceil(o+2**-52));if(s>1e7)throw RangeError(`range: exceeds maximum allowed size of 10,000,000`);return Array.from({length:s},(e,t)=>r+t*a)}function pathSegments(e){return e.replace(/\[(\d+)\]/g,`.$1`).replace(/^\.|\.$/g,``).split(`.`).filter(Boolean)}function readPath(t,n){let r=t;for(let t of pathSegments(n))if(e.has(t)||typeof r!=`object`||!r||(r=r[t],r===void 0))return;return r}function getPath(e,t){return readPath(e,t)}function getPathOr(e,t,n){let r=readPath(e,t);return r===void 0?n:r}function requirePath(e,t){let n=readPath(e,t);if(n===void 0)throw TypeError(`Path does not exist: '${t}'`);return n}function _hash(e,t,n){if(e===void 0)return`undefined`;if(e===null)return`null`;if(typeof e==`bigint`)return`${e}n`;if(typeof e!=`object`)return JSON.stringify(e);if(n.has(e))return`[Circular]`;if(n.add(e),e instanceof Date)return`[Date:${Number.isNaN(e.getTime())?`Invalid`:e.toISOString()}]`;if(e instanceof RegExp)return`[RegExp:${e.source}/${e.flags}]`;if(e instanceof Set)return`[Set:${[...e].map(e=>_hash(e,t,n)).sort().join(`,`)}]`;if(e instanceof Map)return`[Map:${[...e.entries()].map(([e,r])=>[_hash(e,t,n),_hash(r,t,n)]).sort(([e,t],[n,r])=>e===n?t.localeCompare(r):e.localeCompare(n)).map(([e,t])=>`${e}=>${t}`).join(`,`)}]`;if(Array.isArray(e))return`[${e.map(e=>_hash(e,t,n)).join(`,`)}]`;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null){if(t?.onClassInstance===`throw`)throw new ArsenalSerializationError(`hash: unsupported type ${e.constructor?.name??`unknown`}`);return String(e)}let i=e;return`{${Object.keys(i).filter(e=>i[e]!==void 0).sort().map(e=>`${JSON.stringify(e)}:${_hash(i[e],t,n)}`).join(`,`)}}`}function hash(e,t){return _hash(e,t,new Set)}function omit(e,t){let n=new Set(t),r={};for(let t of Object.keys(e))isUnsafeKey(t)||n.has(t)||(r[t]=e[t]);return r}function pick(e,t){let n={};for(let r of t)isUnsafeKey(r)||Object.hasOwn(e,r)&&(n[r]=e[r]);return n}function randomFloat(e){let t=e?.next()??crypto.getRandomValues(new Uint32Array(1))[0]/4294967296;if(!Number.isFinite(t)||t<0||t>=1)throw RangeError(`random source must return a finite number in [0, 1)`);return t}function randomIndex(e,t){return Math.floor(randomFloat(t)*e)}function random(e,t,n){if(e>t)throw RangeError(`random: minimum value must not be greater than maximum value`);return randomIndex(t-e+1,n)+e}var m=/(\p{Ll})(\p{Lu}|\p{N})|(\p{Lu}|\p{N})(\p{Lu}\p{Ll})|(\p{N})(\p{L})/gu;function escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\/-]/g,`\\$&`)}function normalizeCase(e,t=` `){let n=escapeRegex(t);return e.trim().replace(m,`$1$3$5${t}$2$4$6`).replace(/[^\p{L}\p{N}]+/gu,t).replace(RegExp(`^(?:${n})+|(?:${n})+$`,`g`),``)}function camelCase(e){return normalizeCase(e,` `).replace(/[^\p{L}\p{N}]+(.)/gu,(e,t)=>t.toUpperCase()).replace(/^./,e=>e.toLowerCase())}exports.ArsenalError=ArsenalError,exports.ArsenalSerializationError=ArsenalSerializationError,exports.ShareCodeError=ShareCodeError,exports.abortError=abortError,exports.abortable=abortable,exports.allOf=allOf,exports.allocate=allocate,exports.anyOf=anyOf,exports.attempt=attempt,exports.backoff=backoff,exports.base64UrlToBytes=base64UrlToBytes,exports.base64UrlToText=base64UrlToText,exports.bytesToBase64Url=bytesToBase64Url,exports.cache=cache,exports.camelCase=camelCase,exports.chunk=chunk,exports.clamp=clamp,exports.compressBytes=compressBytes,exports.debounce=debounce,exports.decompressBytes=decompressBytes,exports.filterMap=filterMap,exports.getPath=getPath,exports.getPathOr=getPathOr,exports.groupBy=groupBy,exports.hash=hash,exports.indexBy=indexBy,exports.isDefined=isDefined,exports.isEqual=isEqual,exports.isFail=isFail,exports.isNil=isNil,exports.isOk=isOk,exports.isPlainObject=isPlainObject,exports.memo=memo,exports.noneOf=noneOf,exports.not=not,exports.omit=omit,exports.once=once,exports.pack=pack,exports.parallel=parallel,exports.partition=partition,exports.pick=pick,exports.pipe=pipe,exports.random=random,exports.randomFloat=randomFloat,exports.range=range,exports.requirePath=requirePath,exports.retry=retry,exports.sleep=sleep,exports.sort=sort,exports.tapper=tapper,exports.taskPool=taskPool,exports.textToBase64Url=textToBase64Url,exports.throttle=throttle,exports.uniq=uniq,exports.unpack=unpack,exports.utf8Bytes=utf8Bytes,exports.waitFor=waitFor;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function chunk(e,t=2){if(!Array.isArray(e)&&typeof e!=`string`)throw TypeError(`chunk: argument must be an array or string`);if(!Number.isInteger(t)||t<1)throw RangeError(`chunk: size must be a positive integer`);return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,r*t+t))}function filterMap(e,t){let n=[];for(let r=0;r<e.length;r++){let i=t(e[r],r,e);i!==void 0&&n.push(i)}return n}var e=new Set([`__proto__`,`constructor`,`prototype`]);function isUnsafeKey(t){return typeof t==`string`&&e.has(t)}function groupBy(e,t){let n={};for(let r of e){let e=t(r),i=e==null?`_`:String(e);isUnsafeKey(i)||(n[i]||(n[i]=[]),n[i].push(r))}return n}function indexBy(e,t){let n={};for(let r of e){let e=String(t(r));isUnsafeKey(e)||(n[e]=r)}return n}function paginate(e,t={}){if(!Array.isArray(e))throw TypeError(`paginate: first argument must be an array`);let{pageOffset:n=1,pageSize:r=20}=t,i=t.page??n;if(!Number.isInteger(r)||r<1)throw RangeError(`paginate: pageSize must be a positive integer`);if(!Number.isInteger(i)||i<n)throw RangeError(`paginate: page must be an integer >= ${n}`);let a=Math.max(1,Math.ceil(e.length/r)),o=(i-n)*r;return{items:e.slice(o,o+r),page:i,pageSize:r,totalItems:e.length,totalPages:a}}function partition(e,t){let n=[],r=[];for(let i=0;i<e.length;i++)t(e[i],i,e)?n.push(e[i]):r.push(e[i]);return[n,r]}function pathSegments(e){return e.replace(/\[(\d+)\]/g,`.$1`).replace(/^\.|\.$/g,``).split(`.`).filter(Boolean)}function readPath(t,n){let r=t;for(let t of pathSegments(n))if(e.has(t)||typeof r!=`object`||!r||(r=r[t],r===void 0))return;return r}function getPath(e,t){return readPath(e,t)}function getPathOr(e,t,n){let r=readPath(e,t);return r===void 0?n:r}function requirePath(e,t){let n=readPath(e,t);if(n===void 0)throw TypeError(`Path does not exist: '${t}'`);return n}var compare=(e,t)=>{if(e===t)return 0;if(e===void 0)return 1;if(t===void 0)return-1;if(e===null)return t===null?0:-1;if(t===null)return 1;if(typeof e==`string`&&typeof t==`string`)return e.localeCompare(t);if(typeof e==`number`&&typeof t==`number`)return e===t?0:e>t?1:-1;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n===r?0:n>r?1:-1}throw TypeError(`compare: unsupported types "${typeof e}" and "${typeof t}". Supported: number, string, Date, null, undefined.`)},compareBy=e=>{let t=Object.entries(e);return(e,n)=>{for(let[r,i]of t){let t=e[r],a=n[r],o=i===`desc`?-1:1,s=compare(t,a);if(s!==0)return s*o}return 0}};function isCriteriaForm(e){return Array.isArray(e)}function sort(e,t,n=`asc`){if(!Array.isArray(e))throw TypeError(`sort: first argument must be an array`);if(typeof t==`function`){let r=n===`desc`?-1:1;return[...e].sort((e,n)=>compare(t(e),t(n))*r)}if(isCriteriaForm(t)){let n=t.map(({direction:e=`asc`,key:t})=>({multiplier:e===`desc`?-1:1,path:String(t)}));return[...e].sort((e,t)=>{for(let{multiplier:r,path:i}of n){let n=compare(getPath(e,i),getPath(t,i))*r;if(n!==0)return n}return 0})}return[...e].sort(compareBy(t))}function dedupeBySelector(e,t){let n=new Set,r=[];for(let i of e){let e=t(i);n.has(e)||(n.add(e),r.push(i))}return r}function uniq(e,t){return e.length<=1?[...e]:t?dedupeBySelector(e,t):[...new Set(e)]}function abortError(e,t=`Aborted`){return e?.reason??new DOMException(t,`AbortError`)}function abortable(e,t){return t.aborted?Promise.reject(abortError(t)):new Promise((n,r)=>{let onAbort=()=>r(abortError(t));t.addEventListener(`abort`,onAbort,{once:!0}),e.then(e=>n(e)).catch(e=>r(e)).finally(()=>t.removeEventListener(`abort`,onAbort))})}function isOk(e){return e.ok===!0}function isFail(e){return e.ok===!1}async function attempt(e){try{return{ok:!0,value:await e()}}catch(e){return{error:e,ok:!1}}}function backoff(e,t=3e4){return Math.min(1e3*2**Math.max(0,Number.isNaN(e)?0:Math.floor(e)),t)}async function parallel(e,t,n={}){let{abortOnError:r=!1,limit:i=1/0,signal:a}=n;if(i<1)throw RangeError(`parallel: limit must be at least 1, got ${i}`);if(a?.aborted)throw abortError(a);if(e.length===0)return[];let o=Array(e.length),s=0,c=r?new AbortController:void 0,worker=async()=>{for(;;){if(a?.aborted)throw abortError(a);if(c?.signal.aborted||s>=e.length)return;let n=s++;try{o[n]=await t(e[n],n,e)}catch(e){throw c?.abort(),e}}},l=Math.min(i,e.length),u=Array.from({length:l},()=>worker());return await Promise.all(u),o}async function sleep(e,t){return t?t.aborted?Promise.reject(abortError(t)):new Promise((n,r)=>{let i=setTimeout(()=>{t.removeEventListener(`abort`,onAbort),n()},e),onAbort=()=>{clearTimeout(i),t.removeEventListener(`abort`,onAbort),r(abortError(t))};t.addEventListener(`abort`,onAbort)}):new Promise(t=>setTimeout(t,e))}function buildSignal(e,t){let n=[e===void 0?void 0:AbortSignal.timeout(e),t].filter(e=>e!=null);if(n.length!==0)return n.length===1?n[0]:AbortSignal.any(n)}async function retry(e,{delay:t=250,shouldRetry:n,signal:r,timeout:i,times:a=3}={}){if(!Number.isInteger(a)||a<1)throw RangeError(`retry: times must be a positive integer, got ${a}`);for(let o=1;o<=a;o++){if(r?.aborted)throw abortError(r);let s=buildSignal(i,r);try{return await e(s)}catch(e){if(o===a||n&&!n(e,o-1))throw e;let i=typeof t==`function`?t(o-1):t;i>0&&await sleep(i,r)}}}function taskPool({concurrency:e=1}={}){if(!Number.isInteger(e)||e<1)throw RangeError(`taskPool: concurrency must be a positive integer`);let t=new AbortController,n=[],r=0,i=!1,a,resolveIdle=()=>{r===0&&n.length===0&&(a?.resolve(),a=void 0)},start=()=>{for(;r<e&&n.length>0;){let e=n.shift();r++,Promise.resolve().then(()=>e.run(t.signal)).then(e.resolve,e.reject).finally(()=>{r--,start(),resolveIdle()})}};return{get active(){return r},get disposalSignal(){return t.signal},dispose:(e=new DOMException(`Task pool disposed`,`AbortError`))=>{if(!i){i=!0,t.abort(e);for(let t of n.splice(0))t.reject(e);resolveIdle()}},get disposed(){return i},idle:()=>r===0&&n.length===0?Promise.resolve():(a??=Promise.withResolvers(),a.promise),get pending(){return n.length},run:e=>{let r=Promise.withResolvers();return i?(r.reject(t.signal.reason),r.promise):(n.push({reject:r.reject,resolve:r.resolve,run:e}),start(),r.promise)},[Symbol.dispose](){this.dispose()}}}async function waitFor(e,{interval:t=100,signal:n,timeout:r=5e3}={}){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;for(a.throwIfAborted();;){if(a.throwIfAborted(),await e(a))return;await sleep(t,a)}}function cache({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,advanceRevision=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},expiresAt=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},read=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},trim=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},set=(e,t,i={})=>{advanceRevision(e),r.delete(e),r.set(e,{expiresAt:expiresAt(i.ttlMs??n),value:t}),trim()},getOrLoad=(e,t)=>{let n=read(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let s=i.get(e);if(s)return s;let c=o,l=advanceRevision(e),u=t().then(t=>(i.get(e)===u&&i.delete(e),o===c&&a.get(e)===l&&set(e,t),t),t=>{throw i.get(e)===u&&i.delete(e),t});return i.set(e,u),u};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),advanceRevision(e),r.delete(e)),entries:()=>(trim(),[...r].map(([e,t])=>[e,t.value])),get:read,getOrLoad,set,get size(){return r.size}}}var LruMap=class extends Map{maxSize;constructor(e){super(),this.maxSize=e}set(e,t){return this.has(e)&&this.delete(e),super.set(e,t),this.size>this.maxSize&&this.evictOldest(),this}evictOldest(e=()=>!0){for(let[t,n]of this)if(e(t,n))return this.delete(t),!0;return!1}},ArsenalError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},ArsenalSerializationError=class extends ArsenalError{},ShareCodeError=class extends ArsenalError{reason;constructor(e,t,n){super(t,n),this.reason=e}},t=`\0undefined\0`,n=`\0NaN\0`,r=`\0+Infinity\0`,i=`\0-Infinity\0`,a=`\0function\0`,o=0,s=new WeakMap;function idForFunction(e){let t=s.get(e);return t===void 0&&(t=o++,s.set(e,t)),t}var defaultKey=e=>{try{return JSON.stringify(e,(e,o)=>o===void 0?t:typeof o==`number`&&Number.isNaN(o)?n:o===1/0?r:o===-1/0?i:typeof o==`function`?`${a}${idForFunction(o)}`:o)}catch(e){throw new ArsenalSerializationError(`[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${e instanceof Error&&e.message?` Reason: ${e.message}`:``}`,{cause:e})}};function memo(e,{key:t,maxSize:n=1/0}={}){if(n!==1/0&&(!Number.isInteger(n)||n<1))throw RangeError(`memo: maxSize must be a positive integer or Infinity, got ${n}`);let r=new LruMap(n),resolveKey=(...e)=>t?t(...e):defaultKey(e),memoized=(...t)=>{let n=resolveKey(...t);if(r.has(n)){let e=r.get(n);return r.set(n,e),e}let i=e(...t);return r.set(n,i),i},i=Object.assign(memoized,{clear:()=>r.clear(),invalidate:(...e)=>{r.delete(resolveKey(...e))}});return Object.defineProperty(i,"size",{get:()=>r.size}),i}var c=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,l=new Map([...c].map((e,t)=>[e,t]));function bytesToBase64Url(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=e[n+1],a=e[n+2];t+=c[r>>2],t+=c[(r&3)<<4|(i??0)>>4],i!==void 0&&(t+=c[(i&15)<<2|(a??0)>>6]),a!==void 0&&(t+=c[a&63])}return t}function base64UrlToBytes(e){let t=[],n=0,r=0;for(let i of e){let e=l.get(i);if(e===void 0)throw Error(`Invalid base64url character "${i}"`);n=n<<6|e,r+=6,r>=8&&(r-=8,t.push(n>>r&255))}return new Uint8Array(t)}var u=new TextEncoder,d=new TextDecoder;function textToBase64Url(e){return bytesToBase64Url(u.encode(e))}function base64UrlToText(e){return d.decode(base64UrlToBytes(e))}function utf8Bytes(e){return u.encode(e).length}async function transformBytes(e,t,n){let r=new ReadableStream({start(t){t.enqueue(new Uint8Array(e)),t.close()}}).pipeThrough(t).getReader(),i=[],a=0;try{for(;;){let{done:e,value:t}=await r.read();if(e)break;if(a+=t.byteLength,a>n)throw new ArsenalSerializationError(`Decompressed data exceeds the byte limit.`);i.push(t)}}catch(e){throw await r.cancel(e).catch(()=>void 0),e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Unable to transform compressed data.`,{cause:e})}finally{r.releaseLock()}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return o}async function compressBytes(e,t={}){try{return await transformBytes(e,new CompressionStream(t.format??`deflate-raw`),1/0)}catch(e){throw e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Compression is unavailable for this format.`,{cause:e})}}async function decompressBytes(e,t){if(!Number.isSafeInteger(t.maxOutputBytes)||t.maxOutputBytes<0)throw new ArsenalSerializationError(`maxOutputBytes must be a non-negative safe integer.`);try{return await transformBytes(e,new DecompressionStream(t.format??`deflate-raw`),t.maxOutputBytes)}catch(e){throw e instanceof ArsenalSerializationError?e:new ArsenalSerializationError(`Decompression is unavailable for this format.`,{cause:e})}}var f=new TextEncoder,p=new TextDecoder(`utf-8`,{fatal:!0});function assertOptions({maxBytes:e,prefix:t}){if(!Number.isSafeInteger(e)||e<=0)throw new ShareCodeError(`invalid`,`maxBytes must be a positive safe integer.`);if(!/^[A-Za-z0-9]{1,8}$/.test(t))throw new ShareCodeError(`invalid`,`The prefix must be 1–8 alphanumeric characters.`)}function streamsAvailable(){try{return new CompressionStream(`deflate-raw`),new DecompressionStream(`deflate-raw`),!0}catch{return!1}}function decompressionAvailable(){try{return new DecompressionStream(`deflate-raw`),!0}catch{return!1}}async function pack(e,t){assertOptions(t);let{maxBytes:n,prefix:r}=t,i;try{i=JSON.stringify(e)}catch(e){throw new ShareCodeError(`invalid`,`The share payload is not JSON-serializable.`,{cause:e})}if(i===void 0)throw new ShareCodeError(`invalid`,`The share payload is not JSON-serializable.`);let a=f.encode(i);if(a.length>n)throw new ShareCodeError(`too-large`,`The share payload exceeds the byte limit.`);let o=`${r}r.${bytesToBase64Url(a)}`;if(!streamsAvailable())return o;let s=`${r}d.${bytesToBase64Url(await compressBytes(a))}`;return s.length<o.length?s:o}async function unpack(e,t){assertOptions(t);let{maxBytes:n,prefix:r}=t,i=e.trim(),a=Math.ceil(n*4/3)+r.length+2;if(i.length>a)throw new ShareCodeError(`too-large`,`The share code exceeds the length limit.`);let o=i.slice(r.length,r.length+1);if(!i.startsWith(r)||o!==`r`&&o!==`d`||i[r.length+1]!==`.`)throw new ShareCodeError(`invalid`,`That share code format is not supported.`);let s=i.slice(r.length+2);if(!/^[A-Za-z0-9_-]+$/.test(s))throw new ShareCodeError(`invalid`,`Malformed share code.`);let c=base64UrlToBytes(s);if(bytesToBase64Url(c)!==s)throw new ShareCodeError(`invalid`,`Malformed share code.`);if(o===`d`&&!decompressionAvailable())throw new ShareCodeError(`compression-unavailable`,`Raw-DEFLATE decompression is unavailable in this browser.`);let l=o===`d`?await decompressBytes(c,{maxOutputBytes:n}):c;if(l.length>n)throw new ShareCodeError(`too-large`,`The share payload exceeds the byte limit.`);try{return JSON.parse(p.decode(l))}catch(e){throw new ShareCodeError(`invalid`,`The share code payload is not valid UTF-8 JSON.`,{cause:e})}}function debounce(e,t=300,n={leading:!1,trailing:!0}){let r=n.leading??!1,i=n.trailing??!0,a,o,s,c=!1,clearTimer=()=>{a!==void 0&&(clearTimeout(a),a=void 0)},invokeTrailing=()=>{if(clearTimer(),c=!1,!o)return;let t=o;return o=void 0,s=e(...t),s};return Object.assign((...n)=>(o=n,r&&!c&&(c=!0,s=e(...n),o=void 0,!i)?(a=setTimeout(()=>{a=void 0,c=!1},t),s):r&&!i&&c?s:(clearTimer(),a=setTimeout(invokeTrailing,t),s)),{cancel:()=>{clearTimer(),o=void 0,c=!1},flush:()=>invokeTrailing(),pending:()=>a!==void 0})}var once=e=>{let t,n=!1,wrappedFn=((...r)=>(n||=(t=e(...r),!0),t));return wrappedFn.reset=()=>{t=void 0,n=!1},wrappedFn};function pipe(...e){if(e.length===0)return e=>e;let[t,...n]=e;return(...e)=>n.reduce((e,t)=>t(e),t(...e))}var noop=()=>{};function tapper(){let e=new Set;return{clear(){e.clear()},emit(t){if(e.size!==0)for(let n of[...e])try{n(t)}catch{}},get size(){return e.size},tap(t,n){let r=n?.signal;if(r?.aborted)return noop;e.add(t);let detach=()=>{e.delete(t),r?.removeEventListener(`abort`,detach)};return r?.addEventListener(`abort`,detach,{once:!0}),detach}}}function throttle(e,t=700,n={leading:!0,trailing:!1}){let r=n.leading??!0,i=n.trailing??!1,a,o=-1/0,s,c,clearTimer=()=>{a!==void 0&&(clearTimeout(a),a=void 0)},scheduleTimer=e=>{a=setTimeout(timerExpired,e)},invoke=t=>{if(o=t,clearTimer(),!s)return;let n=s;return s=void 0,c=e(...n),c},remaining=e=>t-(e-o),timerExpired=()=>{let e=Date.now();s&&remaining(e)<=0?invoke(e):s?scheduleTimer(remaining(e)):clearTimer()};return Object.assign((...e)=>{let t=Date.now();o===-1/0&&!r&&(o=t),s=e;let n=remaining(t);return n<=0?invoke(t):(i&&!a&&scheduleTimer(n),c)},{cancel:()=>{clearTimer(),s=void 0,o=-1/0},flush:()=>{if(s)return invoke(Date.now())},pending:()=>s!==void 0||a!==void 0})}function allOf(...e){return t=>e.every(e=>e(t))}function anyOf(...e){return t=>e.some(e=>e(t))}function noneOf(...e){return t=>e.every(e=>!e(t))}function not(e){return t=>!e(t)}function isDefined(e){return e!==void 0}function isEqual(e,t){return safeIsEqual(e,t,new WeakMap)}function safeIsEqual(e,t,n){if(e===t)return!0;if(e==null||t==null||typeof e!=typeof t||typeof e!=`object`||typeof t!=`object`)return!1;if(n.has(e))return n.get(e)===t;if(n.set(e,t),Array.isArray(e)||Array.isArray(t))return!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?!1:e.every((e,r)=>safeIsEqual(e,t[r],n));if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(let[r,i]of e)if(!t.has(r)||!safeIsEqual(i,t.get(r),n))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;let r=[...t];for(let i of e)if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`||i==null){if(!t.has(i))return!1}else if(!r.some(e=>safeIsEqual(i,e,n)))return!1;return!0}if(e instanceof RegExp||t instanceof RegExp)return e instanceof RegExp&&t instanceof RegExp&&e.source===t.source&&e.flags===t.flags;if(e instanceof Map||t instanceof Map||e instanceof Set||t instanceof Set)return!1;let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let i of r)if(!Object.hasOwn(t,i)||!safeIsEqual(e[i],t[i],n))return!1;return!0}function isNil(e){return e==null}function isPlainObject(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function allocate(e,t){if(typeof t==`number`&&(!Number.isInteger(t)||t<1))throw RangeError(`allocate: parts must be a positive integer, got ${t}`);let n=Array.isArray(t)?t:Array(t).fill(1);if(n.length===0)throw RangeError(`Ratios array cannot be empty`);if(n.some(e=>e<0))throw RangeError(`Ratios must be non-negative`);let r=n.reduce((e,t)=>e+t,0);if(r===0)throw RangeError(`Total ratio cannot be zero`);if(typeof e==`bigint`){let t=BigInt(r),i=Array.from({length:n.length-1},(r,i)=>e*BigInt(n[i])/t);return i.push(e-i.reduce((e,t)=>e+t,0n)),i}let i=Array.from({length:n.length-1},(t,i)=>Math.floor(e*n[i]/r));return i.push(e-i.reduce((e,t)=>e+t,0)),i}function clamp(e,t,n){return t!=null&&e<t?t:n!=null&&e>n?n:e}function range(e,t,n){let[r,i,a]=t===void 0?[0,e,1]:n===void 0?[e,t,1]:[e,t,n];if(!Number.isFinite(r)||!Number.isFinite(i)||!Number.isFinite(a))throw RangeError(`range: start, stop, and step must be finite numbers`);if(a===0)throw RangeError(`range: step cannot be 0`);if(r===i)return[];let o=(i-r)/a,s=Math.max(0,Number.isInteger(o)?o:Math.ceil(o+2**-52));if(s>1e7)throw RangeError(`range: exceeds maximum allowed size of 10,000,000`);return Array.from({length:s},(e,t)=>r+t*a)}function _hash(e,t,n){if(e===void 0)return`undefined`;if(e===null)return`null`;if(typeof e==`bigint`)return`${e}n`;if(typeof e!=`object`)return JSON.stringify(e);if(n.has(e))return`[Circular]`;if(n.add(e),e instanceof Date)return`[Date:${Number.isNaN(e.getTime())?`Invalid`:e.toISOString()}]`;if(e instanceof RegExp)return`[RegExp:${e.source}/${e.flags}]`;if(e instanceof Set)return`[Set:${[...e].map(e=>_hash(e,t,n)).sort().join(`,`)}]`;if(e instanceof Map)return`[Map:${[...e.entries()].map(([e,r])=>[_hash(e,t,n),_hash(r,t,n)]).sort(([e,t],[n,r])=>e===n?t.localeCompare(r):e.localeCompare(n)).map(([e,t])=>`${e}=>${t}`).join(`,`)}]`;if(Array.isArray(e))return`[${e.map(e=>_hash(e,t,n)).join(`,`)}]`;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null){if(t?.onClassInstance===`throw`)throw new ArsenalSerializationError(`hash: unsupported type ${e.constructor?.name??`unknown`}`);return String(e)}let i=e;return`{${Object.keys(i).filter(e=>i[e]!==void 0).sort().map(e=>`${JSON.stringify(e)}:${_hash(i[e],t,n)}`).join(`,`)}}`}function hash(e,t){return _hash(e,t,new Set)}function omit(e,t){let n=new Set(t),r={};for(let t of Object.keys(e))isUnsafeKey(t)||n.has(t)||(r[t]=e[t]);return r}function pick(e,t){let n={};for(let r of t)isUnsafeKey(r)||Object.hasOwn(e,r)&&(n[r]=e[r]);return n}function randomFloat(e){let t=e?.next()??crypto.getRandomValues(new Uint32Array(1))[0]/4294967296;if(!Number.isFinite(t)||t<0||t>=1)throw RangeError(`random source must return a finite number in [0, 1)`);return t}function randomIndex(e,t){return Math.floor(randomFloat(t)*e)}function random(e,t,n){if(e>t)throw RangeError(`random: minimum value must not be greater than maximum value`);return randomIndex(t-e+1,n)+e}var m=/(\p{Ll})(\p{Lu}|\p{N})|(\p{Lu}|\p{N})(\p{Lu}\p{Ll})|(\p{N})(\p{L})/gu;function escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\/-]/g,`\\$&`)}function normalizeCase(e,t=` `){let n=escapeRegex(t);return e.trim().replace(m,`$1$3$5${t}$2$4$6`).replace(/[^\p{L}\p{N}]+/gu,t).replace(RegExp(`^(?:${n})+|(?:${n})+$`,`g`),``)}function camelCase(e){return normalizeCase(e,` `).replace(/[^\p{L}\p{N}]+(.)/gu,(e,t)=>t.toUpperCase()).replace(/^./,e=>e.toLowerCase())}exports.ArsenalError=ArsenalError,exports.ArsenalSerializationError=ArsenalSerializationError,exports.ShareCodeError=ShareCodeError,exports.abortError=abortError,exports.abortable=abortable,exports.allOf=allOf,exports.allocate=allocate,exports.anyOf=anyOf,exports.attempt=attempt,exports.backoff=backoff,exports.base64UrlToBytes=base64UrlToBytes,exports.base64UrlToText=base64UrlToText,exports.bytesToBase64Url=bytesToBase64Url,exports.cache=cache,exports.camelCase=camelCase,exports.chunk=chunk,exports.clamp=clamp,exports.compressBytes=compressBytes,exports.debounce=debounce,exports.decompressBytes=decompressBytes,exports.filterMap=filterMap,exports.getPath=getPath,exports.getPathOr=getPathOr,exports.groupBy=groupBy,exports.hash=hash,exports.indexBy=indexBy,exports.isDefined=isDefined,exports.isEqual=isEqual,exports.isFail=isFail,exports.isNil=isNil,exports.isOk=isOk,exports.isPlainObject=isPlainObject,exports.memo=memo,exports.noneOf=noneOf,exports.not=not,exports.omit=omit,exports.once=once,exports.pack=pack,exports.paginate=paginate,exports.parallel=parallel,exports.partition=partition,exports.pick=pick,exports.pipe=pipe,exports.random=random,exports.randomFloat=randomFloat,exports.range=range,exports.requirePath=requirePath,exports.retry=retry,exports.sleep=sleep,exports.sort=sort,exports.tapper=tapper,exports.taskPool=taskPool,exports.textToBase64Url=textToBase64Url,exports.throttle=throttle,exports.uniq=uniq,exports.unpack=unpack,exports.utf8Bytes=utf8Bytes,exports.waitFor=waitFor;
2
2
  //# sourceMappingURL=arsenal.cjs.map