@ecosy/core 0.5.0 → 0.6.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Features
6
+
7
+ - **Cache `inject`**: `DiskCache` and `RedisCache` take an `inject` map — the same shape `Schedule({ … })` and `Route({ … })` take. Each class is constructed once per cache instance and handed to `onError` as its third argument, so a failed write can go through the app's own logger instead of one reached around the cache. A handler written for `(error, key)` still fits.
8
+
9
+ ### Bug Fixes
10
+
11
+ - **Build kept dropping `console.warn`**: terser ran with `drop_console: true`, which took the cache's default `onError` with it — a failed cache write in the published package was silent. It now drops only `log`, `info` and `debug`.
12
+
3
13
  ## 0.4.0 (2026-08-24)
4
14
 
5
15
  ### Features
@@ -1,7 +1,13 @@
1
- import { type CacheErrorHandler, type CacherClass } from "./types";
2
- export interface DiskCacheInit {
1
+ import { type CacheContext, type CacheErrorHandler, type CacheInjects, type CacherClass } from "./types";
2
+ export interface DiskCacheInit<Injects extends CacheInjects = Record<string, never>> {
3
+ /**
4
+ * Classes to construct for each cache instance, handed to `onError` as its
5
+ * third argument — the same injection map `Schedule({ … })` and `Route({ … })`
6
+ * take.
7
+ */
8
+ inject?: Injects;
3
9
  /** Where a failed write goes. Defaults to `console.warn`. */
4
- onError?: CacheErrorHandler;
10
+ onError?: CacheErrorHandler<CacheContext<Injects>>;
5
11
  }
6
12
  /**
7
13
  * Builds a cache class backed by the local filesystem, one JSON file per key.
@@ -13,6 +19,12 @@ export interface DiskCacheInit {
13
19
  *
14
20
  * ```ts
15
21
  * Pack(EsmAdapter).cache(DiskCache(configs.env.cache.dir))
22
+ *
23
+ * // A failed write reported through the app's own logger:
24
+ * DiskCache(configs.env.cache.dir, {
25
+ * inject: { logger: AppLogger },
26
+ * onError: (error, key, { logger }) => logger.warn(`[cache] write failed: ${key}`, error),
27
+ * });
16
28
  * ```
17
29
  *
18
30
  * The cache survives a restart, which is what separates it from
@@ -29,4 +41,4 @@ export interface DiskCacheInit {
29
41
  *
30
42
  * @param dir Directory to hold the files. Defaults to `<cwd>/.cache`.
31
43
  */
32
- export declare function DiskCache(dir?: string, init?: DiskCacheInit): CacherClass;
44
+ export declare function DiskCache<Injects extends CacheInjects = Record<string, never>>(dir?: string, init?: DiskCacheInit<Injects>): CacherClass;
@@ -1 +1 @@
1
- "use strict";var r=require("node:fs/promises"),e=require("node:path"),t=require("./types.js");exports.DiskCache=function(i,n={}){var s;const a=null!=i?i:e.join(process.cwd(),".cache"),o=null!==(s=n.onError)&&void 0!==s?s:t.defaultOnError;return class{constructor(){this.dir=a}fileFor(r){return e.join(a,`${encodeURIComponent(r)}.json`)}async get(e){try{return JSON.parse(await r.readFile(this.fileFor(e),"utf-8"))}catch(r){return null}}async set(e,t){try{await r.mkdir(a,{recursive:!0}),await r.writeFile(this.fileFor(e),JSON.stringify(t),"utf-8")}catch(r){o(r,e)}}async delete(e){try{await r.unlink(this.fileFor(e))}catch(r){}}}};
1
+ "use strict";var t=require("node:fs/promises"),e=require("node:path"),r=require("./types.js");exports.DiskCache=function(i,n={}){var s;const c=null!=i?i:e.join(process.cwd(),".cache"),o=null!==(s=n.onError)&&void 0!==s?s:r.defaultOnError;return class{constructor(){this.dir=c,this.context=r.buildCacheContext(n.inject)}fileFor(t){return e.join(c,`${encodeURIComponent(t)}.json`)}async get(e){try{return JSON.parse(await t.readFile(this.fileFor(e),"utf-8"))}catch(t){return null}}async set(e,r){try{await t.mkdir(c,{recursive:!0}),await t.writeFile(this.fileFor(e),JSON.stringify(r),"utf-8")}catch(t){o(t,e,this.context)}}async delete(e){try{await t.unlink(this.fileFor(e))}catch(t){}}}};
@@ -1 +1 @@
1
- import{readFile as r,mkdir as t,writeFile as e,unlink as o}from"node:fs/promises";import{join as s}from"node:path";import{defaultOnError as i}from"./types.mjs";function n(n,c={}){var a;const f=null!=n?n:s(process.cwd(),".cache"),l=null!==(a=c.onError)&&void 0!==a?a:i;return class{constructor(){this.dir=f}fileFor(r){return s(f,`${encodeURIComponent(r)}.json`)}async get(t){try{return JSON.parse(await r(this.fileFor(t),"utf-8"))}catch(r){return null}}async set(r,o){try{await t(f,{recursive:!0}),await e(this.fileFor(r),JSON.stringify(o),"utf-8")}catch(t){l(t,r)}}async delete(r){try{await o(this.fileFor(r))}catch(r){}}}}export{n as DiskCache};
1
+ import{readFile as t,mkdir as r,writeFile as e,unlink as o}from"node:fs/promises";import{join as i}from"node:path";import{defaultOnError as n,buildCacheContext as s}from"./types.mjs";function c(c,a={}){var f;const l=null!=c?c:i(process.cwd(),".cache"),u=null!==(f=a.onError)&&void 0!==f?f:n;return class{constructor(){this.dir=l,this.context=s(a.inject)}fileFor(t){return i(l,`${encodeURIComponent(t)}.json`)}async get(r){try{return JSON.parse(await t(this.fileFor(r),"utf-8"))}catch(t){return null}}async set(t,o){try{await r(l,{recursive:!0}),await e(this.fileFor(t),JSON.stringify(o),"utf-8")}catch(r){u(r,t,this.context)}}async delete(t){try{await o(this.fileFor(t))}catch(t){}}}}export{c as DiskCache};
@@ -1 +1 @@
1
- "use strict";var e=require("./types.js"),r=require("./disk.js"),s=require("./memory.js"),i=require("./redis.js");exports.defaultOnError=e.defaultOnError,exports.DiskCache=r.DiskCache,exports.MemoryCache=s.MemoryCache,exports.RedisCache=i.RedisCache;
1
+ "use strict";var e=require("./types.js"),r=require("./disk.js"),s=require("./memory.js"),t=require("./redis.js");exports.buildCacheContext=e.buildCacheContext,exports.defaultOnError=e.defaultOnError,exports.DiskCache=r.DiskCache,exports.MemoryCache=s.MemoryCache,exports.RedisCache=t.RedisCache;
@@ -1 +1 @@
1
- export{defaultOnError}from"./types.mjs";export{DiskCache}from"./disk.mjs";export{MemoryCache}from"./memory.mjs";export{RedisCache}from"./redis.mjs";
1
+ export{buildCacheContext,defaultOnError}from"./types.mjs";export{DiskCache}from"./disk.mjs";export{MemoryCache}from"./memory.mjs";export{RedisCache}from"./redis.mjs";
@@ -1,4 +1,4 @@
1
- import { type CacheErrorHandler, type CacherClass } from "./types";
1
+ import { type CacheContext, type CacheErrorHandler, type CacheInjects, type CacherClass } from "./types";
2
2
  /**
3
3
  * The three commands `RedisCache` issues.
4
4
  *
@@ -24,7 +24,9 @@ export interface RedisLike {
24
24
  set(key: string, value: string, ttlSeconds?: number): Promise<unknown>;
25
25
  del(key: string): Promise<unknown>;
26
26
  }
27
- export interface RedisCacheInit {
27
+ export interface RedisCacheInit<Injects extends CacheInjects = Record<string, never>> {
28
+ /** Classes constructed per cache instance and handed to `onError`. See `DiskCacheInit.inject`. */
29
+ inject?: Injects;
28
30
  /**
29
31
  * Prefix put in front of every key, so one Redis instance can hold more than
30
32
  * this cache. Include the separator you want, e.g. `"vendor:"`.
@@ -37,7 +39,7 @@ export interface RedisCacheInit {
37
39
  */
38
40
  ttlSeconds?: number;
39
41
  /** Where a failed write goes. Defaults to `console.warn`. */
40
- onError?: CacheErrorHandler;
42
+ onError?: CacheErrorHandler<CacheContext<Injects>>;
41
43
  }
42
44
  /**
43
45
  * Builds a cache class backed by Redis.
@@ -60,4 +62,4 @@ export interface RedisCacheInit {
60
62
  * back as `null` rather than throwing, because a cache holding something
61
63
  * unreadable and a cache holding nothing are the same thing to the caller.
62
64
  */
