@inox-tools/utils 1.0.0 → 1.1.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/dist/nano.d.ts CHANGED
@@ -32,6 +32,6 @@ type Resolved<T> = T extends Array<any> ? ResolvedArray<T> : T extends ReadableA
32
32
  * @param value - A value tree that may contain atoms at any depth.
33
33
  * @returns A readable atom whose value is the deeply-resolved snapshot of the input.
34
34
  */
35
- declare function resolvedAtom<T>(value: T): ReadableAtom<Resolved<T>>;
35
+ declare function resolvedAtom<T>(value: T, batch?: boolean): ReadableAtom<Resolved<T>>;
36
36
 
37
37
  export { type Resolved, resolvedAtom };
package/dist/nano.js CHANGED
@@ -1,2 +1,2 @@
1
- import {computed}from'nanostores';function s(e){return typeof e.lc=="number"&&typeof e.listen=="function"}function r(e){return typeof e!="object"||e===null?e:s(e)?e.value:Array.isArray(e)?e.map(n=>r(n)):Object.fromEntries(Object.entries(e).map(([n,o])=>[n,r(o)]))}function a(e){const n=new Set,o=[e];for(;o.length>0;){const t=o.pop();if(!(typeof t!="object"||t===null)){if(s(t)){n.add(t);continue}o.push(...Array.isArray(t)?t:Object.values(t));}}return Array.from(n.values())}function c(e){const n=a(e);return computed(n,()=>r(e))}export{c as resolvedAtom};//# sourceMappingURL=nano.js.map
1
+ import {batched,computed}from'nanostores';function s(e){return typeof e.lc=="number"&&typeof e.listen=="function"}function r(e){return typeof e!="object"||e===null?e:s(e)?e.value:Array.isArray(e)?e.map(n=>r(n)):Object.fromEntries(Object.entries(e).map(([n,t])=>[n,r(t)]))}function c(e){const n=new Set,t=[e];for(;t.length>0;){const o=t.pop();if(!(typeof o!="object"||o===null)){if(s(o)){n.add(o);continue}t.push(...Array.isArray(o)?o:Object.values(o));}}return Array.from(n.values())}function l(e,n=false){const t=c(e);return (n?batched:computed)(t,()=>r(e))}export{l as resolvedAtom};//# sourceMappingURL=nano.js.map
2
2
  //# sourceMappingURL=nano.js.map
