@isoftdata/svelte-store-crud
Advanced tools
@@ -46,4 +46,7 @@ import type { ConditionalKeys, Simplify } from 'type-fest'; | ||
| deletedValues: Array<T>; | ||
| createdEntries: Array<[EntityIdValue<T>, T]>; | ||
| updatedEntries: Array<[EntityIdValue<T>, T]>; | ||
| deletedEntries: Array<[EntityIdValue<T>, T]>; | ||
| constructor(idKey: K); | ||
| set(value: CrudMap<T>): void; | ||
| set(value: CrudMap<T> | MapCrudMap<T>): void; | ||
| create(entity: T | T[]): void; | ||
@@ -62,1 +65,3 @@ update(entity: T | T[]): void; | ||
| } | ||
| type MapEntityMap<T> = Map<EntityIdValue<T>, T>; | ||
| type MapCrudMap<T> = Record<CrudMapKey, MapEntityMap<T>>; |
+57
-16
| import { writable } from 'svelte/store'; | ||
| import { SvelteMap } from 'svelte/reactivity'; | ||
| /** Creates a new CRUD Map, without the rest of the store logic */ | ||
@@ -120,8 +121,13 @@ export const newCrudMap = () => ({ | ||
| export class CrudRuneStore { | ||
| #crudMap = $state(newCrudMap()); | ||
| #created = new SvelteMap(); | ||
| #updated = new SvelteMap(); | ||
| #deleted = new SvelteMap(); | ||
| #idKey; | ||
| // These public properties automatically get getters created | ||
| createdValues = $derived(Object.values(this.#crudMap.created)); | ||
| updatedValues = $derived(Object.values(this.#crudMap.updated)); | ||
| deletedValues = $derived(Object.values(this.#crudMap.deleted)); | ||
| createdValues = $derived(Array.from(this.#created.values())); | ||
| updatedValues = $derived(Array.from(this.#updated.values())); | ||
| deletedValues = $derived(Array.from(this.#deleted.values())); | ||
| createdEntries = $derived(Array.from(this.#created.entries())); | ||
| updatedEntries = $derived(Array.from(this.#updated.entries())); | ||
| deletedEntries = $derived(Array.from(this.#deleted.entries())); | ||
| #hasChanges = $derived(!!this.createdValues.length || !!this.updatedValues.length || !!this.deletedValues.length); | ||
@@ -133,6 +139,6 @@ constructor(idKey) { | ||
| if (Array.isArray(entity)) { | ||
| entity.forEach(e => doCrud(this.#crudMap, crudType, e, this.#idKey)); | ||
| entity.forEach(e => this.#doCrud(crudType, e)); | ||
| } | ||
| else { | ||
| doCrud(this.#crudMap, crudType, entity, this.#idKey); | ||
| this.#doCrud(crudType, entity); | ||
| } | ||
@@ -147,3 +153,6 @@ } | ||
| set(value) { | ||
| this.#crudMap = value; | ||
| this.clear(); | ||
| this.create(value.created instanceof Map ? Array.from(value.created.values()) : Object.values(value.created)); | ||
| this.update(value.updated instanceof Map ? Array.from(value.updated.values()) : Object.values(value.updated)); | ||
| this.delete(value.deleted instanceof Map ? Array.from(value.deleted.values()) : Object.values(value.deleted)); | ||
| } | ||
@@ -172,27 +181,59 @@ create(entity) { | ||
| isCreated(entity) { | ||
| return this.#getEntityId(entity) in this.#crudMap.created; | ||
| return this.#created.has(this.#getEntityId(entity)); | ||
| } | ||
| isUpdated(entity) { | ||
| return this.#getEntityId(entity) in this.#crudMap.updated; | ||
| return this.#updated.has(this.#getEntityId(entity)); | ||
| } | ||
| isDeleted(entity) { | ||
| return this.#getEntityId(entity) in this.#crudMap.deleted; | ||
| return this.#deleted.has(this.#getEntityId(entity)); | ||
| } | ||
| getCreated(entity) { | ||
| return this.#crudMap.created[this.#getEntityId(entity)]; | ||
| return this.#created.get(this.#getEntityId(entity)); | ||
| } | ||
| getUpdated(entity) { | ||
| return this.#crudMap.updated[this.#getEntityId(entity)]; | ||
| return this.#updated.get(this.#getEntityId(entity)); | ||
| } | ||
| getDeleted(entity) { | ||
| return this.#crudMap.deleted[this.#getEntityId(entity)]; | ||
| return this.#deleted.get(this.#getEntityId(entity)); | ||
| } | ||
| clear(type) { | ||
| if (type) { | ||
| this.#crudMap[`${type}d`] = newEntityMap(); | ||
| if (type === 'create') { | ||
| this.#created.clear(); | ||
| } | ||
| else if (type === 'update') { | ||
| this.#updated.clear(); | ||
| } | ||
| else if (type === 'delete') { | ||
| this.#deleted.clear(); | ||
| } | ||
| else { | ||
| this.#crudMap = newCrudMap(); | ||
| this.#created.clear(); | ||
| this.#updated.clear(); | ||
| this.#deleted.clear(); | ||
| } | ||
| } | ||
| #doCrud(crudType, entity) { | ||
| const id = this.#getEntityId(entity); | ||
| if (crudType === 'deleted') { | ||
| this.#created.delete(id); | ||
| this.#updated.delete(id); | ||
| this.#deleted.set(id, entity); | ||
| } | ||
| else if (crudType === 'created') { | ||
| this.#deleted.delete(id); | ||
| this.#created.set(id, entity); | ||
| } | ||
| else if (crudType === 'undelete') { | ||
| this.#deleted.delete(id); | ||
| } | ||
| else if (crudType === 'updated') { | ||
| this.#deleted.delete(id); | ||
| if (this.#created.has(id)) { | ||
| this.#created.set(id, entity); | ||
| } | ||
| else { | ||
| this.#updated.set(id, entity); | ||
| } | ||
| } | ||
| } | ||
| } |
+9
-4
| { | ||
| "name": "@isoftdata/svelte-store-crud", | ||
| "version": "2.3.0", | ||
| "version": "2.4.0", | ||
| "files": [ | ||
@@ -33,2 +33,3 @@ "dist", | ||
| "@sveltejs/vite-plugin-svelte": "^5.0.0", | ||
| "@vitest/browser-playwright": "^4.1.0", | ||
| "eslint": "^9.18.0", | ||
@@ -38,2 +39,3 @@ "eslint-config-prettier": "^10.0.1", | ||
| "globals": "^16.0.0", | ||
| "playwright": "^1.58.2", | ||
| "prettier": "^3.5.3", | ||
@@ -47,3 +49,4 @@ "prettier-plugin-svelte": "^3.3.3", | ||
| "vite": "^6.0.0", | ||
| "vitest": "^3.1.3" | ||
| "vitest": "^4.1.0", | ||
| "vitest-browser-svelte": "^2.0.2" | ||
| }, | ||
@@ -55,3 +58,4 @@ "keywords": [ | ||
| "dependencies": { | ||
| "svelte": "^5.23.2" | ||
| "svelte": "^5.23.2", | ||
| "type-fest": "^5.4.4" | ||
| }, | ||
@@ -65,4 +69,5 @@ "scripts": { | ||
| "lint": "eslint .", | ||
| "test": "vitest" | ||
| "test": "npm run test:unit -- --run && vitest", | ||
| "test:unit": "vitest" | ||
| } | ||
| } |
+12
-0
@@ -76,2 +76,14 @@ # Svelte Store CRUD | ||
| #### get createdEntries(): T[] | ||
| Get a list of all entries in the created map | ||
| #### get updatedEntries(): T[] | ||
| Get a list of all entries in the updated map | ||
| #### get deletedEntries(): T[] | ||
| Get a list of all entries in the deleted map | ||
| #### hasChanges(entity?: EntityOrId<T, K> | Array<EntityOrId<T, K>>): boolean | ||
@@ -78,0 +90,0 @@ |
17831
14.54%303
17.9%162
8%3
50%24
14.29%+ Added
+ Added
+ Added