@zag-js/utils 0.18.0 → 0.19.1

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/dist/index.d.mts CHANGED
@@ -19,6 +19,8 @@ declare function prevIndex<T>(v: T[], idx: number, opts?: IndexOptions): number;
19
19
  declare function prev<T>(v: T[], index: number, opts?: IndexOptions): T | undefined;
20
20
  declare const chunk: <T>(v: T[], size: number) => T[][];
21
21
 
22
+ declare const isEqual: (a: any, b: any) => boolean;
23
+
22
24
  declare const runIfFn: <T>(v: T | undefined, ...a: T extends (...a: any[]) => void ? Parameters<T> : never) => T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T>;
23
25
  declare const cast: <T>(v: unknown) => T;
24
26
  declare const noop: () => void;
@@ -43,4 +45,4 @@ declare function warn(c: boolean, m: string): void;
43
45
  declare function invariant(m: string): void;
44
46
  declare function invariant(c: boolean, m: string): void;
45
47
 
46
- export { IndexOptions, add, addOrRemove, callAll, cast, chunk, clear, compact, first, fromLength, has, hasProp, invariant, isArray, isBoolean, isDev, isEmpty, isFunction, isNumber, isObject, isString, json, last, match, next, nextIndex, noop, prev, prevIndex, remove, removeAt, runIfFn, toArray, uuid, warn };
48
+ export { IndexOptions, add, addOrRemove, callAll, cast, chunk, clear, compact, first, fromLength, has, hasProp, invariant, isArray, isBoolean, isDev, isEmpty, isEqual, isFunction, isNumber, isObject, isString, json, last, match, next, nextIndex, noop, prev, prevIndex, remove, removeAt, runIfFn, toArray, uuid, warn };
package/dist/index.d.ts CHANGED
@@ -19,6 +19,8 @@ declare function prevIndex<T>(v: T[], idx: number, opts?: IndexOptions): number;
19
19
  declare function prev<T>(v: T[], index: number, opts?: IndexOptions): T | undefined;
20
20
  declare const chunk: <T>(v: T[], size: number) => T[][];
21
21
 
22
+ declare const isEqual: (a: any, b: any) => boolean;
23
+
22
24
  declare const runIfFn: <T>(v: T | undefined, ...a: T extends (...a: any[]) => void ? Parameters<T> : never) => T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T>;
23
25
  declare const cast: <T>(v: unknown) => T;
24
26
  declare const noop: () => void;
@@ -43,4 +45,4 @@ declare function warn(c: boolean, m: string): void;
43
45
  declare function invariant(m: string): void;
44
46
  declare function invariant(c: boolean, m: string): void;
45
47
 
46
- export { IndexOptions, add, addOrRemove, callAll, cast, chunk, clear, compact, first, fromLength, has, hasProp, invariant, isArray, isBoolean, isDev, isEmpty, isFunction, isNumber, isObject, isString, json, last, match, next, nextIndex, noop, prev, prevIndex, remove, removeAt, runIfFn, toArray, uuid, warn };
48
+ export { IndexOptions, add, addOrRemove, callAll, cast, chunk, clear, compact, first, fromLength, has, hasProp, invariant, isArray, isBoolean, isDev, isEmpty, isEqual, isFunction, isNumber, isObject, isString, json, last, match, next, nextIndex, noop, prev, prevIndex, remove, removeAt, runIfFn, toArray, uuid, warn };
package/dist/index.js CHANGED
@@ -36,6 +36,7 @@ __export(src_exports, {
36
36
  isBoolean: () => isBoolean,
37
37
  isDev: () => isDev,
38
38
  isEmpty: () => isEmpty,
39
+ isEqual: () => isEqual,
39
40
  isFunction: () => isFunction,
40
41
  isNumber: () => isNumber,
41
42
  isObject: () => isObject,
@@ -119,6 +120,25 @@ var chunk = (v, size) => {
119
120
  }, res);
120
121
  };
121
122
 
123
+ // src/equal.ts
124
+ var isEqual = (a, b) => {
125
+ if (Object.is(a, b))
126
+ return true;
127
+ if (!(a instanceof Object) || !(b instanceof Object))
128
+ return false;
129
+ const keys = Object.keys(a);
130
+ const length = keys.length;
131
+ for (let i = 0; i < length; i++) {
132
+ if (!(keys[i] in b))
133
+ return false;
134
+ }
135
+ for (let i = 0; i < length; i++) {
136
+ if (a[keys[i]] !== b[keys[i]])
137
+ return false;
138
+ }
139
+ return length === Object.keys(b).length;
140
+ };
141
+
122
142
  // src/functions.ts
