@nice2dev/erp-adapter 0.1.0 → 1.0.3

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/dist/ErpDataAdapter.d.ts +9 -0
  3. package/dist/ErpDataAdapter.d.ts.map +1 -1
  4. package/dist/ErpFileAdapter.d.ts +20 -0
  5. package/dist/ErpFileAdapter.d.ts.map +1 -1
  6. package/dist/ErpOfflineQueue.d.ts +66 -0
  7. package/dist/ErpOfflineQueue.d.ts.map +1 -0
  8. package/dist/ErpOptimisticStore.d.ts +41 -0
  9. package/dist/ErpOptimisticStore.d.ts.map +1 -0
  10. package/dist/ErpRateLimiter.d.ts +42 -0
  11. package/dist/ErpRateLimiter.d.ts.map +1 -0
  12. package/dist/__tests__/ErpAuthAdapter.test.d.ts +2 -0
  13. package/dist/__tests__/ErpAuthAdapter.test.d.ts.map +1 -0
  14. package/dist/__tests__/ErpDataAdapter.test.d.ts +2 -0
  15. package/dist/__tests__/ErpDataAdapter.test.d.ts.map +1 -0
  16. package/dist/__tests__/ErpExportAdapter.test.d.ts +2 -0
  17. package/dist/__tests__/ErpExportAdapter.test.d.ts.map +1 -0
  18. package/dist/__tests__/ErpFileAdapter.test.d.ts +2 -0
  19. package/dist/__tests__/ErpFileAdapter.test.d.ts.map +1 -0
  20. package/dist/__tests__/ErpOfflineQueue.test.d.ts +2 -0
  21. package/dist/__tests__/ErpOfflineQueue.test.d.ts.map +1 -0
  22. package/dist/__tests__/ErpOptimisticStore.test.d.ts +2 -0
  23. package/dist/__tests__/ErpOptimisticStore.test.d.ts.map +1 -0
  24. package/dist/__tests__/ErpRateLimiter.test.d.ts +2 -0
  25. package/dist/__tests__/ErpRateLimiter.test.d.ts.map +1 -0
  26. package/dist/__tests__/middleware.test.d.ts +2 -0
  27. package/dist/__tests__/middleware.test.d.ts.map +1 -0
  28. package/dist/__tests__/registries.test.d.ts +2 -0
  29. package/dist/__tests__/registries.test.d.ts.map +1 -0
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.ts +15 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.mjs +1249 -113
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/middleware.d.ts +44 -0
  37. package/dist/middleware.d.ts.map +1 -0
  38. package/dist/useCollaborativeDataGrid.d.ts +132 -0
  39. package/dist/useCollaborativeDataGrid.d.ts.map +1 -0
  40. package/dist/useEntityPresence.d.ts +136 -0
  41. package/dist/useEntityPresence.d.ts.map +1 -0
  42. package/dist/useSignalRLiveData.d.ts +121 -0
  43. package/dist/useSignalRLiveData.d.ts.map +1 -0
  44. package/package.json +3 -2
