@tanstack/angular-store
Advanced tools
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["import {\n effect,\n signal,\n type CreateSignalOptions,\n Injector,\n assertInInjectionContext,\n inject,\n runInInjectionContext,\n} from '@angular/core'\nimport type { AnyUpdater, Store } from '@tanstack/store'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\nexport function injectStore<\n TState,\n TSelected = NoInfer<TState>,\n TUpdater extends AnyUpdater = AnyUpdater,\n>(\n store: Store<TState, TUpdater>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as TSelected,\n options: CreateSignalOptions<TSelected> & { injector?: Injector } = {\n equal: shallow,\n },\n) {\n !options.injector && assertInInjectionContext(injectStore)\n\n if (!options.injector) {\n options.injector = inject(Injector)\n }\n\n return runInInjectionContext(options.injector, () => {\n const slice = signal(selector(store.state), options)\n\n effect(\n (onCleanup) => {\n const unsub = store.subscribe(() => {\n slice.set(selector(store.state))\n })\n onCleanup(unsub)\n },\n { allowSignalWrites: true },\n )\n\n return slice.asReadonly()\n })\n}\n\nfunction shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["assertInInjectionContext","inject","Injector","runInInjectionContext","signal","effect"],"mappings":";;;AAaO,SAAS,YAKd,OACA,WAAkD,CAAC,MAAM,GACzD,UAAoE;AAAA,EAClE,OAAO;AACT,GACA;AACC,GAAA,QAAQ,YAAYA,KAAA,yBAAyB,WAAW;AAErD,MAAA,CAAC,QAAQ,UAAU;AACb,YAAA,WAAWC,YAAOC,KAAAA,QAAQ;AAAA,EACpC;AAEO,SAAAC,KAAA,sBAAsB,QAAQ,UAAU,MAAM;AACnD,UAAM,QAAQC,KAAAA,OAAO,SAAS,MAAM,KAAK,GAAG,OAAO;AAEnDC,SAAA;AAAA,MACE,CAAC,cAAc;AACP,cAAA,QAAQ,MAAM,UAAU,MAAM;AAClC,gBAAM,IAAI,SAAS,MAAM,KAAK,CAAC;AAAA,QAAA,CAChC;AACD,kBAAU,KAAK;AAAA,MACjB;AAAA,MACA,EAAE,mBAAmB,KAAK;AAAA,IAAA;AAG5B,WAAO,MAAM;EAAW,CACzB;AACH;AAEA,SAAS,QAAW,MAAS,MAAS;AACpC,MAAI,OAAO,GAAG,MAAM,IAAI,GAAG;AAClB,WAAA;AAAA,EACT;AAGE,MAAA,OAAO,SAAS,YAChB,SAAS,QACT,OAAO,SAAS,YAChB,SAAS,MACT;AACO,WAAA;AAAA,EACT;AAEM,QAAA,QAAQ,OAAO,KAAK,IAAI;AAC9B,MAAI,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,QAAQ;AACtC,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAEnC,QAAA,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CAAC,CAAW,KAC9D,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAY,GAAG,KAAK,MAAM,CAAC,CAAY,CAAC,GAC/D;AACO,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;;"} | ||
| {"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["import {\n Injector,\n assertInInjectionContext,\n effect,\n inject,\n runInInjectionContext,\n signal,\n} from '@angular/core'\nimport type { AnyUpdater, Store } from '@tanstack/store'\nimport type { CreateSignalOptions } from '@angular/core'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\nexport function injectStore<\n TState,\n TSelected = NoInfer<TState>,\n TUpdater extends AnyUpdater = AnyUpdater,\n>(\n store: Store<TState, TUpdater>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as TSelected,\n options: CreateSignalOptions<TSelected> & { injector?: Injector } = {\n equal: shallow,\n },\n) {\n !options.injector && assertInInjectionContext(injectStore)\n\n if (!options.injector) {\n options.injector = inject(Injector)\n }\n\n return runInInjectionContext(options.injector, () => {\n const slice = signal(selector(store.state), options)\n\n effect(\n (onCleanup) => {\n const unsub = store.subscribe(() => {\n slice.set(selector(store.state))\n })\n onCleanup(unsub)\n },\n { allowSignalWrites: true },\n )\n\n return slice.asReadonly()\n })\n}\n\nfunction shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":["assertInInjectionContext","inject","Injector","runInInjectionContext","signal","effect"],"mappings":";;;AAaO,SAAS,YAKd,OACA,WAAkD,CAAC,MAAM,GACzD,UAAoE;AAAA,EAClE,OAAO;AACT,GACA;AACC,GAAA,QAAQ,YAAYA,KAAA,yBAAyB,WAAW;AAErD,MAAA,CAAC,QAAQ,UAAU;AACb,YAAA,WAAWC,YAAOC,KAAAA,QAAQ;AAAA,EACpC;AAEO,SAAAC,KAAA,sBAAsB,QAAQ,UAAU,MAAM;AACnD,UAAM,QAAQC,KAAAA,OAAO,SAAS,MAAM,KAAK,GAAG,OAAO;AAEnDC,SAAA;AAAA,MACE,CAAC,cAAc;AACP,cAAA,QAAQ,MAAM,UAAU,MAAM;AAClC,gBAAM,IAAI,SAAS,MAAM,KAAK,CAAC;AAAA,QAAA,CAChC;AACD,kBAAU,KAAK;AAAA,MACjB;AAAA,MACA,EAAE,mBAAmB,KAAK;AAAA,IAAA;AAG5B,WAAO,MAAM;EAAW,CACzB;AACH;AAEA,SAAS,QAAW,MAAS,MAAS;AACpC,MAAI,OAAO,GAAG,MAAM,IAAI,GAAG;AAClB,WAAA;AAAA,EACT;AAGE,MAAA,OAAO,SAAS,YAChB,SAAS,QACT,OAAO,SAAS,YAChB,SAAS,MACT;AACO,WAAA;AAAA,EACT;AAEM,QAAA,QAAQ,OAAO,KAAK,IAAI;AAC9B,MAAI,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,QAAQ;AACtC,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAEnC,QAAA,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CAAC,CAAW,KAC9D,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAY,GAAG,KAAK,MAAM,CAAC,CAAY,CAAC,GAC/D;AACO,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;;"} |
@@ -1,7 +0,8 @@ | ||
| import { type CreateSignalOptions, Injector } from '@angular/core'; | ||
| import type { AnyUpdater, Store } from '@tanstack/store'; | ||
| import { Injector, CreateSignalOptions } from '@angular/core'; | ||
| import { AnyUpdater, Store } from '@tanstack/store'; | ||
| type NoInfer<T> = [T][T extends any ? 0 : never]; | ||
| export declare function injectStore<TState, TSelected = NoInfer<TState>, TUpdater extends AnyUpdater = AnyUpdater>(store: Store<TState, TUpdater>, selector?: (state: NoInfer<TState>) => TSelected, options?: CreateSignalOptions<TSelected> & { | ||
| injector?: Injector; | ||
| }): import("@angular/core").Signal<TSelected>; | ||
| }): import('@angular/core').Signal<TSelected>; | ||
| export {}; |
@@ -1,7 +0,8 @@ | ||
| import { type CreateSignalOptions, Injector } from '@angular/core'; | ||
| import type { AnyUpdater, Store } from '@tanstack/store'; | ||
| import { Injector, CreateSignalOptions } from '@angular/core'; | ||
| import { AnyUpdater, Store } from '@tanstack/store'; | ||
| type NoInfer<T> = [T][T extends any ? 0 : never]; | ||
| export declare function injectStore<TState, TSelected = NoInfer<TState>, TUpdater extends AnyUpdater = AnyUpdater>(store: Store<TState, TUpdater>, selector?: (state: NoInfer<TState>) => TSelected, options?: CreateSignalOptions<TSelected> & { | ||
| injector?: Injector; | ||
| }): import("@angular/core").Signal<TSelected>; | ||
| }): import('@angular/core').Signal<TSelected>; | ||
| export {}; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import {\n effect,\n signal,\n type CreateSignalOptions,\n Injector,\n assertInInjectionContext,\n inject,\n runInInjectionContext,\n} from '@angular/core'\nimport type { AnyUpdater, Store } from '@tanstack/store'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\nexport function injectStore<\n TState,\n TSelected = NoInfer<TState>,\n TUpdater extends AnyUpdater = AnyUpdater,\n>(\n store: Store<TState, TUpdater>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as TSelected,\n options: CreateSignalOptions<TSelected> & { injector?: Injector } = {\n equal: shallow,\n },\n) {\n !options.injector && assertInInjectionContext(injectStore)\n\n if (!options.injector) {\n options.injector = inject(Injector)\n }\n\n return runInInjectionContext(options.injector, () => {\n const slice = signal(selector(store.state), options)\n\n effect(\n (onCleanup) => {\n const unsub = store.subscribe(() => {\n slice.set(selector(store.state))\n })\n onCleanup(unsub)\n },\n { allowSignalWrites: true },\n )\n\n return slice.asReadonly()\n })\n}\n\nfunction shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":[],"mappings":";AAaO,SAAS,YAKd,OACA,WAAkD,CAAC,MAAM,GACzD,UAAoE;AAAA,EAClE,OAAO;AACT,GACA;AACC,GAAA,QAAQ,YAAY,yBAAyB,WAAW;AAErD,MAAA,CAAC,QAAQ,UAAU;AACb,YAAA,WAAW,OAAO,QAAQ;AAAA,EACpC;AAEO,SAAA,sBAAsB,QAAQ,UAAU,MAAM;AACnD,UAAM,QAAQ,OAAO,SAAS,MAAM,KAAK,GAAG,OAAO;AAEnD;AAAA,MACE,CAAC,cAAc;AACP,cAAA,QAAQ,MAAM,UAAU,MAAM;AAClC,gBAAM,IAAI,SAAS,MAAM,KAAK,CAAC;AAAA,QAAA,CAChC;AACD,kBAAU,KAAK;AAAA,MACjB;AAAA,MACA,EAAE,mBAAmB,KAAK;AAAA,IAAA;AAG5B,WAAO,MAAM;EAAW,CACzB;AACH;AAEA,SAAS,QAAW,MAAS,MAAS;AACpC,MAAI,OAAO,GAAG,MAAM,IAAI,GAAG;AAClB,WAAA;AAAA,EACT;AAGE,MAAA,OAAO,SAAS,YAChB,SAAS,QACT,OAAO,SAAS,YAChB,SAAS,MACT;AACO,WAAA;AAAA,EACT;AAEM,QAAA,QAAQ,OAAO,KAAK,IAAI;AAC9B,MAAI,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,QAAQ;AACtC,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAEnC,QAAA,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CAAC,CAAW,KAC9D,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAY,GAAG,KAAK,MAAM,CAAC,CAAY,CAAC,GAC/D;AACO,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;"} | ||
| {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import {\n Injector,\n assertInInjectionContext,\n effect,\n inject,\n runInInjectionContext,\n signal,\n} from '@angular/core'\nimport type { AnyUpdater, Store } from '@tanstack/store'\nimport type { CreateSignalOptions } from '@angular/core'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\nexport function injectStore<\n TState,\n TSelected = NoInfer<TState>,\n TUpdater extends AnyUpdater = AnyUpdater,\n>(\n store: Store<TState, TUpdater>,\n selector: (state: NoInfer<TState>) => TSelected = (d) => d as TSelected,\n options: CreateSignalOptions<TSelected> & { injector?: Injector } = {\n equal: shallow,\n },\n) {\n !options.injector && assertInInjectionContext(injectStore)\n\n if (!options.injector) {\n options.injector = inject(Injector)\n }\n\n return runInInjectionContext(options.injector, () => {\n const slice = signal(selector(store.state), options)\n\n effect(\n (onCleanup) => {\n const unsub = store.subscribe(() => {\n slice.set(selector(store.state))\n })\n onCleanup(unsub)\n },\n { allowSignalWrites: true },\n )\n\n return slice.asReadonly()\n })\n}\n\nfunction shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n"],"names":[],"mappings":";AAaO,SAAS,YAKd,OACA,WAAkD,CAAC,MAAM,GACzD,UAAoE;AAAA,EAClE,OAAO;AACT,GACA;AACC,GAAA,QAAQ,YAAY,yBAAyB,WAAW;AAErD,MAAA,CAAC,QAAQ,UAAU;AACb,YAAA,WAAW,OAAO,QAAQ;AAAA,EACpC;AAEO,SAAA,sBAAsB,QAAQ,UAAU,MAAM;AACnD,UAAM,QAAQ,OAAO,SAAS,MAAM,KAAK,GAAG,OAAO;AAEnD;AAAA,MACE,CAAC,cAAc;AACP,cAAA,QAAQ,MAAM,UAAU,MAAM;AAClC,gBAAM,IAAI,SAAS,MAAM,KAAK,CAAC;AAAA,QAAA,CAChC;AACD,kBAAU,KAAK;AAAA,MACjB;AAAA,MACA,EAAE,mBAAmB,KAAK;AAAA,IAAA;AAG5B,WAAO,MAAM;EAAW,CACzB;AACH;AAEA,SAAS,QAAW,MAAS,MAAS;AACpC,MAAI,OAAO,GAAG,MAAM,IAAI,GAAG;AAClB,WAAA;AAAA,EACT;AAGE,MAAA,OAAO,SAAS,YAChB,SAAS,QACT,OAAO,SAAS,YAChB,SAAS,MACT;AACO,WAAA;AAAA,EACT;AAEM,QAAA,QAAQ,OAAO,KAAK,IAAI;AAC9B,MAAI,MAAM,WAAW,OAAO,KAAK,IAAI,EAAE,QAAQ;AACtC,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAEnC,QAAA,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CAAC,CAAW,KAC9D,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAY,GAAG,KAAK,MAAM,CAAC,CAAY,CAAC,GAC/D;AACO,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;"} |
+4
-12
| { | ||
| "name": "@tanstack/angular-store", | ||
| "author": "Tanner Linsley", | ||
| "version": "0.4.0", | ||
| "version": "0.4.1", | ||
| "license": "MIT", | ||
@@ -44,10 +44,10 @@ "repository": "tanstack/store", | ||
| "dependencies": { | ||
| "@tanstack/store": "0.3.1" | ||
| "@tanstack/store": "0.4.1" | ||
| }, | ||
| "devDependencies": { | ||
| "@analogjs/vite-plugin-angular": "^0.2.32", | ||
| "@angular/core": "^17.1.2", | ||
| "@angular/common": "^17.1.2", | ||
| "@angular/compiler": "^17.1.2", | ||
| "@angular/compiler-cli": "^17.1.2", | ||
| "@angular/core": "^17.1.2", | ||
| "@angular/platform-browser": "^17.1.2", | ||
@@ -61,11 +61,3 @@ "@angular/platform-browser-dynamic": "^17.1.2", | ||
| }, | ||
| "scripts": { | ||
| "clean": "rimraf ./dist && rimraf ./coverage", | ||
| "test:eslint": "eslint --ext .ts,.tsx ./src", | ||
| "test:types": "tsc", | ||
| "test:lib": "vitest", | ||
| "test:lib:dev": "pnpm run test:lib --watch", | ||
| "test:build": "publint --strict", | ||
| "build": "vite build" | ||
| } | ||
| "scripts": {} | ||
| } |
+3
-3
| import { | ||
| effect, | ||
| signal, | ||
| type CreateSignalOptions, | ||
| Injector, | ||
| assertInInjectionContext, | ||
| effect, | ||
| inject, | ||
| runInInjectionContext, | ||
| signal, | ||
| } from '@angular/core' | ||
| import type { AnyUpdater, Store } from '@tanstack/store' | ||
| import type { CreateSignalOptions } from '@angular/core' | ||
@@ -12,0 +12,0 @@ type NoInfer<T> = [T][T extends any ? 0 : never] |
@@ -0,1 +1,2 @@ | ||
| import { describe, expect, test } from 'vitest' | ||
| import { Component, effect } from '@angular/core' | ||
@@ -2,0 +3,0 @@ import { TestBed } from '@angular/core/testing' |
250
0.4%16324
-0.92%+ Added
- Removed
Updated