63
- export declare function RedisCache(client: RedisLike, init?: RedisCacheInit): CacherClass;
65
+ export declare function RedisCache<Injects extends CacheInjects = Record<string, never>>(client: RedisLike, init?: RedisCacheInit<Injects>): CacherClass;
@@ -1 +1 @@
1
- "use strict";var t=require("./types.js");exports.RedisCache=function(r,e={}){var n,a;const s=null!==(n=e.prefix)&&void 0!==n?n:"",c=e.ttlSeconds,l=null!==(a=e.onError)&&void 0!==a?a:t.defaultOnError,i=t=>`${s}${t}`;return class{async get(t){try{const e=await r.get(i(t));return null===e?null:JSON.parse(e)}catch(t){return null}}async set(t,e){try{await r.set(i(t),JSON.stringify(e),c)}catch(r){l(r,t)}}async delete(t){try{await r.del(i(t))}catch(t){}}}};
1
+ "use strict";var t=require("./types.js");exports.RedisCache=function(e,r={}){var n,c;const s=null!==(n=r.prefix)&&void 0!==n?n:"",a=r.ttlSeconds,i=null!==(c=r.onError)&&void 0!==c?c:t.defaultOnError,l=t=>`${s}${t}`;return class{constructor(){this.context=t.buildCacheContext(r.inject)}async get(t){try{const r=await e.get(l(t));return null===r?null:JSON.parse(r)}catch(t){return null}}async set(t,r){try{await e.set(l(t),JSON.stringify(r),a)}catch(e){i(e,t,this.context)}}async delete(t){try{await e.del(l(t))}catch(t){}}}};
@@ -1 +1 @@
1
- import{defaultOnError as t}from"./types.mjs";function r(r,n={}){var e,a;const c=null!==(e=n.prefix)&&void 0!==e?e:"",l=n.ttlSeconds,s=null!==(a=n.onError)&&void 0!==a?a:t,o=t=>`${c}${t}`;return class{async get(t){try{const n=await r.get(o(t));return null===n?null:JSON.parse(n)}catch(t){return null}}async set(t,n){try{await r.set(o(t),JSON.stringify(n),l)}catch(r){s(r,t)}}async delete(t){try{await r.del(o(t))}catch(t){}}}}export{r as RedisCache};
1
+ import{defaultOnError as t,buildCacheContext as n}from"./types.mjs";function r(r,c={}){var e,s;const a=null!==(e=c.prefix)&&void 0!==e?e:"",o=c.ttlSeconds,l=null!==(s=c.onError)&&void 0!==s?s:t,i=t=>`${a}${t}`;return class{constructor(){this.context=n(c.inject)}async get(t){try{const n=await r.get(i(t));return null===n?null:JSON.parse(n)}catch(t){return null}}async set(t,n){try{await r.set(i(t),JSON.stringify(n),o)}catch(n){l(n,t,this.context)}}async delete(t){try{await r.del(i(t))}catch(t){}}}}export{r as RedisCache};
@@ -23,13 +23,29 @@ export interface Cacher {
23
23
  * that captures it and hands one of these back.
24
24
  */
25
25
  export type CacherClass = new () => Cacher;
26
- /** Called when a write fails. Receives the cause and the key it was for. */
27
- export type CacheErrorHandler = (error: unknown, key: string) => void;
26
+ /** A class constructible with no arguments what an injection map holds. */
27
+ export type InjectClass<Instance = unknown> = new () => Instance;
28
+ /** Name to class. Each is constructed once per cache instance. */
29
+ export type CacheInjects = Record<string, InjectClass>;
30
+ /** An injection map, constructed: the same names, holding instances. */
31
+ export type CacheContext<Injects extends CacheInjects> = {
32
+ [K in keyof Injects]: Injects[K] extends InjectClass<infer Instance> ? Instance : never;
33
+ };
34
+ /**
35
+ * Called when a write fails. Receives the cause, the key it was for, and the
36
+ * context built from the factory's `inject` map — the way to reach an app
37
+ * logger, since the handler is a plain function fixed at the composition root
38
+ * and cannot inject for itself. A handler written for `(error, key)` still fits.
39
+ */
40
+ export type CacheErrorHandler<Context = unknown> = (error: unknown, key: string, context: Context) => void;
41
+ /** Builds the context once for a cache instance. */
42
+ export declare function buildCacheContext<Injects extends CacheInjects>(inject: Injects | undefined): CacheContext<Injects>;
28
43
  /**
29
44
  * Where a failed write goes by default.
30
45
  *
31
- * Note this package is built with terser's `drop_console`, so in the built
32
- * output this is stripped and a failed write becomes silent. Anything
33
- * consuming the build and wanting visibility should pass its own handler.
46
+ * Until 0.6.0 the build dropped every console call, this one included, so a
47
+ * failed write was silent in the published package. It now keeps `warn` and
48
+ * `error`. An app with a logger should still pass its own handler — with
49
+ * `inject`, it can reach that logger.
34
50
  */
35
- export declare const defaultOnError: CacheErrorHandler;
51
+ export declare const defaultOnError: CacheErrorHandler<unknown>;
@@ -1 +1 @@
1
- "use strict";exports.defaultOnError=(r,t)=>{};
1
+ "use strict";exports.buildCacheContext=function(e){const t={};for(const[n,o]of Object.entries(null!=e?e:{}))t[n]=new o;return t},exports.defaultOnError=(e,t)=>{console.warn("[ecosy/cache] write failed:",t,e)};
@@ -1 +1 @@
1
- const o=(o,t)=>{};export{o as defaultOnError};
1
+ function e(e){const n={};for(const[o,c]of Object.entries(null!=e?e:{}))n[o]=new c;return n}const n=(e,n)=>{console.warn("[ecosy/cache] write failed:",n,e)};export{e as buildCacheContext,n as defaultOnError};
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EcosyCore={})}(this,function(e){"use strict";function t(e,t,r){if(null==e)return r;const n=Array.isArray(t)?t:t.replace(/\[(\d+)]/g,".$1").split(".").filter(Boolean);if(0===n.length)return e;let i=e;for(const e of n){if(null==i)return r;i=i[e]}return void 0===i?r:i}function r(e,r={}){return e&&"string"==typeof e&&e.trim().length&&e.includes("{")&&e.includes("}")?e.replace(/\{([a-zA-Z0-9_.-]+)\}/g,(e,n)=>{const i=t(r,n);return null==i||"object"==typeof i?"":String(i)}):e}function n(e){return Object.prototype.toString.call(e)}function i(e){return e.charAt(0).toUpperCase()+e.slice(1)}function o(e){return"function"==typeof e||["[object Function]","[object AsyncFunction]","[object GeneratorFunction]"].includes(n(e))}function s(e){return"object"==typeof e&&null!==e}function c(e){if(!s(e)||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function a(e){return s(e)||o(e)}function u(e,t){return!!e&&(a(e)?Object.prototype.hasOwnProperty.call(e,t)||t in e:Object.prototype.hasOwnProperty.call(e,t))}const l={[Date.toString()]:e=>new Date(e.getTime()),[RegExp.toString()]:e=>new RegExp(e.source,e.flags),[Map.toString()]:(e,t)=>{const r=new Map;return t.set(e,r),e.forEach((e,n)=>{r.set(h(n,t),h(e,t))}),r},[Set.toString()]:(e,t)=>{const r=new Set;return t.set(e,r),e.forEach(e=>{r.add(h(e,t))}),r},[ArrayBuffer.toString()]:e=>e.slice(0)},f=[Date,RegExp,Map,Set,ArrayBuffer],p=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array,DataView],y=Array.from(new Set([Error,Promise,Blob,"undefined"!=typeof WeakMap&&WeakMap,"undefined"!=typeof WeakSet&&WeakSet,"undefined"!=typeof Symbol&&Symbol,"undefined"!=typeof Window&&Window,"undefined"!=typeof File&&File,"undefined"!=typeof FormData&&FormData,"undefined"!=typeof Headers&&Headers,"undefined"!=typeof Request&&Request,"undefined"!=typeof Response&&Response,"undefined"!=typeof Worker&&Worker,"undefined"!=typeof AbortController&&AbortController,"undefined"!=typeof Node&&Node,"undefined"!=typeof FileList&&FileList]));function g(e,t){return t.includes(e)}function h(e,t=new WeakMap){var r;if(!a(e)||o(e)||u(e,"$$typeof")||e.constructor&&g(e.constructor,y))return e;if(t.has(e))return t.get(e);if(e.constructor&&g(e.constructor,p)){const r=e,n=new(0,e.constructor)(r.buffer.slice(0),r.byteOffset,r.byteLength);return t.set(e,n),n}const n=e.constructor;if(f.includes(n)){const r=n.toString(),i=(0,l[r])(e,t);return t.set(e,i),i}const i=Array.isArray(e)?new((null===(r=Object.getPrototypeOf(e))||void 0===r?void 0:r.constructor)||Array):Object.create(Object.getPrototypeOf(e));t.set(e,i);const s=Reflect.ownKeys(e);for(const r of s){const n=Object.getOwnPropertyDescriptor(e,r);n&&("value"in n&&(n.value=h(n.value,t)),Object.defineProperty(i,r,n))}return i}function d(e){const t=Reflect.ownKeys(e);for(const r of t){const t=e[r];s(t)&&d(t)}return Object.freeze(e)}function b(e,t=h){if(!s(e))return e;return d(t(e))}const m=b({isString:e=>"string"==typeof e,isNumber:e=>"number"==typeof e&&Number.isFinite(e),isBoolean:e=>"boolean"==typeof e,isPrimitive:e=>!a(e),isDate:e=>e instanceof Date&&!Number.isNaN(e.getTime()),isPlainObject:c,normalize(e){const t=m;if(t.isPrimitive(e))return"bigint"==typeof e?e.toString():e;if(t.isDate(e))return e.toISOString();if(Array.isArray(e))return e.map(e=>t.normalize(e));if(c(e)){const r={};for(const n in e)if(u(e,n)){const i=e[n];void 0!==i&&(r[n]=t.normalize(i))}return r}return e&&u(e,"toJSON")&&o(e.toJSON)?e.toJSON():{}}}),A=b({stringify:(e,t)=>{var r;try{const n=m.normalize(e);return null!==(r=JSON.stringify(n,null,t))&&void 0!==r?r:""}catch(e){return""}},parse:(e,t)=>{if(!e)return null;try{return JSON.parse(e,t)}catch(e){return null}}}),O=b({encode(e,t=!0){if(!e)return"";if("function"==typeof t)return t(e);try{return t?encodeURIComponent(e):encodeURI(e)}catch(r){const n=e.replace(/[\uD800-\uDFFF]/g,"");return t?encodeURIComponent(n):encodeURI(n)}},decode:(e,t=!0)=>{if(!e)return"";if("function"==typeof t)return t(e);const r=t?decodeURIComponent:decodeURI;return(t?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return r(e)}catch(t){return e}})},build:(e,t)=>e?t&&"object"==typeof t?e.replace(/:([a-zA-Z\d_]+)/g,(e,r)=>{const n=t[r];return null==n?e:O.encode(String(n),!0)}):e:""}),w=b({parse(e){if(!e)return{};const t=e.startsWith("?")?e.slice(1):e,r={};return t.split("&").forEach(e=>{if(!e)return;const[t,n]=e.split("=");t&&(r[O.decode(t)]=n?O.decode(n):"")}),r},stringify(e,t={}){if(null===e||"object"!=typeof e)return"";const{arrayFormat:r="none",arrayFormatSeparator:n=",",skipNull:i=!1,skipEmptyString:o=!1,encode:s=!0,strict:c=!0,sort:a=!1}=t,u=e=>e.length>0&&/^[a-zA-Z0-9_\-.[\]]+$/.test(e),l=e=>s?O.encode(e,s):e,f=[],p=(e,t)=>{if(Array.isArray(t)){if("comma"===r||"separator"===r){const r=t.filter(e=>null!=e&&""!==e);return void(r.length>0&&f.push(`${l(e)}=${l(r.map(String).join(n))}`))}t.forEach((t,n)=>{let i=e;"bracket"===r?i=`${e}[]`:"index"===r&&(i=`${e}[${n}]`),p(i,t)})}else if(m.isPlainObject(t))for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&p(`${e}[${r}]`,t[r]);else null!=t?""!==t?"boolean"!=typeof t?m.isDate(t)?f.push(`${l(e)}=${l(t.toISOString())}`):f.push(`${l(e)}=${l(String(t))}`):f.push(`${l(e)}=${t?"true":"false"}`):o||f.push(`${l(e)}=`):i||f.push(`${l(e)}=`)};let y=Object.keys(e);a&&(y="function"==typeof a?y.sort(a):y.sort());for(const t of y)c&&!u(t)||p(t,e[t]);return f.join("&")}});class j{}function S(e,t){if(e.byteLength!==t.byteLength)return!1;const r=ArrayBuffer.isView(e)?e.buffer:e,n=ArrayBuffer.isView(e)?e.byteOffset:0,i=ArrayBuffer.isView(t)?t.buffer:t,o=ArrayBuffer.isView(t)?t.byteOffset:0,s=new Uint8Array(r,n,e.byteLength),c=new Uint8Array(i,o,t.byteLength);for(let e=0;e<s.length;e++)if(s[e]!==c[e])return!1;return!0}j.interpolate=r,j.Primitive=m,j.JSON=A,j.URL=O,j.queryString=w;const $=new Map([[Date,(e,t)=>Object.is(e.getTime(),t.getTime())],[RegExp,(e,t)=>Object.is(e.source,t.source)&&Object.is(e.flags,t.flags)],[ArrayBuffer,S],[Map,(e,t)=>{if(e.size!==t.size)return!1;for(const[r,n]of e)if(!t.has(r)||!F(n,t.get(r)))return!1;return!0}],[Set,(e,t)=>{if(e.size!==t.size)return!1;for(const r of e){let e=!1;for(const n of t)if(F(r,n)){e=!0;break}if(!e)return!1}return!0}]]);function F(e,t){if(!s(e)||!s(t))return Object.is(e,t);if(e.constructor!==t.constructor)return!1;if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!F(e[r],t[r]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t))return S(e,t);if(e.constructor&&$.has(e.constructor))return $.get(e.constructor)(e,t);if(!c(e)||!c(t))return e===t;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(const n of r)if(!u(t,n)||!F(e[n],t[n]))return!1;return!0}function E(e,t,r=h){if(void 0===t)return r(e);if(c(e)&&c(t)){const n=Object.assign({},e);return Object.keys(t).forEach(e=>{if(!function(e){return"__proto__"!==e&&"constructor"!==e&&"prototype"!==e}(e))return;const i=n[e],o=t[e];c(i)&&c(o)?n[e]=E(i,o,r):n[e]=r(o)}),n}return r(t)}class v extends Set{}class _ extends Map{}const R=b({state:{change:"$state:change"}});function z(e,t){const r={r:null,s:null},n=Math.max(0,t||0);function i(){r.r&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.r),r.s&&clearTimeout(r.s),r.r=null,r.s=null}return"function"==typeof requestAnimationFrame?r.r=requestAnimationFrame(()=>{r.s=setTimeout(()=>{e(),i()},n)}):r.s=setTimeout(()=>{e(),i()},n),{ids:r,cancel:i}}function D(e){return"undefined"!=typeof FileList&&e instanceof FileList||"object"==typeof e&&null!==e&&"[object FileList]"===n(e)&&"length"in e&&"item"in e&&o(e.item)}const x=/^[a-zA-Z0-9][a-zA-Z0-9!#$&\-^_.+]*\/[a-zA-Z0-9][a-zA-Z0-9!#$&\-^_.+]*(;\s*[\w.-]+=[\w.-]+)*$/;const k={"đ":"d","æ":"ae","ø":"o","å":"a","œ":"oe","ß":"ss","þ":"th","ð":"d"};function N(e,t={}){const{separator:r="-",silent:n=!1}=t;if(!e)return"";e=e.toLowerCase();const i=Object.assign(Object.assign({},k),t.transformer),o=Object.keys(i);if(o.length>0){o.sort((e,t)=>t.length-e.length);const t=o.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),r=new RegExp(t.join("|"),"g");e=e.replace(r,e=>{const t=i[e];return n&&t.length>1?"":t})}if(e=e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\w]|_|-/g,r),!r)return e.trim();const s=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.replace(new RegExp(`${s}+`,"g"),r).replace(new RegExp(`^${s}|${s}$`,"g"),"").trim()}const P={separator:"",silent:!0,transformer:Object.assign({},k)};e.DEFAULT_TRANSFORMER=k,e.Json=A,e.MIME_REGEX=x,e.Primitive=m,e.Serialize=j,e.Subscriber=class{get shallow(){return b({merge:this._shallow.merge,clone:this._shallow.clone,isEqual:this._shallow.isEqual})}set shallow(e){this._shallow=this._shallow.merge(this._shallow,e)}constructor(e,t){this._state={},this.listeners=new _,this._shallow={merge:E,clone:h,isEqual:F},this._events=b(R),this._state=null!=e?e:{},this._events=b(Object.assign(Object.assign({},this._events),t))}subscribe(e,t){return this.listeners.has(e)||this.listeners.set(e,new v),this.listeners.get(e).add(t),()=>{var r;null===(r=this.listeners.get(e))||void 0===r||r.delete(t)}}dispatch(e,t){this.listeners.has(e)&&this.listeners.get(e).forEach(e=>{e(...void 0===t?[]:[t])})}getState(){return this._state}setState(e){const t=this._shallow.merge(this._state,e);this._shallow.isEqual(this._state,t)||(this._state=t,this.dispatch(this._events.state.change,this._shallow.clone(t)))}onStateChange(e){return this.subscribe(this._events.state.change,e)}async subscribeAsyncOnce(e,t,r){let n,i;try{return await new Promise((o,s)=>{if(null==r?void 0:r.aborted)return s(new Error("Operation cancelled"));n=this.subscribe(e,e=>{null==t||t(e),o(e)}),r&&(i=()=>s(new Error("Operation cancelled")),r.addEventListener("abort",i,{once:!0}))})}finally{null==n||n(),r&&i&&r.removeEventListener("abort",i)}}static wire(e,t){for(const r in t){if(r in e)throw new Error(`[Subscriber.wire] "${r}" is invalid.`);const n=t[r];if(!c(n))continue;const o=Object.keys(n).reduce((t,r)=>{const o=n[r];return t[r]=t=>{e.dispatch(o,t)},t[`on${i(r)}`]=t=>e.subscribe(o,t),t},{});Object.defineProperty(e,r,{value:b(o),writable:!1,enumerable:!0,configurable:!1})}return e}},e.Url=O,e.clone=h,e.defer=z,e.deferAsync=function(e){let t;const r=new Promise(r=>{const{cancel:n}=z(()=>r(),e);t=n});return r.cancel=()=>{t()},r},e.escapeRegexKey=function(e){return e.replace(/([.[\]{}])/g,"\\$1")},e.flatten=function e(t,r="",n={}){if("object"!=typeof t||null===t)return r&&(n[r]=t),n;if(Array.isArray(t))for(let i=0;i<t.length;i++){const o=r?`${r}.${i}`:`${i}`;e(t[i],o,n)}else for(const[i,o]of Object.entries(t)){e(o,r?`${r}.${i}`:i,n)}return n},e.flattenToArray=function(e,t){const r=`${t}.`,n=Object.entries(e).filter(([e])=>e.startsWith(r));if(!n.length)return[];const i=n[0][0].replace(r,"").split(".")[0];if(!!isNaN(Number(i)))return n.map(([e,t])=>({key:e.replace(r,""),value:t}));const o=n.reduce((e,[t,n])=>{const i=t.replace(r,"").split("."),o=i[0],s=i.slice(1).join(".");return e[o]||(e[o]={}),s?e[o][s]=n:e[o]=n,e},{});return Object.values(o)},e.freeze=b,e.get=t,e.hasOwnProperty=u,e.interpolate=r,e.isComplexObject=function(e){return s(e)&&!Array.isArray(e)},e.isEqual=F,e.isFileList=D,e.isFormData=function(e){return e instanceof FormData},e.isFunction=o,e.isLiteralObject=c,e.isObject=s,e.isObjectable=a,e.merge=E,e.objectToFormData=function e(t,r=new FormData,n=""){return null==t||(t instanceof Date?r.append(n,t.toISOString()):t instanceof File||t instanceof Blob?r.append(n,t):D(t)?Array.from(t).forEach((e,t)=>{const i=n?`${n}[${t}]`:String(t);r.append(i,e,e.name)}):Array.isArray(t)?t.forEach((t,i)=>{const o=n?`${n}[${i}]`:String(i);e(t,r,o)}):"object"==typeof t?Object.entries(t).forEach(([t,i])=>{e(i,r,n?`${n}[${t}]`:t)}):r.append(n,String(t))),r},e.pascalToKebab=function(e){return e?e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").toLowerCase():e},e.queryString=w,e.sanitizeMime=function(e){return x.test(e)?e:""},e.searchify=function(e,t){const r=N(t,P),n=r.length,i={matches:[],positions:[]};if(!n)return i;const o=new Map,s=[...e.split("")].map((e,t)=>{let r=o.get(e);return void 0===r&&(r=N(e,P),o.set(e,r)),{originIndex:t,slugified:r,char:e}}).filter((e,t,r)=>0===t||(" "!==e.char||" "!==r[t-1].char));if(s.length<n)return i;for(let t=0;t<s.length;){const o=s[t];if(""===o.slugified){t++;continue}let c="",a=t,u=!0;for(;c.length<n&&a<s.length;){const e=s[a];if(""!==e.slugified&&(c+=e.slugified,!r.startsWith(c))){u=!1;break}a++}if(u&&c===r){const r=s[a-1],n=e.substring(o.originIndex,r.originIndex+1);i.matches.push(n),i.positions.push({start:o.originIndex,length:n.length}),t=a}else t++}return i},e.slugify=N,e.toString=n,e.ucfirst=i});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EcosyCore={})}(this,function(e){"use strict";function t(e,t,r){if(null==e)return r;const n=Array.isArray(t)?t:t.replace(/\[(\d+)]/g,".$1").split(".").filter(Boolean);if(0===n.length)return e;let i=e;for(const e of n){if(null==i)return r;i=i[e]}return void 0===i?r:i}function r(e,r={}){return e&&"string"==typeof e&&e.trim().length&&e.includes("{")&&e.includes("}")?e.replace(/\{([a-zA-Z0-9_.-]+)\}/g,(e,n)=>{const i=t(r,n);return null==i||"object"==typeof i?"":String(i)}):e}function n(e){return Object.prototype.toString.call(e)}function i(e){return e.charAt(0).toUpperCase()+e.slice(1)}function o(e){return"function"==typeof e||["[object Function]","[object AsyncFunction]","[object GeneratorFunction]"].includes(n(e))}function s(e){return"object"==typeof e&&null!==e}function c(e){if(!s(e)||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function a(e){return s(e)||o(e)}function u(e,t){return!!e&&(a(e)?Object.prototype.hasOwnProperty.call(e,t)||t in e:Object.prototype.hasOwnProperty.call(e,t))}const l={[Date.toString()]:e=>new Date(e.getTime()),[RegExp.toString()]:e=>new RegExp(e.source,e.flags),[Map.toString()]:(e,t)=>{const r=new Map;return t.set(e,r),e.forEach((e,n)=>{r.set(h(n,t),h(e,t))}),r},[Set.toString()]:(e,t)=>{const r=new Set;return t.set(e,r),e.forEach(e=>{r.add(h(e,t))}),r},[ArrayBuffer.toString()]:e=>e.slice(0)},f=[Date,RegExp,Map,Set,ArrayBuffer],p=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array,DataView],y=Array.from(new Set([Error,Promise,Blob,"undefined"!=typeof WeakMap&&WeakMap,"undefined"!=typeof WeakSet&&WeakSet,"undefined"!=typeof Symbol&&Symbol,"undefined"!=typeof Window&&Window,"undefined"!=typeof File&&File,"undefined"!=typeof FormData&&FormData,"undefined"!=typeof Headers&&Headers,"undefined"!=typeof Request&&Request,"undefined"!=typeof Response&&Response,"undefined"!=typeof Worker&&Worker,"undefined"!=typeof AbortController&&AbortController,"undefined"!=typeof Node&&Node,"undefined"!=typeof FileList&&FileList]));function g(e,t){return t.includes(e)}function h(e,t=new WeakMap){var r;if(!a(e)||o(e)||u(e,"$$typeof")||e.constructor&&g(e.constructor,y))return e;if(t.has(e))return t.get(e);if(e.constructor&&g(e.constructor,p)){const r=e,n=new(0,e.constructor)(r.buffer.slice(0),r.byteOffset,r.byteLength);return t.set(e,n),n}const n=e.constructor;if(f.includes(n)){const r=n.toString(),i=(0,l[r])(e,t);return t.set(e,i),i}const i=Array.isArray(e)?new((null===(r=Object.getPrototypeOf(e))||void 0===r?void 0:r.constructor)||Array):Object.create(Object.getPrototypeOf(e));t.set(e,i);const s=Reflect.ownKeys(e);for(const r of s){const n=Object.getOwnPropertyDescriptor(e,r);n&&("value"in n&&(n.value=h(n.value,t)),Object.defineProperty(i,r,n))}return i}function d(e){const t=Reflect.ownKeys(e);for(const r of t){const t=e[r];s(t)&&d(t)}return Object.freeze(e)}function b(e,t=h){if(!s(e))return e;return d(t(e))}const m=b({isString:e=>"string"==typeof e,isNumber:e=>"number"==typeof e&&Number.isFinite(e),isBoolean:e=>"boolean"==typeof e,isPrimitive:e=>!a(e),isDate:e=>e instanceof Date&&!Number.isNaN(e.getTime()),isPlainObject:c,normalize(e){const t=m;if(t.isPrimitive(e))return"bigint"==typeof e?e.toString():e;if(t.isDate(e))return e.toISOString();if(Array.isArray(e))return e.map(e=>t.normalize(e));if(c(e)){const r={};for(const n in e)if(u(e,n)){const i=e[n];void 0!==i&&(r[n]=t.normalize(i))}return r}return e&&u(e,"toJSON")&&o(e.toJSON)?e.toJSON():{}}}),A=b({stringify:(e,t)=>{var r;try{const n=m.normalize(e);return null!==(r=JSON.stringify(n,null,t))&&void 0!==r?r:""}catch(e){return""}},parse:(e,t)=>{if(!e)return null;try{return JSON.parse(e,t)}catch(e){return null}}}),O=b({encode(e,t=!0){if(!e)return"";if("function"==typeof t)return t(e);try{return t?encodeURIComponent(e):encodeURI(e)}catch(r){const n=e.replace(/[\uD800-\uDFFF]/g,"");return t?encodeURIComponent(n):encodeURI(n)}},decode:(e,t=!0)=>{if(!e)return"";if("function"==typeof t)return t(e);const r=t?decodeURIComponent:decodeURI;return(t?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return r(e)}catch(t){return console.warn(`[Serialize.URL] Cannot decode part: ${e}`),e}})},build:(e,t)=>e?t&&"object"==typeof t?e.replace(/:([a-zA-Z\d_]+)/g,(e,r)=>{const n=t[r];return null==n?e:O.encode(String(n),!0)}):e:""}),w=b({parse(e){if(!e)return{};const t=e.startsWith("?")?e.slice(1):e,r={};return t.split("&").forEach(e=>{if(!e)return;const[t,n]=e.split("=");t&&(r[O.decode(t)]=n?O.decode(n):"")}),r},stringify(e,t={}){if(null===e||"object"!=typeof e)return"";const{arrayFormat:r="none",arrayFormatSeparator:n=",",skipNull:i=!1,skipEmptyString:o=!1,encode:s=!0,strict:c=!0,sort:a=!1}=t,u=e=>e.length>0&&/^[a-zA-Z0-9_\-.[\]]+$/.test(e),l=e=>s?O.encode(e,s):e,f=[],p=(e,t)=>{if(Array.isArray(t)){if("comma"===r||"separator"===r){const r=t.filter(e=>null!=e&&""!==e);return void(r.length>0&&f.push(`${l(e)}=${l(r.map(String).join(n))}`))}t.forEach((t,n)=>{let i=e;"bracket"===r?i=`${e}[]`:"index"===r&&(i=`${e}[${n}]`),p(i,t)})}else if(m.isPlainObject(t))for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&p(`${e}[${r}]`,t[r]);else null!=t?""!==t?"boolean"!=typeof t?m.isDate(t)?f.push(`${l(e)}=${l(t.toISOString())}`):f.push(`${l(e)}=${l(String(t))}`):f.push(`${l(e)}=${t?"true":"false"}`):o||f.push(`${l(e)}=`):i||f.push(`${l(e)}=`)};let y=Object.keys(e);a&&(y="function"==typeof a?y.sort(a):y.sort());for(const t of y)c&&!u(t)||p(t,e[t]);return f.join("&")}});class j{}function S(e,t){if(e.byteLength!==t.byteLength)return!1;const r=ArrayBuffer.isView(e)?e.buffer:e,n=ArrayBuffer.isView(e)?e.byteOffset:0,i=ArrayBuffer.isView(t)?t.buffer:t,o=ArrayBuffer.isView(t)?t.byteOffset:0,s=new Uint8Array(r,n,e.byteLength),c=new Uint8Array(i,o,t.byteLength);for(let e=0;e<s.length;e++)if(s[e]!==c[e])return!1;return!0}j.interpolate=r,j.Primitive=m,j.JSON=A,j.URL=O,j.queryString=w;const $=new Map([[Date,(e,t)=>Object.is(e.getTime(),t.getTime())],[RegExp,(e,t)=>Object.is(e.source,t.source)&&Object.is(e.flags,t.flags)],[ArrayBuffer,S],[Map,(e,t)=>{if(e.size!==t.size)return!1;for(const[r,n]of e)if(!t.has(r)||!F(n,t.get(r)))return!1;return!0}],[Set,(e,t)=>{if(e.size!==t.size)return!1;for(const r of e){let e=!1;for(const n of t)if(F(r,n)){e=!0;break}if(!e)return!1}return!0}]]);function F(e,t){if(!s(e)||!s(t))return Object.is(e,t);if(e.constructor!==t.constructor)return!1;if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!F(e[r],t[r]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t))return S(e,t);if(e.constructor&&$.has(e.constructor))return $.get(e.constructor)(e,t);if(!c(e)||!c(t))return e===t;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(const n of r)if(!u(t,n)||!F(e[n],t[n]))return!1;return!0}function E(e,t,r=h){if(void 0===t)return r(e);if(c(e)&&c(t)){const n=Object.assign({},e);return Object.keys(t).forEach(e=>{if(!function(e){return"__proto__"!==e&&"constructor"!==e&&"prototype"!==e}(e))return;const i=n[e],o=t[e];c(i)&&c(o)?n[e]=E(i,o,r):n[e]=r(o)}),n}return r(t)}class v extends Set{}class _ extends Map{}const R=b({state:{change:"$state:change"}});function z(e,t){const r={r:null,s:null},n=Math.max(0,t||0);function i(){r.r&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.r),r.s&&clearTimeout(r.s),r.r=null,r.s=null}return"function"==typeof requestAnimationFrame?r.r=requestAnimationFrame(()=>{r.s=setTimeout(()=>{e(),i()},n)}):r.s=setTimeout(()=>{e(),i()},n),{ids:r,cancel:i}}function D(e){return"undefined"!=typeof FileList&&e instanceof FileList||"object"==typeof e&&null!==e&&"[object FileList]"===n(e)&&"length"in e&&"item"in e&&o(e.item)}const x=/^[a-zA-Z0-9][a-zA-Z0-9!#$&\-^_.+]*\/[a-zA-Z0-9][a-zA-Z0-9!#$&\-^_.+]*(;\s*[\w.-]+=[\w.-]+)*$/;const k={"đ":"d","æ":"ae","ø":"o","å":"a","œ":"oe","ß":"ss","þ":"th","ð":"d"};function L(e,t={}){const{separator:r="-",silent:n=!1}=t;if(!e)return"";e=e.toLowerCase();const i=Object.assign(Object.assign({},k),t.transformer),o=Object.keys(i);if(o.length>0){o.sort((e,t)=>t.length-e.length);const t=o.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),r=new RegExp(t.join("|"),"g");e=e.replace(r,e=>{const t=i[e];return n&&t.length>1?"":t})}if(e=e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\w]|_|-/g,r),!r)return e.trim();const s=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.replace(new RegExp(`${s}+`,"g"),r).replace(new RegExp(`^${s}|${s}$`,"g"),"").trim()}const N={separator:"",silent:!0,transformer:Object.assign({},k)};e.DEFAULT_TRANSFORMER=k,e.Json=A,e.MIME_REGEX=x,e.Primitive=m,e.Serialize=j,e.Subscriber=class{get shallow(){return b({merge:this._shallow.merge,clone:this._shallow.clone,isEqual:this._shallow.isEqual})}set shallow(e){this._shallow=this._shallow.merge(this._shallow,e)}constructor(e,t){this._state={},this.listeners=new _,this._shallow={merge:E,clone:h,isEqual:F},this._events=b(R),this._state=null!=e?e:{},this._events=b(Object.assign(Object.assign({},this._events),t))}subscribe(e,t){return this.listeners.has(e)||this.listeners.set(e,new v),this.listeners.get(e).add(t),()=>{var r;null===(r=this.listeners.get(e))||void 0===r||r.delete(t)}}dispatch(e,t){this.listeners.has(e)&&this.listeners.get(e).forEach(e=>{e(...void 0===t?[]:[t])})}getState(){return this._state}setState(e){const t=this._shallow.merge(this._state,e);this._shallow.isEqual(this._state,t)||(this._state=t,this.dispatch(this._events.state.change,this._shallow.clone(t)))}onStateChange(e){return this.subscribe(this._events.state.change,e)}async subscribeAsyncOnce(e,t,r){let n,i;try{return await new Promise((o,s)=>{if(null==r?void 0:r.aborted)return s(new Error("Operation cancelled"));n=this.subscribe(e,e=>{null==t||t(e),o(e)}),r&&(i=()=>s(new Error("Operation cancelled")),r.addEventListener("abort",i,{once:!0}))})}finally{null==n||n(),r&&i&&r.removeEventListener("abort",i)}}static wire(e,t){for(const r in t){if(r in e)throw new Error(`[Subscriber.wire] "${r}" is invalid.`);const n=t[r];if(!c(n))continue;const o=Object.keys(n).reduce((t,r)=>{const o=n[r];return t[r]=t=>{e.dispatch(o,t)},t[`on${i(r)}`]=t=>e.subscribe(o,t),t},{});Object.defineProperty(e,r,{value:b(o),writable:!1,enumerable:!0,configurable:!1})}return e}},e.Url=O,e.clone=h,e.defer=z,e.deferAsync=function(e){let t;const r=new Promise(r=>{const{cancel:n}=z(()=>r(),e);t=n});return r.cancel=()=>{t()},r},e.escapeRegexKey=function(e){return e.replace(/([.[\]{}])/g,"\\$1")},e.flatten=function e(t,r="",n={}){if("object"!=typeof t||null===t)return r&&(n[r]=t),n;if(Array.isArray(t))for(let i=0;i<t.length;i++){const o=r?`${r}.${i}`:`${i}`;e(t[i],o,n)}else for(const[i,o]of Object.entries(t)){e(o,r?`${r}.${i}`:i,n)}return n},e.flattenToArray=function(e,t){const r=`${t}.`,n=Object.entries(e).filter(([e])=>e.startsWith(r));if(!n.length)return[];const i=n[0][0].replace(r,"").split(".")[0];if(!!isNaN(Number(i)))return n.map(([e,t])=>({key:e.replace(r,""),value:t}));const o=n.reduce((e,[t,n])=>{const i=t.replace(r,"").split("."),o=i[0],s=i.slice(1).join(".");return e[o]||(e[o]={}),s?e[o][s]=n:e[o]=n,e},{});return Object.values(o)},e.freeze=b,e.get=t,e.hasOwnProperty=u,e.interpolate=r,e.isComplexObject=function(e){return s(e)&&!Array.isArray(e)},e.isEqual=F,e.isFileList=D,e.isFormData=function(e){return e instanceof FormData},e.isFunction=o,e.isLiteralObject=c,e.isObject=s,e.isObjectable=a,e.merge=E,e.objectToFormData=function e(t,r=new FormData,n=""){return null==t||(t instanceof Date?r.append(n,t.toISOString()):t instanceof File||t instanceof Blob?r.append(n,t):D(t)?Array.from(t).forEach((e,t)=>{const i=n?`${n}[${t}]`:String(t);r.append(i,e,e.name)}):Array.isArray(t)?t.forEach((t,i)=>{const o=n?`${n}[${i}]`:String(i);e(t,r,o)}):"object"==typeof t?Object.entries(t).forEach(([t,i])=>{e(i,r,n?`${n}[${t}]`:t)}):r.append(n,String(t))),r},e.pascalToKebab=function(e){return e?e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").toLowerCase():e},e.queryString=w,e.sanitizeMime=function(e){return x.test(e)?e:""},e.searchify=function(e,t){const r=L(t,N),n=r.length,i={matches:[],positions:[]};if(!n)return i;const o=new Map,s=[...e.split("")].map((e,t)=>{let r=o.get(e);return void 0===r&&(r=L(e,N),o.set(e,r)),{originIndex:t,slugified:r,char:e}}).filter((e,t,r)=>0===t||(" "!==e.char||" "!==r[t-1].char));if(s.length<n)return i;for(let t=0;t<s.length;){const o=s[t];if(""===o.slugified){t++;continue}let c="",a=t,u=!0;for(;c.length<n&&a<s.length;){const e=s[a];if(""!==e.slugified&&(c+=e.slugified,!r.startsWith(c))){u=!1;break}a++}if(u&&c===r){const r=s[a-1],n=e.substring(o.originIndex,r.originIndex+1);i.matches.push(n),i.positions.push({start:o.originIndex,length:n.length}),t=a}else t++}return i},e.slugify=L,e.toString=n,e.ucfirst=i});
2
2
  //# sourceMappingURL=ecosy-core.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ecosy-core.umd.js","sources":["../src/utilities/get.ts","../src/serialize/interpolate.ts","../src/utilities/string.ts","../src/utilities/is-function.ts","../src/utilities/object.ts","../src/utilities/clone.ts","../src/utilities/freeze.ts","../src/serialize/primitive.ts","../src/serialize/json.ts","../src/serialize/url.ts","../src/serialize/query-string.ts","../src/serialize/index.ts","../src/utilities/is-equal.ts","../src/utilities/merge.ts","../src/subscriber.ts","../src/utilities/defer.ts","../src/utilities/filelist.ts","../src/utilities/sanitize-mime.ts","../src/utilities/slugify.ts","../src/utilities/searchify.ts","../src/utilities/flatten.ts","../src/utilities/formdata.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Safely retrieves a nested value from an object using a dot/bracket path.\n * Returns `defaultValue` only when the resolved value is `undefined` —\n * falsy values like `null`, `0`, `false`, and `\"\"` are returned as-is.\n *\n * @param data - The source object to traverse.\n * @param path - Dot-notation string (`\"a.b.c\"`), bracket-notation (`\"a[0].b\"`), or an array of keys.\n * @param defaultValue - Value returned when the path resolves to `undefined`.\n * @returns The resolved value, or `defaultValue` if not found.\n *\n * @example\n * ```ts\n * const obj = { users: [{ name: \"Alice\" }] };\n *\n * get(obj, \"users[0].name\"); // \"Alice\"\n * get(obj, \"users.0.name\"); // \"Alice\"\n * get(obj, \"users[1].name\", \"N/A\"); // \"N/A\"\n * get(obj, \"count\", 0); // 0\n * ```\n */\nexport function get(data, path, defaultValue) {\n // 1. Short-circuit if data is nullish\n if (data === null || data === undefined) {\n return defaultValue;\n }\n // 2. Normalize path into an array of keys\n // Handles both dot notation (\"a.b\") and bracket notation (\"a[0]\")\n const keys = Array.isArray(path)\n ? path\n : path\n .replace(/\\[(\\d+)]/g, \".$1\") // Convert \"users[0]\" to \"users.0\"\n .split(\".\")\n .filter(Boolean); // Remove empty segments from leading/trailing dots\n if (keys.length === 0) {\n return data;\n }\n // 3. Traverse the object tree\n let result = data;\n for (const key of keys) {\n // Stop early if we hit null/undefined mid-path\n if (result === null || result === undefined) {\n return defaultValue;\n }\n result = result[key];\n }\n // 4. Return defaultValue only for undefined; null, 0, false, \"\" are valid results\n return result === undefined ? defaultValue : result;\n}\n","import { get } from \"../utilities/get\";\n/**\n * Interpolates `{key}` placeholders in a string using deep path resolution via {@link get}.\n * Objects are silently replaced with empty strings to avoid `[object Object]`.\n *\n * @param pattern - Template string with `{key}` or `{path.to.key}` placeholders.\n * @param params - Data object or array to resolve values from.\n * @returns The interpolated string.\n */\nexport function interpolate(pattern, params = {}) {\n // Fast-path: skip processing if no placeholders\n if (!pattern ||\n typeof pattern !== \"string\" ||\n !pattern.trim().length ||\n !pattern.includes(\"{\") ||\n !pattern.includes(\"}\")) {\n return pattern;\n }\n // Scan for placeholders and resolve lazily via `get`\n return pattern.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (match, variable) => {\n const value = get(params, variable);\n // Unresolved placeholders become empty strings\n if (value === null || value === undefined) {\n return \"\";\n }\n // Prevent \"[object Object]\" — only render primitives\n if (typeof value === \"object\") {\n return \"\";\n }\n return String(value);\n });\n}\n/** Type guards and deep normalization utilities. */\n","/**\n * Returns the internal `[[Class]]` tag of a value using `Object.prototype.toString`.\n *\n * @example\n * ```ts\n * toString([]); // \"[object Array]\"\n * toString(null); // \"[object Null]\"\n * ```\n */\nexport function toString(value) {\n return Object.prototype.toString.call(value);\n}\n/**\n * Capitalizes the first character of a string.\n *\n * @example\n * ```ts\n * ucfirst(\"hello\"); // \"Hello\"\n * ```\n */\nexport function ucfirst(str) {\n return (str.charAt(0).toUpperCase() + str.slice(1));\n}\n/**\n * Converts a PascalCase or camelCase string to kebab-case.\n * Handles consecutive uppercase characters (e.g. acronyms) gracefully.\n *\n * @example\n * ```ts\n * pascalToKebab(\"MyComponent\"); // \"my-component\"\n * pascalToKebab(\"HTMLParser\"); // \"html-parser\"\n * pascalToKebab(\"camelCase\"); // \"camel-case\"\n * ```\n */\nexport function pascalToKebab(str) {\n if (!str)\n return str;\n return str\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n","import { toString } from \"./string\";\n/**\n * Checks whether a value is a function (including async and generator functions).\n *\n * @param value - The value to check.\n * @returns `true` if the value is a function.\n *\n * @example\n * ```ts\n * isFunction(() => {}); // true\n * isFunction(async () => {}); // true\n * isFunction(42); // false\n * ```\n */\nexport function isFunction(value) {\n return (typeof value === \"function\" ||\n [\"[object Function]\", \"[object AsyncFunction]\", \"[object GeneratorFunction]\"].includes(toString(value)));\n}\n","import { isFunction } from \"./is-function\";\n/**\n * Checks whether a value is a non-null object.\n *\n * @param value - The value to check.\n * @returns `true` if the value is of type `object` and is not `null`.\n */\nexport function isObject(value) {\n return typeof value === \"object\" && value !== null;\n}\n/**\n * Checks whether a value is a plain object (created by `{}` or `Object.create(null)`).\n *\n * @param value - The value to check.\n * @returns `true` if the value is a plain literal object.\n */\nexport function isLiteralObject(value) {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n/**\n * Checks whether a value is a complex (non-array) object, such as a class instance.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a non-array object.\n */\nexport function isComplexObject(value) {\n return isObject(value) && !Array.isArray(value);\n}\n/**\n * Checks whether a value is an object, array, or function.\n *\n * @param value - The value to check.\n * @returns `true` if the value is \"objectable\" (object, array, or function).\n */\nexport function isObjectable(value) {\n return isObject(value) || isFunction(value);\n}\n/**\n * Type-safe check for own property existence on an object.\n *\n * @param obj - The object to check.\n * @param key - The property key to look for.\n * @returns `true` if the object has the specified own property.\n *\n * @example\n * ```ts\n * hasOwnProperty({ a: 1 }, \"a\"); // true\n * hasOwnProperty({ a: 1 }, \"b\"); // false\n * ```\n */\nexport function hasOwnProperty(obj, key) {\n if (!obj) {\n return false;\n }\n if (!isObjectable(obj)) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n }\n return (Object.prototype.hasOwnProperty.call(obj, key) || key in obj);\n}\n","import { isFunction } from \"./is-function\";\nimport { hasOwnProperty, isObjectable } from \"./object\";\nconst cloneStrateries = {\n [Date.toString()]: (data) => new Date(data.getTime()),\n [RegExp.toString()]: (data) => new RegExp(data.source, data.flags),\n [Map.toString()]: (data, cache) => {\n const result = new Map();\n cache.set(data, result);\n data.forEach((val, key) => {\n result.set(clone(key, cache), clone(val, cache));\n });\n return result;\n },\n [Set.toString()]: (data, cache) => {\n const result = new Set();\n cache.set(data, result);\n data.forEach((val) => {\n result.add(clone(val, cache));\n });\n return result;\n },\n [ArrayBuffer.toString()]: (data) => {\n return data.slice(0);\n },\n};\nconst Strateries = [Date, RegExp, Map, Set, ArrayBuffer];\nconst NumberTypedArray = [\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n DataView,\n];\nconst DoNotClone = (() => {\n return Array.from(new Set([\n // Built-in\n Error,\n Promise,\n Blob,\n // Split by environment\n typeof WeakMap !== \"undefined\" && WeakMap,\n typeof WeakSet !== \"undefined\" && WeakSet,\n typeof Symbol !== \"undefined\" && Symbol,\n typeof Window !== \"undefined\" && Window,\n typeof File !== \"undefined\" && File,\n typeof FormData !== \"undefined\" && FormData,\n typeof Headers !== \"undefined\" && Headers,\n typeof Request !== \"undefined\" && Request,\n typeof Response !== \"undefined\" && Response,\n typeof Worker !== \"undefined\" && Worker,\n typeof AbortController !== \"undefined\" && AbortController,\n typeof Node !== \"undefined\" && Node,\n typeof FileList !== \"undefined\" && FileList,\n ]));\n})();\nfunction isConstructor(constructor, targets) {\n return targets.includes(constructor);\n}\n/**\n * Deep clones a value, handling circular references, built-in types (Date, RegExp, Map, Set,\n * ArrayBuffer, TypedArrays), arrays, and plain objects. Skips non-cloneable types like\n * Error, Promise, WeakMap, DOM nodes, etc.\n *\n * @param data - The value to clone.\n * @param cache - Internal WeakMap used to track circular references.\n * @returns A deep copy of the input value.\n *\n * @example\n * ```ts\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = clone(original);\n * cloned.b.c = 3;\n * original.b.c; // still 2\n * ```\n */\nexport function clone(data, cache = new WeakMap()) {\n var _a;\n if (!isObjectable(data) ||\n isFunction(data) ||\n hasOwnProperty(data, \"$$typeof\") ||\n (data.constructor && isConstructor(data.constructor, DoNotClone))) {\n return data;\n }\n // Prevent circular references\n if (cache.has(data)) {\n return cache.get(data);\n }\n if (data.constructor && isConstructor(data.constructor, NumberTypedArray)) {\n const itemData = data;\n const ItemClass = data.constructor;\n const result = new ItemClass(itemData.buffer.slice(0), itemData.byteOffset, itemData.byteLength);\n cache.set(data, result);\n return result;\n }\n const ItemConstructor = data.constructor;\n if (Strateries.includes(ItemConstructor)) {\n const handleName = ItemConstructor.toString();\n const handler = cloneStrateries[handleName];\n const result = handler(data, cache);\n cache.set(data, result);\n return result;\n }\n // Is Object | Array | Class | Instance | Function\n const result = Array.isArray(data)\n ? new (((_a = Object.getPrototypeOf(data)) === null || _a === void 0 ? void 0 : _a.constructor) || Array)()\n : Object.create(Object.getPrototypeOf(data));\n cache.set(data, result);\n const keys = Reflect.ownKeys(data);\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(data, key);\n if (descriptor) {\n if (\"value\" in descriptor) {\n descriptor.value = clone(descriptor.value, cache);\n }\n Object.defineProperty(result, key, descriptor);\n }\n }\n return result;\n}\n","import { clone } from \"./clone\";\nimport { isObject } from \"./object\";\nfunction deepFreezeInternal(obj) {\n const propNames = Reflect.ownKeys(obj);\n for (const name of propNames) {\n const value = obj[name];\n if (isObject(value)) {\n deepFreezeInternal(value);\n }\n }\n return Object.freeze(obj);\n}\n/**\n * Deep freezes a value by first cloning it, then recursively calling `Object.freeze`.\n * Primitives are returned as-is.\n *\n * @param data - The value to freeze.\n * @param cloneDeep - Custom clone function (defaults to `clone`).\n * @returns A deeply frozen copy of the input.\n *\n * @example\n * ```ts\n * const frozen = freeze({ a: { b: 1 } });\n * frozen.a.b = 2; // throws in strict mode\n * ```\n */\nexport function freeze(data, cloneDeep = clone) {\n if (!isObject(data)) {\n return data;\n }\n const cloned = cloneDeep(data);\n return deepFreezeInternal(cloned);\n}\n","import { freeze } from \"../utilities/freeze\";\nimport { hasOwnProperty, isLiteralObject, isObjectable } from \"../utilities/object\";\nimport { isFunction } from \"../utilities/is-function\";\n/** Type guards and deep normalization utilities. */\nexport const Primitive = freeze({\n isString: (value) => {\n return typeof value === \"string\";\n },\n isNumber(value) {\n return typeof value === \"number\" && Number.isFinite(value);\n },\n isBoolean(value) {\n return typeof value === \"boolean\";\n },\n isPrimitive(value) {\n return !isObjectable(value);\n },\n isDate(value) {\n return value instanceof Date && !Number.isNaN(value.getTime());\n },\n isPlainObject: isLiteralObject,\n normalize(data) {\n const prim = Primitive;\n if (prim.isPrimitive(data)) {\n if (typeof data === \"bigint\")\n return data.toString();\n return data;\n }\n if (prim.isDate(data)) {\n return data.toISOString();\n }\n if (Array.isArray(data)) {\n return data.map((item) => prim.normalize(item));\n }\n // Use isLiteralObject for consistent plain-object detection\n if (isLiteralObject(data)) {\n const result = {};\n for (const key in data) {\n if (hasOwnProperty(data, key)) {\n const val = data[key];\n if (val !== undefined) {\n result[key] = prim.normalize(val);\n }\n }\n }\n return result;\n }\n if (data && hasOwnProperty(data, \"toJSON\") && isFunction(data.toJSON)) {\n return data.toJSON();\n }\n return {};\n },\n});\n","import { freeze } from \"../utilities/freeze\";\nimport { Primitive } from \"./primitive\";\n/** Safe JSON stringify/parse that never throws. */\nexport const Json = freeze({\n stringify: (value, space) => {\n var _a;\n try {\n const normalized = Primitive.normalize(value);\n return (_a = JSON.stringify(normalized, null, space)) !== null && _a !== void 0 ? _a : \"\";\n }\n catch (_b) {\n // Catch edge cases (e.g. circular references not handled by normalize)\n return \"\";\n }\n },\n parse: (text, reviver) => {\n if (!text) {\n return null;\n }\n try {\n return JSON.parse(text, reviver);\n }\n catch (_a) {\n return null; // Return null instead of throwing to keep the flow alive\n }\n },\n});\n","import { freeze } from \"../utilities/freeze\";\n/** URL encoding/decoding with malformed-character recovery. */\nexport const Url = freeze({\n encode(value, component = true) {\n if (!value)\n return \"\";\n if (typeof component === \"function\")\n return component(value);\n try {\n return component ? encodeURIComponent(value) : encodeURI(value);\n }\n catch (_a) {\n // Strip broken surrogate chars and retry instead of crashing\n const sanitized = value.replace(/[\\uD800-\\uDFFF]/g, \"\");\n return component ? encodeURIComponent(sanitized) : encodeURI(sanitized);\n }\n },\n decode: (value, component = true) => {\n if (!value)\n return \"\";\n if (typeof component === \"function\")\n return component(value);\n const decoder = component ? decodeURIComponent : decodeURI;\n const normalized = component ? value.replace(/\\+/g, \"%20\") : value;\n return normalized.replace(/(%[0-9A-F]{2})+/gi, (match) => {\n try {\n return decoder(match);\n }\n catch (_a) {\n console.warn(`[Serialize.URL] Cannot decode part: ${match}`);\n return match; // Keep broken parts intact, recover what we can\n }\n });\n },\n build: (uri, params) => {\n if (!uri)\n return \"\";\n if (!params || typeof params !== \"object\")\n return uri;\n // Single-pass regex replace for maximum speed\n return uri.replace(/:([a-zA-Z\\d_]+)/g, (fullMatch, key) => {\n const value = params[key];\n // If param is not provided, keep the \":key\" placeholder\n if (value === null || value === undefined) {\n return fullMatch;\n }\n // Auto-encode the value using the same URL encoder\n return Url.encode(String(value), true);\n });\n },\n});\n","import { freeze } from \"../utilities/freeze\";\nimport { Primitive } from \"./primitive\";\nimport { Url } from \"./url\";\n/** Query string parse/stringify with configurable array formats. */\nexport const queryString = freeze({\n parse(query) {\n if (!query)\n return {};\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n const result = {};\n cleanQuery.split(\"&\").forEach((part) => {\n if (!part)\n return;\n const [key, value] = part.split(\"=\");\n if (key) {\n result[Url.decode(key)] = value ? Url.decode(value) : \"\";\n }\n });\n return result;\n },\n stringify(params, options = {}) {\n if (params === null || typeof params !== \"object\")\n return \"\";\n const { arrayFormat = \"none\", arrayFormatSeparator = \",\", skipNull = false, skipEmptyString = false, encode = true, strict = true, sort = false, } = options;\n const isValidKey = (k) => k.length > 0 && /^[a-zA-Z0-9_\\-.[\\]]+$/.test(k);\n // Internal encode wrapper\n const encoder = (val) => {\n if (!encode)\n return val;\n return Url.encode(val, encode);\n };\n const resultPairs = [];\n // Flat recursion — traverse arrays and nested objects\n const traverse = (prefix, obj) => {\n if (Array.isArray(obj)) {\n if (arrayFormat === \"comma\" || arrayFormat === \"separator\") {\n const validVals = obj.filter((v) => v !== null && v !== undefined && v !== \"\");\n if (validVals.length > 0) {\n resultPairs.push(`${encoder(prefix)}=${encoder(validVals.map(String).join(arrayFormatSeparator))}`);\n }\n return;\n }\n obj.forEach((val, idx) => {\n let arrayKey = prefix;\n if (arrayFormat === \"bracket\")\n arrayKey = `${prefix}[]`;\n else if (arrayFormat === \"index\")\n arrayKey = `${prefix}[${idx}]`;\n traverse(arrayKey, val);\n });\n return;\n }\n if (Primitive.isPlainObject(obj)) {\n for (const subKey in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, subKey)) {\n traverse(`${prefix}[${subKey}]`, obj[subKey]);\n }\n }\n return;\n }\n // Primitive formatting\n if (obj === null || obj === undefined) {\n if (!skipNull)\n resultPairs.push(`${encoder(prefix)}=`);\n return;\n }\n if (obj === \"\") {\n if (!skipEmptyString)\n resultPairs.push(`${encoder(prefix)}=`);\n return;\n }\n if (typeof obj === \"boolean\") {\n resultPairs.push(`${encoder(prefix)}=${obj ? \"true\" : \"false\"}`);\n return;\n }\n if (Primitive.isDate(obj)) {\n resultPairs.push(`${encoder(prefix)}=${encoder(obj.toISOString())}`);\n return;\n }\n resultPairs.push(`${encoder(prefix)}=${encoder(String(obj))}`);\n };\n // Run the top-level iteration\n let keys = Object.keys(params);\n if (sort)\n keys = typeof sort === \"function\" ? keys.sort(sort) : keys.sort();\n for (const key of keys) {\n if (strict && !isValidKey(key))\n continue;\n traverse(key, params[key]);\n }\n return resultPairs.join(\"&\");\n },\n});\n","import { interpolate } from \"./interpolate\";\nimport { Json } from \"./json\";\nimport { Primitive } from \"./primitive\";\nimport { queryString } from \"./query-string\";\nimport { Url } from \"./url\";\nexport * from \"./types\";\nexport { interpolate } from \"./interpolate\";\nexport { Json } from \"./json\";\nexport { Primitive } from \"./primitive\";\nexport { queryString } from \"./query-string\";\nexport { Url } from \"./url\";\n/**\n * Centralized serialization engine and type-guard toolkit.\n * Addresses common pitfalls of `JSON.stringify`/`JSON.parse` — BigInt safety,\n * Date preservation, undefined stripping, and safe URL encoding/decoding.\n *\n * This is the convenience surface: it gathers every part under one name.\n * Referencing it keeps all of them, because a class is a single binding and a\n * bundler cannot drop half of one. Code that cares about what it ships should\n * import the part it uses instead — each lives in its own module, so nothing\n * else comes with it:\n *\n * ```ts\n * import { Primitive } from \"@ecosy/core/serialize/primitive\";\n * import { queryString } from \"@ecosy/core/serialize/query-string\";\n * ```\n *\n * The two are the same objects, so mixing them is free.\n *\n * @example\n * ```ts\n * Serialize.JSON.stringify({ date: new Date(), big: 123n });\n * Serialize.JSON.parse<User>(jsonText);\n * Serialize.URL.encode(\"hello world\");\n * Serialize.queryString.stringify({ page: 1, tags: [\"a\", \"b\"] });\n * ```\n */\nexport class Serialize {\n}\nSerialize.interpolate = interpolate;\n/** Type guards and deep normalization utilities. */\nSerialize.Primitive = Primitive;\n/** Safe JSON stringify/parse that never throws. */\nSerialize.JSON = Json;\n/** URL encoding/decoding with malformed-character recovery. */\nSerialize.URL = Url;\n/** Query string parse/stringify with configurable array formats. */\nSerialize.queryString = queryString;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { hasOwnProperty, isLiteralObject, isObject } from \"./object\";\nfunction isEqualArrayBuffer(value1, value2) {\n if (value1.byteLength !== value2.byteLength) {\n return false;\n }\n const buffer1 = ArrayBuffer.isView(value1) ? value1.buffer : value1;\n const offset1 = ArrayBuffer.isView(value1) ? value1.byteOffset : 0;\n const buffer2 = ArrayBuffer.isView(value2) ? value2.buffer : value2;\n const offset2 = ArrayBuffer.isView(value2) ? value2.byteOffset : 0;\n const view1 = new Uint8Array(buffer1, offset1, value1.byteLength);\n const view2 = new Uint8Array(buffer2, offset2, value2.byteLength);\n for (let i = 0; i < view1.length; i++) {\n if (view1[i] !== view2[i]) {\n return false;\n }\n }\n return true;\n}\nconst isEqualStrategies = new Map([\n [Date, (value1, value2) => Object.is(value1.getTime(), value2.getTime())],\n [\n RegExp,\n (value1, value2) => Object.is(value1.source, value2.source) && Object.is(value1.flags, value2.flags),\n ],\n [ArrayBuffer, isEqualArrayBuffer],\n [\n Map,\n (value1, value2) => {\n if (value1.size !== value2.size) {\n return false;\n }\n for (const [key, val] of value1) {\n if (!value2.has(key) || !isEqual(val, value2.get(key))) {\n return false;\n }\n }\n return true;\n },\n ],\n [\n Set,\n (value1, value2) => {\n if (value1.size !== value2.size) {\n return false;\n }\n for (const item1 of value1) {\n let hasMatch = false;\n for (const item2 of value2) {\n if (isEqual(item1, item2)) {\n hasMatch = true;\n break;\n }\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n },\n ],\n]);\n/**\n * Performs a deep structural equality check between two values.\n * Supports primitives, arrays, plain objects, Date, RegExp, Map, Set,\n * ArrayBuffer, and TypedArrays.\n *\n * @param value1 - The first value to compare.\n * @param value2 - The second value to compare.\n * @returns `true` if both values are deeply equal.\n *\n * @example\n * ```ts\n * isEqual({ a: 1 }, { a: 1 }); // true\n * isEqual([1, 2], [1, 3]); // false\n * isEqual(new Date(0), new Date(0)); // true\n * ```\n */\nexport function isEqual(value1, value2) {\n // primitive, null, function, avoid NaN === NaN is false\n if (!isObject(value1) || !isObject(value2)) {\n return Object.is(value1, value2);\n }\n // If complex object, check constructor\n if (value1.constructor !== value2.constructor) {\n return false;\n }\n if (Array.isArray(value1)) {\n if (!Array.isArray(value2) || value1.length !== value2.length) {\n return false;\n }\n for (let i = 0; i < value1.length; i++) {\n if (!isEqual(value1[i], value2[i])) {\n return false;\n }\n }\n return true;\n }\n // TypedArray, same logic array because constructor match above\n if (ArrayBuffer.isView(value1) && ArrayBuffer.isView(value2)) {\n return isEqualArrayBuffer(value1, value2);\n }\n if (value1.constructor && isEqualStrategies.has(value1.constructor)) {\n return isEqualStrategies.get(value1.constructor)(value1, value2);\n }\n if (!isLiteralObject(value1) || !isLiteralObject(value2)) {\n return value1 === value2;\n }\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n if (!hasOwnProperty(value2, key) ||\n !isEqual(value1[key], value2[key])) {\n return false;\n }\n }\n return true;\n}\n","import { clone } from \"./clone\";\nimport { isLiteralObject } from \"./object\";\nfunction isValidKey(key) {\n return key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\";\n}\n/**\n * Deep merges `target` into `source`. If both are plain objects, properties are merged\n * recursively. Otherwise, `target` replaces `source`. Prototype-polluting keys\n * (`__proto__`, `constructor`, `prototype`) are rejected.\n *\n * @param source - The base object.\n * @param target - The object whose values are merged into `source`.\n * @param cloneDeep - Custom deep clone function (defaults to `clone`).\n * @returns The merged result.\n *\n * @example\n * ```ts\n * merge({ a: 1, b: { c: 2 } }, { b: { d: 3 } });\n * // { a: 1, b: { c: 2, d: 3 } }\n * ```\n */\nexport function merge(source, target, cloneDeep = clone) {\n if (target === undefined) {\n return cloneDeep(source);\n }\n if (isLiteralObject(source) && isLiteralObject(target)) {\n const result = Object.assign({}, source);\n Object.keys(target).forEach((key) => {\n if (!isValidKey(key)) {\n return;\n }\n const sourceValue = result[key];\n const targetValue = target[key];\n if (isLiteralObject(sourceValue) && isLiteralObject(targetValue)) {\n result[key] = merge(sourceValue, targetValue, cloneDeep);\n }\n else {\n result[key] = cloneDeep(targetValue);\n }\n });\n return result;\n }\n return cloneDeep(target);\n}\n","import { clone } from \"./utilities/clone\";\nimport { freeze } from \"./utilities/freeze\";\nimport { isEqual } from \"./utilities/is-equal\";\nimport { isLiteralObject } from \"./utilities/object\";\nimport { merge } from \"./utilities/merge\";\nimport { ucfirst } from \"./utilities/string\";\nclass SubscribeListener extends Set {\n}\nclass SubscribeListeners extends Map {\n}\nconst defaultEvents = freeze({\n state: {\n change: \"$state:change\",\n },\n});\n/**\n * Generic pub/sub event emitter with built-in state management.\n * Provides subscribe/dispatch for arbitrary channels and state change notifications.\n *\n * @typeParam State - The shape of the internal state object.\n * @typeParam Events - Extended event definitions to wire onto the instance.\n */\nexport class Subscriber {\n get shallow() {\n return freeze({\n merge: this._shallow.merge,\n clone: this._shallow.clone,\n isEqual: this._shallow.isEqual,\n });\n }\n set shallow(shallow) {\n this._shallow = this._shallow.merge(this._shallow, shallow);\n }\n constructor(initialState, events) {\n this._state = {};\n this.listeners = new SubscribeListeners();\n this._shallow = {\n merge,\n clone,\n isEqual,\n };\n this._events = freeze(defaultEvents);\n this._state = (initialState !== null && initialState !== void 0 ? initialState : {});\n this._events = freeze(Object.assign(Object.assign({}, this._events), events));\n }\n /**\n * Subscribes a handler to a named channel.\n *\n * @param channel - The event channel name.\n * @param handler - Callback invoked when the channel is dispatched.\n * @returns An unsubscribe function.\n */\n subscribe(channel, handler) {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new SubscribeListener());\n }\n this.listeners.get(channel).add(handler);\n return () => {\n var _a;\n (_a = this.listeners.get(channel)) === null || _a === void 0 ? void 0 : _a.delete(handler);\n };\n }\n /**\n * Dispatches a payload to all handlers subscribed to the given channel.\n *\n * @param channel - The event channel name.\n * @param payload - Optional data to pass to each handler.\n */\n dispatch(channel, payload) {\n if (!this.listeners.has(channel)) {\n return;\n }\n this.listeners.get(channel).forEach((handler) => {\n const params = payload === undefined ? [] : [payload];\n handler(...params);\n });\n }\n /** Returns the current state. */\n getState() {\n return this._state;\n }\n /**\n * Merges new state and dispatches a state change event if the state has changed.\n *\n * @param state - Full or partial state to merge.\n */\n setState(state) {\n const nextState = this._shallow.merge(this._state, state);\n if (!this._shallow.isEqual(this._state, nextState)) {\n this._state = nextState;\n this.dispatch(this._events.state.change, this._shallow.clone(nextState));\n }\n }\n /**\n * Shorthand to subscribe to state change events.\n *\n * @param handler - Callback receiving the new state.\n * @returns An unsubscribe function.\n */\n onStateChange(handler) {\n return this.subscribe(this._events.state.change, handler);\n }\n /**\n * Subscribes to a channel, resolving a Promise with the first dispatched payload.\n * Supports cancellation via an `AbortSignal`.\n *\n * @warning If the channel is never dispatched and no `AbortSignal` is provided,\n * the returned Promise will never resolve, causing a memory leak. Always pass an\n * `AbortSignal` or ensure the channel will eventually be dispatched.\n *\n * @param channel - The event channel name.\n * @param handler - Optional callback invoked on payload.\n * @param signal - Optional AbortSignal to cancel the subscription.\n * @returns A promise that resolves with the first payload dispatched to the channel.\n */\n async subscribeAsyncOnce(channel, handler, signal) {\n let unsub;\n let onAbort;\n try {\n return await new Promise((resolve, reject) => {\n if (signal === null || signal === void 0 ? void 0 : signal.aborted) {\n return reject(new Error(\"Operation cancelled\"));\n }\n const handle = ((payload) => {\n handler === null || handler === void 0 ? void 0 : handler(payload);\n resolve(payload);\n });\n unsub = this.subscribe(channel, handle);\n if (signal) {\n onAbort = () => reject(new Error(\"Operation cancelled\"));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n finally {\n unsub === null || unsub === void 0 ? void 0 : unsub();\n if (signal && onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n }\n /**\n * Wires event domains onto a `Subscriber` instance, creating typed dispatch and\n * listener methods (e.g. `instance.domainName.eventName()` and\n * `instance.domainName.onEventName()`).\n *\n * @param $instance - The subscriber instance to extend.\n * @param events - Event definitions mapping domain → channel names.\n * @returns The instance with wired event methods.\n */\n static wire($instance, events) {\n for (const channel in events) {\n if (channel in $instance) {\n throw new Error(`[Subscriber.wire] \"${channel}\" is invalid.`);\n }\n const domains = events[channel];\n if (!isLiteralObject(domains)) {\n continue;\n }\n const methods = Object.keys(domains).reduce((acc, domain) => {\n const channelName = domains[domain];\n acc[domain] = (payload) => {\n $instance.dispatch(channelName, payload);\n };\n acc[`on${ucfirst(domain)}`] = (listener) => $instance.subscribe(channelName, listener);\n return acc;\n }, {});\n Object.defineProperty($instance, channel, {\n value: freeze(methods),\n writable: false,\n enumerable: true,\n configurable: false,\n });\n }\n return $instance;\n }\n}\n","/**\n * Schedules a callback using `requestAnimationFrame` + `setTimeout` for optimal\n * browser execution timing. Falls back to plain `setTimeout` in non-browser environments.\n *\n * @param callback - Function to execute after the defer.\n * @param delay - Additional delay in milliseconds after the animation frame. Defaults to `0`.\n * @returns An object with `ids` (internal timer IDs) and a `cancel` function.\n *\n * @example\n * ```ts\n * const { cancel } = defer(() => console.log(\"done\"), 100);\n * // Later:\n * cancel(); // Cancels if not yet executed\n * ```\n */\nexport function defer(callback, delay) {\n const ids = { r: null, s: null };\n const timeout = Math.max(0, delay || 0);\n function cancel() {\n ids.r && typeof cancelAnimationFrame === \"function\" && cancelAnimationFrame(ids.r);\n ids.s && clearTimeout(ids.s);\n ids.r = null;\n ids.s = null;\n }\n if (typeof requestAnimationFrame === \"function\") {\n ids.r = requestAnimationFrame(() => {\n ids.s = setTimeout(() => {\n callback();\n cancel();\n }, timeout);\n });\n }\n else {\n ids.s = setTimeout(() => {\n callback();\n cancel();\n }, timeout);\n }\n return { ids, cancel };\n}\n/**\n * Promise-based wrapper around {@link defer}.\n * Resolves after the specified delay, and can be cancelled before resolution.\n *\n * @param delay - Delay in milliseconds. Defaults to `0`.\n * @returns A {@link CancelablePromise} that resolves when the defer completes.\n *\n * @example\n * ```ts\n * const wait = deferAsync(500);\n * await wait; // Resolves after ~500ms\n *\n * // Or cancel early:\n * const wait2 = deferAsync(5000);\n * wait2.cancel();\n * ```\n */\nexport function deferAsync(delay) {\n let cancelRef;\n const promise = new Promise((resolve) => {\n // Leverage the core defer function above\n const { cancel } = defer(() => resolve(), delay);\n cancelRef = cancel;\n });\n // Attach the cancel method directly onto the Promise object\n promise.cancel = () => {\n cancelRef();\n };\n return promise;\n}\n","import { isFunction } from \"./is-function\";\nimport { toString } from \"./string\";\n/**\n * Checks whether a value is a `FileList` or a `FileList`-like object.\n * Uses `instanceof FileList` in browser environments and falls back to\n * `Object.prototype.toString` tag detection for isomorphic compatibility.\n *\n * @param data - The value to check.\n * @returns `true` if the value is a `FileList` or has the `[object FileList]` tag.\n *\n * @example\n * ```ts\n * const input = document.querySelector(\"input[type=file]\");\n * isFileList(input.files); // true\n * isFileList([]); // false\n * ```\n */\nexport function isFileList(data) {\n return ((typeof FileList !== \"undefined\" && data instanceof FileList) ||\n (typeof data === \"object\" &&\n data !== null &&\n toString(data) === \"[object FileList]\" &&\n \"length\" in data &&\n \"item\" in data &&\n isFunction(data.item)));\n}\n","/** RFC 2045 MIME type pattern: `type/subtype` with optional `;parameter=value`. */\nexport const MIME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*\\/[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*(;\\s*[\\w.-]+=[\\w.-]+)*$/;\n/**\n * Validate and sanitize a MIME type string.\n *\n * Returns the input unchanged if valid, empty string if malformed.\n * This prevents attackers from smuggling values like `application/php/jpeg`\n * through to the upstream API — the empty Content-Type lets the API\n * server reject the payload on its own terms instead of crashing ours.\n */\nexport function sanitizeMime(value) {\n return MIME_REGEX.test(value) ? value : \"\";\n}\n","/**\n * Default character transformer map for common non-ASCII characters.\n * Can be extended or overridden via {@link SlugifyOptions.transformer}.\n */\nexport const DEFAULT_TRANSFORMER = {\n đ: \"d\",\n æ: \"ae\",\n ø: \"o\",\n å: \"a\",\n œ: \"oe\",\n ß: \"ss\",\n þ: \"th\",\n ð: \"d\",\n};\n/**\n * Converts a string into a URL-friendly slug.\n * Handles Unicode normalization, custom character transformations,\n * and separator deduplication.\n *\n * @param str - The input string to slugify.\n * @param options - Configuration options.\n * @returns A lowercase, URL-safe slug string.\n *\n * @example\n * ```ts\n * slugify(\"Hello World\"); // \"hello-world\"\n * slugify(\"Xin Chào Đất Nước\"); // \"xin-chao-dat-nuoc\" (Vietnamese)\n * slugify(\"Straße nach München\"); // \"strasse-nach-munchen\" (German)\n * slugify(\"Ærlig talt, det er sjovt\"); // \"aerlig-talt-det-er-sjovt\" (Danish)\n * slugify(\"C'est la crème brûlée\"); // \"cest-la-creme-brulee\" (French)\n * slugify(\"Foo Bar\", { separator: \"_\" }); // \"foo_bar\"\n * ```\n */\nexport function slugify(str, options = {}) {\n const { separator = \"-\", silent = false } = options;\n if (!str) {\n return \"\";\n }\n str = str.toLowerCase();\n // 1. Merge default transformer with user overrides (user takes precedence)\n const transformer = Object.assign(Object.assign({}, DEFAULT_TRANSFORMER), options.transformer);\n const keys = Object.keys(transformer);\n if (keys.length > 0) {\n // Sort keys by length (descending) so longer matches take priority\n keys.sort((a, b) => b.length - a.length);\n const escapedKeys = keys.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n const regex = new RegExp(escapedKeys.join(\"|\"), \"g\");\n str = str.replace(regex, (match) => {\n const replaceValue = transformer[match];\n // Silent mode: discard replacements longer than 1 character\n if (silent && replaceValue.length > 1) {\n return \"\";\n }\n return replaceValue;\n });\n }\n // 2. Decompose Unicode (NFD) and strip diacritics + special characters\n str = str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^\\w]|_|-/g, separator);\n // 3. Clean up separator duplicates and trim edges\n if (!separator) {\n return str.trim();\n }\n const escapedSeparator = separator.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return str\n .replace(new RegExp(`${escapedSeparator}+`, \"g\"), separator)\n .replace(new RegExp(`^${escapedSeparator}|${escapedSeparator}$`, \"g\"), \"\")\n .trim();\n}\n","import { DEFAULT_TRANSFORMER, slugify } from \"./slugify\";\n/** Slugify options tuned for search: no separator, silent multi-char replacements. */\nconst HIGHLIGHT_SEARCH_OPTIONS = {\n separator: \"\",\n silent: true,\n transformer: Object.assign({}, DEFAULT_TRANSFORMER),\n};\n/**\n * Performs a diacritic-insensitive fuzzy search by comparing slugified characters.\n * Returns all matching substrings and their positions in the original string.\n *\n * Uses a **sliding window** algorithm with per-character slugification cache\n * for optimal performance on repeated characters.\n *\n * @param original - The original string to search within.\n * @param searchStr - The search term (will be slugified for comparison).\n * @returns A {@link SearchResult} with matched substrings and their positions.\n *\n * @example\n * ```ts\n * searchify(\"Xin Chào Việt Nam\", \"viet\");\n * // { matches: [\"Việt\"], positions: [{ start: 9, length: 4 }] }\n *\n * searchify(\"Crème Brûlée\", \"brulee\");\n * // { matches: [\"Brûlée\"], positions: [{ start: 6, length: 6 }] }\n * ```\n */\nexport function searchify(original, searchStr) {\n const slugified = slugify(searchStr, HIGHLIGHT_SEARCH_OPTIONS);\n const searchLength = slugified.length;\n const result = { matches: [], positions: [] };\n if (!searchLength) {\n return result;\n }\n const charCache = new Map();\n // Pre-process: map each original character to its slugified form (cached)\n const originalChars = [...original.split(\"\")].map((char, index) => {\n let slug = charCache.get(char);\n if (slug === undefined) {\n slug = slugify(char, HIGHLIGHT_SEARCH_OPTIONS);\n charCache.set(char, slug);\n }\n return {\n originIndex: index,\n slugified: slug,\n char,\n };\n });\n // Filter consecutive whitespace for performance\n const originalFiltered = originalChars.filter((obj, index, chars) => {\n if (index === 0)\n return true;\n if (obj.char === \" \" && chars[index - 1].char === \" \")\n return false;\n return true;\n });\n if (originalFiltered.length < searchLength) {\n return result;\n }\n // Core algorithm: sliding window match\n for (let i = 0; i < originalFiltered.length;) {\n const firstChar = originalFiltered[i];\n if (firstChar.slugified === \"\") {\n i++;\n continue;\n }\n let currentSlugified = \"\";\n let endPosition = i;\n let isMatch = true;\n while (currentSlugified.length < searchLength && endPosition < originalFiltered.length) {\n const currentChar = originalFiltered[endPosition];\n if (currentChar.slugified !== \"\") {\n currentSlugified += currentChar.slugified;\n if (!slugified.startsWith(currentSlugified)) {\n isMatch = false;\n break;\n }\n }\n endPosition++;\n }\n if (isMatch && currentSlugified === slugified) {\n const lastChar = originalFiltered[endPosition - 1];\n const matchText = original.substring(firstChar.originIndex, lastChar.originIndex + 1);\n result.matches.push(matchText);\n result.positions.push({\n start: firstChar.originIndex,\n length: matchText.length,\n });\n i = endPosition;\n }\n else {\n i++;\n }\n }\n return result;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Recursively flattens a nested object or array into a single-level object\n * with dot-separated keys.\n *\n * Array indices use dot notation (`users.0.name` instead of `users[0].name`).\n *\n * @param data - The value to flatten.\n * @param prefix - Internal prefix for recursive key building.\n * @param acc - Internal accumulator for the result.\n * @returns A flat `Record<string, unknown>` with dot-separated keys.\n *\n * @example\n * ```ts\n * flatten({ users: [{ name: \"Alice\" }] });\n * // { \"users.0.name\": \"Alice\" }\n *\n * flatten({ a: { b: { c: 1 } } });\n * // { \"a.b.c\": 1 }\n * ```\n */\nexport function flatten(data, prefix = \"\", acc = {}) {\n if (typeof data !== \"object\" || data === null) {\n if (prefix)\n acc[prefix] = data;\n return acc;\n }\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const newPrefix = prefix ? `${prefix}.${i}` : `${i}`;\n flatten(data[i], newPrefix, acc);\n }\n }\n else {\n for (const [key, value] of Object.entries(data)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n flatten(value, newPrefix, acc);\n }\n }\n return acc;\n}\n/**\n * Extracts entries from a flattened object under a given path and reconstructs\n * them as an array of objects (if the keys are numeric indices) or a list of\n * `{ key, value }` pairs (if the keys are non-numeric).\n *\n * @param data - A flattened `Record<string, unknown>` (output of {@link flatten}).\n * @param path - The dot-separated path prefix to extract.\n * @returns An array of reconstructed objects, primitive values, or `{ key, value }` pairs.\n *\n * @example\n * ```ts\n * const flat = flatten({ users: [{ name: \"Alice\" }, { name: \"Bob\" }] });\n * flattenToArray(flat, \"users\");\n * // [{ name: \"Alice\" }, { name: \"Bob\" }]\n *\n * const flat2 = flatten({ config: { host: \"localhost\", port: 3000 } });\n * flattenToArray(flat2, \"config\");\n * // [{ key: \"host\", value: \"localhost\" }, { key: \"port\", value: 3000 }]\n * ```\n */\nexport function flattenToArray(data, path) {\n const prefix = `${path}.`;\n const dataOfPath = Object.entries(data).filter(([key]) => key.startsWith(prefix));\n if (!dataOfPath.length)\n return [];\n // Get the first key, strip the prefix. e.g. \"0.name\"\n const firstKeyRemain = dataOfPath[0][0].replace(prefix, \"\");\n // Determine if it's an array by checking whether the first node is a numeric index\n const firstNode = firstKeyRemain.split(\".\")[0];\n const isArrayType = !isNaN(Number(firstNode));\n // Return as { key, value } list if not an array\n if (!isArrayType) {\n return dataOfPath.map(([key, value]) => ({\n key: key.replace(prefix, \"\"),\n value,\n }));\n }\n // Reconstruct array from \"0.name\" format\n const resultObj = dataOfPath.reduce((acc, [key, value]) => {\n const cleanedKey = key.replace(prefix, \"\"); // \"0.contact.email\"\n const parts = cleanedKey.split(\".\");\n const index = parts[0]; // \"0\"\n const remain = parts.slice(1).join(\".\"); // \"contact.email\"\n if (!acc[index])\n acc[index] = {};\n if (remain) {\n acc[index][remain] = value;\n }\n else {\n acc[index] = value; // Handle primitive arrays\n }\n return acc;\n }, {});\n return Object.values(resultObj);\n}\n/**\n * Escapes special regex characters in a key string so it can be safely\n * used inside a `RegExp` constructor.\n *\n * @param key - The string to escape.\n * @returns The escaped string with special characters prefixed by `\\\\`.\n *\n * @example\n * ```ts\n * escapeRegexKey(\"users[0].name\"); // \"users\\\\[0\\\\]\\\\.name\"\n * ```\n */\nexport function escapeRegexKey(key) {\n return key.replace(/([.[\\]{}])/g, \"\\\\$1\");\n}\n","import { isFileList } from \"./filelist\";\n/** Type guard that checks whether a value is a `FormData` instance. */\nexport function isFormData(body) {\n return body instanceof FormData;\n}\n/**\n * Recursively converts a value into a `FormData` instance.\n * Handles Date, File, Blob, FileList, arrays, nested objects, and primitives.\n *\n * @param data - The value to convert.\n * @param formData - The `FormData` instance to append to (created automatically if omitted).\n * @param parentKey - Internal key prefix for recursive nesting.\n * @returns The populated `FormData` instance.\n *\n * @example\n * ```ts\n * const fd = objectToFormData({\n * name: \"Alice\",\n * avatar: someFile,\n * tags: [\"a\", \"b\"],\n * meta: { role: \"admin\" },\n * });\n * // FormData entries:\n * // name → \"Alice\"\n * // avatar → File\n * // tags[0] → \"a\"\n * // tags[1] → \"b\"\n * // meta[role] → \"admin\"\n * ```\n */\nexport function objectToFormData(data, formData = new FormData(), parentKey = \"\") {\n // Skip null or undefined values\n if (data === null || data === undefined) {\n return formData;\n }\n // 1. Handle Date\n if (data instanceof Date) {\n formData.append(parentKey, data.toISOString());\n }\n // 2. Handle single File or Blob\n else if (data instanceof File || data instanceof Blob) {\n formData.append(parentKey, data);\n }\n // 3. Handle FileList (isomorphic-safe for Node.js)\n else if (isFileList(data)) {\n Array.from(data).forEach((file, index) => {\n // Backend typically expects array files as: files[0], files[1]\n const arrayKey = parentKey ? `${parentKey}[${index}]` : String(index);\n formData.append(arrayKey, file, file.name);\n });\n }\n // 4. Handle regular arrays\n else if (Array.isArray(data)) {\n data.forEach((item, index) => {\n const arrayKey = parentKey ? `${parentKey}[${index}]` : String(index);\n objectToFormData(item, formData, arrayKey);\n });\n }\n // 5. Handle nested objects\n else if (typeof data === \"object\") {\n Object.entries(data).forEach(([key, value]) => {\n const propKey = parentKey ? `${parentKey}[${key}]` : key;\n objectToFormData(value, formData, propKey);\n });\n }\n // 6. Handle primitives (string, number, boolean)\n else {\n formData.append(parentKey, String(data));\n }\n return formData;\n}\n"],"names":["get","data","path","defaultValue","keys","Array","isArray","replace","split","filter","Boolean","length","result","key","undefined","interpolate","pattern","params","trim","includes","match","variable","value","String","toString","Object","prototype","call","ucfirst","str","charAt","toUpperCase","slice","isFunction","isObject","isLiteralObject","proto","getPrototypeOf","isObjectable","hasOwnProperty","obj","cloneStrateries","Date","getTime","RegExp","source","flags","Map","cache","set","forEach","val","clone","Set","add","ArrayBuffer","Strateries","NumberTypedArray","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","DataView","DoNotClone","from","Error","Promise","Blob","WeakMap","WeakSet","Symbol","Window","File","FormData","Headers","Request","Response","Worker","AbortController","Node","FileList","isConstructor","constructor","targets","_a","has","itemData","ItemClass","buffer","byteOffset","byteLength","ItemConstructor","handleName","handler","create","Reflect","ownKeys","descriptor","getOwnPropertyDescriptor","defineProperty","deepFreezeInternal","propNames","name","freeze","cloneDeep","Primitive","isString","isNumber","Number","isFinite","isBoolean","isPrimitive","isDate","isNaN","isPlainObject","normalize","prim","toISOString","map","item","toJSON","Json","stringify","space","normalized","JSON","_b","parse","text","reviver","Url","encode","component","encodeURIComponent","encodeURI","sanitized","decode","decoder","decodeURIComponent","decodeURI","build","uri","fullMatch","queryString","query","cleanQuery","startsWith","part","options","arrayFormat","arrayFormatSeparator","skipNull","skipEmptyString","strict","sort","isValidKey","k","test","encoder","resultPairs","traverse","prefix","validVals","v","push","join","idx","arrayKey","subKey","Serialize","isEqualArrayBuffer","value1","value2","buffer1","isView","offset1","buffer2","offset2","view1","view2","i","URL","isEqualStrategies","is","size","isEqual","item1","hasMatch","item2","keys1","keys2","merge","target","assign","sourceValue","targetValue","SubscribeListener","SubscribeListeners","defaultEvents","state","change","defer","callback","delay","ids","r","s","timeout","Math","max","cancel","cancelAnimationFrame","clearTimeout","requestAnimationFrame","setTimeout","isFileList","MIME_REGEX","DEFAULT_TRANSFORMER","slugify","separator","silent","toLowerCase","transformer","a","b","escapedKeys","regex","replaceValue","escapedSeparator","HIGHLIGHT_SEARCH_OPTIONS","shallow","this","_shallow","initialState","events","_state","listeners","_events","subscribe","channel","delete","dispatch","payload","getState","setState","nextState","onStateChange","subscribeAsyncOnce","signal","unsub","onAbort","resolve","reject","aborted","addEventListener","once","removeEventListener","wire","$instance","domains","methods","reduce","acc","domain","channelName","listener","writable","enumerable","configurable","cancelRef","promise","flatten","newPrefix","entries","dataOfPath","firstNode","resultObj","parts","index","remain","values","body","objectToFormData","formData","parentKey","append","file","original","searchStr","slugified","searchLength","matches","positions","charCache","originalFiltered","char","slug","originIndex","chars","firstChar","currentSlugified","endPosition","isMatch","currentChar","lastChar","matchText","substring","start"],"mappings":"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"}
1
+ {"version":3,"file":"ecosy-core.umd.js","sources":["../src/utilities/get.ts","../src/serialize/interpolate.ts","../src/utilities/string.ts","../src/utilities/is-function.ts","../src/utilities/object.ts","../src/utilities/clone.ts","../src/utilities/freeze.ts","../src/serialize/primitive.ts","../src/serialize/json.ts","../src/serialize/url.ts","../src/serialize/query-string.ts","../src/serialize/index.ts","../src/utilities/is-equal.ts","../src/utilities/merge.ts","../src/subscriber.ts","../src/utilities/defer.ts","../src/utilities/filelist.ts","../src/utilities/sanitize-mime.ts","../src/utilities/slugify.ts","../src/utilities/searchify.ts","../src/utilities/flatten.ts","../src/utilities/formdata.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Safely retrieves a nested value from an object using a dot/bracket path.\n * Returns `defaultValue` only when the resolved value is `undefined` —\n * falsy values like `null`, `0`, `false`, and `\"\"` are returned as-is.\n *\n * @param data - The source object to traverse.\n * @param path - Dot-notation string (`\"a.b.c\"`), bracket-notation (`\"a[0].b\"`), or an array of keys.\n * @param defaultValue - Value returned when the path resolves to `undefined`.\n * @returns The resolved value, or `defaultValue` if not found.\n *\n * @example\n * ```ts\n * const obj = { users: [{ name: \"Alice\" }] };\n *\n * get(obj, \"users[0].name\"); // \"Alice\"\n * get(obj, \"users.0.name\"); // \"Alice\"\n * get(obj, \"users[1].name\", \"N/A\"); // \"N/A\"\n * get(obj, \"count\", 0); // 0\n * ```\n */\nexport function get(data, path, defaultValue) {\n // 1. Short-circuit if data is nullish\n if (data === null || data === undefined) {\n return defaultValue;\n }\n // 2. Normalize path into an array of keys\n // Handles both dot notation (\"a.b\") and bracket notation (\"a[0]\")\n const keys = Array.isArray(path)\n ? path\n : path\n .replace(/\\[(\\d+)]/g, \".$1\") // Convert \"users[0]\" to \"users.0\"\n .split(\".\")\n .filter(Boolean); // Remove empty segments from leading/trailing dots\n if (keys.length === 0) {\n return data;\n }\n // 3. Traverse the object tree\n let result = data;\n for (const key of keys) {\n // Stop early if we hit null/undefined mid-path\n if (result === null || result === undefined) {\n return defaultValue;\n }\n result = result[key];\n }\n // 4. Return defaultValue only for undefined; null, 0, false, \"\" are valid results\n return result === undefined ? defaultValue : result;\n}\n","import { get } from \"../utilities/get\";\n/**\n * Interpolates `{key}` placeholders in a string using deep path resolution via {@link get}.\n * Objects are silently replaced with empty strings to avoid `[object Object]`.\n *\n * @param pattern - Template string with `{key}` or `{path.to.key}` placeholders.\n * @param params - Data object or array to resolve values from.\n * @returns The interpolated string.\n */\nexport function interpolate(pattern, params = {}) {\n // Fast-path: skip processing if no placeholders\n if (!pattern ||\n typeof pattern !== \"string\" ||\n !pattern.trim().length ||\n !pattern.includes(\"{\") ||\n !pattern.includes(\"}\")) {\n return pattern;\n }\n // Scan for placeholders and resolve lazily via `get`\n return pattern.replace(/\\{([a-zA-Z0-9_.-]+)\\}/g, (match, variable) => {\n const value = get(params, variable);\n // Unresolved placeholders become empty strings\n if (value === null || value === undefined) {\n return \"\";\n }\n // Prevent \"[object Object]\" — only render primitives\n if (typeof value === \"object\") {\n return \"\";\n }\n return String(value);\n });\n}\n/** Type guards and deep normalization utilities. */\n","/**\n * Returns the internal `[[Class]]` tag of a value using `Object.prototype.toString`.\n *\n * @example\n * ```ts\n * toString([]); // \"[object Array]\"\n * toString(null); // \"[object Null]\"\n * ```\n */\nexport function toString(value) {\n return Object.prototype.toString.call(value);\n}\n/**\n * Capitalizes the first character of a string.\n *\n * @example\n * ```ts\n * ucfirst(\"hello\"); // \"Hello\"\n * ```\n */\nexport function ucfirst(str) {\n return (str.charAt(0).toUpperCase() + str.slice(1));\n}\n/**\n * Converts a PascalCase or camelCase string to kebab-case.\n * Handles consecutive uppercase characters (e.g. acronyms) gracefully.\n *\n * @example\n * ```ts\n * pascalToKebab(\"MyComponent\"); // \"my-component\"\n * pascalToKebab(\"HTMLParser\"); // \"html-parser\"\n * pascalToKebab(\"camelCase\"); // \"camel-case\"\n * ```\n */\nexport function pascalToKebab(str) {\n if (!str)\n return str;\n return str\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n","import { toString } from \"./string\";\n/**\n * Checks whether a value is a function (including async and generator functions).\n *\n * @param value - The value to check.\n * @returns `true` if the value is a function.\n *\n * @example\n * ```ts\n * isFunction(() => {}); // true\n * isFunction(async () => {}); // true\n * isFunction(42); // false\n * ```\n */\nexport function isFunction(value) {\n return (typeof value === \"function\" ||\n [\"[object Function]\", \"[object AsyncFunction]\", \"[object GeneratorFunction]\"].includes(toString(value)));\n}\n","import { isFunction } from \"./is-function\";\n/**\n * Checks whether a value is a non-null object.\n *\n * @param value - The value to check.\n * @returns `true` if the value is of type `object` and is not `null`.\n */\nexport function isObject(value) {\n return typeof value === \"object\" && value !== null;\n}\n/**\n * Checks whether a value is a plain object (created by `{}` or `Object.create(null)`).\n *\n * @param value - The value to check.\n * @returns `true` if the value is a plain literal object.\n */\nexport function isLiteralObject(value) {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n/**\n * Checks whether a value is a complex (non-array) object, such as a class instance.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a non-array object.\n */\nexport function isComplexObject(value) {\n return isObject(value) && !Array.isArray(value);\n}\n/**\n * Checks whether a value is an object, array, or function.\n *\n * @param value - The value to check.\n * @returns `true` if the value is \"objectable\" (object, array, or function).\n */\nexport function isObjectable(value) {\n return isObject(value) || isFunction(value);\n}\n/**\n * Type-safe check for own property existence on an object.\n *\n * @param obj - The object to check.\n * @param key - The property key to look for.\n * @returns `true` if the object has the specified own property.\n *\n * @example\n * ```ts\n * hasOwnProperty({ a: 1 }, \"a\"); // true\n * hasOwnProperty({ a: 1 }, \"b\"); // false\n * ```\n */\nexport function hasOwnProperty(obj, key) {\n if (!obj) {\n return false;\n }\n if (!isObjectable(obj)) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n }\n return (Object.prototype.hasOwnProperty.call(obj, key) || key in obj);\n}\n","import { isFunction } from \"./is-function\";\nimport { hasOwnProperty, isObjectable } from \"./object\";\nconst cloneStrateries = {\n [Date.toString()]: (data) => new Date(data.getTime()),\n [RegExp.toString()]: (data) => new RegExp(data.source, data.flags),\n [Map.toString()]: (data, cache) => {\n const result = new Map();\n cache.set(data, result);\n data.forEach((val, key) => {\n result.set(clone(key, cache), clone(val, cache));\n });\n return result;\n },\n [Set.toString()]: (data, cache) => {\n const result = new Set();\n cache.set(data, result);\n data.forEach((val) => {\n result.add(clone(val, cache));\n });\n return result;\n },\n [ArrayBuffer.toString()]: (data) => {\n return data.slice(0);\n },\n};\nconst Strateries = [Date, RegExp, Map, Set, ArrayBuffer];\nconst NumberTypedArray = [\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n DataView,\n];\nconst DoNotClone = (() => {\n return Array.from(new Set([\n // Built-in\n Error,\n Promise,\n Blob,\n // Split by environment\n typeof WeakMap !== \"undefined\" && WeakMap,\n typeof WeakSet !== \"undefined\" && WeakSet,\n typeof Symbol !== \"undefined\" && Symbol,\n typeof Window !== \"undefined\" && Window,\n typeof File !== \"undefined\" && File,\n typeof FormData !== \"undefined\" && FormData,\n typeof Headers !== \"undefined\" && Headers,\n typeof Request !== \"undefined\" && Request,\n typeof Response !== \"undefined\" && Response,\n typeof Worker !== \"undefined\" && Worker,\n typeof AbortController !== \"undefined\" && AbortController,\n typeof Node !== \"undefined\" && Node,\n typeof FileList !== \"undefined\" && FileList,\n ]));\n})();\nfunction isConstructor(constructor, targets) {\n return targets.includes(constructor);\n}\n/**\n * Deep clones a value, handling circular references, built-in types (Date, RegExp, Map, Set,\n * ArrayBuffer, TypedArrays), arrays, and plain objects. Skips non-cloneable types like\n * Error, Promise, WeakMap, DOM nodes, etc.\n *\n * @param data - The value to clone.\n * @param cache - Internal WeakMap used to track circular references.\n * @returns A deep copy of the input value.\n *\n * @example\n * ```ts\n * const original = { a: 1, b: { c: 2 } };\n * const cloned = clone(original);\n * cloned.b.c = 3;\n * original.b.c; // still 2\n * ```\n */\nexport function clone(data, cache = new WeakMap()) {\n var _a;\n if (!isObjectable(data) ||\n isFunction(data) ||\n hasOwnProperty(data, \"$$typeof\") ||\n (data.constructor && isConstructor(data.constructor, DoNotClone))) {\n return data;\n }\n // Prevent circular references\n if (cache.has(data)) {\n return cache.get(data);\n }\n if (data.constructor && isConstructor(data.constructor, NumberTypedArray)) {\n const itemData = data;\n const ItemClass = data.constructor;\n const result = new ItemClass(itemData.buffer.slice(0), itemData.byteOffset, itemData.byteLength);\n cache.set(data, result);\n return result;\n }\n const ItemConstructor = data.constructor;\n if (Strateries.includes(ItemConstructor)) {\n const handleName = ItemConstructor.toString();\n const handler = cloneStrateries[handleName];\n const result = handler(data, cache);\n cache.set(data, result);\n return result;\n }\n // Is Object | Array | Class | Instance | Function\n const result = Array.isArray(data)\n ? new (((_a = Object.getPrototypeOf(data)) === null || _a === void 0 ? void 0 : _a.constructor) || Array)()\n : Object.create(Object.getPrototypeOf(data));\n cache.set(data, result);\n const keys = Reflect.ownKeys(data);\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(data, key);\n if (descriptor) {\n if (\"value\" in descriptor) {\n descriptor.value = clone(descriptor.value, cache);\n }\n Object.defineProperty(result, key, descriptor);\n }\n }\n return result;\n}\n","import { clone } from \"./clone\";\nimport { isObject } from \"./object\";\nfunction deepFreezeInternal(obj) {\n const propNames = Reflect.ownKeys(obj);\n for (const name of propNames) {\n const value = obj[name];\n if (isObject(value)) {\n deepFreezeInternal(value);\n }\n }\n return Object.freeze(obj);\n}\n/**\n * Deep freezes a value by first cloning it, then recursively calling `Object.freeze`.\n * Primitives are returned as-is.\n *\n * @param data - The value to freeze.\n * @param cloneDeep - Custom clone function (defaults to `clone`).\n * @returns A deeply frozen copy of the input.\n *\n * @example\n * ```ts\n * const frozen = freeze({ a: { b: 1 } });\n * frozen.a.b = 2; // throws in strict mode\n * ```\n */\nexport function freeze(data, cloneDeep = clone) {\n if (!isObject(data)) {\n return data;\n }\n const cloned = cloneDeep(data);\n return deepFreezeInternal(cloned);\n}\n","import { freeze } from \"../utilities/freeze\";\nimport { hasOwnProperty, isLiteralObject, isObjectable } from \"../utilities/object\";\nimport { isFunction } from \"../utilities/is-function\";\n/** Type guards and deep normalization utilities. */\nexport const Primitive = freeze({\n isString: (value) => {\n return typeof value === \"string\";\n },\n isNumber(value) {\n return typeof value === \"number\" && Number.isFinite(value);\n },\n isBoolean(value) {\n return typeof value === \"boolean\";\n },\n isPrimitive(value) {\n return !isObjectable(value);\n },\n isDate(value) {\n return value instanceof Date && !Number.isNaN(value.getTime());\n },\n isPlainObject: isLiteralObject,\n normalize(data) {\n const prim = Primitive;\n if (prim.isPrimitive(data)) {\n if (typeof data === \"bigint\")\n return data.toString();\n return data;\n }\n if (prim.isDate(data)) {\n return data.toISOString();\n }\n if (Array.isArray(data)) {\n return data.map((item) => prim.normalize(item));\n }\n // Use isLiteralObject for consistent plain-object detection\n if (isLiteralObject(data)) {\n const result = {};\n for (const key in data) {\n if (hasOwnProperty(data, key)) {\n const val = data[key];\n if (val !== undefined) {\n result[key] = prim.normalize(val);\n }\n }\n }\n return result;\n }\n if (data && hasOwnProperty(data, \"toJSON\") && isFunction(data.toJSON)) {\n return data.toJSON();\n }\n return {};\n },\n});\n","import { freeze } from \"../utilities/freeze\";\nimport { Primitive } from \"./primitive\";\n/** Safe JSON stringify/parse that never throws. */\nexport const Json = freeze({\n stringify: (value, space) => {\n var _a;\n try {\n const normalized = Primitive.normalize(value);\n return (_a = JSON.stringify(normalized, null, space)) !== null && _a !== void 0 ? _a : \"\";\n }\n catch (_b) {\n // Catch edge cases (e.g. circular references not handled by normalize)\n return \"\";\n }\n },\n parse: (text, reviver) => {\n if (!text) {\n return null;\n }\n try {\n return JSON.parse(text, reviver);\n }\n catch (_a) {\n return null; // Return null instead of throwing to keep the flow alive\n }\n },\n});\n","import { freeze } from \"../utilities/freeze\";\n/** URL encoding/decoding with malformed-character recovery. */\nexport const Url = freeze({\n encode(value, component = true) {\n if (!value)\n return \"\";\n if (typeof component === \"function\")\n return component(value);\n try {\n return component ? encodeURIComponent(value) : encodeURI(value);\n }\n catch (_a) {\n // Strip broken surrogate chars and retry instead of crashing\n const sanitized = value.replace(/[\\uD800-\\uDFFF]/g, \"\");\n return component ? encodeURIComponent(sanitized) : encodeURI(sanitized);\n }\n },\n decode: (value, component = true) => {\n if (!value)\n return \"\";\n if (typeof component === \"function\")\n return component(value);\n const decoder = component ? decodeURIComponent : decodeURI;\n const normalized = component ? value.replace(/\\+/g, \"%20\") : value;\n return normalized.replace(/(%[0-9A-F]{2})+/gi, (match) => {\n try {\n return decoder(match);\n }\n catch (_a) {\n console.warn(`[Serialize.URL] Cannot decode part: ${match}`);\n return match; // Keep broken parts intact, recover what we can\n }\n });\n },\n build: (uri, params) => {\n if (!uri)\n return \"\";\n if (!params || typeof params !== \"object\")\n return uri;\n // Single-pass regex replace for maximum speed\n return uri.replace(/:([a-zA-Z\\d_]+)/g, (fullMatch, key) => {\n const value = params[key];\n // If param is not provided, keep the \":key\" placeholder\n if (value === null || value === undefined) {\n return fullMatch;\n }\n // Auto-encode the value using the same URL encoder\n return Url.encode(String(value), true);\n });\n },\n});\n","import { freeze } from \"../utilities/freeze\";\nimport { Primitive } from \"./primitive\";\nimport { Url } from \"./url\";\n/** Query string parse/stringify with configurable array formats. */\nexport const queryString = freeze({\n parse(query) {\n if (!query)\n return {};\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n const result = {};\n cleanQuery.split(\"&\").forEach((part) => {\n if (!part)\n return;\n const [key, value] = part.split(\"=\");\n if (key) {\n result[Url.decode(key)] = value ? Url.decode(value) : \"\";\n }\n });\n return result;\n },\n stringify(params, options = {}) {\n if (params === null || typeof params !== \"object\")\n return \"\";\n const { arrayFormat = \"none\", arrayFormatSeparator = \",\", skipNull = false, skipEmptyString = false, encode = true, strict = true, sort = false, } = options;\n const isValidKey = (k) => k.length > 0 && /^[a-zA-Z0-9_\\-.[\\]]+$/.test(k);\n // Internal encode wrapper\n const encoder = (val) => {\n if (!encode)\n return val;\n return Url.encode(val, encode);\n };\n const resultPairs = [];\n // Flat recursion — traverse arrays and nested objects\n const traverse = (prefix, obj) => {\n if (Array.isArray(obj)) {\n if (arrayFormat === \"comma\" || arrayFormat === \"separator\") {\n const validVals = obj.filter((v) => v !== null && v !== undefined && v !== \"\");\n if (validVals.length > 0) {\n resultPairs.push(`${encoder(prefix)}=${encoder(validVals.map(String).join(arrayFormatSeparator))}`);\n }\n return;\n }\n obj.forEach((val, idx) => {\n let arrayKey = prefix;\n if (arrayFormat === \"bracket\")\n arrayKey = `${prefix}[]`;\n else if (arrayFormat === \"index\")\n arrayKey = `${prefix}[${idx}]`;\n traverse(arrayKey, val);\n });\n return;\n }\n if (Primitive.isPlainObject(obj)) {\n for (const subKey in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, subKey)) {\n traverse(`${prefix}[${subKey}]`, obj[subKey]);\n }\n }\n return;\n }\n // Primitive formatting\n if (obj === null || obj === undefined) {\n if (!skipNull)\n resultPairs.push(`${encoder(prefix)}=`);\n return;\n }\n if (obj === \"\") {\n if (!skipEmptyString)\n resultPairs.push(`${encoder(prefix)}=`);\n return;\n }\n if (typeof obj === \"boolean\") {\n resultPairs.push(`${encoder(prefix)}=${obj ? \"true\" : \"false\"}`);\n return;\n }\n if (Primitive.isDate(obj)) {\n resultPairs.push(`${encoder(prefix)}=${encoder(obj.toISOString())}`);\n return;\n }\n resultPairs.push(`${encoder(prefix)}=${encoder(String(obj))}`);\n };\n // Run the top-level iteration\n let keys = Object.keys(params);\n if (sort)\n keys = typeof sort === \"function\" ? keys.sort(sort) : keys.sort();\n for (const key of keys) {\n if (strict && !isValidKey(key))\n continue;\n traverse(key, params[key]);\n }\n return resultPairs.join(\"&\");\n },\n});\n","import { interpolate } from \"./interpolate\";\nimport { Json } from \"./json\";\nimport { Primitive } from \"./primitive\";\nimport { queryString } from \"./query-string\";\nimport { Url } from \"./url\";\nexport * from \"./types\";\nexport { interpolate } from \"./interpolate\";\nexport { Json } from \"./json\";\nexport { Primitive } from \"./primitive\";\nexport { queryString } from \"./query-string\";\nexport { Url } from \"./url\";\n/**\n * Centralized serialization engine and type-guard toolkit.\n * Addresses common pitfalls of `JSON.stringify`/`JSON.parse` — BigInt safety,\n * Date preservation, undefined stripping, and safe URL encoding/decoding.\n *\n * This is the convenience surface: it gathers every part under one name.\n * Referencing it keeps all of them, because a class is a single binding and a\n * bundler cannot drop half of one. Code that cares about what it ships should\n * import the part it uses instead — each lives in its own module, so nothing\n * else comes with it:\n *\n * ```ts\n * import { Primitive } from \"@ecosy/core/serialize/primitive\";\n * import { queryString } from \"@ecosy/core/serialize/query-string\";\n * ```\n *\n * The two are the same objects, so mixing them is free.\n *\n * @example\n * ```ts\n * Serialize.JSON.stringify({ date: new Date(), big: 123n });\n * Serialize.JSON.parse<User>(jsonText);\n * Serialize.URL.encode(\"hello world\");\n * Serialize.queryString.stringify({ page: 1, tags: [\"a\", \"b\"] });\n * ```\n */\nexport class Serialize {\n}\nSerialize.interpolate = interpolate;\n/** Type guards and deep normalization utilities. */\nSerialize.Primitive = Primitive;\n/** Safe JSON stringify/parse that never throws. */\nSerialize.JSON = Json;\n/** URL encoding/decoding with malformed-character recovery. */\nSerialize.URL = Url;\n/** Query string parse/stringify with configurable array formats. */\nSerialize.queryString = queryString;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { hasOwnProperty, isLiteralObject, isObject } from \"./object\";\nfunction isEqualArrayBuffer(value1, value2) {\n if (value1.byteLength !== value2.byteLength) {\n return false;\n }\n const buffer1 = ArrayBuffer.isView(value1) ? value1.buffer : value1;\n const offset1 = ArrayBuffer.isView(value1) ? value1.byteOffset : 0;\n const buffer2 = ArrayBuffer.isView(value2) ? value2.buffer : value2;\n const offset2 = ArrayBuffer.isView(value2) ? value2.byteOffset : 0;\n const view1 = new Uint8Array(buffer1, offset1, value1.byteLength);\n const view2 = new Uint8Array(buffer2, offset2, value2.byteLength);\n for (let i = 0; i < view1.length; i++) {\n if (view1[i] !== view2[i]) {\n return false;\n }\n }\n return true;\n}\nconst isEqualStrategies = new Map([\n [Date, (value1, value2) => Object.is(value1.getTime(), value2.getTime())],\n [\n RegExp,\n (value1, value2) => Object.is(value1.source, value2.source) && Object.is(value1.flags, value2.flags),\n ],\n [ArrayBuffer, isEqualArrayBuffer],\n [\n Map,\n (value1, value2) => {\n if (value1.size !== value2.size) {\n return false;\n }\n for (const [key, val] of value1) {\n if (!value2.has(key) || !isEqual(val, value2.get(key))) {\n return false;\n }\n }\n return true;\n },\n ],\n [\n Set,\n (value1, value2) => {\n if (value1.size !== value2.size) {\n return false;\n }\n for (const item1 of value1) {\n let hasMatch = false;\n for (const item2 of value2) {\n if (isEqual(item1, item2)) {\n hasMatch = true;\n break;\n }\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n },\n ],\n]);\n/**\n * Performs a deep structural equality check between two values.\n * Supports primitives, arrays, plain objects, Date, RegExp, Map, Set,\n * ArrayBuffer, and TypedArrays.\n *\n * @param value1 - The first value to compare.\n * @param value2 - The second value to compare.\n * @returns `true` if both values are deeply equal.\n *\n * @example\n * ```ts\n * isEqual({ a: 1 }, { a: 1 }); // true\n * isEqual([1, 2], [1, 3]); // false\n * isEqual(new Date(0), new Date(0)); // true\n * ```\n */\nexport function isEqual(value1, value2) {\n // primitive, null, function, avoid NaN === NaN is false\n if (!isObject(value1) || !isObject(value2)) {\n return Object.is(value1, value2);\n }\n // If complex object, check constructor\n if (value1.constructor !== value2.constructor) {\n return false;\n }\n if (Array.isArray(value1)) {\n if (!Array.isArray(value2) || value1.length !== value2.length) {\n return false;\n }\n for (let i = 0; i < value1.length; i++) {\n if (!isEqual(value1[i], value2[i])) {\n return false;\n }\n }\n return true;\n }\n // TypedArray, same logic array because constructor match above\n if (ArrayBuffer.isView(value1) && ArrayBuffer.isView(value2)) {\n return isEqualArrayBuffer(value1, value2);\n }\n if (value1.constructor && isEqualStrategies.has(value1.constructor)) {\n return isEqualStrategies.get(value1.constructor)(value1, value2);\n }\n if (!isLiteralObject(value1) || !isLiteralObject(value2)) {\n return value1 === value2;\n }\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n if (!hasOwnProperty(value2, key) ||\n !isEqual(value1[key], value2[key])) {\n return false;\n }\n }\n return true;\n}\n","import { clone } from \"./clone\";\nimport { isLiteralObject } from \"./object\";\nfunction isValidKey(key) {\n return key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\";\n}\n/**\n * Deep merges `target` into `source`. If both are plain objects, properties are merged\n * recursively. Otherwise, `target` replaces `source`. Prototype-polluting keys\n * (`__proto__`, `constructor`, `prototype`) are rejected.\n *\n * @param source - The base object.\n * @param target - The object whose values are merged into `source`.\n * @param cloneDeep - Custom deep clone function (defaults to `clone`).\n * @returns The merged result.\n *\n * @example\n * ```ts\n * merge({ a: 1, b: { c: 2 } }, { b: { d: 3 } });\n * // { a: 1, b: { c: 2, d: 3 } }\n * ```\n */\nexport function merge(source, target, cloneDeep = clone) {\n if (target === undefined) {\n return cloneDeep(source);\n }\n if (isLiteralObject(source) && isLiteralObject(target)) {\n const result = Object.assign({}, source);\n Object.keys(target).forEach((key) => {\n if (!isValidKey(key)) {\n return;\n }\n const sourceValue = result[key];\n const targetValue = target[key];\n if (isLiteralObject(sourceValue) && isLiteralObject(targetValue)) {\n result[key] = merge(sourceValue, targetValue, cloneDeep);\n }\n else {\n result[key] = cloneDeep(targetValue);\n }\n });\n return result;\n }\n return cloneDeep(target);\n}\n","import { clone } from \"./utilities/clone\";\nimport { freeze } from \"./utilities/freeze\";\nimport { isEqual } from \"./utilities/is-equal\";\nimport { isLiteralObject } from \"./utilities/object\";\nimport { merge } from \"./utilities/merge\";\nimport { ucfirst } from \"./utilities/string\";\nclass SubscribeListener extends Set {\n}\nclass SubscribeListeners extends Map {\n}\nconst defaultEvents = freeze({\n state: {\n change: \"$state:change\",\n },\n});\n/**\n * Generic pub/sub event emitter with built-in state management.\n * Provides subscribe/dispatch for arbitrary channels and state change notifications.\n *\n * @typeParam State - The shape of the internal state object.\n * @typeParam Events - Extended event definitions to wire onto the instance.\n */\nexport class Subscriber {\n get shallow() {\n return freeze({\n merge: this._shallow.merge,\n clone: this._shallow.clone,\n isEqual: this._shallow.isEqual,\n });\n }\n set shallow(shallow) {\n this._shallow = this._shallow.merge(this._shallow, shallow);\n }\n constructor(initialState, events) {\n this._state = {};\n this.listeners = new SubscribeListeners();\n this._shallow = {\n merge,\n clone,\n isEqual,\n };\n this._events = freeze(defaultEvents);\n this._state = (initialState !== null && initialState !== void 0 ? initialState : {});\n this._events = freeze(Object.assign(Object.assign({}, this._events), events));\n }\n /**\n * Subscribes a handler to a named channel.\n *\n * @param channel - The event channel name.\n * @param handler - Callback invoked when the channel is dispatched.\n * @returns An unsubscribe function.\n */\n subscribe(channel, handler) {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new SubscribeListener());\n }\n this.listeners.get(channel).add(handler);\n return () => {\n var _a;\n (_a = this.listeners.get(channel)) === null || _a === void 0 ? void 0 : _a.delete(handler);\n };\n }\n /**\n * Dispatches a payload to all handlers subscribed to the given channel.\n *\n * @param channel - The event channel name.\n * @param payload - Optional data to pass to each handler.\n */\n dispatch(channel, payload) {\n if (!this.listeners.has(channel)) {\n return;\n }\n this.listeners.get(channel).forEach((handler) => {\n const params = payload === undefined ? [] : [payload];\n handler(...params);\n });\n }\n /** Returns the current state. */\n getState() {\n return this._state;\n }\n /**\n * Merges new state and dispatches a state change event if the state has changed.\n *\n * @param state - Full or partial state to merge.\n */\n setState(state) {\n const nextState = this._shallow.merge(this._state, state);\n if (!this._shallow.isEqual(this._state, nextState)) {\n this._state = nextState;\n this.dispatch(this._events.state.change, this._shallow.clone(nextState));\n }\n }\n /**\n * Shorthand to subscribe to state change events.\n *\n * @param handler - Callback receiving the new state.\n * @returns An unsubscribe function.\n */\n onStateChange(handler) {\n return this.subscribe(this._events.state.change, handler);\n }\n /**\n * Subscribes to a channel, resolving a Promise with the first dispatched payload.\n * Supports cancellation via an `AbortSignal`.\n *\n * @warning If the channel is never dispatched and no `AbortSignal` is provided,\n * the returned Promise will never resolve, causing a memory leak. Always pass an\n * `AbortSignal` or ensure the channel will eventually be dispatched.\n *\n * @param channel - The event channel name.\n * @param handler - Optional callback invoked on payload.\n * @param signal - Optional AbortSignal to cancel the subscription.\n * @returns A promise that resolves with the first payload dispatched to the channel.\n */\n async subscribeAsyncOnce(channel, handler, signal) {\n let unsub;\n let onAbort;\n try {\n return await new Promise((resolve, reject) => {\n if (signal === null || signal === void 0 ? void 0 : signal.aborted) {\n return reject(new Error(\"Operation cancelled\"));\n }\n const handle = ((payload) => {\n handler === null || handler === void 0 ? void 0 : handler(payload);\n resolve(payload);\n });\n unsub = this.subscribe(channel, handle);\n if (signal) {\n onAbort = () => reject(new Error(\"Operation cancelled\"));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n finally {\n unsub === null || unsub === void 0 ? void 0 : unsub();\n if (signal && onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n }\n /**\n * Wires event domains onto a `Subscriber` instance, creating typed dispatch and\n * listener methods (e.g. `instance.domainName.eventName()` and\n * `instance.domainName.onEventName()`).\n *\n * @param $instance - The subscriber instance to extend.\n * @param events - Event definitions mapping domain → channel names.\n * @returns The instance with wired event methods.\n */\n static wire($instance, events) {\n for (const channel in events) {\n if (channel in $instance) {\n throw new Error(`[Subscriber.wire] \"${channel}\" is invalid.`);\n }\n const domains = events[channel];\n if (!isLiteralObject(domains)) {\n continue;\n }\n const methods = Object.keys(domains).reduce((acc, domain) => {\n const channelName = domains[domain];\n acc[domain] = (payload) => {\n $instance.dispatch(channelName, payload);\n };\n acc[`on${ucfirst(domain)}`] = (listener) => $instance.subscribe(channelName, listener);\n return acc;\n }, {});\n Object.defineProperty($instance, channel, {\n value: freeze(methods),\n writable: false,\n enumerable: true,\n configurable: false,\n });\n }\n return $instance;\n }\n}\n","/**\n * Schedules a callback using `requestAnimationFrame` + `setTimeout` for optimal\n * browser execution timing. Falls back to plain `setTimeout` in non-browser environments.\n *\n * @param callback - Function to execute after the defer.\n * @param delay - Additional delay in milliseconds after the animation frame. Defaults to `0`.\n * @returns An object with `ids` (internal timer IDs) and a `cancel` function.\n *\n * @example\n * ```ts\n * const { cancel } = defer(() => console.log(\"done\"), 100);\n * // Later:\n * cancel(); // Cancels if not yet executed\n * ```\n */\nexport function defer(callback, delay) {\n const ids = { r: null, s: null };\n const timeout = Math.max(0, delay || 0);\n function cancel() {\n ids.r && typeof cancelAnimationFrame === \"function\" && cancelAnimationFrame(ids.r);\n ids.s && clearTimeout(ids.s);\n ids.r = null;\n ids.s = null;\n }\n if (typeof requestAnimationFrame === \"function\") {\n ids.r = requestAnimationFrame(() => {\n ids.s = setTimeout(() => {\n callback();\n cancel();\n }, timeout);\n });\n }\n else {\n ids.s = setTimeout(() => {\n callback();\n cancel();\n }, timeout);\n }\n return { ids, cancel };\n}\n/**\n * Promise-based wrapper around {@link defer}.\n * Resolves after the specified delay, and can be cancelled before resolution.\n *\n * @param delay - Delay in milliseconds. Defaults to `0`.\n * @returns A {@link CancelablePromise} that resolves when the defer completes.\n *\n * @example\n * ```ts\n * const wait = deferAsync(500);\n * await wait; // Resolves after ~500ms\n *\n * // Or cancel early:\n * const wait2 = deferAsync(5000);\n * wait2.cancel();\n * ```\n */\nexport function deferAsync(delay) {\n let cancelRef;\n const promise = new Promise((resolve) => {\n // Leverage the core defer function above\n const { cancel } = defer(() => resolve(), delay);\n cancelRef = cancel;\n });\n // Attach the cancel method directly onto the Promise object\n promise.cancel = () => {\n cancelRef();\n };\n return promise;\n}\n","import { isFunction } from \"./is-function\";\nimport { toString } from \"./string\";\n/**\n * Checks whether a value is a `FileList` or a `FileList`-like object.\n * Uses `instanceof FileList` in browser environments and falls back to\n * `Object.prototype.toString` tag detection for isomorphic compatibility.\n *\n * @param data - The value to check.\n * @returns `true` if the value is a `FileList` or has the `[object FileList]` tag.\n *\n * @example\n * ```ts\n * const input = document.querySelector(\"input[type=file]\");\n * isFileList(input.files); // true\n * isFileList([]); // false\n * ```\n */\nexport function isFileList(data) {\n return ((typeof FileList !== \"undefined\" && data instanceof FileList) ||\n (typeof data === \"object\" &&\n data !== null &&\n toString(data) === \"[object FileList]\" &&\n \"length\" in data &&\n \"item\" in data &&\n isFunction(data.item)));\n}\n","/** RFC 2045 MIME type pattern: `type/subtype` with optional `;parameter=value`. */\nexport const MIME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*\\/[a-zA-Z0-9][a-zA-Z0-9!#$&\\-^_.+]*(;\\s*[\\w.-]+=[\\w.-]+)*$/;\n/**\n * Validate and sanitize a MIME type string.\n *\n * Returns the input unchanged if valid, empty string if malformed.\n * This prevents attackers from smuggling values like `application/php/jpeg`\n * through to the upstream API — the empty Content-Type lets the API\n * server reject the payload on its own terms instead of crashing ours.\n */\nexport function sanitizeMime(value) {\n return MIME_REGEX.test(value) ? value : \"\";\n}\n","/**\n * Default character transformer map for common non-ASCII characters.\n * Can be extended or overridden via {@link SlugifyOptions.transformer}.\n */\nexport const DEFAULT_TRANSFORMER = {\n đ: \"d\",\n æ: \"ae\",\n ø: \"o\",\n å: \"a\",\n œ: \"oe\",\n ß: \"ss\",\n þ: \"th\",\n ð: \"d\",\n};\n/**\n * Converts a string into a URL-friendly slug.\n * Handles Unicode normalization, custom character transformations,\n * and separator deduplication.\n *\n * @param str - The input string to slugify.\n * @param options - Configuration options.\n * @returns A lowercase, URL-safe slug string.\n *\n * @example\n * ```ts\n * slugify(\"Hello World\"); // \"hello-world\"\n * slugify(\"Xin Chào Đất Nước\"); // \"xin-chao-dat-nuoc\" (Vietnamese)\n * slugify(\"Straße nach München\"); // \"strasse-nach-munchen\" (German)\n * slugify(\"Ærlig talt, det er sjovt\"); // \"aerlig-talt-det-er-sjovt\" (Danish)\n * slugify(\"C'est la crème brûlée\"); // \"cest-la-creme-brulee\" (French)\n * slugify(\"Foo Bar\", { separator: \"_\" }); // \"foo_bar\"\n * ```\n */\nexport function slugify(str, options = {}) {\n const { separator = \"-\", silent = false } = options;\n if (!str) {\n return \"\";\n }\n str = str.toLowerCase();\n // 1. Merge default transformer with user overrides (user takes precedence)\n const transformer = Object.assign(Object.assign({}, DEFAULT_TRANSFORMER), options.transformer);\n const keys = Object.keys(transformer);\n if (keys.length > 0) {\n // Sort keys by length (descending) so longer matches take priority\n keys.sort((a, b) => b.length - a.length);\n const escapedKeys = keys.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n const regex = new RegExp(escapedKeys.join(\"|\"), \"g\");\n str = str.replace(regex, (match) => {\n const replaceValue = transformer[match];\n // Silent mode: discard replacements longer than 1 character\n if (silent && replaceValue.length > 1) {\n return \"\";\n }\n return replaceValue;\n });\n }\n // 2. Decompose Unicode (NFD) and strip diacritics + special characters\n str = str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^\\w]|_|-/g, separator);\n // 3. Clean up separator duplicates and trim edges\n if (!separator) {\n return str.trim();\n }\n const escapedSeparator = separator.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return str\n .replace(new RegExp(`${escapedSeparator}+`, \"g\"), separator)\n .replace(new RegExp(`^${escapedSeparator}|${escapedSeparator}$`, \"g\"), \"\")\n .trim();\n}\n","import { DEFAULT_TRANSFORMER, slugify } from \"./slugify\";\n/** Slugify options tuned for search: no separator, silent multi-char replacements. */\nconst HIGHLIGHT_SEARCH_OPTIONS = {\n separator: \"\",\n silent: true,\n transformer: Object.assign({}, DEFAULT_TRANSFORMER),\n};\n/**\n * Performs a diacritic-insensitive fuzzy search by comparing slugified characters.\n * Returns all matching substrings and their positions in the original string.\n *\n * Uses a **sliding window** algorithm with per-character slugification cache\n * for optimal performance on repeated characters.\n *\n * @param original - The original string to search within.\n * @param searchStr - The search term (will be slugified for comparison).\n * @returns A {@link SearchResult} with matched substrings and their positions.\n *\n * @example\n * ```ts\n * searchify(\"Xin Chào Việt Nam\", \"viet\");\n * // { matches: [\"Việt\"], positions: [{ start: 9, length: 4 }] }\n *\n * searchify(\"Crème Brûlée\", \"brulee\");\n * // { matches: [\"Brûlée\"], positions: [{ start: 6, length: 6 }] }\n * ```\n */\nexport function searchify(original, searchStr) {\n const slugified = slugify(searchStr, HIGHLIGHT_SEARCH_OPTIONS);\n const searchLength = slugified.length;\n const result = { matches: [], positions: [] };\n if (!searchLength) {\n return result;\n }\n const charCache = new Map();\n // Pre-process: map each original character to its slugified form (cached)\n const originalChars = [...original.split(\"\")].map((char, index) => {\n let slug = charCache.get(char);\n if (slug === undefined) {\n slug = slugify(char, HIGHLIGHT_SEARCH_OPTIONS);\n charCache.set(char, slug);\n }\n return {\n originIndex: index,\n slugified: slug,\n char,\n };\n });\n // Filter consecutive whitespace for performance\n const originalFiltered = originalChars.filter((obj, index, chars) => {\n if (index === 0)\n return true;\n if (obj.char === \" \" && chars[index - 1].char === \" \")\n return false;\n return true;\n });\n if (originalFiltered.length < searchLength) {\n return result;\n }\n // Core algorithm: sliding window match\n for (let i = 0; i < originalFiltered.length;) {\n const firstChar = originalFiltered[i];\n if (firstChar.slugified === \"\") {\n i++;\n continue;\n }\n let currentSlugified = \"\";\n let endPosition = i;\n let isMatch = true;\n while (currentSlugified.length < searchLength && endPosition < originalFiltered.length) {\n const currentChar = originalFiltered[endPosition];\n if (currentChar.slugified !== \"\") {\n currentSlugified += currentChar.slugified;\n if (!slugified.startsWith(currentSlugified)) {\n isMatch = false;\n break;\n }\n }\n endPosition++;\n }\n if (isMatch && currentSlugified === slugified) {\n const lastChar = originalFiltered[endPosition - 1];\n const matchText = original.substring(firstChar.originIndex, lastChar.originIndex + 1);\n result.matches.push(matchText);\n result.positions.push({\n start: firstChar.originIndex,\n length: matchText.length,\n });\n i = endPosition;\n }\n else {\n i++;\n }\n }\n return result;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Recursively flattens a nested object or array into a single-level object\n * with dot-separated keys.\n *\n * Array indices use dot notation (`users.0.name` instead of `users[0].name`).\n *\n * @param data - The value to flatten.\n * @param prefix - Internal prefix for recursive key building.\n * @param acc - Internal accumulator for the result.\n * @returns A flat `Record<string, unknown>` with dot-separated keys.\n *\n * @example\n * ```ts\n * flatten({ users: [{ name: \"Alice\" }] });\n * // { \"users.0.name\": \"Alice\" }\n *\n * flatten({ a: { b: { c: 1 } } });\n * // { \"a.b.c\": 1 }\n * ```\n */\nexport function flatten(data, prefix = \"\", acc = {}) {\n if (typeof data !== \"object\" || data === null) {\n if (prefix)\n acc[prefix] = data;\n return acc;\n }\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const newPrefix = prefix ? `${prefix}.${i}` : `${i}`;\n flatten(data[i], newPrefix, acc);\n }\n }\n else {\n for (const [key, value] of Object.entries(data)) {\n const newPrefix = prefix ? `${prefix}.${key}` : key;\n flatten(value, newPrefix, acc);\n }\n }\n return acc;\n}\n/**\n * Extracts entries from a flattened object under a given path and reconstructs\n * them as an array of objects (if the keys are numeric indices) or a list of\n * `{ key, value }` pairs (if the keys are non-numeric).\n *\n * @param data - A flattened `Record<string, unknown>` (output of {@link flatten}).\n * @param path - The dot-separated path prefix to extract.\n * @returns An array of reconstructed objects, primitive values, or `{ key, value }` pairs.\n *\n * @example\n * ```ts\n * const flat = flatten({ users: [{ name: \"Alice\" }, { name: \"Bob\" }] });\n * flattenToArray(flat, \"users\");\n * // [{ name: \"Alice\" }, { name: \"Bob\" }]\n *\n * const flat2 = flatten({ config: { host: \"localhost\", port: 3000 } });\n * flattenToArray(flat2, \"config\");\n * // [{ key: \"host\", value: \"localhost\" }, { key: \"port\", value: 3000 }]\n * ```\n */\nexport function flattenToArray(data, path) {\n const prefix = `${path}.`;\n const dataOfPath = Object.entries(data).filter(([key]) => key.startsWith(prefix));\n if (!dataOfPath.length)\n return [];\n // Get the first key, strip the prefix. e.g. \"0.name\"\n const firstKeyRemain = dataOfPath[0][0].replace(prefix, \"\");\n // Determine if it's an array by checking whether the first node is a numeric index\n const firstNode = firstKeyRemain.split(\".\")[0];\n const isArrayType = !isNaN(Number(firstNode));\n // Return as { key, value } list if not an array\n if (!isArrayType) {\n return dataOfPath.map(([key, value]) => ({\n key: key.replace(prefix, \"\"),\n value,\n }));\n }\n // Reconstruct array from \"0.name\" format\n const resultObj = dataOfPath.reduce((acc, [key, value]) => {\n const cleanedKey = key.replace(prefix, \"\"); // \"0.contact.email\"\n const parts = cleanedKey.split(\".\");\n const index = parts[0]; // \"0\"\n const remain = parts.slice(1).join(\".\"); // \"contact.email\"\n if (!acc[index])\n acc[index] = {};\n if (remain) {\n acc[index][remain] = value;\n }\n else {\n acc[index] = value; // Handle primitive arrays\n }\n return acc;\n }, {});\n return Object.values(resultObj);\n}\n/**\n * Escapes special regex characters in a key string so it can be safely\n * used inside a `RegExp` constructor.\n *\n * @param key - The string to escape.\n * @returns The escaped string with special characters prefixed by `\\\\`.\n *\n * @example\n * ```ts\n * escapeRegexKey(\"users[0].name\"); // \"users\\\\[0\\\\]\\\\.name\"\n * ```\n */\nexport function escapeRegexKey(key) {\n return key.replace(/([.[\\]{}])/g, \"\\\\$1\");\n}\n","import { isFileList } from \"./filelist\";\n/** Type guard that checks whether a value is a `FormData` instance. */\nexport function isFormData(body) {\n return body instanceof FormData;\n}\n/**\n * Recursively converts a value into a `FormData` instance.\n * Handles Date, File, Blob, FileList, arrays, nested objects, and primitives.\n *\n * @param data - The value to convert.\n * @param formData - The `FormData` instance to append to (created automatically if omitted).\n * @param parentKey - Internal key prefix for recursive nesting.\n * @returns The populated `FormData` instance.\n *\n * @example\n * ```ts\n * const fd = objectToFormData({\n * name: \"Alice\",\n * avatar: someFile,\n * tags: [\"a\", \"b\"],\n * meta: { role: \"admin\" },\n * });\n * // FormData entries:\n * // name → \"Alice\"\n * // avatar → File\n * // tags[0] → \"a\"\n * // tags[1] → \"b\"\n * // meta[role] → \"admin\"\n * ```\n */\nexport function objectToFormData(data, formData = new FormData(), parentKey = \"\") {\n // Skip null or undefined values\n if (data === null || data === undefined) {\n return formData;\n }\n // 1. Handle Date\n if (data instanceof Date) {\n formData.append(parentKey, data.toISOString());\n }\n // 2. Handle single File or Blob\n else if (data instanceof File || data instanceof Blob) {\n formData.append(parentKey, data);\n }\n // 3. Handle FileList (isomorphic-safe for Node.js)\n else if (isFileList(data)) {\n Array.from(data).forEach((file, index) => {\n // Backend typically expects array files as: files[0], files[1]\n const arrayKey = parentKey ? `${parentKey}[${index}]` : String(index);\n formData.append(arrayKey, file, file.name);\n });\n }\n // 4. Handle regular arrays\n else if (Array.isArray(data)) {\n data.forEach((item, index) => {\n const arrayKey = parentKey ? `${parentKey}[${index}]` : String(index);\n objectToFormData(item, formData, arrayKey);\n });\n }\n // 5. Handle nested objects\n else if (typeof data === \"object\") {\n Object.entries(data).forEach(([key, value]) => {\n const propKey = parentKey ? `${parentKey}[${key}]` : key;\n objectToFormData(value, formData, propKey);\n });\n }\n // 6. Handle primitives (string, number, boolean)\n else {\n formData.append(parentKey, String(data));\n }\n return formData;\n}\n"],"names":["get","data","path","defaultValue","keys","Array","isArray","replace","split","filter","Boolean","length","result","key","undefined","interpolate","pattern","params","trim","includes","match","variable","value","String","toString","Object","prototype","call","ucfirst","str","charAt","toUpperCase","slice","isFunction","isObject","isLiteralObject","proto","getPrototypeOf","isObjectable","hasOwnProperty","obj","cloneStrateries","Date","getTime","RegExp","source","flags","Map","cache","set","forEach","val","clone","Set","add","ArrayBuffer","Strateries","NumberTypedArray","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","DataView","DoNotClone","from","Error","Promise","Blob","WeakMap","WeakSet","Symbol","Window","File","FormData","Headers","Request","Response","Worker","AbortController","Node","FileList","isConstructor","constructor","targets","_a","has","itemData","ItemClass","buffer","byteOffset","byteLength","ItemConstructor","handleName","handler","create","Reflect","ownKeys","descriptor","getOwnPropertyDescriptor","defineProperty","deepFreezeInternal","propNames","name","freeze","cloneDeep","Primitive","isString","isNumber","Number","isFinite","isBoolean","isPrimitive","isDate","isNaN","isPlainObject","normalize","prim","toISOString","map","item","toJSON","Json","stringify","space","normalized","JSON","_b","parse","text","reviver","Url","encode","component","encodeURIComponent","encodeURI","sanitized","decode","decoder","decodeURIComponent","decodeURI","console","warn","build","uri","fullMatch","queryString","query","cleanQuery","startsWith","part","options","arrayFormat","arrayFormatSeparator","skipNull","skipEmptyString","strict","sort","isValidKey","k","test","encoder","resultPairs","traverse","prefix","validVals","v","push","join","idx","arrayKey","subKey","Serialize","isEqualArrayBuffer","value1","value2","buffer1","isView","offset1","buffer2","offset2","view1","view2","i","URL","isEqualStrategies","is","size","isEqual","item1","hasMatch","item2","keys1","keys2","merge","target","assign","sourceValue","targetValue","SubscribeListener","SubscribeListeners","defaultEvents","state","change","defer","callback","delay","ids","r","s","timeout","Math","max","cancel","cancelAnimationFrame","clearTimeout","requestAnimationFrame","setTimeout","isFileList","MIME_REGEX","DEFAULT_TRANSFORMER","slugify","separator","silent","toLowerCase","transformer","a","b","escapedKeys","regex","replaceValue","escapedSeparator","HIGHLIGHT_SEARCH_OPTIONS","shallow","this","_shallow","initialState","events","_state","listeners","_events","subscribe","channel","delete","dispatch","payload","getState","setState","nextState","onStateChange","subscribeAsyncOnce","signal","unsub","onAbort","resolve","reject","aborted","addEventListener","once","removeEventListener","wire","$instance","domains","methods","reduce","acc","domain","channelName","listener","writable","enumerable","configurable","cancelRef","promise","flatten","newPrefix","entries","dataOfPath","firstNode","resultObj","parts","index","remain","values","body","objectToFormData","formData","parentKey","append","file","original","searchStr","slugified","searchLength","matches","positions","charCache","originalFiltered","char","slug","originIndex","chars","firstChar","currentSlugified","endPosition","isMatch","currentChar","lastChar","matchText","substring","start"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";const e=require("../utilities/freeze.js").freeze({encode(e,r=!0){if(!e)return"";if("function"==typeof r)return r(e);try{return r?encodeURIComponent(e):encodeURI(e)}catch(t){const n=e.replace(/[\uD800-\uDFFF]/g,"");return r?encodeURIComponent(n):encodeURI(n)}},decode:(e,r=!0)=>{if(!e)return"";if("function"==typeof r)return r(e);const t=r?decodeURIComponent:decodeURI;return(r?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return t(e)}catch(r){return e}})},build:(r,t)=>r?t&&"object"==typeof t?r.replace(/:([a-zA-Z\d_]+)/g,(r,n)=>{const o=t[n];return null==o?r:e.encode(String(o),!0)}):r:""});exports.Url=e;
1
+ "use strict";const e=require("../utilities/freeze.js").freeze({encode(e,r=!0){if(!e)return"";if("function"==typeof r)return r(e);try{return r?encodeURIComponent(e):encodeURI(e)}catch(n){const t=e.replace(/[\uD800-\uDFFF]/g,"");return r?encodeURIComponent(t):encodeURI(t)}},decode:(e,r=!0)=>{if(!e)return"";if("function"==typeof r)return r(e);const n=r?decodeURIComponent:decodeURI;return(r?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return n(e)}catch(r){return console.warn(`[Serialize.URL] Cannot decode part: ${e}`),e}})},build:(r,n)=>r?n&&"object"==typeof n?r.replace(/:([a-zA-Z\d_]+)/g,(r,t)=>{const o=n[t];return null==o?r:e.encode(String(o),!0)}):r:""});exports.Url=e;
@@ -1 +1 @@
1
- import{freeze as e}from"../utilities/freeze.mjs";const n=e({encode(e,n=!0){if(!e)return"";if("function"==typeof n)return n(e);try{return n?encodeURIComponent(e):encodeURI(e)}catch(t){const r=e.replace(/[\uD800-\uDFFF]/g,"");return n?encodeURIComponent(r):encodeURI(r)}},decode:(e,n=!0)=>{if(!e)return"";if("function"==typeof n)return n(e);const t=n?decodeURIComponent:decodeURI;return(n?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return t(e)}catch(n){return e}})},build:(e,t)=>e?t&&"object"==typeof t?e.replace(/:([a-zA-Z\d_]+)/g,(e,r)=>{const o=t[r];return null==o?e:n.encode(String(o),!0)}):e:""});export{n as Url};
1
+ import{freeze as e}from"../utilities/freeze.mjs";const n=e({encode(e,n=!0){if(!e)return"";if("function"==typeof n)return n(e);try{return n?encodeURIComponent(e):encodeURI(e)}catch(r){const t=e.replace(/[\uD800-\uDFFF]/g,"");return n?encodeURIComponent(t):encodeURI(t)}},decode:(e,n=!0)=>{if(!e)return"";if("function"==typeof n)return n(e);const r=n?decodeURIComponent:decodeURI;return(n?e.replace(/\+/g,"%20"):e).replace(/(%[0-9A-F]{2})+/gi,e=>{try{return r(e)}catch(n){return console.warn(`[Serialize.URL] Cannot decode part: ${e}`),e}})},build:(e,r)=>e?r&&"object"==typeof r?e.replace(/:([a-zA-Z\d_]+)/g,(e,t)=>{const o=r[t];return null==o?e:n.encode(String(o),!0)}):e:""});export{n as Url};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ecosy/core",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "A modular, tree-shakable collection of essential utilities, serialization primitives, and event-driven patterns for modern TypeScript applications",
5
5
  "license": "MIT",
6
6
  "publishConfig": {