@@ -0,0 +1,44 @@
1
+ /**
2
+ * ErpMiddleware — composable request/response interceptor pipeline.
3
+ *
4
+ * Middleware functions wrap `fetch` calls, enabling logging, retry,
5
+ * header injection, metrics, caching, etc. without modifying adapters.
6
+ *
7
+ * Usage:
8
+ * const pipeline = createMiddlewarePipeline([
9
+ * loggingMiddleware(),
10
+ * retryMiddleware({ maxRetries: 3 }),
11
+ * ]);
12
+ * const adapter = new ErpDataAdapter({ baseUrl: '/api/products', fetch: pipeline(fetch) });
13
+ */
14
+ /** Request context available to middleware. */
15
+ export interface ErpRequestContext {
16
+ url: string;
17
+ init: RequestInit;
18
+ /** Custom metadata bag — middleware can attach/read arbitrary keys. */
19
+ meta: Record<string, unknown>;
20
+ }
21
+ /** A middleware function: receives context + next handler, returns Response. */
22
+ export type ErpMiddleware = (ctx: ErpRequestContext, next: (ctx: ErpRequestContext) => Promise<Response>) => Promise<Response>;
23
+ /**
24
+ * Compose an array of middleware into a single `fetch`-compatible function.
25
+ *
26
+ * Middleware executes in order: first in the array wraps outermost.
27
+ * The innermost call delegates to the real `fetch`.
28
+ */
29
+ export declare function createMiddlewarePipeline(middlewares: ErpMiddleware[]): (baseFetch?: typeof fetch) => typeof fetch;
30
+ /** Logging middleware — logs request/response timing to console. */
31
+ export declare function loggingMiddleware(): ErpMiddleware;
32
+ export interface RetryOptions {
33
+ /** Maximum number of retry attempts (default: 3). */
34
+ maxRetries?: number;
35
+ /** Base delay in ms for exponential backoff (default: 500). */
36
+ baseDelay?: number;
37
+ /** HTTP status codes that trigger retry (default: [408, 429, 500, 502, 503, 504]). */
38
+ retryOn?: number[];
39
+ }
40
+ /** Retry middleware with exponential backoff for transient failures. */
41
+ export declare function retryMiddleware(opts?: RetryOptions): ErpMiddleware;
42
+ /** Header injection middleware — merges extra headers into every request. */
43
+ export declare function headerMiddleware(headers: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>)): ErpMiddleware;
44
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,CACxB,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,QAAQ,CAAC,KAClD,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACpC,WAAW,EAAE,aAAa,EAAE,GAC7B,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,CAwB5C;AAID,oEAAoE;AACpE,wBAAgB,iBAAiB,IAAI,aAAa,CAejD;AAED,MAAM,WAAW,YAAY;IACzB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,aAAa,CAyBlE;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GACnG,aAAa,CAMf"}
@@ -0,0 +1,132 @@
1
+ import { ErpSignalRAdapter, SignalRStatus } from './ErpSignalRAdapter';
2
+ import { UseSignalRLiveDataOptions } from './useSignalRLiveData';
3
+ import { PresenceUser, EntityPresenceInfo, EntityPresenceStatus } from './useEntityPresence';
4
+ /** Cell position in the grid. */
5
+ export interface CellPosition {
6
+ rowKey: unknown;
7
+ field: string;
8
+ }
9
+ /** Range of cells. */
10
+ export interface CellRange {
11
+ startRowKey: unknown;
12
+ endRowKey: unknown;
13
+ startField: string;
14
+ endField: string;
15
+ }
16
+ /** Pending cell edit. */
17
+ export interface PendingEdit<T = unknown> {
18
+ cell: CellPosition;
19
+ originalValue: T;
20
+ newValue: T;
21
+ timestamp: number;
22
+ }
23
+ /** Conflict resolution strategy. */
24
+ export type ConflictStrategy = "last-write-wins" | "first-write-wins" | "merge" | "ask-user" | "reject";
25
+ /** Edit conflict information. */
26
+ export interface EditConflict<T = unknown> {
27
+ cell: CellPosition;
28
+ localValue: T;
29
+ remoteValue: T;
30
+ localUser: PresenceUser;
31
+ remoteUser: PresenceUser;
32
+ localTimestamp: number;
33
+ remoteTimestamp: number;
34
+ }
35
+ /** User cursor/selection in the grid. */
36
+ export interface UserSelection {
37
+ user: PresenceUser;
38
+ selectedCells: CellPosition[];
39
+ selectedRows: unknown[];
40
+ focusedCell: CellPosition | null;
41
+ editingCell: CellPosition | null;
42
+ color: string;
43
+ }
44
+ /** Configuration for useCollaborativeDataGrid hook. */
45
+ export interface UseCollaborativeDataGridOptions<T> {
46
+ /** The SignalR adapter instance. */
47
+ adapter: ErpSignalRAdapter;
48
+ /** Entity type name (e.g., "orders"). */
49
+ entityType: string;
50
+ /** Primary key field name. */
51
+ keyField: keyof T & string;
52
+ /** Current user information. */
53
+ currentUser: PresenceUser;
54
+ /** Initial data array. */
55
+ initialData?: T[];
56
+ /** Conflict resolution strategy. Default: "last-write-wins". */
57
+ conflictStrategy?: ConflictStrategy;
58
+ /** Custom merge function for "merge" strategy. */
59
+ mergeFunction?: (local: T, remote: T, field: string) => T;
60
+ /** Called when a conflict needs user resolution (for "ask-user" strategy). */
61
+ onConflict?: (conflict: EditConflict<any>) => Promise<"local" | "remote" | "merge">;
62
+ /** Called before a cell edit is committed. Return false to cancel. */
63
+ onBeforeCommit?: (cell: CellPosition, oldValue: any, newValue: any) => boolean | Promise<boolean>;
64
+ /** Called after a cell edit is committed. */
65
+ onAfterCommit?: (cell: CellPosition, newValue: any) => void;
66
+ /** Enable cell-level locking. Default: true. */
67
+ enableCellLocking?: boolean;
68
+ /** Lock timeout in ms. Default: 60000 (1 min). */
69
+ lockTimeout?: number;
70
+ /** Enable cursor sharing. Default: true. */
71
+ enableCursorSharing?: boolean;
72
+ /** Cursor update debounce in ms. Default: 50. */
73
+ cursorDebounce?: number;
74
+ /** Enable optimistic updates. Default: true. */
75
+ optimisticUpdates?: boolean;
76
+ /** Flash updated rows. Default: true. */
77
+ flashChanges?: boolean;
78
+ /** Flash duration in ms. Default: 500. */
79
+ flashDuration?: number;
80
+ /** Additional options for SignalR live data. */
81
+ liveDataOptions?: Partial<UseSignalRLiveDataOptions<T>>;
82
+ }
83
+ /** State returned by useCollaborativeDataGrid hook. */
84
+ export interface CollaborativeDataGridState<T> {
85
+ /** Current data array with real-time updates. */
86
+ data: T[];
87
+ /** All user presence information. */
88
+ presence: EntityPresenceInfo[];
89
+ /** Other users' selections and cursors. */
90
+ userSelections: UserSelection[];
91
+ /** Current user's selection. */
92
+ mySelection: UserSelection;
93
+ /** Set of row keys that were recently changed (for flash animation). */
94
+ flashedKeys: Set<unknown>;
95
+ /** Pending local edits. */
96
+ pendingEdits: Map<string, PendingEdit>;
97
+ /** Connection status. */
98
+ connectionStatus: SignalRStatus;
99
+ /** Current user's presence status. */
100
+ myPresenceStatus: EntityPresenceStatus;
101
+ /** Set focused cell. */
102
+ setFocusedCell: (cell: CellPosition | null) => void;
103
+ /** Set selected cells. */
104
+ setSelectedCells: (cells: CellPosition[]) => void;
105
+ /** Set selected rows. */
106
+ setSelectedRows: (rowKeys: unknown[]) => void;
107
+ /** Start editing a cell. Returns false if locked by another user. */
108
+ startCellEdit: (cell: CellPosition) => boolean;
109
+ /** Commit a cell edit. */
110
+ commitCellEdit: (cell: CellPosition, newValue: any) => Promise<boolean>;
111
+ /** Cancel a cell edit. */
112
+ cancelCellEdit: (cell: CellPosition) => void;
113
+ /** Check if a cell is locked by another user. */
114
+ isCellLocked: (cell: CellPosition) => boolean;
115
+ /** Get the user editing a cell (if any). */
116
+ getCellEditor: (cell: CellPosition) => PresenceUser | null;
117
+ /** Get the user's cursor color. */
118
+ getUserColor: (userId: string) => string;
119
+ /** Insert a new row. */
120
+ insertRow: (data: Partial<T>) => Promise<void>;
121
+ /** Update a row. */
122
+ updateRow: (key: unknown, changes: Partial<T>) => Promise<void>;
123
+ /** Delete a row. */
124
+ deleteRow: (key: unknown) => Promise<void>;
125
+ /** Resolve a pending conflict. */
126
+ resolveConflict: (cell: CellPosition, resolution: "local" | "remote" | "merge") => void;
127
+ /** Get current conflicts. */
128
+ conflicts: EditConflict[];
129
+ }
130
+ export declare function useCollaborativeDataGrid<T extends Record<string, any>>(options: UseCollaborativeDataGridOptions<T>): CollaborativeDataGridState<T>;
131
+ export default useCollaborativeDataGrid;
132
+ //# sourceMappingURL=useCollaborativeDataGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCollaborativeDataGrid.d.ts","sourceRoot":"","sources":["../src/useCollaborativeDataGrid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { ErpSignalRAdapter, SignalRStatus } from './ErpSignalRAdapter';
2
+ /** User presence status for entity tracking. */
3
+ export type EntityPresenceStatus = "viewing" | "editing" | "idle" | "away";
4
+ /** User information for presence display. */
5
+ export interface PresenceUser {
6
+ /** User ID. */
7
+ id: string;
8
+ /** Display name. */
9
+ name: string;
10
+ /** Avatar URL (optional). */
11
+ avatarUrl?: string;
12
+ /** User's email (optional). */
13
+ email?: string;
14
+ /** Custom color for cursor/indicator. */
15
+ color?: string;
16
+ }
17
+ /** Presence data for a single user on an entity. */
18
+ export interface EntityPresenceInfo {
19
+ /** The user. */
20
+ user: PresenceUser;
21
+ /** Current presence status. */
22
+ status: EntityPresenceStatus;
23
+ /** When they joined this entity view. */
24
+ joinedAt: string;
25
+ /** Last activity timestamp. */
26
+ lastActivityAt: string;
27
+ /** Field being edited (if editing). */
28
+ editingField?: string;
29
+ /** Cursor position (for text fields). */
30
+ cursorPosition?: {
31
+ start: number;
32
+ end: number;
33
+ };
34
+ /** Selection range (for grids). */
35
+ selectedRange?: {
36
+ startRow: number;
37
+ endRow: number;
38
+ startCol: number;
39
+ endCol: number;
40
+ };
41
+ }
42
+ /** Configuration for useEntityPresence hook. */
43
+ export interface UseEntityPresenceOptions {
44
+ /** The SignalR adapter instance. */
45
+ adapter: ErpSignalRAdapter;
46
+ /** Entity type name (e.g., "orders", "employees"). */
47
+ entityType: string;
48
+ /** Entity ID being viewed/edited. Can be array for bulk selection. */
49
+ entityId: string | string[];
50
+ /** Current user information. */
51
+ currentUser: PresenceUser;
52
+ /** Initial presence status. Default: "viewing". */
53
+ initialStatus?: EntityPresenceStatus;
54
+ /** Heartbeat interval in ms. Default: 30000. */
55
+ heartbeatInterval?: number;
56
+ /** Idle timeout in ms. Default: 60000 (1 min). */
57
+ idleTimeout?: number;
58
+ /** Away timeout in ms. Default: 300000 (5 min). */
59
+ awayTimeout?: number;
60
+ /** Hub method for joining. Default: "JoinEntityView". */
61
+ joinMethod?: string;
62
+ /** Hub method for leaving. Default: "LeaveEntityView". */
63
+ leaveMethod?: string;
64
+ /** Hub method for status update. Default: "UpdateEntityPresence". */
65
+ updateMethod?: string;
66
+ /** Hub event for presence changes. Default: "EntityPresenceChanged". */
67
+ presenceEventName?: string;
68
+ /** Hub event for user joined. Default: "EntityUserJoined". */
69
+ joinedEventName?: string;
70
+ /** Hub event for user left. Default: "EntityUserLeft". */
71
+ leftEventName?: string;
72
+ /** Called when presence list changes. */
73
+ onPresenceChange?: (presence: EntityPresenceInfo[]) => void;
74
+ /** Called when a conflict is detected. */
75
+ onEditConflict?: (editor: PresenceUser, field?: string) => void;
76
+ }
77
+ /** State returned by useEntityPresence hook. */
78
+ export interface EntityPresenceState {
79
+ /** All users currently present on this entity. */
80
+ presence: EntityPresenceInfo[];
81
+ /** Users only viewing (not editing). */
82
+ viewers: PresenceUser[];
83
+ /** Users currently editing. */
84
+ editors: PresenceUser[];
85
+ /** Current user's status. */
86
+ myStatus: EntityPresenceStatus;
87
+ /** Set current user's status. */
88
+ setMyStatus: (status: EntityPresenceStatus, editingField?: string) => void;
89
+ /** Start editing a field. */
90
+ startEditing: (field: string) => void;
91
+ /** Stop editing. */
92
+ stopEditing: () => void;
93
+ /** Update cursor/selection position. */
94
+ updateSelection: (selection: EntityPresenceInfo["selectedRange"] | EntityPresenceInfo["cursorPosition"]) => void;
95
+ /** SignalR connection status. */
96
+ connectionStatus: SignalRStatus;
97
+ /** Check if another user is editing a specific field. */
98
+ isFieldLocked: (field: string) => PresenceUser | null;
99
+ /** Check if there are any active editors (conflict potential). */
100
+ hasActiveEditors: boolean;
101
+ /** Get the user editing a field (if any). */
102
+ getFieldEditor: (field: string) => PresenceUser | null;
103
+ /** Force refresh presence list. */
104
+ refresh: () => Promise<void>;
105
+ }
106
+ export declare function useEntityPresence(options: UseEntityPresenceOptions): EntityPresenceState;
107
+ /** Generate a consistent color for a user (based on ID hash). */
108
+ export declare function generateUserColor(userId: string): string;
109
+ /** Format presence status for display. */
110
+ export declare function formatPresenceStatus(status: EntityPresenceStatus): string;
111
+ export interface MultiEntityPresenceOptions {
112
+ /** The SignalR adapter instance. */
113
+ adapter: ErpSignalRAdapter;
114
+ /** Entity type name. */
115
+ entityType: string;
116
+ /** Current user information. */
117
+ currentUser: PresenceUser;
118
+ /** Hub event name for batch presence updates. Default: "BatchPresenceUpdate". */
119
+ batchEventName?: string;
120
+ }
121
+ export interface MultiEntityPresenceState {
122
+ /** Map of entity ID to presence info array. */
123
+ presenceByEntity: Map<string, EntityPresenceInfo[]>;
124
+ /** Get presence for a specific entity. */
125
+ getPresence: (entityId: string) => EntityPresenceInfo[];
126
+ /** Check if any user is editing an entity. */
127
+ isEntityBeingEdited: (entityId: string) => boolean;
128
+ /** Get editors for an entity. */
129
+ getEntityEditors: (entityId: string) => PresenceUser[];
130
+ }
131
+ /**
132
+ * Hook for tracking presence across multiple entities at once.
133
+ * Useful for DataGrid row-level presence indicators.
134
+ */
135
+ export declare function useMultiEntityPresence(options: MultiEntityPresenceOptions): MultiEntityPresenceState;
136
+ //# sourceMappingURL=useEntityPresence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEntityPresence.d.ts","sourceRoot":"","sources":["../src/useEntityPresence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { ErpSignalRAdapter, SignalRStatus } from './ErpSignalRAdapter';
2
+ /** Type of real-time data operation. */
3
+ export type LiveDataOperation = "insert" | "update" | "delete";
4
+ /** A single real-time data change event. */
5
+ export interface LiveDataChange<T = unknown> {
6
+ /** Operation type: insert, update, or delete. */
7
+ operation: LiveDataOperation;
8
+ /** Entity type name (e.g., "employees", "orders"). */
9
+ entityName: string;
10
+ /** Primary key of the affected row. */
11
+ key: unknown;
12
+ /** Full data for insert/update; undefined for delete. */
13
+ data?: T;
14
+ /** Partial changes for update (fields that changed). */
15
+ changes?: Partial<T>;
16
+ /** Server timestamp of the change. */
17
+ timestamp?: string;
18
+ /** User ID who made the change. */
19
+ changedBy?: string;
20
+ }
21
+ /** Configuration for useSignalRLiveData hook. */
22
+ export interface UseSignalRLiveDataOptions<T> {
23
+ /** The SignalR adapter instance. */
24
+ adapter: ErpSignalRAdapter;
25
+ /** Entity name to subscribe to (e.g., "employees"). */
26
+ entityName: string;
27
+ /** Primary key field name. */
28
+ keyField: keyof T & string;
29
+ /** Initial data array. */
30
+ initialData?: T[];
31
+ /** Called when a remote change is received. Return false to reject the update. */
32
+ onBeforeChange?: (change: LiveDataChange<T>) => boolean | Promise<boolean>;
33
+ /** Called after a change has been applied locally. */
34
+ onAfterChange?: (change: LiveDataChange<T>, data: T[]) => void;
35
+ /** Called when there's a conflict (local pending edit vs remote update). */
36
+ onConflict?: (local: T, remote: T, change: LiveDataChange<T>) => T | "local" | "remote" | "merge";
37
+ /** Hub method name for subscribing. Default: "SubscribeToEntity". */
38
+ subscribeMethod?: string;
39
+ /** Hub method name for unsubscribing. Default: "UnsubscribeFromEntity". */
40
+ unsubscribeMethod?: string;
41
+ /** Hub event name for data changes. Default: "EntityChanged". */
42
+ changeEventName?: string;
43
+ /** Enable flash animation for changed rows. */
44
+ flashChanges?: boolean;
45
+ /** Duration of flash animation in ms. Default: 500. */
46
+ flashDuration?: number;
47
+ /** Enable optimistic UI updates. Default: true. */
48
+ optimisticUpdates?: boolean;
49
+ }
50
+ /** State returned by useSignalRLiveData hook. */
51
+ export interface SignalRLiveDataState<T> {
52
+ /** Current data array with real-time updates applied. */
53
+ data: T[];
54
+ /** SignalR connection status. */
55
+ status: SignalRStatus;
56
+ /** Set of row keys that were recently changed (for flash animation). */
57
+ flashedKeys: Set<unknown>;
58
+ /** Set of row keys with pending local changes. */
59
+ pendingKeys: Set<unknown>;
60
+ /** Last error if any. */
61
+ error: Error | null;
62
+ /** Manually apply a remote update (for testing or custom handling). */
63
+ applyRemoteUpdate: (change: LiveDataChange<T>) => void;
64
+ /** Register a local pending change (for optimistic UI). */
65
+ registerPendingChange: (key: unknown, change: Partial<T>) => void;
66
+ /** Confirm a pending change was saved server-side. */
67
+ confirmPendingChange: (key: unknown) => void;
68
+ /** Rollback a pending change (server rejected). */
69
+ rollbackPendingChange: (key: unknown) => void;
70
+ /** Force re-subscribe to the entity. */
71
+ resubscribe: () => Promise<void>;
72
+ }
73
+ export declare function useSignalRLiveData<T extends Record<string, any>>(options: UseSignalRLiveDataOptions<T>): SignalRLiveDataState<T>;
74
+ export interface SignalRDataSourceConfig<T> {
75
+ /** The SignalR adapter instance. */
76
+ adapter: ErpSignalRAdapter;
77
+ /** Entity name for subscriptions. */
78
+ entityName: string;
79
+ /** Primary key field. */
80
+ keyField: keyof T & string;
81
+ /** Hub method name to fetch initial data. Default: "GetEntities". */
82
+ fetchMethod?: string;
83
+ /** Hub method name to insert. Default: "InsertEntity". */
84
+ insertMethod?: string;
85
+ /** Hub method name to update. Default: "UpdateEntity". */
86
+ updateMethod?: string;
87
+ /** Hub method name to delete. Default: "DeleteEntity". */
88
+ deleteMethod?: string;
89
+ }
90
+ /**
91
+ * Create callbacks for CRUD operations via SignalR.
92
+ * Use with useSignalRLiveData for a complete real-time data solution.
93
+ */
94
+ export declare function createSignalRDataOperations<T extends Record<string, any>>(config: SignalRDataSourceConfig<T>): {
95
+ /** Fetch all entities from the hub. */
96
+ fetchAll(options?: {
97
+ skip?: number;
98
+ take?: number;
99
+ filter?: unknown;
100
+ }): Promise<T[]>;
101
+ /** Insert a new entity via the hub. */
102
+ insert(data: Partial<T>): Promise<T>;
103
+ /** Update an existing entity via the hub. */
104
+ update(key: unknown, changes: Partial<T>): Promise<T>;
105
+ /** Delete an entity via the hub. */
106
+ remove(key: unknown): Promise<void>;
107
+ /** Get the key field name. */
108
+ getKeyField(): keyof T & string;
109
+ };
110
+ export interface BatchChange<T> {
111
+ operation: LiveDataOperation;
112
+ key: unknown;
113
+ data?: T;
114
+ changes?: Partial<T>;
115
+ }
116
+ /**
117
+ * Apply multiple changes to a data array efficiently.
118
+ * Useful for initial sync or batch operations.
119
+ */
120
+ export declare function applyBatchChanges<T extends Record<string, any>>(data: T[], changes: BatchChange<T>[], keyField: keyof T & string): T[];
121
+ //# sourceMappingURL=useSignalRLiveData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSignalRLiveData.d.ts","sourceRoot":"","sources":["../src/useSignalRLiveData.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nice2dev/erp-adapter",
3
- "version": "0.1.0",
3
+ "version": "1.0.3",
4
4
  "description": "Adapter layer connecting OmniVerk .NET backend with @nice2dev/* React components",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -50,6 +50,7 @@
50
50
  "react-dom": "^18.2.0",
51
51
  "typescript": "^5.3.3",
52
52
  "vite": "^6.2.0",
53
- "vite-plugin-dts": "^4.5.0"
53
+ "vite-plugin-dts": "^4.5.0",
54
+ "vitest": "^4.1.0"
54
55
  }
55
56
  }