@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.
Files changed (234) hide show
  1. package/dist/adapter/ContemberAdapter.d.ts +40 -0
  2. package/dist/adapter/ContemberAdapter.d.ts.map +1 -0
  3. package/dist/adapter/MockAdapter.d.ts +81 -0
  4. package/dist/adapter/MockAdapter.d.ts.map +1 -0
  5. package/dist/adapter/MockQueryEngine.d.ts +43 -0
  6. package/dist/adapter/MockQueryEngine.d.ts.map +1 -0
  7. package/dist/adapter/index.d.ts +5 -0
  8. package/dist/adapter/index.d.ts.map +1 -0
  9. package/dist/adapter/types.d.ts +184 -0
  10. package/dist/adapter/types.d.ts.map +1 -0
  11. package/dist/brand/ComponentBrand.d.ts +25 -0
  12. package/dist/brand/ComponentBrand.d.ts.map +1 -0
  13. package/dist/contember/index.d.ts +10 -0
  14. package/dist/contember/index.d.ts.map +1 -0
  15. package/dist/core/ActionDispatcher.d.ts +64 -0
  16. package/dist/core/ActionDispatcher.d.ts.map +1 -0
  17. package/dist/core/Disposable.d.ts +57 -0
  18. package/dist/core/Disposable.d.ts.map +1 -0
  19. package/dist/core/EntityLoader.d.ts +80 -0
  20. package/dist/core/EntityLoader.d.ts.map +1 -0
  21. package/dist/core/PersistenceManager.d.ts +126 -0
  22. package/dist/core/PersistenceManager.d.ts.map +1 -0
  23. package/dist/core/SelectionResolver.d.ts +21 -0
  24. package/dist/core/SelectionResolver.d.ts.map +1 -0
  25. package/dist/core/actionClassification.d.ts +48 -0
  26. package/dist/core/actionClassification.d.ts.map +1 -0
  27. package/dist/core/actions.d.ts +301 -0
  28. package/dist/core/actions.d.ts.map +1 -0
  29. package/dist/core/index.d.ts +4 -0
  30. package/dist/core/index.d.ts.map +1 -0
  31. package/dist/dataview/filterHandlers.d.ts +18 -0
  32. package/dist/dataview/filterHandlers.d.ts.map +1 -0
  33. package/dist/dataview/index.d.ts +3 -0
  34. package/dist/dataview/index.d.ts.map +1 -0
  35. package/dist/dataview/types.d.ts +164 -0
  36. package/dist/dataview/types.d.ts.map +1 -0
  37. package/dist/errors/UnfetchedFieldError.d.ts +11 -0
  38. package/dist/errors/UnfetchedFieldError.d.ts.map +1 -0
  39. package/dist/errors/errorPathResolver.d.ts +52 -0
  40. package/dist/errors/errorPathResolver.d.ts.map +1 -0
  41. package/dist/errors/index.d.ts +5 -0
  42. package/dist/errors/index.d.ts.map +1 -0
  43. package/dist/errors/pathMapper.d.ts +42 -0
  44. package/dist/errors/pathMapper.d.ts.map +1 -0
  45. package/dist/errors/types.d.ts +131 -0
  46. package/dist/errors/types.d.ts.map +1 -0
  47. package/dist/events/EventEmitter.d.ts +97 -0
  48. package/dist/events/EventEmitter.d.ts.map +1 -0
  49. package/dist/events/eventFactory.d.ts +40 -0
  50. package/dist/events/eventFactory.d.ts.map +1 -0
  51. package/dist/events/index.d.ts +15 -0
  52. package/dist/events/index.d.ts.map +1 -0
  53. package/dist/events/types.d.ts +264 -0
  54. package/dist/events/types.d.ts.map +1 -0
  55. package/dist/handles/BaseHandle.d.ts +64 -0
  56. package/dist/handles/BaseHandle.d.ts.map +1 -0
  57. package/dist/handles/EntityHandle.d.ts +208 -0
  58. package/dist/handles/EntityHandle.d.ts.map +1 -0
  59. package/dist/handles/FieldHandle.d.ts +111 -0
  60. package/dist/handles/FieldHandle.d.ts.map +1 -0
  61. package/dist/handles/HasManyListHandle.d.ts +166 -0
  62. package/dist/handles/HasManyListHandle.d.ts.map +1 -0
  63. package/dist/handles/HasOneHandle.d.ts +168 -0
  64. package/dist/handles/HasOneHandle.d.ts.map +1 -0
  65. package/dist/handles/PlaceholderHandle.d.ts +117 -0
  66. package/dist/handles/PlaceholderHandle.d.ts.map +1 -0
  67. package/dist/handles/index.d.ts +8 -0
  68. package/dist/handles/index.d.ts.map +1 -0
  69. package/dist/handles/proxyFactory.d.ts +66 -0
  70. package/dist/handles/proxyFactory.d.ts.map +1 -0
  71. package/dist/handles/types.d.ts +430 -0
  72. package/dist/handles/types.d.ts.map +1 -0
  73. package/dist/index.d.ts +53 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/internal.d.ts +11 -0
  76. package/dist/internal.d.ts.map +1 -0
  77. package/dist/persistence/BatchPersister.d.ts +142 -0
  78. package/dist/persistence/BatchPersister.d.ts.map +1 -0
  79. package/dist/persistence/ChangeRegistry.d.ts +87 -0
  80. package/dist/persistence/ChangeRegistry.d.ts.map +1 -0
  81. package/dist/persistence/ContemberSchemaMutationAdapter.d.ts +16 -0
  82. package/dist/persistence/ContemberSchemaMutationAdapter.d.ts.map +1 -0
  83. package/dist/persistence/MutationCollector.d.ts +96 -0
  84. package/dist/persistence/MutationCollector.d.ts.map +1 -0
  85. package/dist/persistence/MutationSchemaProvider.d.ts +30 -0
  86. package/dist/persistence/MutationSchemaProvider.d.ts.map +1 -0
  87. package/dist/persistence/index.d.ts +7 -0
  88. package/dist/persistence/index.d.ts.map +1 -0
  89. package/dist/persistence/types.d.ts +189 -0
  90. package/dist/persistence/types.d.ts.map +1 -0
  91. package/dist/roles/RoleSchemaRegistry.d.ts +77 -0
  92. package/dist/roles/RoleSchemaRegistry.d.ts.map +1 -0
  93. package/dist/roles/index.d.ts +11 -0
  94. package/dist/roles/index.d.ts.map +1 -0
  95. package/dist/roles/types.d.ts +242 -0
  96. package/dist/roles/types.d.ts.map +1 -0
  97. package/dist/schema/ContemberSchema.d.ts +98 -0
  98. package/dist/schema/ContemberSchema.d.ts.map +1 -0
  99. package/dist/schema/SchemaLoader.d.ts +28 -0
  100. package/dist/schema/SchemaLoader.d.ts.map +1 -0
  101. package/dist/schema/SchemaRegistry.d.ts +95 -0
  102. package/dist/schema/SchemaRegistry.d.ts.map +1 -0
  103. package/dist/schema/index.d.ts +6 -0
  104. package/dist/schema/index.d.ts.map +1 -0
  105. package/dist/schema/roles.d.ts +62 -0
  106. package/dist/schema/roles.d.ts.map +1 -0
  107. package/dist/schema/types.d.ts +179 -0
  108. package/dist/schema/types.d.ts.map +1 -0
  109. package/dist/selection/SelectionMetaCollector.d.ts +32 -0
  110. package/dist/selection/SelectionMetaCollector.d.ts.map +1 -0
  111. package/dist/selection/SelectionScope.d.ts +77 -0
  112. package/dist/selection/SelectionScope.d.ts.map +1 -0
  113. package/dist/selection/buildQuery.d.ts +45 -0
  114. package/dist/selection/buildQuery.d.ts.map +1 -0
  115. package/dist/selection/createFragment.d.ts +29 -0
  116. package/dist/selection/createFragment.d.ts.map +1 -0
  117. package/dist/selection/createSelectionBuilder.d.ts +18 -0
  118. package/dist/selection/createSelectionBuilder.d.ts.map +1 -0
  119. package/dist/selection/index.d.ts +8 -0
  120. package/dist/selection/index.d.ts.map +1 -0
  121. package/dist/selection/queryTypes.d.ts +84 -0
  122. package/dist/selection/queryTypes.d.ts.map +1 -0
  123. package/dist/selection/types.d.ts +238 -0
  124. package/dist/selection/types.d.ts.map +1 -0
  125. package/dist/store/DirtyTracker.d.ts +26 -0
  126. package/dist/store/DirtyTracker.d.ts.map +1 -0
  127. package/dist/store/EntityMetaStore.d.ts +52 -0
  128. package/dist/store/EntityMetaStore.d.ts.map +1 -0
  129. package/dist/store/EntitySnapshotStore.d.ts +63 -0
  130. package/dist/store/EntitySnapshotStore.d.ts.map +1 -0
  131. package/dist/store/ErrorStore.d.ts +82 -0
  132. package/dist/store/ErrorStore.d.ts.map +1 -0
  133. package/dist/store/RelationStore.d.ts +175 -0
  134. package/dist/store/RelationStore.d.ts.map +1 -0
  135. package/dist/store/SnapshotStore.d.ts +143 -0
  136. package/dist/store/SnapshotStore.d.ts.map +1 -0
  137. package/dist/store/SubscriptionManager.d.ts +90 -0
  138. package/dist/store/SubscriptionManager.d.ts.map +1 -0
  139. package/dist/store/TouchedStore.d.ts +24 -0
  140. package/dist/store/TouchedStore.d.ts.map +1 -0
  141. package/dist/store/entityId.d.ts +29 -0
  142. package/dist/store/entityId.d.ts.map +1 -0
  143. package/dist/store/index.d.ts +1 -0
  144. package/dist/store/index.d.ts.map +1 -0
  145. package/dist/store/snapshots.d.ts +144 -0
  146. package/dist/store/snapshots.d.ts.map +1 -0
  147. package/dist/undo/UndoManager.d.ts +120 -0
  148. package/dist/undo/UndoManager.d.ts.map +1 -0
  149. package/dist/undo/index.d.ts +3 -0
  150. package/dist/undo/index.d.ts.map +1 -0
  151. package/dist/undo/types.d.ts +74 -0
  152. package/dist/undo/types.d.ts.map +1 -0
  153. package/dist/utils/aliasGenerator.d.ts +25 -0
  154. package/dist/utils/aliasGenerator.d.ts.map +1 -0
  155. package/dist/utils/deepEqual.d.ts +6 -0
  156. package/dist/utils/deepEqual.d.ts.map +1 -0
  157. package/dist/utils/index.d.ts +3 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/package.json +29 -0
  160. package/src/adapter/ContemberAdapter.ts +239 -0
  161. package/src/adapter/MockAdapter.ts +394 -0
  162. package/src/adapter/MockQueryEngine.ts +236 -0
  163. package/src/adapter/index.ts +21 -0
  164. package/src/adapter/types.ts +199 -0
  165. package/src/brand/ComponentBrand.ts +28 -0
  166. package/src/contember/index.ts +17 -0
  167. package/src/core/ActionDispatcher.ts +450 -0
  168. package/src/core/Disposable.ts +126 -0
  169. package/src/core/EntityLoader.ts +169 -0
  170. package/src/core/SelectionResolver.ts +78 -0
  171. package/src/core/actionClassification.ts +196 -0
  172. package/src/core/actions.ts +491 -0
  173. package/src/core/index.ts +20 -0
  174. package/src/dataview/filterHandlers.ts +443 -0
  175. package/src/dataview/index.ts +36 -0
  176. package/src/dataview/types.ts +220 -0
  177. package/src/errors/UnfetchedFieldError.ts +18 -0
  178. package/src/errors/errorPathResolver.ts +239 -0
  179. package/src/errors/index.ts +40 -0
  180. package/src/errors/pathMapper.ts +40 -0
  181. package/src/errors/types.ts +223 -0
  182. package/src/events/EventEmitter.ts +447 -0
  183. package/src/events/eventFactory.ts +430 -0
  184. package/src/events/index.ts +89 -0
  185. package/src/events/types.ts +374 -0
  186. package/src/handles/BaseHandle.ts +100 -0
  187. package/src/handles/EntityHandle.ts +538 -0
  188. package/src/handles/FieldHandle.ts +268 -0
  189. package/src/handles/HasManyListHandle.ts +500 -0
  190. package/src/handles/HasOneHandle.ts +500 -0
  191. package/src/handles/PlaceholderHandle.ts +321 -0
  192. package/src/handles/index.ts +37 -0
  193. package/src/handles/proxyFactory.ts +218 -0
  194. package/src/handles/types.ts +743 -0
  195. package/src/index.ts +384 -0
  196. package/src/internal.ts +19 -0
  197. package/src/persistence/BatchPersister.ts +911 -0
  198. package/src/persistence/ChangeRegistry.ts +150 -0
  199. package/src/persistence/ContemberSchemaMutationAdapter.ts +57 -0
  200. package/src/persistence/MutationCollector.ts +567 -0
  201. package/src/persistence/MutationSchemaProvider.ts +33 -0
  202. package/src/persistence/index.ts +23 -0
  203. package/src/persistence/types.ts +220 -0
  204. package/src/schema/ContemberSchema.ts +132 -0
  205. package/src/schema/SchemaLoader.ts +93 -0
  206. package/src/schema/SchemaRegistry.ts +286 -0
  207. package/src/schema/index.ts +51 -0
  208. package/src/schema/roles.ts +83 -0
  209. package/src/schema/types.ts +238 -0
  210. package/src/selection/SelectionMetaCollector.ts +122 -0
  211. package/src/selection/SelectionScope.ts +208 -0
  212. package/src/selection/buildQuery.ts +134 -0
  213. package/src/selection/createFragment.ts +50 -0
  214. package/src/selection/createSelectionBuilder.ts +283 -0
  215. package/src/selection/index.ts +31 -0
  216. package/src/selection/queryTypes.ts +135 -0
  217. package/src/selection/types.ts +320 -0
  218. package/src/store/DirtyTracker.ts +117 -0
  219. package/src/store/EntityMetaStore.ts +143 -0
  220. package/src/store/EntitySnapshotStore.ts +260 -0
  221. package/src/store/ErrorStore.ts +251 -0
  222. package/src/store/RelationStore.ts +696 -0
  223. package/src/store/SnapshotStore.ts +765 -0
  224. package/src/store/SubscriptionManager.ts +241 -0
  225. package/src/store/TouchedStore.ts +42 -0
  226. package/src/store/entityId.ts +43 -0
  227. package/src/store/index.ts +2 -0
  228. package/src/store/snapshots.ts +203 -0
  229. package/src/undo/UndoManager.ts +418 -0
  230. package/src/undo/index.ts +9 -0
  231. package/src/undo/types.ts +84 -0
  232. package/src/utils/aliasGenerator.ts +56 -0
  233. package/src/utils/deepEqual.ts +33 -0
  234. package/src/utils/index.ts +2 -0