package/dist/nano.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nano.ts"],"names":["isResolvable","value","resolveNested","item","key","findDependencies","dependencies","stack","current","resolvedAtom","computed"],"mappings":"kCA2BA,SAASA,EAAaC,CAAAA,CAAqD,CAC1E,OAAO,OAAOA,CAAAA,CAAM,EAAA,EAAO,QAAA,EAAY,OAAOA,EAAM,MAAA,EAAW,UAChE,CAEA,SAASC,CAAAA,CAAiBD,CAAAA,CAAuB,CAChD,OAAI,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,IAAA,CAAaA,CAAAA,CACpDD,CAAAA,CAAaC,CAAK,CAAA,CACdA,EAAM,KAAA,CAEV,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAUA,CAAAA,CAAM,GAAA,CAAKE,CAAAA,EAASD,EAAcC,CAAI,CAAC,CAAA,CACjE,MAAA,CAAO,WAAA,CACb,MAAA,CAAO,OAAA,CAAQF,CAAK,EAAE,GAAA,CAAI,CAAC,CAACG,CAAAA,CAAKH,CAAK,CAAA,GAAM,CAACG,CAAAA,CAAKF,EAAcD,CAAK,CAAC,CAAC,CACxE,CACD,CAEA,SAASI,CAAAA,CAAiBJ,CAAAA,CAAgC,CACzD,MAAMK,CAAAA,CAAe,IAAI,GAAA,CACnBC,CAAAA,CAAQ,CAACN,CAAK,CAAA,CAEpB,KAAOM,CAAAA,CAAM,MAAA,CAAS,CAAA,EAAG,CACxB,MAAMC,CAAAA,CAAUD,CAAAA,CAAM,GAAA,GACtB,GAAI,EAAA,OAAOC,CAAAA,EAAY,QAAA,EAAYA,CAAAA,GAAY,IAAA,CAAA,CAC/C,CAAA,GAAIR,CAAAA,CAAaQ,CAAO,CAAA,CAAG,CAC1BF,CAAAA,CAAa,GAAA,CAAIE,CAAO,CAAA,CACxB,QACD,CACAD,EAAM,IAAA,CAAK,GAAI,KAAA,CAAM,OAAA,CAAQC,CAAO,CAAA,CAAIA,CAAAA,CAAU,MAAA,CAAO,OAAOA,CAAO,CAAE,EAAA,CAC1E,CAEA,OAAO,KAAA,CAAM,IAAA,CAAKF,CAAAA,CAAa,QAAQ,CACxC,CAqBO,SAASG,CAAAA,CAAgBR,CAAAA,CAAqC,CACpE,MAAMK,EAAeD,CAAAA,CAAiBJ,CAAK,CAAA,CAE3C,OAAOS,SAASJ,CAAAA,CAAc,IAAMJ,CAAAA,CAAcD,CAAK,CAAC,CACzD","file":"nano.js","sourcesContent":["import { computed, type ReadableAtom } from 'nanostores';\n\ntype ResolvedArray<T extends any[]> = T extends [infer H, ...infer R]\n\t? [Resolved<H>, ...ResolvedArray<R>]\n\t: [];\n\ntype ResolvedObject<T extends Record<any, any>> = {\n\t[K in keyof T]: Resolved<T[K]>;\n};\n\n/**\n * Recursively unwraps all {@link ReadableAtom} instances in a type to their inner values.\n *\n * - Atoms become their contained value type.\n * - Arrays and tuples are resolved element-wise.\n * - Objects are resolved property-wise.\n * - Primitives pass through unchanged.\n */\nexport type Resolved<T> =\n\tT extends Array<any>\n\t\t? ResolvedArray<T>\n\t\t: T extends ReadableAtom<infer U>\n\t\t\t? U\n\t\t\t: T extends Record<any, any>\n\t\t\t\t? ResolvedObject<T>\n\t\t\t\t: T;\n\nfunction isResolvable(value: Record<any, any>): value is ReadableAtom<any> {\n\treturn typeof value.lc === 'number' && typeof value.listen === 'function';\n}\n\nfunction resolveNested<T>(value: T): Resolved<T> {\n\tif (typeof value !== 'object' || value === null) return value as Resolved<T>;\n\tif (isResolvable(value)) {\n\t\treturn value.value;\n\t}\n\tif (Array.isArray(value)) return value.map((item) => resolveNested(item)) as Resolved<T>;\n\treturn Object.fromEntries(\n\t\tObject.entries(value).map(([key, value]) => [key, resolveNested(value)])\n\t) as Resolved<T>;\n}\n\nfunction findDependencies(value: unknown): ReadableAtom[] {\n\tconst dependencies = new Set<ReadableAtom>();\n\tconst stack = [value];\n\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (typeof current !== 'object' || current === null) continue;\n\t\tif (isResolvable(current)) {\n\t\t\tdependencies.add(current);\n\t\t\tcontinue;\n\t\t}\n\t\tstack.push(...(Array.isArray(current) ? current : Object.values(current)));\n\t}\n\n\treturn Array.from(dependencies.values());\n}\n\n/**\n * Creates a read-only computed atom that deeply resolves all nested {@link ReadableAtom}\n * instances in the given value, reactively updating when any of them changes.\n *\n * @example\n * ```ts\n * const $name = atom('Alice');\n * const $age = atom(30);\n *\n * const $user = resolvedAtom({ name: $name, age: $age, role: 'admin' });\n * $user.get(); // { name: 'Alice', age: 30, role: 'admin' }\n *\n * $name.set('Bob');\n * $user.get(); // { name: 'Bob', age: 30, role: 'admin' }\n * ```\n *\n * @param value - A value tree that may contain atoms at any depth.\n * @returns A readable atom whose value is the deeply-resolved snapshot of the input.\n */\nexport function resolvedAtom<T>(value: T): ReadableAtom<Resolved<T>> {\n\tconst dependencies = findDependencies(value);\n\n\treturn computed(dependencies, () => resolveNested(value));\n}\n"]}
1
+ {"version":3,"sources":["../src/nano.ts"],"names":["isResolvable","value","resolveNested","item","key","findDependencies","dependencies","stack","current","resolvedAtom","batch","batched","computed"],"mappings":"0CA2BA,SAASA,CAAAA,CAAaC,CAAAA,CAAqD,CAC1E,OAAO,OAAOA,CAAAA,CAAM,EAAA,EAAO,QAAA,EAAY,OAAOA,CAAAA,CAAM,MAAA,EAAW,UAChE,CAEA,SAASC,CAAAA,CAAiBD,CAAAA,CAAuB,CAChD,OAAI,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,KAAaA,CAAAA,CACpDD,CAAAA,CAAaC,CAAK,CAAA,CACdA,EAAM,KAAA,CAEV,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAUA,CAAAA,CAAM,GAAA,CAAKE,CAAAA,EAASD,EAAcC,CAAI,CAAC,CAAA,CACjE,MAAA,CAAO,YACb,MAAA,CAAO,OAAA,CAAQF,CAAK,CAAA,CAAE,IAAI,CAAC,CAACG,CAAAA,CAAKH,CAAK,CAAA,GAAM,CAACG,CAAAA,CAAKF,CAAAA,CAAcD,CAAK,CAAC,CAAC,CACxE,CACD,CAEA,SAASI,CAAAA,CAAiBJ,CAAAA,CAAgC,CACzD,MAAMK,CAAAA,CAAe,IAAI,GAAA,CACnBC,CAAAA,CAAQ,CAACN,CAAK,CAAA,CAEpB,KAAOM,EAAM,MAAA,CAAS,CAAA,EAAG,CACxB,MAAMC,EAAUD,CAAAA,CAAM,GAAA,EAAI,CAC1B,GAAI,SAAOC,CAAAA,EAAY,QAAA,EAAYA,CAAAA,GAAY,IAAA,CAAA,CAC/C,CAAA,GAAIR,CAAAA,CAAaQ,CAAO,CAAA,CAAG,CAC1BF,CAAAA,CAAa,GAAA,CAAIE,CAAO,CAAA,CACxB,QACD,CACAD,CAAAA,CAAM,IAAA,CAAK,GAAI,MAAM,OAAA,CAAQC,CAAO,CAAA,CAAIA,CAAAA,CAAU,MAAA,CAAO,MAAA,CAAOA,CAAO,CAAE,GAC1E,CAEA,OAAO,KAAA,CAAM,IAAA,CAAKF,EAAa,MAAA,EAAQ,CACxC,CAqBO,SAASG,CAAAA,CAAgBR,CAAAA,CAAUS,CAAAA,CAAQ,KAAA,CAAkC,CACnF,MAAMJ,CAAAA,CAAeD,CAAAA,CAAiBJ,CAAK,CAAA,CAE3C,OAAA,CAAQS,CAAAA,CAAQC,OAAAA,CAAUC,UAAUN,CAAAA,CAAc,IAAMJ,CAAAA,CAAcD,CAAK,CAAC,CAC7E","file":"nano.js","sourcesContent":["import { batched, computed, type ReadableAtom } from 'nanostores';\n\ntype ResolvedArray<T extends any[]> = T extends [infer H, ...infer R]\n\t? [Resolved<H>, ...ResolvedArray<R>]\n\t: [];\n\ntype ResolvedObject<T extends Record<any, any>> = {\n\t[K in keyof T]: Resolved<T[K]>;\n};\n\n/**\n * Recursively unwraps all {@link ReadableAtom} instances in a type to their inner values.\n *\n * - Atoms become their contained value type.\n * - Arrays and tuples are resolved element-wise.\n * - Objects are resolved property-wise.\n * - Primitives pass through unchanged.\n */\nexport type Resolved<T> =\n\tT extends Array<any>\n\t\t? ResolvedArray<T>\n\t\t: T extends ReadableAtom<infer U>\n\t\t\t? U\n\t\t\t: T extends Record<any, any>\n\t\t\t\t? ResolvedObject<T>\n\t\t\t\t: T;\n\nfunction isResolvable(value: Record<any, any>): value is ReadableAtom<any> {\n\treturn typeof value.lc === 'number' && typeof value.listen === 'function';\n}\n\nfunction resolveNested<T>(value: T): Resolved<T> {\n\tif (typeof value !== 'object' || value === null) return value as Resolved<T>;\n\tif (isResolvable(value)) {\n\t\treturn value.value;\n\t}\n\tif (Array.isArray(value)) return value.map((item) => resolveNested(item)) as Resolved<T>;\n\treturn Object.fromEntries(\n\t\tObject.entries(value).map(([key, value]) => [key, resolveNested(value)])\n\t) as Resolved<T>;\n}\n\nfunction findDependencies(value: unknown): ReadableAtom[] {\n\tconst dependencies = new Set<ReadableAtom>();\n\tconst stack = [value];\n\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (typeof current !== 'object' || current === null) continue;\n\t\tif (isResolvable(current)) {\n\t\t\tdependencies.add(current);\n\t\t\tcontinue;\n\t\t}\n\t\tstack.push(...(Array.isArray(current) ? current : Object.values(current)));\n\t}\n\n\treturn Array.from(dependencies.values());\n}\n\n/**\n * Creates a read-only computed atom that deeply resolves all nested {@link ReadableAtom}\n * instances in the given value, reactively updating when any of them changes.\n *\n * @example\n * ```ts\n * const $name = atom('Alice');\n * const $age = atom(30);\n *\n * const $user = resolvedAtom({ name: $name, age: $age, role: 'admin' });\n * $user.get(); // { name: 'Alice', age: 30, role: 'admin' }\n *\n * $name.set('Bob');\n * $user.get(); // { name: 'Bob', age: 30, role: 'admin' }\n * ```\n *\n * @param value - A value tree that may contain atoms at any depth.\n * @returns A readable atom whose value is the deeply-resolved snapshot of the input.\n */\nexport function resolvedAtom<T>(value: T, batch = false): ReadableAtom<Resolved<T>> {\n\tconst dependencies = findDependencies(value);\n\n\treturn (batch ? batched : computed)(dependencies, () => resolveNested(value));\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inox-tools/utils",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A collection of utilities used throughout Inox Tools",
5
5
  "keywords": [
6
6
  "utilities"
package/src/nano.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { computed, type ReadableAtom } from 'nanostores';
1
+ import { batched, computed, type ReadableAtom } from 'nanostores';
2
2
 
3
3
  type ResolvedArray<T extends any[]> = T extends [infer H, ...infer R]
4
4
  ? [Resolved<H>, ...ResolvedArray<R>]
@@ -76,8 +76,8 @@ function findDependencies(value: unknown): ReadableAtom[] {
76
76
  * @param value - A value tree that may contain atoms at any depth.
77
77
  * @returns A readable atom whose value is the deeply-resolved snapshot of the input.
78
78
  */
79
- export function resolvedAtom<T>(value: T): ReadableAtom<Resolved<T>> {
79
+ export function resolvedAtom<T>(value: T, batch = false): ReadableAtom<Resolved<T>> {
80
80
  const dependencies = findDependencies(value);
81
81
 
82
- return computed(dependencies, () => resolveNested(value));
82
+ return (batch ? batched : computed)(dependencies, () => resolveNested(value));
83
83
  }