🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@isoftdata/svelte-store-crud

Package Overview
Dependencies
Maintainers
11
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@isoftdata/svelte-store-crud - npm Package Compare versions

Comparing version
2.3.0
to
2.4.0
+6
-1
dist/store.svelte.d.ts

@@ -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);
}
}
}
}
{
"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"
}
}

@@ -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 @@