123
143
  var runIfFn = (v, ...a) => {
124
144
  const res = typeof v === "function" ? v(...a) : v;
@@ -214,6 +234,7 @@ function invariant(...a) {
214
234
  isBoolean,
215
235
  isDev,
216
236
  isEmpty,
237
+ isEqual,
217
238
  isFunction,
218
239
  isNumber,
219
240
  isObject,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/array.ts","../src/functions.ts","../src/guard.ts","../src/object.ts","../src/warning.ts"],"sourcesContent":["export * from \"./array\"\nexport * from \"./functions\"\nexport * from \"./guard\"\nexport * from \"./object\"\nexport * from \"./warning\"\n","export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport const addOrRemove = <T>(v: T[], item: T): T[] => {\n if (has(v, item)) return remove(v, item)\n return add(v, item)\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n","export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function match<V extends string | number = string, R = unknown>(\n key: V,\n record: Record<V, R | ((...args: any[]) => R)>,\n ...args: any[]\n): R {\n if (key in record) {\n const fn = record[key]\n return typeof fn === \"function\" ? fn(...args) : fn\n }\n\n const error = new Error(`No matching key: ${JSON.stringify(key)} in ${JSON.stringify(Object.keys(record))}`)\n Error.captureStackTrace?.(error, match)\n\n throw error\n}\n","export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n","export function compact<T extends Record<string, unknown> | undefined>(obj: T): T {\n if (!isPlainObject(obj) || obj === undefined) {\n return obj\n }\n\n const keys = Reflect.ownKeys(obj).filter((key) => typeof key === \"string\")\n const filtered: Partial<T> = {}\n for (const key of keys) {\n const value = (obj as any)[key]\n if (value !== undefined) {\n filtered[key as keyof T] = compact(value)\n }\n }\n return filtered as T\n}\n\nexport function json(value: any) {\n return JSON.parse(JSON.stringify(value))\n}\n\nconst isPlainObject = (value: any) => {\n return value && typeof value === \"object\" && value.constructor === Object\n}\n","export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n"],"mappings":"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","names":["next","last"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/array.ts","../src/equal.ts","../src/functions.ts","../src/guard.ts","../src/object.ts","../src/warning.ts"],"sourcesContent":["export * from \"./array\"\nexport * from \"./equal\"\nexport * from \"./functions\"\nexport * from \"./guard\"\nexport * from \"./object\"\nexport * from \"./warning\"\n","export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport const addOrRemove = <T>(v: T[], item: T): T[] => {\n if (has(v, item)) return remove(v, item)\n return add(v, item)\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n","export const isEqual = (a: any, b: any) => {\n if (Object.is(a, b)) return true\n\n if (!(a instanceof Object) || !(b instanceof Object)) return false\n\n const keys = Object.keys(a)\n const length = keys.length\n\n for (let i = 0; i < length; i++) {\n if (!(keys[i] in b)) return false\n }\n\n for (let i = 0; i < length; i++) {\n if (a[keys[i]] !== b[keys[i]]) return false\n }\n\n return length === Object.keys(b).length\n}\n","export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function match<V extends string | number = string, R = unknown>(\n key: V,\n record: Record<V, R | ((...args: any[]) => R)>,\n ...args: any[]\n): R {\n if (key in record) {\n const fn = record[key]\n return typeof fn === \"function\" ? fn(...args) : fn\n }\n\n const error = new Error(`No matching key: ${JSON.stringify(key)} in ${JSON.stringify(Object.keys(record))}`)\n Error.captureStackTrace?.(error, match)\n\n throw error\n}\n","export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n","export function compact<T extends Record<string, unknown> | undefined>(obj: T): T {\n if (!isPlainObject(obj) || obj === undefined) {\n return obj\n }\n\n const keys = Reflect.ownKeys(obj).filter((key) => typeof key === \"string\")\n const filtered: Partial<T> = {}\n for (const key of keys) {\n const value = (obj as any)[key]\n if (value !== undefined) {\n filtered[key as keyof T] = compact(value)\n }\n }\n return filtered as T\n}\n\nexport function json(value: any) {\n return JSON.parse(JSON.stringify(value))\n}\n\nconst isPlainObject = (value: any) => {\n return value && typeof value === \"object\" && value.constructor === Object\n}\n","export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n"],"mappings":"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","names":["next","last"]}