@@ -0,0 +1,150 @@
1
+ import type { SnapshotStore } from '../store/SnapshotStore.js'
2
+
3
+ /**
4
+ * Information about a dirty entity
5
+ */
6
+ export interface DirtyEntity {
7
+ readonly entityType: string
8
+ readonly entityId: string
9
+ readonly changeType: 'create' | 'update' | 'delete'
10
+ readonly dirtyFields: readonly string[]
11
+ readonly dirtyRelations: readonly string[]
12
+ }
13
+
14
+ /**
15
+ * ChangeRegistry tracks all dirty entities and in-flight persistence operations.
16
+ * It wraps SnapshotStore's dirty tracking methods and adds deduplication and
17
+ * in-flight tracking for batch persistence operations.
18
+ */
19
+ export class ChangeRegistry {
20
+ /** Set of entity keys currently being persisted (for batch operations) */
21
+ private readonly inFlight = new Set<string>()
22
+
23
+ /** Subscribers to in-flight state changes */
24
+ private readonly subscribers = new Set<() => void>()
25
+
26
+ constructor(private readonly store: SnapshotStore) {}
27
+
28
+ /**
29
+ * Gets the entity key for internal tracking.
30
+ */
31
+ private getKey(entityType: string, entityId: string): string {
32
+ return `${entityType}:${entityId}`
33
+ }
34
+
35
+ /**
36
+ * Gets all dirty entities with their change types and dirty fields/relations.
37
+ */
38
+ getDirtyEntities(): readonly DirtyEntity[] {
39
+ const rawDirty = this.store.getAllDirtyEntities()
40
+
41
+ return rawDirty.map(entity => ({
42
+ entityType: entity.entityType,
43
+ entityId: entity.entityId,
44
+ changeType: entity.changeType,
45
+ dirtyFields: this.store.getDirtyFields(entity.entityType, entity.entityId),
46
+ dirtyRelations: this.store.getDirtyRelations(entity.entityType, entity.entityId),
47
+ }))
48
+ }
49
+
50
+ /**
51
+ * Gets dirty entities that are not currently in-flight.
52
+ */
53
+ getDirtyEntitiesNotInFlight(): readonly DirtyEntity[] {
54
+ return this.getDirtyEntities().filter(
55
+ entity => !this.isInFlight(entity.entityType, entity.entityId),
56
+ )
57
+ }
58
+
59
+ /**
60
+ * Gets dirty fields for a specific entity.
61
+ */
62
+ getDirtyFields(entityType: string, entityId: string): readonly string[] {
63
+ return this.store.getDirtyFields(entityType, entityId)
64
+ }
65
+
66
+ /**
67
+ * Gets dirty relations for a specific entity.
68
+ */
69
+ getDirtyRelations(entityType: string, entityId: string): readonly string[] {
70
+ return this.store.getDirtyRelations(entityType, entityId)
71
+ }
72
+
73
+ /**
74
+ * Checks if an entity is currently being persisted (in a batch operation).
75
+ */
76
+ isInFlight(entityType: string, entityId: string): boolean {
77
+ const key = this.getKey(entityType, entityId)
78
+ return this.inFlight.has(key) || this.store.isPersisting(entityType, entityId)
79
+ }
80
+
81
+ /**
82
+ * Marks entities as in-flight (being persisted).
83
+ */
84
+ markInFlight(entities: ReadonlyArray<{ entityType: string; entityId: string }>): void {
85
+ for (const entity of entities) {
86
+ const key = this.getKey(entity.entityType, entity.entityId)
87
+ this.inFlight.add(key)
88
+ }
89
+ this.notifySubscribers()
90
+ }
91
+
92
+ /**
93
+ * Clears in-flight status for entities.
94
+ */
95
+ clearInFlight(entities: ReadonlyArray<{ entityType: string; entityId: string }>): void {
96
+ for (const entity of entities) {
97
+ const key = this.getKey(entity.entityType, entity.entityId)
98
+ this.inFlight.delete(key)
99
+ }
100
+ this.notifySubscribers()
101
+ }
102
+
103
+ /**
104
+ * Clears all in-flight status.
105
+ */
106
+ clearAllInFlight(): void {
107
+ this.inFlight.clear()
108
+ this.notifySubscribers()
109
+ }
110
+
111
+ /**
112
+ * Gets the set of all in-flight entity keys.
113
+ */
114
+ getInFlightEntities(): ReadonlySet<string> {
115
+ return this.inFlight
116
+ }
117
+
118
+ /**
119
+ * Checks if any entity is currently in-flight.
120
+ */
121
+ hasInFlight(): boolean {
122
+ return this.inFlight.size > 0
123
+ }
124
+
125
+ /**
126
+ * Checks if there are any dirty entities.
127
+ */
128
+ hasDirtyEntities(): boolean {
129
+ return this.store.getAllDirtyEntities().length > 0
130
+ }
131
+
132
+ /**
133
+ * Subscribe to in-flight state changes.
134
+ */
135
+ subscribe(callback: () => void): () => void {
136
+ this.subscribers.add(callback)
137
+ return () => {
138
+ this.subscribers.delete(callback)
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Notifies all subscribers of in-flight state changes.
144
+ */
145
+ private notifySubscribers(): void {
146
+ for (const subscriber of this.subscribers) {
147
+ subscriber()
148
+ }
149
+ }
150
+ }
@@ -0,0 +1,57 @@
1
+ import type { SchemaNames } from '@contember/client-content'
2
+ import type { MutationSchemaProvider } from './MutationSchemaProvider.js'
3
+
4
+ /**
5
+ * Adapter that wraps Contember SchemaNames to implement MutationSchemaProvider.
6
+ * Translates Contember's schema format (column/one/many) to the unified format (scalar/hasOne/hasMany).
7
+ */
8
+ export class ContemberSchemaMutationAdapter implements MutationSchemaProvider {
9
+ constructor(private readonly schema: SchemaNames) {}
10
+
11
+ getScalarFields(entityType: string): readonly string[] {
12
+ const entitySchema = this.schema.entities[entityType]
13
+ if (!entitySchema) return []
14
+
15
+ return Object.entries(entitySchema.fields)
16
+ .filter(([_, fieldDef]) => fieldDef.type === 'column')
17
+ .map(([name]) => name)
18
+ }
19
+
20
+ getRelationFields(entityType: string): readonly string[] {
21
+ const entitySchema = this.schema.entities[entityType]
22
+ if (!entitySchema) return []
23
+
24
+ return Object.entries(entitySchema.fields)
25
+ .filter(([_, fieldDef]) => fieldDef.type === 'one' || fieldDef.type === 'many')
26
+ .map(([name]) => name)
27
+ }
28
+
29
+ getRelationType(entityType: string, fieldName: string): 'hasOne' | 'hasMany' | undefined {
30
+ const entitySchema = this.schema.entities[entityType]
31
+ if (!entitySchema) return undefined
32
+
33
+ const fieldDef = entitySchema.fields[fieldName]
34
+ if (!fieldDef) return undefined
35
+
36
+ if (fieldDef.type === 'one') return 'hasOne'
37
+ if (fieldDef.type === 'many') return 'hasMany'
38
+ return undefined
39
+ }
40
+
41
+ getRelationTarget(entityType: string, fieldName: string): string | undefined {
42
+ const entitySchema = this.schema.entities[entityType]
43
+ if (!entitySchema) return undefined
44
+
45
+ const fieldDef = entitySchema.fields[fieldName]
46
+ if (!fieldDef) return undefined
47
+
48
+ if (fieldDef.type === 'one' || fieldDef.type === 'many') {
49
+ return fieldDef.entity
50
+ }
51
+ return undefined
52
+ }
53
+
54
+ hasEntity(entityType: string): boolean {
55
+ return entityType in this.schema.entities
56
+ }
57
+ }