@contember/bindx 0.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/adapter/ContemberAdapter.d.ts +40 -0
- package/dist/adapter/ContemberAdapter.d.ts.map +1 -0
- package/dist/adapter/MockAdapter.d.ts +81 -0
- package/dist/adapter/MockAdapter.d.ts.map +1 -0
- package/dist/adapter/MockQueryEngine.d.ts +43 -0
- package/dist/adapter/MockQueryEngine.d.ts.map +1 -0
- package/dist/adapter/index.d.ts +5 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/types.d.ts +184 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/brand/ComponentBrand.d.ts +25 -0
- package/dist/brand/ComponentBrand.d.ts.map +1 -0
- package/dist/contember/index.d.ts +10 -0
- package/dist/contember/index.d.ts.map +1 -0
- package/dist/core/ActionDispatcher.d.ts +64 -0
- package/dist/core/ActionDispatcher.d.ts.map +1 -0
- package/dist/core/Disposable.d.ts +57 -0
- package/dist/core/Disposable.d.ts.map +1 -0
- package/dist/core/EntityLoader.d.ts +80 -0
- package/dist/core/EntityLoader.d.ts.map +1 -0
- package/dist/core/PersistenceManager.d.ts +126 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/SelectionResolver.d.ts +21 -0
- package/dist/core/SelectionResolver.d.ts.map +1 -0
- package/dist/core/actionClassification.d.ts +48 -0
- package/dist/core/actionClassification.d.ts.map +1 -0
- package/dist/core/actions.d.ts +301 -0
- package/dist/core/actions.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/dataview/filterHandlers.d.ts +18 -0
- package/dist/dataview/filterHandlers.d.ts.map +1 -0
- package/dist/dataview/index.d.ts +3 -0
- package/dist/dataview/index.d.ts.map +1 -0
- package/dist/dataview/types.d.ts +164 -0
- package/dist/dataview/types.d.ts.map +1 -0
- package/dist/errors/UnfetchedFieldError.d.ts +11 -0
- package/dist/errors/UnfetchedFieldError.d.ts.map +1 -0
- package/dist/errors/errorPathResolver.d.ts +52 -0
- package/dist/errors/errorPathResolver.d.ts.map +1 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/pathMapper.d.ts +42 -0
- package/dist/errors/pathMapper.d.ts.map +1 -0
- package/dist/errors/types.d.ts +131 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/events/EventEmitter.d.ts +97 -0
- package/dist/events/EventEmitter.d.ts.map +1 -0
- package/dist/events/eventFactory.d.ts +40 -0
- package/dist/events/eventFactory.d.ts.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/types.d.ts +264 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/handles/BaseHandle.d.ts +64 -0
- package/dist/handles/BaseHandle.d.ts.map +1 -0
- package/dist/handles/EntityHandle.d.ts +208 -0
- package/dist/handles/EntityHandle.d.ts.map +1 -0
- package/dist/handles/FieldHandle.d.ts +111 -0
- package/dist/handles/FieldHandle.d.ts.map +1 -0
- package/dist/handles/HasManyListHandle.d.ts +166 -0
- package/dist/handles/HasManyListHandle.d.ts.map +1 -0
- package/dist/handles/HasOneHandle.d.ts +168 -0
- package/dist/handles/HasOneHandle.d.ts.map +1 -0
- package/dist/handles/PlaceholderHandle.d.ts +117 -0
- package/dist/handles/PlaceholderHandle.d.ts.map +1 -0
- package/dist/handles/index.d.ts +8 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/proxyFactory.d.ts +66 -0
- package/dist/handles/proxyFactory.d.ts.map +1 -0
- package/dist/handles/types.d.ts +430 -0
- package/dist/handles/types.d.ts.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/internal.d.ts +11 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/persistence/BatchPersister.d.ts +142 -0
- package/dist/persistence/BatchPersister.d.ts.map +1 -0
- package/dist/persistence/ChangeRegistry.d.ts +87 -0
- package/dist/persistence/ChangeRegistry.d.ts.map +1 -0
- package/dist/persistence/ContemberSchemaMutationAdapter.d.ts +16 -0
- package/dist/persistence/ContemberSchemaMutationAdapter.d.ts.map +1 -0
- package/dist/persistence/MutationCollector.d.ts +96 -0
- package/dist/persistence/MutationCollector.d.ts.map +1 -0
- package/dist/persistence/MutationSchemaProvider.d.ts +30 -0
- package/dist/persistence/MutationSchemaProvider.d.ts.map +1 -0
- package/dist/persistence/index.d.ts +7 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/types.d.ts +189 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/roles/RoleSchemaRegistry.d.ts +77 -0
- package/dist/roles/RoleSchemaRegistry.d.ts.map +1 -0
- package/dist/roles/index.d.ts +11 -0
- package/dist/roles/index.d.ts.map +1 -0
- package/dist/roles/types.d.ts +242 -0
- package/dist/roles/types.d.ts.map +1 -0
- package/dist/schema/ContemberSchema.d.ts +98 -0
- package/dist/schema/ContemberSchema.d.ts.map +1 -0
- package/dist/schema/SchemaLoader.d.ts +28 -0
- package/dist/schema/SchemaLoader.d.ts.map +1 -0
- package/dist/schema/SchemaRegistry.d.ts +95 -0
- package/dist/schema/SchemaRegistry.d.ts.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/roles.d.ts +62 -0
- package/dist/schema/roles.d.ts.map +1 -0
- package/dist/schema/types.d.ts +179 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/selection/SelectionMetaCollector.d.ts +32 -0
- package/dist/selection/SelectionMetaCollector.d.ts.map +1 -0
- package/dist/selection/SelectionScope.d.ts +77 -0
- package/dist/selection/SelectionScope.d.ts.map +1 -0
- package/dist/selection/buildQuery.d.ts +45 -0
- package/dist/selection/buildQuery.d.ts.map +1 -0
- package/dist/selection/createFragment.d.ts +29 -0
- package/dist/selection/createFragment.d.ts.map +1 -0
- package/dist/selection/createSelectionBuilder.d.ts +18 -0
- package/dist/selection/createSelectionBuilder.d.ts.map +1 -0
- package/dist/selection/index.d.ts +8 -0
- package/dist/selection/index.d.ts.map +1 -0
- package/dist/selection/queryTypes.d.ts +84 -0
- package/dist/selection/queryTypes.d.ts.map +1 -0
- package/dist/selection/types.d.ts +238 -0
- package/dist/selection/types.d.ts.map +1 -0
- package/dist/store/DirtyTracker.d.ts +26 -0
- package/dist/store/DirtyTracker.d.ts.map +1 -0
- package/dist/store/EntityMetaStore.d.ts +52 -0
- package/dist/store/EntityMetaStore.d.ts.map +1 -0
- package/dist/store/EntitySnapshotStore.d.ts +63 -0
- package/dist/store/EntitySnapshotStore.d.ts.map +1 -0
- package/dist/store/ErrorStore.d.ts +82 -0
- package/dist/store/ErrorStore.d.ts.map +1 -0
- package/dist/store/RelationStore.d.ts +175 -0
- package/dist/store/RelationStore.d.ts.map +1 -0
- package/dist/store/SnapshotStore.d.ts +143 -0
- package/dist/store/SnapshotStore.d.ts.map +1 -0
- package/dist/store/SubscriptionManager.d.ts +90 -0
- package/dist/store/SubscriptionManager.d.ts.map +1 -0
- package/dist/store/TouchedStore.d.ts +24 -0
- package/dist/store/TouchedStore.d.ts.map +1 -0
- package/dist/store/entityId.d.ts +29 -0
- package/dist/store/entityId.d.ts.map +1 -0
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/snapshots.d.ts +144 -0
- package/dist/store/snapshots.d.ts.map +1 -0
- package/dist/undo/UndoManager.d.ts +120 -0
- package/dist/undo/UndoManager.d.ts.map +1 -0
- package/dist/undo/index.d.ts +3 -0
- package/dist/undo/index.d.ts.map +1 -0
- package/dist/undo/types.d.ts +74 -0
- package/dist/undo/types.d.ts.map +1 -0
- package/dist/utils/aliasGenerator.d.ts +25 -0
- package/dist/utils/aliasGenerator.d.ts.map +1 -0
- package/dist/utils/deepEqual.d.ts +6 -0
- package/dist/utils/deepEqual.d.ts.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/package.json +29 -0
- package/src/adapter/ContemberAdapter.ts +239 -0
- package/src/adapter/MockAdapter.ts +394 -0
- package/src/adapter/MockQueryEngine.ts +236 -0
- package/src/adapter/index.ts +21 -0
- package/src/adapter/types.ts +199 -0
- package/src/brand/ComponentBrand.ts +28 -0
- package/src/contember/index.ts +17 -0
- package/src/core/ActionDispatcher.ts +450 -0
- package/src/core/Disposable.ts +126 -0
- package/src/core/EntityLoader.ts +169 -0
- package/src/core/SelectionResolver.ts +78 -0
- package/src/core/actionClassification.ts +196 -0
- package/src/core/actions.ts +491 -0
- package/src/core/index.ts +20 -0
- package/src/dataview/filterHandlers.ts +443 -0
- package/src/dataview/index.ts +36 -0
- package/src/dataview/types.ts +220 -0
- package/src/errors/UnfetchedFieldError.ts +18 -0
- package/src/errors/errorPathResolver.ts +239 -0
- package/src/errors/index.ts +40 -0
- package/src/errors/pathMapper.ts +40 -0
- package/src/errors/types.ts +223 -0
- package/src/events/EventEmitter.ts +447 -0
- package/src/events/eventFactory.ts +430 -0
- package/src/events/index.ts +89 -0
- package/src/events/types.ts +374 -0
- package/src/handles/BaseHandle.ts +100 -0
- package/src/handles/EntityHandle.ts +538 -0
- package/src/handles/FieldHandle.ts +268 -0
- package/src/handles/HasManyListHandle.ts +500 -0
- package/src/handles/HasOneHandle.ts +500 -0
- package/src/handles/PlaceholderHandle.ts +321 -0
- package/src/handles/index.ts +37 -0
- package/src/handles/proxyFactory.ts +218 -0
- package/src/handles/types.ts +743 -0
- package/src/index.ts +384 -0
- package/src/internal.ts +19 -0
- package/src/persistence/BatchPersister.ts +911 -0
- package/src/persistence/ChangeRegistry.ts +150 -0
- package/src/persistence/ContemberSchemaMutationAdapter.ts +57 -0
- package/src/persistence/MutationCollector.ts +567 -0
- package/src/persistence/MutationSchemaProvider.ts +33 -0
- package/src/persistence/index.ts +23 -0
- package/src/persistence/types.ts +220 -0
- package/src/schema/ContemberSchema.ts +132 -0
- package/src/schema/SchemaLoader.ts +93 -0
- package/src/schema/SchemaRegistry.ts +286 -0
- package/src/schema/index.ts +51 -0
- package/src/schema/roles.ts +83 -0
- package/src/schema/types.ts +238 -0
- package/src/selection/SelectionMetaCollector.ts +122 -0
- package/src/selection/SelectionScope.ts +208 -0
- package/src/selection/buildQuery.ts +134 -0
- package/src/selection/createFragment.ts +50 -0
- package/src/selection/createSelectionBuilder.ts +283 -0
- package/src/selection/index.ts +31 -0
- package/src/selection/queryTypes.ts +135 -0
- package/src/selection/types.ts +320 -0
- package/src/store/DirtyTracker.ts +117 -0
- package/src/store/EntityMetaStore.ts +143 -0
- package/src/store/EntitySnapshotStore.ts +260 -0
- package/src/store/ErrorStore.ts +251 -0
- package/src/store/RelationStore.ts +696 -0
- package/src/store/SnapshotStore.ts +765 -0
- package/src/store/SubscriptionManager.ts +241 -0
- package/src/store/TouchedStore.ts +42 -0
- package/src/store/entityId.ts +43 -0
- package/src/store/index.ts +2 -0
- package/src/store/snapshots.ts +203 -0
- package/src/undo/UndoManager.ts +418 -0
- package/src/undo/index.ts +9 -0
- package/src/undo/types.ts +84 -0
- package/src/utils/aliasGenerator.ts +56 -0
- package/src/utils/deepEqual.ts +33 -0
- package/src/utils/index.ts +2 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe event system for bindx.
|
|
3
|
+
*
|
|
4
|
+
* Events are categorized into:
|
|
5
|
+
* - Before events (interceptable): Can be cancelled or modified
|
|
6
|
+
* - After events (notifications): Fired after state changes
|
|
7
|
+
*/
|
|
8
|
+
import type { FieldError } from '../errors/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Base interface for all bindx events.
|
|
11
|
+
*/
|
|
12
|
+
export interface BindxEvent<TType extends string = string> {
|
|
13
|
+
readonly type: TType;
|
|
14
|
+
readonly timestamp: number;
|
|
15
|
+
readonly entityType: string;
|
|
16
|
+
readonly entityId: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Base interface for field-scoped events.
|
|
20
|
+
*/
|
|
21
|
+
export interface FieldScopedEvent<TType extends string> extends BindxEvent<TType> {
|
|
22
|
+
readonly fieldName: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fired before a field value changes. Can be intercepted to cancel or modify.
|
|
26
|
+
*/
|
|
27
|
+
export interface FieldChangingEvent extends FieldScopedEvent<'field:changing'> {
|
|
28
|
+
readonly fieldPath: readonly string[];
|
|
29
|
+
readonly oldValue: unknown;
|
|
30
|
+
readonly newValue: unknown;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fired after a field value has changed.
|
|
34
|
+
*/
|
|
35
|
+
export interface FieldChangedEvent extends FieldScopedEvent<'field:changed'> {
|
|
36
|
+
readonly fieldPath: readonly string[];
|
|
37
|
+
readonly oldValue: unknown;
|
|
38
|
+
readonly newValue: unknown;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Fired before a has-one relation is connected.
|
|
42
|
+
*/
|
|
43
|
+
export interface RelationConnectingEvent extends FieldScopedEvent<'relation:connecting'> {
|
|
44
|
+
readonly targetId: string;
|
|
45
|
+
readonly previousId: string | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Fired after a has-one relation has been connected.
|
|
49
|
+
*/
|
|
50
|
+
export interface RelationConnectedEvent extends FieldScopedEvent<'relation:connected'> {
|
|
51
|
+
readonly targetId: string;
|
|
52
|
+
readonly previousId: string | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Fired before a has-one relation is disconnected.
|
|
56
|
+
*/
|
|
57
|
+
export interface RelationDisconnectingEvent extends FieldScopedEvent<'relation:disconnecting'> {
|
|
58
|
+
readonly currentId: string | null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fired after a has-one relation has been disconnected.
|
|
62
|
+
*/
|
|
63
|
+
export interface RelationDisconnectedEvent extends FieldScopedEvent<'relation:disconnected'> {
|
|
64
|
+
readonly previousId: string | null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Fired before a has-one relation is deleted.
|
|
68
|
+
*/
|
|
69
|
+
export interface RelationDeletingEvent extends FieldScopedEvent<'relation:deleting'> {
|
|
70
|
+
readonly currentId: string | null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Fired after a has-one relation has been deleted.
|
|
74
|
+
*/
|
|
75
|
+
export interface RelationDeletedEvent extends FieldScopedEvent<'relation:deleted'> {
|
|
76
|
+
readonly previousId: string | null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Fired before an item is connected to a has-many relation.
|
|
80
|
+
*/
|
|
81
|
+
export interface HasManyConnectingEvent extends FieldScopedEvent<'hasMany:connecting'> {
|
|
82
|
+
readonly itemId: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Fired after an item has been connected to a has-many relation.
|
|
86
|
+
*/
|
|
87
|
+
export interface HasManyConnectedEvent extends FieldScopedEvent<'hasMany:connected'> {
|
|
88
|
+
readonly itemId: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Fired before an item is disconnected from a has-many relation.
|
|
92
|
+
*/
|
|
93
|
+
export interface HasManyDisconnectingEvent extends FieldScopedEvent<'hasMany:disconnecting'> {
|
|
94
|
+
readonly itemId: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Fired after an item has been disconnected from a has-many relation.
|
|
98
|
+
*/
|
|
99
|
+
export interface HasManyDisconnectedEvent extends FieldScopedEvent<'hasMany:disconnected'> {
|
|
100
|
+
readonly itemId: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Fired before an entity is persisted (create or update).
|
|
104
|
+
*/
|
|
105
|
+
export interface EntityPersistingEvent extends BindxEvent<'entity:persisting'> {
|
|
106
|
+
readonly isNew: boolean;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Fired after an entity has been successfully persisted.
|
|
110
|
+
*/
|
|
111
|
+
export interface EntityPersistedEvent extends BindxEvent<'entity:persisted'> {
|
|
112
|
+
readonly isNew: boolean;
|
|
113
|
+
readonly persistedId: string;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Fired when entity persistence fails.
|
|
117
|
+
*/
|
|
118
|
+
export interface EntityPersistFailedEvent extends BindxEvent<'entity:persistFailed'> {
|
|
119
|
+
readonly isNew: boolean;
|
|
120
|
+
readonly error: Error;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Fired before an entity is reset to server state.
|
|
124
|
+
*/
|
|
125
|
+
export interface EntityResettingEvent extends BindxEvent<'entity:resetting'> {
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Fired after an entity has been reset to server state.
|
|
129
|
+
*/
|
|
130
|
+
export interface EntityResetEvent extends BindxEvent<'entity:reset'> {
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Fired before an entity is deleted.
|
|
134
|
+
*/
|
|
135
|
+
export interface EntityDeletingEvent extends BindxEvent<'entity:deleting'> {
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Fired after an entity has been deleted.
|
|
139
|
+
*/
|
|
140
|
+
export interface EntityDeletedEvent extends BindxEvent<'entity:deleted'> {
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Fired when an error is added to a field, entity, or relation.
|
|
144
|
+
*/
|
|
145
|
+
export interface ErrorAddedEvent extends BindxEvent<'error:added'> {
|
|
146
|
+
readonly target: 'entity' | 'field' | 'relation';
|
|
147
|
+
readonly targetName: string | null;
|
|
148
|
+
readonly error: FieldError;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Fired when errors are cleared.
|
|
152
|
+
*/
|
|
153
|
+
export interface ErrorsClearedEvent extends BindxEvent<'errors:cleared'> {
|
|
154
|
+
readonly target: 'entity' | 'field' | 'relation' | 'all';
|
|
155
|
+
readonly targetName: string | null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fired when entity load state changes.
|
|
159
|
+
*/
|
|
160
|
+
export interface LoadStateChangedEvent extends BindxEvent<'load:stateChanged'> {
|
|
161
|
+
readonly previousStatus: string | undefined;
|
|
162
|
+
readonly newStatus: string;
|
|
163
|
+
readonly error?: FieldError;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* All "before" events that can be intercepted and cancelled.
|
|
167
|
+
*/
|
|
168
|
+
export type BeforeEvent = FieldChangingEvent | RelationConnectingEvent | RelationDisconnectingEvent | RelationDeletingEvent | HasManyConnectingEvent | HasManyDisconnectingEvent | EntityPersistingEvent | EntityResettingEvent | EntityDeletingEvent;
|
|
169
|
+
/**
|
|
170
|
+
* All "after" events (notifications).
|
|
171
|
+
*/
|
|
172
|
+
export type AfterEvent = FieldChangedEvent | RelationConnectedEvent | RelationDisconnectedEvent | RelationDeletedEvent | HasManyConnectedEvent | HasManyDisconnectedEvent | EntityPersistedEvent | EntityPersistFailedEvent | EntityResetEvent | EntityDeletedEvent | ErrorAddedEvent | ErrorsClearedEvent | LoadStateChangedEvent;
|
|
173
|
+
/**
|
|
174
|
+
* All bindx events.
|
|
175
|
+
*/
|
|
176
|
+
export type AnyBindxEvent = BeforeEvent | AfterEvent;
|
|
177
|
+
/**
|
|
178
|
+
* All before event type strings.
|
|
179
|
+
*/
|
|
180
|
+
export type BeforeEventType = BeforeEvent['type'];
|
|
181
|
+
/**
|
|
182
|
+
* All after event type strings.
|
|
183
|
+
*/
|
|
184
|
+
export type AfterEventType = AfterEvent['type'];
|
|
185
|
+
/**
|
|
186
|
+
* All event type strings.
|
|
187
|
+
*/
|
|
188
|
+
export type AnyEventType = AnyBindxEvent['type'];
|
|
189
|
+
/**
|
|
190
|
+
* Map of event types to their event objects.
|
|
191
|
+
* Enables type-safe subscriptions.
|
|
192
|
+
*/
|
|
193
|
+
export interface EventTypeMap {
|
|
194
|
+
'field:changing': FieldChangingEvent;
|
|
195
|
+
'field:changed': FieldChangedEvent;
|
|
196
|
+
'relation:connecting': RelationConnectingEvent;
|
|
197
|
+
'relation:connected': RelationConnectedEvent;
|
|
198
|
+
'relation:disconnecting': RelationDisconnectingEvent;
|
|
199
|
+
'relation:disconnected': RelationDisconnectedEvent;
|
|
200
|
+
'relation:deleting': RelationDeletingEvent;
|
|
201
|
+
'relation:deleted': RelationDeletedEvent;
|
|
202
|
+
'hasMany:connecting': HasManyConnectingEvent;
|
|
203
|
+
'hasMany:connected': HasManyConnectedEvent;
|
|
204
|
+
'hasMany:disconnecting': HasManyDisconnectingEvent;
|
|
205
|
+
'hasMany:disconnected': HasManyDisconnectedEvent;
|
|
206
|
+
'entity:persisting': EntityPersistingEvent;
|
|
207
|
+
'entity:persisted': EntityPersistedEvent;
|
|
208
|
+
'entity:persistFailed': EntityPersistFailedEvent;
|
|
209
|
+
'entity:resetting': EntityResettingEvent;
|
|
210
|
+
'entity:reset': EntityResetEvent;
|
|
211
|
+
'entity:deleting': EntityDeletingEvent;
|
|
212
|
+
'entity:deleted': EntityDeletedEvent;
|
|
213
|
+
'error:added': ErrorAddedEvent;
|
|
214
|
+
'errors:cleared': ErrorsClearedEvent;
|
|
215
|
+
'load:stateChanged': LoadStateChangedEvent;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Extract event type from event name.
|
|
219
|
+
*/
|
|
220
|
+
export type EventByType<T extends keyof EventTypeMap> = EventTypeMap[T];
|
|
221
|
+
/**
|
|
222
|
+
* Result of an interceptor execution.
|
|
223
|
+
*/
|
|
224
|
+
export type InterceptorResult<T extends BeforeEvent = BeforeEvent> = {
|
|
225
|
+
readonly action: 'cancel';
|
|
226
|
+
} | {
|
|
227
|
+
readonly action: 'continue';
|
|
228
|
+
} | {
|
|
229
|
+
readonly action: 'modify';
|
|
230
|
+
readonly event: T;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* Interceptor function type.
|
|
234
|
+
* Can be sync or async.
|
|
235
|
+
* Return undefined/void to continue without changes.
|
|
236
|
+
*/
|
|
237
|
+
export type Interceptor<T extends BeforeEvent> = (event: T) => InterceptorResult<T> | Promise<InterceptorResult<T>> | void | Promise<void>;
|
|
238
|
+
/**
|
|
239
|
+
* Event listener function type.
|
|
240
|
+
*/
|
|
241
|
+
export type EventListener<T extends AfterEvent> = (event: T) => void;
|
|
242
|
+
/**
|
|
243
|
+
* Unsubscribe function returned by subscription methods.
|
|
244
|
+
*/
|
|
245
|
+
export type Unsubscribe = () => void;
|
|
246
|
+
/**
|
|
247
|
+
* Extract before events from EventTypeMap.
|
|
248
|
+
*/
|
|
249
|
+
export type BeforeEventTypes = {
|
|
250
|
+
[K in keyof EventTypeMap]: EventTypeMap[K] extends BeforeEvent ? K : never;
|
|
251
|
+
}[keyof EventTypeMap];
|
|
252
|
+
/**
|
|
253
|
+
* Extract after events from EventTypeMap.
|
|
254
|
+
*/
|
|
255
|
+
export type AfterEventTypes = {
|
|
256
|
+
[K in keyof EventTypeMap]: EventTypeMap[K] extends AfterEvent ? K : never;
|
|
257
|
+
}[keyof EventTypeMap];
|
|
258
|
+
/**
|
|
259
|
+
* Extract field-scoped events.
|
|
260
|
+
*/
|
|
261
|
+
export type FieldScopedEventTypes = {
|
|
262
|
+
[K in keyof EventTypeMap]: EventTypeMap[K] extends FieldScopedEvent<string> ? K : never;
|
|
263
|
+
}[keyof EventTypeMap];
|
|
264
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Disposable } from '../core/Disposable.js';
|
|
2
|
+
import type { ActionDispatcher } from '../core/ActionDispatcher.js';
|
|
3
|
+
import type { SnapshotStore } from '../store/SnapshotStore.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all handles.
|
|
6
|
+
* Provides common functionality for subscription and disposal.
|
|
7
|
+
*
|
|
8
|
+
* Handles are stable objects that:
|
|
9
|
+
* - Have stable identity (same instance across renders)
|
|
10
|
+
* - Provide subscribe/getSnapshot for useSyncExternalStore
|
|
11
|
+
* - Dispatch actions for mutations
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class BaseHandle implements Disposable {
|
|
14
|
+
protected readonly store: SnapshotStore;
|
|
15
|
+
protected readonly dispatcher: ActionDispatcher;
|
|
16
|
+
protected _disposed: boolean;
|
|
17
|
+
constructor(store: SnapshotStore, dispatcher: ActionDispatcher);
|
|
18
|
+
/**
|
|
19
|
+
* Subscribe to changes. Used by useSyncExternalStore.
|
|
20
|
+
*/
|
|
21
|
+
abstract subscribe(callback: () => void): () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Get current version for change detection.
|
|
24
|
+
*/
|
|
25
|
+
abstract getVersion(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Dispose resources (unsubscribe, cleanup).
|
|
28
|
+
*/
|
|
29
|
+
dispose(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Check if the handle has been disposed.
|
|
32
|
+
*/
|
|
33
|
+
get isDisposed(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Throws if the handle has been disposed.
|
|
36
|
+
*/
|
|
37
|
+
protected assertNotDisposed(): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Base class for entity-related handles.
|
|
41
|
+
* Provides common entity subscription logic.
|
|
42
|
+
*/
|
|
43
|
+
export declare abstract class EntityRelatedHandle extends BaseHandle {
|
|
44
|
+
protected readonly entityType: string;
|
|
45
|
+
protected readonly entityId: string;
|
|
46
|
+
constructor(entityType: string, entityId: string, store: SnapshotStore, dispatcher: ActionDispatcher);
|
|
47
|
+
/**
|
|
48
|
+
* Subscribe to entity changes.
|
|
49
|
+
*/
|
|
50
|
+
subscribe(callback: () => void): () => void;
|
|
51
|
+
/**
|
|
52
|
+
* Get entity snapshot version.
|
|
53
|
+
*/
|
|
54
|
+
getVersion(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Get entity data.
|
|
57
|
+
*/
|
|
58
|
+
protected getEntityData(): Record<string, unknown> | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Get entity server data.
|
|
61
|
+
*/
|
|
62
|
+
protected getServerData(): Record<string, unknown> | undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=BaseHandle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseHandle.d.ts","sourceRoot":"","sources":["../../src/handles/BaseHandle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,uBAAuB,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D;;;;;;;;GAQG;AACH,8BAAsB,UAAW,YAAW,UAAU;IAIpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IACvC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB;IAJhD,SAAS,CAAC,SAAS,UAAQ;gBAGP,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAGhD;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEpD;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,MAAM;IAE7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;CAKnC;AAED;;;GAGG;AACH,8BAAsB,mBAAoB,SAAQ,UAAU;IAE1D,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM;IACrC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACnC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB;IAK7B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C;;OAEG;IACH,UAAU,IAAI,MAAM;IAKpB;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAK9D;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;CAI9D"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { EntityRelatedHandle } from './BaseHandle.js';
|
|
2
|
+
import { FieldHandle } from './FieldHandle.js';
|
|
3
|
+
import type { ActionDispatcher } from '../core/ActionDispatcher.js';
|
|
4
|
+
import { type SnapshotStore } from '../store/SnapshotStore.js';
|
|
5
|
+
import type { SchemaRegistry } from '../schema/SchemaRegistry.js';
|
|
6
|
+
import type { EntitySnapshot } from '../store/snapshots.js';
|
|
7
|
+
import { type EntityRef, type SelectedEntityFields, type Unsubscribe } from './types.js';
|
|
8
|
+
import { type ErrorInput, type FieldError } from '../errors/types.js';
|
|
9
|
+
import type { EventTypeMap, AfterEventTypes, BeforeEventTypes, EventListener, Interceptor, EntityPersistedEvent, EntityPersistingEvent } from '../events/types.js';
|
|
10
|
+
import { HasOneHandle } from './HasOneHandle.js';
|
|
11
|
+
import { HasManyListHandle } from './HasManyListHandle.js';
|
|
12
|
+
import type { SelectionMeta } from '../selection/types.js';
|
|
13
|
+
/**
|
|
14
|
+
* EntityHandle provides stable access to an entity.
|
|
15
|
+
* Implements EntityRef interface for consistent usage across the system.
|
|
16
|
+
*
|
|
17
|
+
* Supports direct field access for shorter chains:
|
|
18
|
+
* - `entity.fieldName` is equivalent to `entity.$fields.fieldName`
|
|
19
|
+
* - Handle properties use $ prefix to avoid collision with field names: `$id`, `$data`, `$isDirty`, etc.
|
|
20
|
+
*
|
|
21
|
+
* Key characteristics:
|
|
22
|
+
* - Stable identity (same instance across renders when id doesn't change)
|
|
23
|
+
* - Provides field handles for individual fields
|
|
24
|
+
* - Provides relation handles for has-one and has-many relations
|
|
25
|
+
* - Tracks dirty state across all fields
|
|
26
|
+
*
|
|
27
|
+
* @typeParam T - The full entity type
|
|
28
|
+
* @typeParam TSelected - The selected subset of fields (defaults to T for backwards compatibility)
|
|
29
|
+
*/
|
|
30
|
+
export declare class EntityHandle<T extends object = object, TSelected = T> extends EntityRelatedHandle implements EntityRef<T, TSelected> {
|
|
31
|
+
private readonly schema;
|
|
32
|
+
private readonly selection?;
|
|
33
|
+
/** Cache for field handles to ensure stable identity */
|
|
34
|
+
private readonly fieldHandleCache;
|
|
35
|
+
/** Cache for relation handles */
|
|
36
|
+
private readonly relationHandleCache;
|
|
37
|
+
/** Runtime brand symbols for validation */
|
|
38
|
+
readonly __brands?: Set<symbol>;
|
|
39
|
+
/** Type brand for schema - placeholder at runtime */
|
|
40
|
+
readonly __schema: Record<string, object>;
|
|
41
|
+
readonly $fields: SelectedEntityFields<T, TSelected>;
|
|
42
|
+
readonly $data: TSelected | null;
|
|
43
|
+
readonly $isDirty: boolean;
|
|
44
|
+
readonly $persistedId: string | null;
|
|
45
|
+
readonly $isNew: boolean;
|
|
46
|
+
readonly $errors: readonly FieldError[];
|
|
47
|
+
readonly $hasError: boolean;
|
|
48
|
+
$addError: (error: ErrorInput) => void;
|
|
49
|
+
$clearErrors: () => void;
|
|
50
|
+
$clearAllErrors: () => void;
|
|
51
|
+
$on: <E extends AfterEventTypes>(eventType: E, listener: EventListener<EventTypeMap[E]>) => Unsubscribe;
|
|
52
|
+
$intercept: <E extends BeforeEventTypes>(eventType: E, interceptor: Interceptor<EventTypeMap[E]>) => Unsubscribe;
|
|
53
|
+
$onPersisted: (listener: EventListener<EntityPersistedEvent>) => Unsubscribe;
|
|
54
|
+
$interceptPersisting: (interceptor: Interceptor<EntityPersistingEvent>) => Unsubscribe;
|
|
55
|
+
private constructor();
|
|
56
|
+
static create<T extends object = object, TSelected = T>(id: string, entityType: string, store: SnapshotStore, dispatcher: ActionDispatcher, schema: SchemaRegistry, brands?: Set<symbol>, selection?: SelectionMeta): EntityHandle<T, TSelected>;
|
|
57
|
+
/**
|
|
58
|
+
* Gets the entity ID.
|
|
59
|
+
*/
|
|
60
|
+
get id(): string;
|
|
61
|
+
/**
|
|
62
|
+
* Gets the entity type.
|
|
63
|
+
*/
|
|
64
|
+
get type(): string;
|
|
65
|
+
/**
|
|
66
|
+
* Gets the current entity snapshot.
|
|
67
|
+
*/
|
|
68
|
+
getSnapshot(): EntitySnapshot<T> | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Gets the current entity data.
|
|
71
|
+
* Returns selected fields subset as specified by TSelected type parameter.
|
|
72
|
+
*/
|
|
73
|
+
get data(): TSelected | null;
|
|
74
|
+
/**
|
|
75
|
+
* Gets the server data.
|
|
76
|
+
*/
|
|
77
|
+
get serverData(): T | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Checks if the entity has been loaded.
|
|
80
|
+
*/
|
|
81
|
+
get isLoaded(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Checks if the entity is currently loading.
|
|
84
|
+
*/
|
|
85
|
+
get isLoading(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Checks if there was an error loading the entity.
|
|
88
|
+
*/
|
|
89
|
+
get isError(): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Gets the loading error if any.
|
|
92
|
+
*/
|
|
93
|
+
get error(): FieldError | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* Checks if the entity is currently being persisted.
|
|
96
|
+
*/
|
|
97
|
+
get isPersisting(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Checks if any field on the entity has been modified.
|
|
100
|
+
* This includes scalar field changes and relation changes (hasOne, hasMany).
|
|
101
|
+
*/
|
|
102
|
+
get isDirty(): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Gets the persisted ID (server-assigned ID after create).
|
|
105
|
+
* Returns the ID itself if it's already a real ID, null if it's a temp ID without mapping.
|
|
106
|
+
*/
|
|
107
|
+
get persistedId(): string | null;
|
|
108
|
+
/**
|
|
109
|
+
* Checks if this entity is new (created locally, not yet persisted to server).
|
|
110
|
+
*/
|
|
111
|
+
get isNew(): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Gets a field handle for a specific field.
|
|
114
|
+
* Returns cached handle to ensure stable identity.
|
|
115
|
+
*/
|
|
116
|
+
field<K extends keyof T>(fieldName: K): FieldHandle<T[K]>;
|
|
117
|
+
/**
|
|
118
|
+
* Gets a has-one relation handle.
|
|
119
|
+
*/
|
|
120
|
+
hasOne<TRelated extends object>(fieldName: string, nestedSelection?: SelectionMeta): HasOneHandle<TRelated>;
|
|
121
|
+
/**
|
|
122
|
+
* Gets a has-many relation handle.
|
|
123
|
+
*
|
|
124
|
+
* @param alias - Optional alias for the relation. When the same field is used multiple times
|
|
125
|
+
* with different parameters (filter, orderBy, limit), each needs a unique alias.
|
|
126
|
+
*/
|
|
127
|
+
hasMany<TItem extends object>(fieldName: string, alias?: string, nestedSelection?: SelectionMeta): HasManyListHandle<TItem>;
|
|
128
|
+
/**
|
|
129
|
+
* Resets the entity to server data.
|
|
130
|
+
* Also resets all relation states (hasOne, hasMany).
|
|
131
|
+
*/
|
|
132
|
+
reset(): void;
|
|
133
|
+
/**
|
|
134
|
+
* Commits changes (serverData = data).
|
|
135
|
+
*/
|
|
136
|
+
commit(): void;
|
|
137
|
+
/**
|
|
138
|
+
* Disposes the handle and all cached child handles.
|
|
139
|
+
*/
|
|
140
|
+
dispose(): void;
|
|
141
|
+
/**
|
|
142
|
+
* Creates a proxy for field access.
|
|
143
|
+
* Returns appropriate handle type based on schema field definition:
|
|
144
|
+
* - Scalar fields -> FieldHandle
|
|
145
|
+
* - HasOne relations -> HasOneHandle
|
|
146
|
+
* - HasMany relations -> HasManyListHandle
|
|
147
|
+
*
|
|
148
|
+
* Implements EntityRef.fields - returns selection-aware field accessors.
|
|
149
|
+
*/
|
|
150
|
+
get fields(): SelectedEntityFields<T, TSelected>;
|
|
151
|
+
/**
|
|
152
|
+
* Type brand - ensures EntityRef<Author> is not assignable to EntityRef<Tag>.
|
|
153
|
+
* This is a phantom property that only exists in the type system.
|
|
154
|
+
* Implements EntityRef.__entityType.
|
|
155
|
+
*/
|
|
156
|
+
get __entityType(): T;
|
|
157
|
+
/**
|
|
158
|
+
* Entity name for type inference.
|
|
159
|
+
* Carries the entity type name (e.g., 'Article', 'Author').
|
|
160
|
+
* Implements EntityRef.__entityName.
|
|
161
|
+
*/
|
|
162
|
+
get __entityName(): string;
|
|
163
|
+
/**
|
|
164
|
+
* Gets the list of entity-level errors (not including field or relation errors).
|
|
165
|
+
*/
|
|
166
|
+
get errors(): readonly FieldError[];
|
|
167
|
+
/**
|
|
168
|
+
* Checks if this entity has any errors (entity-level, fields, or relations).
|
|
169
|
+
*/
|
|
170
|
+
get hasError(): boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Adds a client-side error to this entity.
|
|
173
|
+
*/
|
|
174
|
+
addError(error: ErrorInput): void;
|
|
175
|
+
/**
|
|
176
|
+
* Clears entity-level errors.
|
|
177
|
+
*/
|
|
178
|
+
clearErrors(): void;
|
|
179
|
+
/**
|
|
180
|
+
* Clears all errors (entity-level, fields, and relations).
|
|
181
|
+
*/
|
|
182
|
+
clearAllErrors(): void;
|
|
183
|
+
/**
|
|
184
|
+
* Gets the list of dirty scalar fields.
|
|
185
|
+
*/
|
|
186
|
+
getDirtyFields(): readonly string[];
|
|
187
|
+
/**
|
|
188
|
+
* Gets the list of dirty relations.
|
|
189
|
+
*/
|
|
190
|
+
getDirtyRelations(): readonly string[];
|
|
191
|
+
/**
|
|
192
|
+
* Subscribe to any event on this entity.
|
|
193
|
+
*/
|
|
194
|
+
on<E extends AfterEventTypes>(eventType: E, listener: EventListener<EventTypeMap[E]>): Unsubscribe;
|
|
195
|
+
/**
|
|
196
|
+
* Intercept any before event on this entity.
|
|
197
|
+
*/
|
|
198
|
+
intercept<E extends BeforeEventTypes>(eventType: E, interceptor: Interceptor<EventTypeMap[E]>): Unsubscribe;
|
|
199
|
+
/**
|
|
200
|
+
* Subscribe to persist success events.
|
|
201
|
+
*/
|
|
202
|
+
onPersisted(listener: EventListener<EntityPersistedEvent>): Unsubscribe;
|
|
203
|
+
/**
|
|
204
|
+
* Intercept persist (can cancel).
|
|
205
|
+
*/
|
|
206
|
+
interceptPersisting(interceptor: Interceptor<EntityPersistingEvent>): Unsubscribe;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=EntityHandle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityHandle.d.ts","sourceRoot":"","sources":["../../src/handles/EntityHandle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { EntityRelatedHandle } from './BaseHandle.js';
|
|
2
|
+
import type { ActionDispatcher } from '../core/ActionDispatcher.js';
|
|
3
|
+
import type { SnapshotStore } from '../store/SnapshotStore.js';
|
|
4
|
+
import { FIELD_REF_META, type FieldRef, type FieldRefMeta, type InputProps, type Unsubscribe } from './types.js';
|
|
5
|
+
import { type ErrorInput, type FieldError } from '../errors/types.js';
|
|
6
|
+
import type { FieldChangedEvent, FieldChangingEvent, EventListener, Interceptor } from '../events/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* FieldHandle provides stable access to a scalar field.
|
|
9
|
+
*
|
|
10
|
+
* Key characteristics:
|
|
11
|
+
* - Stable identity (same instance across renders)
|
|
12
|
+
* - Reads data from SnapshotStore snapshots
|
|
13
|
+
* - Dispatches actions for mutations
|
|
14
|
+
* - Provides inputProps for form integration
|
|
15
|
+
* - Implements FieldRef interface for JSX compatibility
|
|
16
|
+
*/
|
|
17
|
+
export declare class FieldHandle<T = unknown> extends EntityRelatedHandle implements FieldRef<T> {
|
|
18
|
+
private readonly fieldPath;
|
|
19
|
+
private readonly _enumName?;
|
|
20
|
+
private readonly _columnType?;
|
|
21
|
+
private _cachedInputProps;
|
|
22
|
+
private _cachedInputPropsValue;
|
|
23
|
+
private readonly _boundSetValue;
|
|
24
|
+
private constructor();
|
|
25
|
+
static create<T = unknown>(entityType: string, entityId: string, fieldPath: string[], store: SnapshotStore, dispatcher: ActionDispatcher, enumName?: string, columnType?: string): FieldHandle<T>;
|
|
26
|
+
/**
|
|
27
|
+
* JSX field reference metadata for collection phase.
|
|
28
|
+
* Implements FieldRef interface.
|
|
29
|
+
*/
|
|
30
|
+
get [FIELD_REF_META](): FieldRefMeta;
|
|
31
|
+
/**
|
|
32
|
+
* Gets the current field value.
|
|
33
|
+
*/
|
|
34
|
+
get value(): T | null;
|
|
35
|
+
/**
|
|
36
|
+
* Gets the server value (for dirty tracking).
|
|
37
|
+
*/
|
|
38
|
+
get serverValue(): T | null;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if the field has been modified.
|
|
41
|
+
*/
|
|
42
|
+
get isDirty(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if the field has been touched (interacted with by the user).
|
|
45
|
+
* Useful for showing errors only after user interaction.
|
|
46
|
+
*/
|
|
47
|
+
get isTouched(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Marks the field as touched.
|
|
50
|
+
* Call this on blur or other interaction events.
|
|
51
|
+
*/
|
|
52
|
+
touch(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Sets the field value.
|
|
55
|
+
* Also clears non-sticky client errors.
|
|
56
|
+
*/
|
|
57
|
+
setValue(value: T | null): void;
|
|
58
|
+
/**
|
|
59
|
+
* Gets the list of errors on this field.
|
|
60
|
+
*/
|
|
61
|
+
get errors(): readonly FieldError[];
|
|
62
|
+
/**
|
|
63
|
+
* Checks if this field has any errors.
|
|
64
|
+
*/
|
|
65
|
+
get hasError(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Adds a client-side error to this field.
|
|
68
|
+
*/
|
|
69
|
+
addError(error: ErrorInput): void;
|
|
70
|
+
/**
|
|
71
|
+
* Clears all errors from this field.
|
|
72
|
+
*/
|
|
73
|
+
clearErrors(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Gets input binding props for form integration.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```tsx
|
|
79
|
+
* <input {...field.inputProps} />
|
|
80
|
+
* // or with custom handler
|
|
81
|
+
* <input
|
|
82
|
+
* value={field.inputProps.value ?? ''}
|
|
83
|
+
* onChange={e => field.inputProps.onChange(e.target.value)}
|
|
84
|
+
* />
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
get inputProps(): InputProps<T>;
|
|
88
|
+
/**
|
|
89
|
+
* Gets the field path.
|
|
90
|
+
*/
|
|
91
|
+
get path(): readonly string[];
|
|
92
|
+
/**
|
|
93
|
+
* Gets the field name (last segment of path).
|
|
94
|
+
*/
|
|
95
|
+
get fieldName(): string;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a nested field handle for a subfield.
|
|
98
|
+
*/
|
|
99
|
+
nested<K extends keyof NonNullable<T>>(key: K): FieldHandle<NonNullable<T>[K]>;
|
|
100
|
+
/**
|
|
101
|
+
* Subscribe to field value changes.
|
|
102
|
+
* The listener is called after the value has changed.
|
|
103
|
+
*/
|
|
104
|
+
onChange(listener: EventListener<FieldChangedEvent>): Unsubscribe;
|
|
105
|
+
/**
|
|
106
|
+
* Intercept field value changes.
|
|
107
|
+
* The interceptor can cancel or modify the change.
|
|
108
|
+
*/
|
|
109
|
+
onChanging(interceptor: Interceptor<FieldChangingEvent>): Unsubscribe;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=FieldHandle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldHandle.d.ts","sourceRoot":"","sources":["../../src/handles/FieldHandle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAEhH,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACxF,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,MAAM,oBAAoB,CAAA;AAG3B;;;;;;;;;GASG;AACH,qBAAa,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,mBAAoB,YAAW,QAAQ,CAAC,CAAC,CAAC;IAStF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAG1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAZ9B,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAAkC;IAEhE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkD;IAEjF,OAAO;IAYP,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GACjB,WAAW,CAAC,CAAC,CAAC;IAIjB;;;OAGG;IACH,IAAI,CAAC,cAAc,CAAC,IAAI,YAAY,CAWnC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAIpB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,CAAC,GAAG,IAAI,CAI1B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAS/B;;OAEG;IACH,IAAI,MAAM,IAAI,SAAS,UAAU,EAAE,CAElC;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOjC;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;;;;;;;;;;;OAYG;IACH,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAW9B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,SAAS,MAAM,EAAE,CAE5B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,CAAC,EACpC,GAAG,EAAE,CAAC,GACJ,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAYjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAAG,WAAW;IAWjE;;;OAGG;IACH,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,kBAAkB,CAAC,GAAG,WAAW;CAWrE"}
|