package/dist/index.mjs CHANGED
@@ -60,6 +60,25 @@ var chunk = (v, size) => {
60
60
  }, res);
61
61
  };
62
62
 
63
+ // src/equal.ts
64
+ var isEqual = (a, b) => {
65
+ if (Object.is(a, b))
66
+ return true;
67
+ if (!(a instanceof Object) || !(b instanceof Object))
68
+ return false;
69
+ const keys = Object.keys(a);
70
+ const length = keys.length;
71
+ for (let i = 0; i < length; i++) {
72
+ if (!(keys[i] in b))
73
+ return false;
74
+ }
75
+ for (let i = 0; i < length; i++) {
76
+ if (a[keys[i]] !== b[keys[i]])
77
+ return false;
78
+ }
79
+ return length === Object.keys(b).length;
80
+ };
81
+
63
82
  // src/functions.ts
64
83
  var runIfFn = (v, ...a) => {
65
84
  const res = typeof v === "function" ? v(...a) : v;
@@ -154,6 +173,7 @@ export {
154
173
  isBoolean,
155
174
  isDev,
156
175
  isEmpty,
176
+ isEqual,
157
177
  isFunction,
158
178
  isNumber,
159
179
  isObject,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/array.ts","../src/functions.ts","../src/guard.ts","../src/object.ts","../src/warning.ts"],"sourcesContent":["export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport const addOrRemove = <T>(v: T[], item: T): T[] => {\n if (has(v, item)) return remove(v, item)\n return add(v, item)\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n","export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function match<V extends string | number = string, R = unknown>(\n key: V,\n record: Record<V, R | ((...args: any[]) => R)>,\n ...args: any[]\n): R {\n if (key in record) {\n const fn = record[key]\n return typeof fn === \"function\" ? fn(...args) : fn\n }\n\n const error = new Error(`No matching key: ${JSON.stringify(key)} in ${JSON.stringify(Object.keys(record))}`)\n Error.captureStackTrace?.(error, match)\n\n throw error\n}\n","export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n","export function compact<T extends Record<string, unknown> | undefined>(obj: T): T {\n if (!isPlainObject(obj) || obj === undefined) {\n return obj\n }\n\n const keys = Reflect.ownKeys(obj).filter((key) => typeof key === \"string\")\n const filtered: Partial<T> = {}\n for (const key of keys) {\n const value = (obj as any)[key]\n if (value !== undefined) {\n filtered[key as keyof T] = compact(value)\n }\n }\n return filtered as T\n}\n\nexport function json(value: any) {\n return JSON.parse(JSON.stringify(value))\n}\n\nconst isPlainObject = (value: any) => {\n return value && typeof value === \"object\" && value.constructor === Object\n}\n","export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n"],"mappings":";AAAO,SAAS,QAAW,GAAoC;AAC7D,MAAI,CAAC;AAAG,WAAO,CAAC;AAChB,SAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AAClC;AAEO,IAAM,aAAa,CAAC,WAAmB,MAAM,KAAK,MAAM,MAAM,EAAE,KAAK,CAAC;AAEtE,IAAM,QAAQ,CAAI,MAA0B,EAAE,CAAC;AAE/C,IAAM,OAAO,CAAI,MAA0B,EAAE,EAAE,SAAS,CAAC;AAEzD,IAAM,UAAU,CAAI,MAAoB,EAAE,WAAW;AAErD,IAAM,MAAM,CAAI,GAAQ,MAAoB,EAAE,QAAQ,CAAC,MAAM;AAE7D,IAAM,MAAM,CAAI,MAAW,UAAoB,EAAE,OAAO,KAAK;AAE7D,IAAM,SAAS,CAAI,GAAQ,SAAiB,SAAS,GAAG,EAAE,QAAQ,IAAI,CAAC;AAEvE,IAAM,WAAW,CAAI,GAAQ,MAAmB;AACrD,MAAI,IAAI;AAAI,MAAE,OAAO,GAAG,CAAC;AACzB,SAAO;AACT;AAEO,IAAM,cAAc,CAAI,GAAQ,SAAiB;AACtD,MAAI,IAAI,GAAG,IAAI;AAAG,WAAO,OAAO,GAAG,IAAI;AACvC,SAAO,IAAI,GAAG,IAAI;AACpB;AAEO,SAAS,MAAS,GAAa;AACpC,SAAO,EAAE,SAAS;AAAG,MAAE,IAAI;AAC3B,SAAO;AACT;AAOO,SAAS,UAAa,GAAQ,KAAa,OAAqB,CAAC,GAAW;AACjF,QAAM,EAAE,OAAO,GAAG,OAAO,KAAK,IAAI;AAClC,QAAMA,QAAO,MAAM;AACnB,QAAM,MAAM,EAAE;AACd,QAAMC,QAAO,MAAM;AACnB,MAAI,QAAQ;AAAI,WAAO,OAAO,IAAI,IAAIA;AACtC,MAAID,QAAO;AAAG,WAAO,OAAOC,QAAO;AACnC,MAAID,SAAQ;AAAK,WAAO,OAAO,IAAI,MAAM,MAAM,MAAM;AACrD,SAAOA;AACT;AAEO,SAAS,KAAQ,GAAQ,KAAa,OAAqB,CAAC,GAAkB;AACnF,SAAO,EAAE,UAAU,GAAG,KAAK,IAAI,CAAC;AAClC;AAEO,SAAS,UAAa,GAAQ,KAAa,OAAqB,CAAC,GAAW;AACjF,QAAM,EAAE,OAAO,GAAG,OAAO,KAAK,IAAI;AAClC,SAAO,UAAU,GAAG,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;AAChD;AAEO,SAAS,KAAQ,GAAQ,OAAe,OAAqB,CAAC,GAAkB;AACrF,SAAO,EAAE,UAAU,GAAG,OAAO,IAAI,CAAC;AACpC;AAEO,IAAM,QAAQ,CAAI,GAAQ,SAAwB;AACvD,QAAM,MAAa,CAAC;AACpB,SAAO,EAAE,OAAO,CAAC,MAAM,OAAO,UAAU;AACtC,QAAI,QAAQ,SAAS;AAAG,WAAK,KAAK,CAAC,KAAK,CAAC;AAAA;AACpC,WAAK,IAAI,GAAG,KAAK,KAAK;AAC3B,WAAO;AAAA,EACT,GAAG,GAAG;AACR;;;ACtEO,IAAM,UAAU,CACrB,MACG,MAC+E;AAClF,QAAM,MAAM,OAAO,MAAM,aAAa,EAAE,GAAG,CAAC,IAAI;AAChD,SAAO,OAAO;AAChB;AAEO,IAAM,OAAO,CAAI,MAAkB;AAEnC,IAAM,OAAO,MAAM;AAAC;AAEpB,IAAM,UACX,IAAqC,QACrC,IAAI,MAAqB;AACvB,MAAI,QAAQ,SAAU,IAAI;AACxB,SAAK,GAAG,CAAC;AAAA,EACX,CAAC;AACH;AAEK,IAAM,OAAsB,uBAAM;AACvC,MAAI,KAAK;AACT,SAAO,MAAM;AACX;AACA,WAAO,GAAG,SAAS,EAAE;AAAA,EACvB;AACF,GAAG;AAEI,SAAS,MACd,KACA,WACG,MACA;AACH,MAAI,OAAO,QAAQ;AACjB,UAAM,KAAK,OAAO,GAAG;AACrB,WAAO,OAAO,OAAO,aAAa,GAAG,GAAG,IAAI,IAAI;AAAA,EAClD;AAEA,QAAM,QAAQ,IAAI,MAAM,oBAAoB,KAAK,UAAU,GAAG,CAAC,OAAO,KAAK,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE;AAC3G,QAAM,oBAAoB,OAAO,KAAK;AAEtC,QAAM;AACR;;;AC1CO,IAAM,QAAQ,MAAM,QAAQ,IAAI,aAAa;AAC7C,IAAM,UAAU,CAAC,MAAuB,MAAM,QAAQ,CAAC;AACvD,IAAM,YAAY,CAAC,MAAyB,MAAM,QAAQ,MAAM;AAChE,IAAM,WAAW,CAAC,MAAqC,EAAE,KAAK,QAAQ,OAAO,MAAM,YAAY,QAAQ,CAAC;AACxG,IAAM,WAAW,CAAC,MAAwB,OAAO,MAAM,YAAY,CAAC,OAAO,MAAM,CAAC;AAClF,IAAM,WAAW,CAAC,MAAwB,OAAO,MAAM;AACvD,IAAM,aAAa,CAAC,MAA0B,OAAO,MAAM;AAE3D,IAAM,UAAU,CAAmB,KAAU,SAClD,OAAO,UAAU,eAAe,KAAK,KAAK,IAAI;;;ACTzC,SAAS,QAAuD,KAAW;AAChF,MAAI,CAAC,cAAc,GAAG,KAAK,QAAQ,QAAW;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,QAAQ,GAAG,EAAE,OAAO,CAAC,QAAQ,OAAO,QAAQ,QAAQ;AACzE,QAAM,WAAuB,CAAC;AAC9B,aAAW,OAAO,MAAM;AACtB,UAAM,QAAS,IAAY,GAAG;AAC9B,QAAI,UAAU,QAAW;AACvB,eAAS,GAAc,IAAI,QAAQ,KAAK;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,KAAK,OAAY;AAC/B,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,IAAM,gBAAgB,CAAC,UAAe;AACpC,SAAO,SAAS,OAAO,UAAU,YAAY,MAAM,gBAAgB;AACrE;;;ACpBO,SAAS,QAAQ,GAAgB;AACtC,QAAM,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACrC,QAAM,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI;AAClC,MAAI,KAAK,QAAQ,IAAI,aAAa,cAAc;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIO,SAAS,aAAa,GAAgB;AAC3C,QAAM,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACrC,QAAM,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI;AAClC,MAAI,KAAK,QAAQ,IAAI,aAAa,cAAc;AAC9C,UAAM,IAAI,MAAM,CAAC;AAAA,EACnB;AACF;","names":["next","last"]}
1
+ {"version":3,"sources":["../src/array.ts","../src/equal.ts","../src/functions.ts","../src/guard.ts","../src/object.ts","../src/warning.ts"],"sourcesContent":["export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport const addOrRemove = <T>(v: T[], item: T): T[] => {\n if (has(v, item)) return remove(v, item)\n return add(v, item)\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n","export const isEqual = (a: any, b: any) => {\n if (Object.is(a, b)) return true\n\n if (!(a instanceof Object) || !(b instanceof Object)) return false\n\n const keys = Object.keys(a)\n const length = keys.length\n\n for (let i = 0; i < length; i++) {\n if (!(keys[i] in b)) return false\n }\n\n for (let i = 0; i < length; i++) {\n if (a[keys[i]] !== b[keys[i]]) return false\n }\n\n return length === Object.keys(b).length\n}\n","export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function match<V extends string | number = string, R = unknown>(\n key: V,\n record: Record<V, R | ((...args: any[]) => R)>,\n ...args: any[]\n): R {\n if (key in record) {\n const fn = record[key]\n return typeof fn === \"function\" ? fn(...args) : fn\n }\n\n const error = new Error(`No matching key: ${JSON.stringify(key)} in ${JSON.stringify(Object.keys(record))}`)\n Error.captureStackTrace?.(error, match)\n\n throw error\n}\n","export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n","export function compact<T extends Record<string, unknown> | undefined>(obj: T): T {\n if (!isPlainObject(obj) || obj === undefined) {\n return obj\n }\n\n const keys = Reflect.ownKeys(obj).filter((key) => typeof key === \"string\")\n const filtered: Partial<T> = {}\n for (const key of keys) {\n const value = (obj as any)[key]\n if (value !== undefined) {\n filtered[key as keyof T] = compact(value)\n }\n }\n return filtered as T\n}\n\nexport function json(value: any) {\n return JSON.parse(JSON.stringify(value))\n}\n\nconst isPlainObject = (value: any) => {\n return value && typeof value === \"object\" && value.constructor === Object\n}\n","export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n"],"mappings":"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","names":["next","last"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/utils",
3
- "version": "0.18.0",
3
+ "version": "0.19.1",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "js",
package/src/equal.ts ADDED
@@ -0,0 +1,18 @@
1
+ export const isEqual = (a: any, b: any) => {
2
+ if (Object.is(a, b)) return true
3
+
4
+ if (!(a instanceof Object) || !(b instanceof Object)) return false
5
+
6
+ const keys = Object.keys(a)
7
+ const length = keys.length
8
+
9
+ for (let i = 0; i < length; i++) {
10
+ if (!(keys[i] in b)) return false
11
+ }
12
+
13
+ for (let i = 0; i < length; i++) {
14
+ if (a[keys[i]] !== b[keys[i]]) return false
15
+ }
16
+
17
+ return length === Object.keys(b).length
18
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./array"
2
+ export * from "./equal"
2
3
  export * from "./functions"
3
4
  export * from "./guard"
4
5
  export * from "./object"