@vived/host 4.0.3 → 4.2.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 (196) hide show
  1. package/dist/cjs/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.js +24 -0
  2. package/dist/cjs/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.js.map +1 -0
  3. package/dist/cjs/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.js +30 -0
  4. package/dist/cjs/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.js.map +1 -0
  5. package/dist/cjs/ChallengeResults/Adapters/index.js +1 -0
  6. package/dist/cjs/ChallengeResults/Adapters/index.js.map +1 -1
  7. package/dist/cjs/ChallengeResults/Factories/index.js +1 -1
  8. package/dist/cjs/ChallengeResults/Factories/index.js.map +1 -1
  9. package/dist/cjs/ChallengeResults/Factories/setupChallengeResults.js +14 -0
  10. package/dist/cjs/ChallengeResults/Factories/setupChallengeResults.js.map +1 -0
  11. package/dist/cjs/ChallengeResults/Factories/setupChallengeResultsForSandbox.js +1 -0
  12. package/dist/cjs/ChallengeResults/Factories/setupChallengeResultsForSandbox.js.map +1 -1
  13. package/dist/cjs/ChallengeResults/Mocks/MockHasChallengeResultsPM.js +16 -0
  14. package/dist/cjs/ChallengeResults/Mocks/MockHasChallengeResultsPM.js.map +1 -0
  15. package/dist/cjs/ChallengeResults/Mocks/index.js +1 -0
  16. package/dist/cjs/ChallengeResults/Mocks/index.js.map +1 -1
  17. package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.js +2 -0
  18. package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
  19. package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.test.js +4 -2
  20. package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.test.js.map +1 -1
  21. package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.js +37 -0
  22. package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -0
  23. package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.test.js +32 -0
  24. package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.test.js.map +1 -0
  25. package/dist/cjs/ChallengeResults/PMs/index.js +1 -0
  26. package/dist/cjs/ChallengeResults/PMs/index.js.map +1 -1
  27. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js +24 -0
  28. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  29. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js +49 -0
  30. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  31. package/dist/cjs/StateMachine/Adapters/index.js +1 -0
  32. package/dist/cjs/StateMachine/Adapters/index.js.map +1 -1
  33. package/dist/cjs/StateMachine/Controllers/editStateName.js +13 -0
  34. package/dist/cjs/StateMachine/Controllers/editStateName.js.map +1 -0
  35. package/dist/cjs/StateMachine/Controllers/editStateName.test.js +49 -0
  36. package/dist/cjs/StateMachine/Controllers/editStateName.test.js.map +1 -0
  37. package/dist/cjs/StateMachine/Controllers/index.js +1 -0
  38. package/dist/cjs/StateMachine/Controllers/index.js.map +1 -1
  39. package/dist/cjs/StateMachine/Entities/HostStateMachine.js +67 -24
  40. package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
  41. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js +174 -0
  42. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  43. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js +12 -0
  44. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  45. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js +23 -0
  46. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  47. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js +21 -15
  48. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  49. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  50. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  51. package/dist/cjs/StateMachine/PMs/HostStatePM.js +136 -0
  52. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -0
  53. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js +405 -0
  54. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  55. package/dist/cjs/StateMachine/PMs/index.js +1 -0
  56. package/dist/cjs/StateMachine/PMs/index.js.map +1 -1
  57. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js +35 -0
  58. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  59. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js +58 -0
  60. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  61. package/dist/cjs/StateMachine/UCs/index.js +1 -0
  62. package/dist/cjs/StateMachine/UCs/index.js.map +1 -1
  63. package/dist/cjs/ThemeColors/Factories/index.js +1 -1
  64. package/dist/cjs/ThemeColors/Factories/index.js.map +1 -1
  65. package/dist/cjs/ThemeColors/Factories/setupTheme.js +20 -0
  66. package/dist/cjs/ThemeColors/Factories/setupTheme.js.map +1 -0
  67. package/dist/cjs/ThemeColors/UCs/SetThemeUC.js +1 -1
  68. package/dist/cjs/ThemeColors/UCs/SetThemeUC.js.map +1 -1
  69. package/dist/esm/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.js +21 -0
  70. package/dist/esm/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.js.map +1 -0
  71. package/dist/esm/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.js +28 -0
  72. package/dist/esm/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.js.map +1 -0
  73. package/dist/esm/ChallengeResults/Adapters/index.js +1 -0
  74. package/dist/esm/ChallengeResults/Adapters/index.js.map +1 -1
  75. package/dist/esm/ChallengeResults/Factories/index.js +1 -1
  76. package/dist/esm/ChallengeResults/Factories/index.js.map +1 -1
  77. package/dist/esm/ChallengeResults/Factories/setupChallengeResults.js +11 -0
  78. package/dist/esm/ChallengeResults/Factories/setupChallengeResults.js.map +1 -0
  79. package/dist/esm/ChallengeResults/Factories/setupChallengeResultsForSandbox.js +2 -1
  80. package/dist/esm/ChallengeResults/Factories/setupChallengeResultsForSandbox.js.map +1 -1
  81. package/dist/esm/ChallengeResults/Mocks/MockHasChallengeResultsPM.js +11 -0
  82. package/dist/esm/ChallengeResults/Mocks/MockHasChallengeResultsPM.js.map +1 -0
  83. package/dist/esm/ChallengeResults/Mocks/index.js +1 -0
  84. package/dist/esm/ChallengeResults/Mocks/index.js.map +1 -1
  85. package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.js +2 -0
  86. package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
  87. package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.test.js +4 -2
  88. package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.test.js.map +1 -1
  89. package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.js +32 -0
  90. package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -0
  91. package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.test.js +30 -0
  92. package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.test.js.map +1 -0
  93. package/dist/esm/ChallengeResults/PMs/index.js +1 -0
  94. package/dist/esm/ChallengeResults/PMs/index.js.map +1 -1
  95. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js +21 -0
  96. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  97. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js +47 -0
  98. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  99. package/dist/esm/StateMachine/Adapters/index.js +1 -0
  100. package/dist/esm/StateMachine/Adapters/index.js.map +1 -1
  101. package/dist/esm/StateMachine/Controllers/editStateName.js +10 -0
  102. package/dist/esm/StateMachine/Controllers/editStateName.js.map +1 -0
  103. package/dist/esm/StateMachine/Controllers/editStateName.test.js +47 -0
  104. package/dist/esm/StateMachine/Controllers/editStateName.test.js.map +1 -0
  105. package/dist/esm/StateMachine/Controllers/index.js +1 -0
  106. package/dist/esm/StateMachine/Controllers/index.js.map +1 -1
  107. package/dist/esm/StateMachine/Entities/HostStateMachine.js +67 -24
  108. package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
  109. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js +174 -0
  110. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  111. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js +8 -0
  112. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  113. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js +18 -0
  114. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  115. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js +21 -15
  116. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  117. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  118. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  119. package/dist/esm/StateMachine/PMs/HostStatePM.js +131 -0
  120. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -0
  121. package/dist/esm/StateMachine/PMs/HostStatePM.test.js +403 -0
  122. package/dist/esm/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  123. package/dist/esm/StateMachine/PMs/index.js +1 -0
  124. package/dist/esm/StateMachine/PMs/index.js.map +1 -1
  125. package/dist/esm/StateMachine/UCs/EditStateNameUC.js +30 -0
  126. package/dist/esm/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  127. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js +56 -0
  128. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  129. package/dist/esm/StateMachine/UCs/index.js +1 -0
  130. package/dist/esm/StateMachine/UCs/index.js.map +1 -1
  131. package/dist/esm/ThemeColors/Factories/index.js +1 -1
  132. package/dist/esm/ThemeColors/Factories/index.js.map +1 -1
  133. package/dist/esm/ThemeColors/Factories/setupTheme.js +17 -0
  134. package/dist/esm/ThemeColors/Factories/setupTheme.js.map +1 -0
  135. package/dist/esm/ThemeColors/UCs/SetThemeUC.js +1 -1
  136. package/dist/esm/ThemeColors/UCs/SetThemeUC.js.map +1 -1
  137. package/dist/types/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.d.ts +3 -0
  138. package/dist/types/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.d.ts.map +1 -0
  139. package/dist/types/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.d.ts +2 -0
  140. package/dist/types/ChallengeResults/Adapters/hasChallengeResultsPMAdapter.test.d.ts.map +1 -0
  141. package/dist/types/ChallengeResults/Adapters/index.d.ts +1 -0
  142. package/dist/types/ChallengeResults/Adapters/index.d.ts.map +1 -1
  143. package/dist/types/ChallengeResults/Factories/index.d.ts +1 -1
  144. package/dist/types/ChallengeResults/Factories/index.d.ts.map +1 -1
  145. package/dist/types/ChallengeResults/Factories/setupChallengeResults.d.ts +4 -0
  146. package/dist/types/ChallengeResults/Factories/setupChallengeResults.d.ts.map +1 -0
  147. package/dist/types/ChallengeResults/Factories/setupChallengeResultsForSandbox.d.ts.map +1 -1
  148. package/dist/types/ChallengeResults/Mocks/MockHasChallengeResultsPM.d.ts +8 -0
  149. package/dist/types/ChallengeResults/Mocks/MockHasChallengeResultsPM.d.ts.map +1 -0
  150. package/dist/types/ChallengeResults/Mocks/index.d.ts +1 -0
  151. package/dist/types/ChallengeResults/Mocks/index.d.ts.map +1 -1
  152. package/dist/types/ChallengeResults/PMs/ChallengeResultsListPM.d.ts +1 -0
  153. package/dist/types/ChallengeResults/PMs/ChallengeResultsListPM.d.ts.map +1 -1
  154. package/dist/types/ChallengeResults/PMs/HasChallengeResultsPM.d.ts +7 -0
  155. package/dist/types/ChallengeResults/PMs/HasChallengeResultsPM.d.ts.map +1 -0
  156. package/dist/types/ChallengeResults/PMs/HasChallengeResultsPM.test.d.ts +2 -0
  157. package/dist/types/ChallengeResults/PMs/HasChallengeResultsPM.test.d.ts.map +1 -0
  158. package/dist/types/ChallengeResults/PMs/index.d.ts +1 -0
  159. package/dist/types/ChallengeResults/PMs/index.d.ts.map +1 -1
  160. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts +4 -0
  161. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts.map +1 -0
  162. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts +2 -0
  163. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts.map +1 -0
  164. package/dist/types/StateMachine/Adapters/index.d.ts +1 -0
  165. package/dist/types/StateMachine/Adapters/index.d.ts.map +1 -1
  166. package/dist/types/StateMachine/Controllers/editStateName.d.ts +3 -0
  167. package/dist/types/StateMachine/Controllers/editStateName.d.ts.map +1 -0
  168. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts +2 -0
  169. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts.map +1 -0
  170. package/dist/types/StateMachine/Controllers/index.d.ts +1 -0
  171. package/dist/types/StateMachine/Controllers/index.d.ts.map +1 -1
  172. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +6 -0
  173. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
  174. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts +7 -0
  175. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts.map +1 -0
  176. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts +9 -0
  177. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts.map +1 -0
  178. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts +3 -4
  179. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts.map +1 -1
  180. package/dist/types/StateMachine/PMs/HostStatePM.d.ts +18 -0
  181. package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -0
  182. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts +2 -0
  183. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts.map +1 -0
  184. package/dist/types/StateMachine/PMs/index.d.ts +1 -0
  185. package/dist/types/StateMachine/PMs/index.d.ts.map +1 -1
  186. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts +9 -0
  187. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts.map +1 -0
  188. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts +2 -0
  189. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts.map +1 -0
  190. package/dist/types/StateMachine/UCs/index.d.ts +1 -0
  191. package/dist/types/StateMachine/UCs/index.d.ts.map +1 -1
  192. package/dist/types/ThemeColors/Factories/index.d.ts +1 -1
  193. package/dist/types/ThemeColors/Factories/index.d.ts.map +1 -1
  194. package/dist/types/ThemeColors/Factories/setupTheme.d.ts +3 -0
  195. package/dist/types/ThemeColors/Factories/setupTheme.d.ts.map +1 -0
  196. package/package.json +1 -1
@@ -14,14 +14,27 @@ class HostStateMachineImp extends HostStateMachine {
14
14
  get states() {
15
15
  return this._states.map((state) => state.id);
16
16
  }
17
+ get stateCount() {
18
+ return this._states.length;
19
+ }
17
20
  get activeState() {
18
21
  return this._activeState;
19
22
  }
20
23
  get previousState() {
21
- return this._previousState;
24
+ if (!this._activeState)
25
+ return undefined;
26
+ const currentIndex = this.getStateIndex(this._activeState);
27
+ if (currentIndex === undefined || currentIndex === 0)
28
+ return undefined;
29
+ return this._states[currentIndex - 1].id;
22
30
  }
23
31
  get nextState() {
24
- return this._nextState;
32
+ if (!this._activeState)
33
+ return undefined;
34
+ const currentIndex = this.getStateIndex(this._activeState);
35
+ if (currentIndex === undefined || currentIndex >= this._states.length - 1)
36
+ return undefined;
37
+ return this._states[currentIndex + 1].id;
25
38
  }
26
39
  get isAuthoring() {
27
40
  return this.memoizedIsAuthoring.val;
@@ -80,33 +93,17 @@ class HostStateMachineImp extends HostStateMachine {
80
93
  if (state.id === this._activeState)
81
94
  return;
82
95
  this._activeState = state.id;
83
- const index = this.getStateIndex(id);
84
- if (index === undefined) {
85
- this._nextState = undefined;
86
- this._previousState = undefined;
87
- return;
88
- }
89
- const prevIndex = index - 1;
90
- const nextIndex = index + 1;
91
- if (prevIndex >= 0) {
92
- this._previousState = this._states[prevIndex].id;
93
- }
94
- else {
95
- this._previousState = undefined;
96
- }
97
- if (nextIndex < this._states.length) {
98
- this._nextState = this._states[nextIndex].id;
99
- }
100
- else {
101
- this._nextState = undefined;
102
- }
103
96
  this.notifyOnChange();
104
97
  };
98
+ this.setActiveStateByIndex = (index) => {
99
+ if (index < 0 || index >= this._states.length)
100
+ return;
101
+ const state = this._states[index];
102
+ this.setActiveStateByID(state.id);
103
+ };
105
104
  this.clearActiveState = () => {
106
105
  if (!this.activeState)
107
106
  return;
108
- this._nextState = undefined;
109
- this._previousState = undefined;
110
107
  this._activeState = undefined;
111
108
  this.notifyOnChange();
112
109
  };
@@ -137,6 +134,17 @@ class HostStateMachineImp extends HostStateMachine {
137
134
  this._states.splice(index, 1);
138
135
  this.notifyOnChange();
139
136
  };
137
+ this.deleteAllStates = () => {
138
+ if (this._states.length === 0)
139
+ return;
140
+ // Dispose all state app objects
141
+ this._states.forEach((state) => {
142
+ state.appObject.dispose();
143
+ });
144
+ this._states = [];
145
+ this.clearActiveState();
146
+ this.notifyOnChange();
147
+ };
140
148
  this.getStateIndex = (id) => {
141
149
  let index = -1;
142
150
  this._states.forEach((state, i) => {
@@ -151,6 +159,41 @@ class HostStateMachineImp extends HostStateMachine {
151
159
  return undefined;
152
160
  }
153
161
  };
162
+ this.setPreviousStateActive = () => {
163
+ if (!this.previousState)
164
+ return;
165
+ this.setActiveStateByID(this.previousState);
166
+ };
167
+ this.setNextStateActive = () => {
168
+ if (!this.nextState)
169
+ return;
170
+ this.setActiveStateByID(this.nextState);
171
+ };
172
+ this.setStateIndex = (stateID, index) => {
173
+ // Check if the state exists
174
+ const state = this.getStateByID(stateID);
175
+ if (!state)
176
+ return;
177
+ // Check if the index is valid
178
+ if (index < 0 || index >= this._states.length)
179
+ return;
180
+ // Get the current index
181
+ const currentIndex = this.getStateIndex(stateID);
182
+ if (currentIndex === undefined)
183
+ return;
184
+ // If the index is the same, do nothing
185
+ if (currentIndex === index)
186
+ return;
187
+ // Remove the state from the current position
188
+ const stateToMove = this._states.splice(currentIndex, 1)[0];
189
+ // Insert it at the new position
190
+ this._states.splice(index, 0, stateToMove);
191
+ // If the moved state was active, update previous and next states
192
+ if (stateID === this._activeState) {
193
+ this.setActiveStateByID(stateID);
194
+ }
195
+ this.notifyOnChange();
196
+ };
154
197
  this.appObjects.registerSingleton(this);
155
198
  }
156
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n private _previousState: string | undefined;\r\n get previousState() {\r\n return this._previousState;\r\n }\r\n\r\n private _nextState: string | undefined;\r\n get nextState() {\r\n return this._nextState;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n return;\r\n }\r\n\r\n const prevIndex = index - 1;\r\n const nextIndex = index + 1;\r\n\r\n if (prevIndex >= 0) {\r\n this._previousState = this._states[prevIndex].id;\r\n } else {\r\n this._previousState = undefined;\r\n }\r\n\r\n if (nextIndex < this._states.length) {\r\n this._nextState = this._states[nextIndex].id;\r\n } else {\r\n this._nextState = undefined;\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n abstract stateCount: number;\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract deleteAllStates: () => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n abstract setPreviousStateActive: () => void;\r\n abstract setNextStateActive: () => void;\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n get previousState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex === 0) return undefined;\r\n \r\n return this._states[currentIndex - 1].id;\r\n }\r\n\r\n get nextState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex >= this._states.length - 1) return undefined;\r\n \r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n setActiveStateByIndex = (index: number): void => {\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n const state = this._states[index];\r\n this.setActiveStateByID(state.id);\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n deleteAllStates = (): void => {\r\n if (this._states.length === 0) return;\r\n\r\n // Dispose all state app objects\r\n this._states.forEach((state) => {\r\n state.appObject.dispose();\r\n });\r\n\r\n this._states = [];\r\n this.clearActiveState();\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n setPreviousStateActive = (): void => {\r\n if (!this.previousState) return;\r\n\r\n this.setActiveStateByID(this.previousState);\r\n };\r\n\r\n setNextStateActive = (): void => {\r\n if (!this.nextState) return;\r\n\r\n this.setActiveStateByID(this.nextState);\r\n };\r\n\r\n setStateIndex = (stateID: string, index: number): void => {\r\n // Check if the state exists\r\n const state = this.getStateByID(stateID);\r\n if (!state) return;\r\n\r\n // Check if the index is valid\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n // Get the current index\r\n const currentIndex = this.getStateIndex(stateID);\r\n if (currentIndex === undefined) return;\r\n\r\n // If the index is the same, do nothing\r\n if (currentIndex === index) return;\r\n\r\n // Remove the state from the current position\r\n const stateToMove = this._states.splice(currentIndex, 1)[0];\r\n\r\n // Insert it at the new position\r\n this._states.splice(index, 0, stateToMove);\r\n\r\n // If the moved state was active, update previous and next states\r\n if (stateID === this._activeState) {\r\n this.setActiveStateByID(stateID);\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -128,5 +128,179 @@ describe("State Machine", () => {
128
128
  expect(stateMachine.hasState("state1")).toEqual(true);
129
129
  expect(stateMachine.hasState("somethingElse")).toEqual(false);
130
130
  });
131
+ it("Reports correct state count", () => {
132
+ const { stateMachine } = makeTestRig();
133
+ // Initial state has 2 states
134
+ expect(stateMachine.stateCount).toEqual(2);
135
+ // After adding a state
136
+ stateMachine.createNewState();
137
+ expect(stateMachine.stateCount).toEqual(3);
138
+ // After deleting a state
139
+ stateMachine.deleteState("state1");
140
+ expect(stateMachine.stateCount).toEqual(2);
141
+ });
142
+ it("Sets active state by index", () => {
143
+ const { stateMachine, observer } = makeTestRig();
144
+ observer.mockClear();
145
+ stateMachine.setActiveStateByIndex(1);
146
+ expect(stateMachine.activeState).toEqual("state2");
147
+ expect(observer).toBeCalled();
148
+ });
149
+ it("Does nothing if index is out of bounds", () => {
150
+ const { stateMachine, observer } = makeTestRig();
151
+ observer.mockClear();
152
+ // With negative index
153
+ stateMachine.setActiveStateByIndex(-1);
154
+ expect(stateMachine.activeState).toBeUndefined();
155
+ expect(observer).not.toBeCalled();
156
+ // With too large index
157
+ stateMachine.setActiveStateByIndex(5);
158
+ expect(stateMachine.activeState).toBeUndefined();
159
+ expect(observer).not.toBeCalled();
160
+ });
161
+ it("Sets previous and next state correctly when using setActiveStateByIndex", () => {
162
+ const { stateMachine } = makeTestRig();
163
+ stateMachine.createNewState(); // Now 3 states
164
+ stateMachine.setActiveStateByIndex(1);
165
+ expect(stateMachine.activeState).toEqual("state2");
166
+ expect(stateMachine.previousState).toEqual("state1");
167
+ expect(stateMachine.nextState).not.toBeUndefined();
168
+ });
169
+ it("Deletes all states", () => {
170
+ const { stateMachine, observer } = makeTestRig();
171
+ observer.mockClear();
172
+ stateMachine.deleteAllStates();
173
+ expect(stateMachine.states).toHaveLength(0);
174
+ expect(stateMachine.stateCount).toEqual(0);
175
+ expect(observer).toBeCalled();
176
+ });
177
+ it("Does not notify if there are no states to delete", () => {
178
+ const { stateMachine, observer } = makeTestRig();
179
+ stateMachine.deleteAllStates(); // Clear all states first
180
+ observer.mockClear();
181
+ stateMachine.deleteAllStates(); // Try again with empty states
182
+ expect(observer).not.toBeCalled();
183
+ });
184
+ it("Disposes all state app objects when deleting all states", () => {
185
+ const { stateMachine } = makeTestRig();
186
+ // Create mock dispose functions for each state
187
+ const state1 = stateMachine.getStateByID("state1");
188
+ const state2 = stateMachine.getStateByID("state2");
189
+ expect(state1).not.toBeUndefined();
190
+ expect(state2).not.toBeUndefined();
191
+ state1.appObject.dispose = jest.fn();
192
+ state2.appObject.dispose = jest.fn();
193
+ stateMachine.deleteAllStates();
194
+ expect(state1.appObject.dispose).toBeCalled();
195
+ expect(state2.appObject.dispose).toBeCalled();
196
+ });
197
+ it("Clears active state when deleting all states", () => {
198
+ const { stateMachine } = makeTestRig();
199
+ stateMachine.setActiveStateByID("state1");
200
+ expect(stateMachine.activeState).toEqual("state1");
201
+ stateMachine.deleteAllStates();
202
+ expect(stateMachine.activeState).toBeUndefined();
203
+ expect(stateMachine.previousState).toBeUndefined();
204
+ expect(stateMachine.nextState).toBeUndefined();
205
+ });
206
+ it("Sets previous state active", () => {
207
+ const { stateMachine, observer } = makeTestRig();
208
+ // Set state2 as active so state1 becomes the previous state
209
+ stateMachine.setActiveStateByID("state2");
210
+ observer.mockClear();
211
+ // Now call setPreviousStateActive
212
+ stateMachine.setPreviousStateActive();
213
+ expect(stateMachine.activeState).toEqual("state1");
214
+ expect(observer).toBeCalled();
215
+ });
216
+ it("Does nothing when setting previous state active if there is no previous state", () => {
217
+ const { stateMachine, observer } = makeTestRig();
218
+ // Set state1 as active (which has no previous state)
219
+ stateMachine.setActiveStateByID("state1");
220
+ observer.mockClear();
221
+ // Now call setPreviousStateActive
222
+ stateMachine.setPreviousStateActive();
223
+ // Should remain on state1
224
+ expect(stateMachine.activeState).toEqual("state1");
225
+ expect(observer).not.toHaveBeenCalled();
226
+ });
227
+ it("Sets next state active", () => {
228
+ const { stateMachine, observer } = makeTestRig();
229
+ // Set state1 as active so state2 becomes the next state
230
+ stateMachine.setActiveStateByID("state1");
231
+ observer.mockClear();
232
+ // Now call setNextStateActive
233
+ stateMachine.setNextStateActive();
234
+ expect(stateMachine.activeState).toEqual("state2");
235
+ expect(observer).toHaveBeenCalled();
236
+ });
237
+ it("Does nothing when setting next state active if there is no next state", () => {
238
+ const { stateMachine, observer } = makeTestRig();
239
+ // Set state2 as active (which has no next state)
240
+ stateMachine.setActiveStateByID("state2");
241
+ observer.mockClear();
242
+ // Now call setNextStateActive
243
+ stateMachine.setNextStateActive();
244
+ // Should remain on state2
245
+ expect(stateMachine.activeState).toEqual("state2");
246
+ expect(observer).not.toHaveBeenCalled();
247
+ });
248
+ it("Sets state index", () => {
249
+ const { stateMachine, observer } = makeTestRig();
250
+ observer.mockClear();
251
+ // Save the initial states order
252
+ const initialStates = [...stateMachine.states];
253
+ // Move state2 to index 0 (before state1)
254
+ stateMachine.setStateIndex("state2", 0);
255
+ // Check that the order changed correctly
256
+ expect(stateMachine.states[0]).toEqual("state2");
257
+ expect(stateMachine.states[1]).toEqual("state1");
258
+ expect(observer).toHaveBeenCalled();
259
+ });
260
+ it("Does nothing if state ID doesn't exist when setting state index", () => {
261
+ const { stateMachine, observer } = makeTestRig();
262
+ observer.mockClear();
263
+ // Save the initial states order
264
+ const initialStates = [...stateMachine.states];
265
+ // Try to move a non-existent state
266
+ stateMachine.setStateIndex("nonExistentState", 0);
267
+ // Check that states remain unchanged
268
+ expect(stateMachine.states).toEqual(initialStates);
269
+ expect(observer).not.toHaveBeenCalled();
270
+ });
271
+ it("Does nothing if index is out of bounds when setting state index", () => {
272
+ const { stateMachine, observer } = makeTestRig();
273
+ observer.mockClear();
274
+ // Save the initial states order
275
+ const initialStates = [...stateMachine.states];
276
+ // Try to move to an invalid index (negative)
277
+ stateMachine.setStateIndex("state1", -1);
278
+ expect(stateMachine.states).toEqual(initialStates);
279
+ expect(observer).not.toHaveBeenCalled();
280
+ // Try to move to an invalid index (too large)
281
+ stateMachine.setStateIndex("state1", 10);
282
+ expect(stateMachine.states).toEqual(initialStates);
283
+ expect(observer).not.toHaveBeenCalled();
284
+ });
285
+ it("Does nothing if moving state to its current index", () => {
286
+ const { stateMachine, observer } = makeTestRig();
287
+ observer.mockClear();
288
+ // Try to move state1 to index 0 (its current position)
289
+ stateMachine.setStateIndex("state1", 0);
290
+ // Verify no notification happened
291
+ expect(observer).not.toHaveBeenCalled();
292
+ });
293
+ it("Updates active state relationships when moving the active state", () => {
294
+ const { stateMachine } = makeTestRig();
295
+ // Set state1 as active
296
+ stateMachine.setActiveStateByID("state1");
297
+ expect(stateMachine.nextState).toEqual("state2");
298
+ // Move state1 after state2
299
+ stateMachine.setStateIndex("state1", 1);
300
+ // Check that relationships updated correctly
301
+ expect(stateMachine.activeState).toEqual("state1");
302
+ expect(stateMachine.previousState).toEqual("state2");
303
+ expect(stateMachine.nextState).toBeUndefined();
304
+ });
131
305
  });
132
306
  //# sourceMappingURL=HostStateMachine.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HostStateMachine.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeAppObjectRepo } from \"@vived/core\";\r\nimport { makeHostStateEntity } from \"./HostStateEntity\";\r\nimport { HostStateMachine, makeHostStateMachine } from \"./HostStateMachine\";\r\n\r\nfunction makeTestRig() {\r\n const appObjects = makeAppObjectRepo();\r\n const registerSingletonSpy = jest.spyOn(appObjects, \"registerSingleton\");\r\n\r\n const stateMachine = makeHostStateMachine(\r\n appObjects.getOrCreate(\"StateMachine\")\r\n );\r\n const observer = jest.fn();\r\n stateMachine.addChangeObserver(observer);\r\n\r\n stateMachine.setStates([\r\n makeHostStateEntity(appObjects.getOrCreate(\"state1\")),\r\n makeHostStateEntity(appObjects.getOrCreate(\"state2\"))\r\n ]);\r\n\r\n return { stateMachine, observer, appObjects, registerSingletonSpy };\r\n}\r\n\r\ndescribe(\"State Machine\", () => {\r\n it(\"Gets the singleton\", () => {\r\n const { stateMachine, appObjects } = makeTestRig();\r\n\r\n expect(HostStateMachine.get(appObjects)).toEqual(stateMachine);\r\n });\r\n\r\n it(\"Register as the singleton\", () => {\r\n const { stateMachine, registerSingletonSpy } = makeTestRig();\r\n\r\n expect(registerSingletonSpy).toBeCalledWith(stateMachine);\r\n });\r\n\r\n it(\"Allows states to be set\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n expect(stateMachine.states).toHaveLength(2);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Creates a new state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n const newState = stateMachine.createNewState();\r\n\r\n expect(newState.id).not.toBeFalsy();\r\n\r\n expect(stateMachine.states).toHaveLength(3);\r\n expect(stateMachine.states[2]).toEqual(newState.id);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Retrieves a state\", () => {\r\n const { stateMachine } = makeTestRig();\r\n const newState = stateMachine.createNewState();\r\n const retrievedStateResult = stateMachine.getStateByID(newState.id);\r\n\r\n expect(retrievedStateResult).toEqual(newState);\r\n });\r\n\r\n it(\"Returns undefined if an unknowns state is requested\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const retrievedStateResult = stateMachine.getStateByID(\"unknownID\");\r\n expect(retrievedStateResult).toBeUndefined();\r\n });\r\n\r\n it(\"Deletes a state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.deleteState(\"state1\");\r\n\r\n expect(stateMachine.states).toHaveLength(1);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Disposes the State's AO on delete\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const stateAO = stateMachine.getStateByID(\"state1\")?.appObject;\r\n expect(stateAO).not.toBeUndefined();\r\n\r\n stateAO!.dispose = jest.fn();\r\n\r\n stateMachine.deleteState(\"state1\");\r\n\r\n expect(stateAO!.dispose).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify is a unknown state is deleted\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.deleteState(\"UnknownID\");\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Gets an index for a state by id\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const indexResult = stateMachine.getStateIndex(\"state1\");\r\n expect(indexResult).toEqual(0);\r\n });\r\n\r\n it(\"Notifies when the active state is set\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n expect(stateMachine.activeState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify if the active state is unchanged\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n stateMachine.setActiveStateByID(\"state1\");\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Notifies when the active state is cleared\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n stateMachine.clearActiveState();\r\n\r\n expect(stateMachine.activeState).toBeUndefined();\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify when the active state is cleared if there is no active state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n observer.mockClear();\r\n\r\n stateMachine.clearActiveState();\r\n stateMachine.clearActiveState();\r\n stateMachine.clearActiveState();\r\n\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Sets previous state as expected\", () => {\r\n const { stateMachine } = makeTestRig();\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.previousState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state2\");\r\n\r\n expect(stateMachine.previousState).toEqual(\"state1\");\r\n\r\n stateMachine.clearActiveState();\r\n\r\n expect(stateMachine.previousState).toBeUndefined();\r\n });\r\n\r\n it(\"Sets next state as expected\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n expect(stateMachine.nextState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.nextState).toEqual(\"state2\");\r\n\r\n stateMachine.setActiveStateByID(\"state2\");\r\n\r\n expect(stateMachine.nextState).toBeUndefined();\r\n });\r\n\r\n it(\"Has state\", () => {\r\n const { stateMachine } = makeTestRig();\r\n expect(stateMachine.hasState(\"state1\")).toEqual(true);\r\n expect(stateMachine.hasState(\"somethingElse\")).toEqual(false);\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"HostStateMachine.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeAppObjectRepo } from \"@vived/core\";\r\nimport { makeHostStateEntity } from \"./HostStateEntity\";\r\nimport { HostStateMachine, makeHostStateMachine } from \"./HostStateMachine\";\r\n\r\nfunction makeTestRig() {\r\n const appObjects = makeAppObjectRepo();\r\n const registerSingletonSpy = jest.spyOn(appObjects, \"registerSingleton\");\r\n\r\n const stateMachine = makeHostStateMachine(\r\n appObjects.getOrCreate(\"StateMachine\")\r\n );\r\n const observer = jest.fn();\r\n stateMachine.addChangeObserver(observer);\r\n\r\n stateMachine.setStates([\r\n makeHostStateEntity(appObjects.getOrCreate(\"state1\")),\r\n makeHostStateEntity(appObjects.getOrCreate(\"state2\"))\r\n ]);\r\n\r\n return { stateMachine, observer, appObjects, registerSingletonSpy };\r\n}\r\n\r\ndescribe(\"State Machine\", () => {\r\n it(\"Gets the singleton\", () => {\r\n const { stateMachine, appObjects } = makeTestRig();\r\n\r\n expect(HostStateMachine.get(appObjects)).toEqual(stateMachine);\r\n });\r\n\r\n it(\"Register as the singleton\", () => {\r\n const { stateMachine, registerSingletonSpy } = makeTestRig();\r\n\r\n expect(registerSingletonSpy).toBeCalledWith(stateMachine);\r\n });\r\n\r\n it(\"Allows states to be set\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n expect(stateMachine.states).toHaveLength(2);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Creates a new state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n const newState = stateMachine.createNewState();\r\n\r\n expect(newState.id).not.toBeFalsy();\r\n\r\n expect(stateMachine.states).toHaveLength(3);\r\n expect(stateMachine.states[2]).toEqual(newState.id);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Retrieves a state\", () => {\r\n const { stateMachine } = makeTestRig();\r\n const newState = stateMachine.createNewState();\r\n const retrievedStateResult = stateMachine.getStateByID(newState.id);\r\n\r\n expect(retrievedStateResult).toEqual(newState);\r\n });\r\n\r\n it(\"Returns undefined if an unknowns state is requested\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const retrievedStateResult = stateMachine.getStateByID(\"unknownID\");\r\n expect(retrievedStateResult).toBeUndefined();\r\n });\r\n\r\n it(\"Deletes a state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.deleteState(\"state1\");\r\n\r\n expect(stateMachine.states).toHaveLength(1);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Disposes the State's AO on delete\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const stateAO = stateMachine.getStateByID(\"state1\")?.appObject;\r\n expect(stateAO).not.toBeUndefined();\r\n\r\n stateAO!.dispose = jest.fn();\r\n\r\n stateMachine.deleteState(\"state1\");\r\n\r\n expect(stateAO!.dispose).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify is a unknown state is deleted\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.deleteState(\"UnknownID\");\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Gets an index for a state by id\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n const indexResult = stateMachine.getStateIndex(\"state1\");\r\n expect(indexResult).toEqual(0);\r\n });\r\n\r\n it(\"Notifies when the active state is set\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n expect(stateMachine.activeState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify if the active state is unchanged\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n stateMachine.setActiveStateByID(\"state1\");\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Notifies when the active state is cleared\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n stateMachine.clearActiveState();\r\n\r\n expect(stateMachine.activeState).toBeUndefined();\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify when the active state is cleared if there is no active state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n observer.mockClear();\r\n\r\n stateMachine.clearActiveState();\r\n stateMachine.clearActiveState();\r\n stateMachine.clearActiveState();\r\n\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Sets previous state as expected\", () => {\r\n const { stateMachine } = makeTestRig();\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.previousState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state2\");\r\n\r\n expect(stateMachine.previousState).toEqual(\"state1\");\r\n\r\n stateMachine.clearActiveState();\r\n\r\n expect(stateMachine.previousState).toBeUndefined();\r\n });\r\n\r\n it(\"Sets next state as expected\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n expect(stateMachine.nextState).toBeUndefined();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n\r\n expect(stateMachine.nextState).toEqual(\"state2\");\r\n\r\n stateMachine.setActiveStateByID(\"state2\");\r\n\r\n expect(stateMachine.nextState).toBeUndefined();\r\n });\r\n\r\n it(\"Has state\", () => {\r\n const { stateMachine } = makeTestRig();\r\n expect(stateMachine.hasState(\"state1\")).toEqual(true);\r\n expect(stateMachine.hasState(\"somethingElse\")).toEqual(false);\r\n });\r\n\r\n it(\"Reports correct state count\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n // Initial state has 2 states\r\n expect(stateMachine.stateCount).toEqual(2);\r\n\r\n // After adding a state\r\n stateMachine.createNewState();\r\n expect(stateMachine.stateCount).toEqual(3);\r\n\r\n // After deleting a state\r\n stateMachine.deleteState(\"state1\");\r\n expect(stateMachine.stateCount).toEqual(2);\r\n });\r\n\r\n it(\"Sets active state by index\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.setActiveStateByIndex(1);\r\n\r\n expect(stateMachine.activeState).toEqual(\"state2\");\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does nothing if index is out of bounds\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n // With negative index\r\n stateMachine.setActiveStateByIndex(-1);\r\n expect(stateMachine.activeState).toBeUndefined();\r\n expect(observer).not.toBeCalled();\r\n\r\n // With too large index\r\n stateMachine.setActiveStateByIndex(5);\r\n expect(stateMachine.activeState).toBeUndefined();\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Sets previous and next state correctly when using setActiveStateByIndex\", () => {\r\n const { stateMachine } = makeTestRig();\r\n stateMachine.createNewState(); // Now 3 states\r\n\r\n stateMachine.setActiveStateByIndex(1);\r\n\r\n expect(stateMachine.activeState).toEqual(\"state2\");\r\n expect(stateMachine.previousState).toEqual(\"state1\");\r\n expect(stateMachine.nextState).not.toBeUndefined();\r\n });\r\n\r\n it(\"Deletes all states\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n stateMachine.deleteAllStates();\r\n\r\n expect(stateMachine.states).toHaveLength(0);\r\n expect(stateMachine.stateCount).toEqual(0);\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does not notify if there are no states to delete\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n stateMachine.deleteAllStates(); // Clear all states first\r\n observer.mockClear();\r\n\r\n stateMachine.deleteAllStates(); // Try again with empty states\r\n expect(observer).not.toBeCalled();\r\n });\r\n\r\n it(\"Disposes all state app objects when deleting all states\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n // Create mock dispose functions for each state\r\n const state1 = stateMachine.getStateByID(\"state1\");\r\n const state2 = stateMachine.getStateByID(\"state2\");\r\n\r\n expect(state1).not.toBeUndefined();\r\n expect(state2).not.toBeUndefined();\r\n\r\n state1!.appObject.dispose = jest.fn();\r\n state2!.appObject.dispose = jest.fn();\r\n\r\n stateMachine.deleteAllStates();\r\n\r\n expect(state1!.appObject.dispose).toBeCalled();\r\n expect(state2!.appObject.dispose).toBeCalled();\r\n });\r\n\r\n it(\"Clears active state when deleting all states\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n stateMachine.setActiveStateByID(\"state1\");\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n\r\n stateMachine.deleteAllStates();\r\n\r\n expect(stateMachine.activeState).toBeUndefined();\r\n expect(stateMachine.previousState).toBeUndefined();\r\n expect(stateMachine.nextState).toBeUndefined();\r\n });\r\n\r\n it(\"Sets previous state active\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n // Set state2 as active so state1 becomes the previous state\r\n stateMachine.setActiveStateByID(\"state2\");\r\n observer.mockClear();\r\n\r\n // Now call setPreviousStateActive\r\n stateMachine.setPreviousStateActive();\r\n\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n expect(observer).toBeCalled();\r\n });\r\n\r\n it(\"Does nothing when setting previous state active if there is no previous state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n // Set state1 as active (which has no previous state)\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n // Now call setPreviousStateActive\r\n stateMachine.setPreviousStateActive();\r\n\r\n // Should remain on state1\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n expect(observer).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Sets next state active\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n // Set state1 as active so state2 becomes the next state\r\n stateMachine.setActiveStateByID(\"state1\");\r\n observer.mockClear();\r\n\r\n // Now call setNextStateActive\r\n stateMachine.setNextStateActive();\r\n\r\n expect(stateMachine.activeState).toEqual(\"state2\");\r\n expect(observer).toHaveBeenCalled();\r\n });\r\n\r\n it(\"Does nothing when setting next state active if there is no next state\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n\r\n // Set state2 as active (which has no next state)\r\n stateMachine.setActiveStateByID(\"state2\");\r\n observer.mockClear();\r\n\r\n // Now call setNextStateActive\r\n stateMachine.setNextStateActive();\r\n\r\n // Should remain on state2\r\n expect(stateMachine.activeState).toEqual(\"state2\");\r\n expect(observer).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Sets state index\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n // Save the initial states order\r\n const initialStates = [...stateMachine.states];\r\n\r\n // Move state2 to index 0 (before state1)\r\n stateMachine.setStateIndex(\"state2\", 0);\r\n\r\n // Check that the order changed correctly\r\n expect(stateMachine.states[0]).toEqual(\"state2\");\r\n expect(stateMachine.states[1]).toEqual(\"state1\");\r\n expect(observer).toHaveBeenCalled();\r\n });\r\n\r\n it(\"Does nothing if state ID doesn't exist when setting state index\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n // Save the initial states order\r\n const initialStates = [...stateMachine.states];\r\n\r\n // Try to move a non-existent state\r\n stateMachine.setStateIndex(\"nonExistentState\", 0);\r\n\r\n // Check that states remain unchanged\r\n expect(stateMachine.states).toEqual(initialStates);\r\n expect(observer).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Does nothing if index is out of bounds when setting state index\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n // Save the initial states order\r\n const initialStates = [...stateMachine.states];\r\n\r\n // Try to move to an invalid index (negative)\r\n stateMachine.setStateIndex(\"state1\", -1);\r\n expect(stateMachine.states).toEqual(initialStates);\r\n expect(observer).not.toHaveBeenCalled();\r\n\r\n // Try to move to an invalid index (too large)\r\n stateMachine.setStateIndex(\"state1\", 10);\r\n expect(stateMachine.states).toEqual(initialStates);\r\n expect(observer).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Does nothing if moving state to its current index\", () => {\r\n const { stateMachine, observer } = makeTestRig();\r\n observer.mockClear();\r\n\r\n // Try to move state1 to index 0 (its current position)\r\n stateMachine.setStateIndex(\"state1\", 0);\r\n\r\n // Verify no notification happened\r\n expect(observer).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Updates active state relationships when moving the active state\", () => {\r\n const { stateMachine } = makeTestRig();\r\n\r\n // Set state1 as active\r\n stateMachine.setActiveStateByID(\"state1\");\r\n expect(stateMachine.nextState).toEqual(\"state2\");\r\n\r\n // Move state1 after state2\r\n stateMachine.setStateIndex(\"state1\", 1);\r\n\r\n // Check that relationships updated correctly\r\n expect(stateMachine.activeState).toEqual(\"state1\");\r\n expect(stateMachine.previousState).toEqual(\"state2\");\r\n expect(stateMachine.nextState).toBeUndefined();\r\n });\r\n});\r\n"]}
@@ -0,0 +1,8 @@
1
+ import { EditStateNameUC } from "../UCs/EditStateNameUC";
2
+ export class MockEditStateNameUC extends EditStateNameUC {
3
+ constructor(appObject) {
4
+ super(appObject, EditStateNameUC.type);
5
+ this.editStateName = jest.fn();
6
+ }
7
+ }
8
+ //# sourceMappingURL=MockEditStateNameUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockEditStateNameUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockEditStateNameUC.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAGtD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAHzC,kBAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAI1B,CAAC;CACF","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { EditStateNameUC } from \"../UCs/EditStateNameUC\";\r\n\r\nexport class MockEditStateNameUC extends EditStateNameUC {\r\n editStateName = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EditStateNameUC.type);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,18 @@
1
+ import { HostStatePM } from "../PMs/HostStatePM";
2
+ export class MockHostStatePM extends HostStatePM {
3
+ // Simple implementation that always returns true for equality checks
4
+ vmsAreEqual(a, b) {
5
+ return true;
6
+ }
7
+ // Exposed method to manually trigger a view model update
8
+ updateVM(vm) {
9
+ this.doUpdateView(vm);
10
+ }
11
+ constructor(appObject) {
12
+ super(appObject, HostStatePM.type);
13
+ }
14
+ }
15
+ export function makeMockHostStatePM(appObject) {
16
+ return new MockHostStatePM(appObject);
17
+ }
18
+ //# sourceMappingURL=MockHostStatePM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockHostStatePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockHostStatePM.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAE9D,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,qEAAqE;IACrE,WAAW,CAAC,CAAc,EAAE,CAAc;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yDAAyD;IACzD,QAAQ,CAAC,EAAe;QACtB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,OAAO,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { HostStatePM, HostStateVM } from \"../PMs/HostStatePM\";\r\n\r\nexport class MockHostStatePM extends HostStatePM {\r\n // Simple implementation that always returns true for equality checks\r\n vmsAreEqual(a: HostStateVM, b: HostStateVM): boolean {\r\n return true;\r\n }\r\n\r\n // Exposed method to manually trigger a view model update\r\n updateVM(vm: HostStateVM): void {\r\n this.doUpdateView(vm);\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStatePM.type);\r\n }\r\n}\r\n\r\nexport function makeMockHostStatePM(appObject: AppObject): MockHostStatePM {\r\n return new MockHostStatePM(appObject);\r\n}\r\n"]}
@@ -13,36 +13,40 @@ class HostStateMachinePMImp extends HostStateMachinePM {
13
13
  vmsAreEqual(a, b) {
14
14
  if (a.activeSlideID !== b.activeSlideID)
15
15
  return false;
16
+ if (a.activeSlideName !== b.activeSlideName)
17
+ return false;
16
18
  if (a.nextSlideID !== b.nextSlideID)
17
19
  return false;
18
20
  if (a.previousSlideID !== b.previousSlideID)
19
21
  return false;
20
22
  if (a.states.length !== b.states.length)
21
23
  return false;
22
- let statesAreEqual = true;
23
- a.states.forEach((stateA, i) => {
24
- const stateB = b.states[i];
25
- if (stateA.id !== stateB.id)
26
- statesAreEqual = false;
27
- if (stateA.name !== stateB.name)
28
- statesAreEqual = false;
29
- });
30
- return statesAreEqual;
24
+ if (a.isSingleSlide !== b.isSingleSlide)
25
+ return false;
26
+ // Compare states arrays
27
+ for (let i = 0; i < a.states.length; i++) {
28
+ if (a.states[i] !== b.states[i])
29
+ return false;
30
+ }
31
+ return true;
31
32
  }
32
33
  constructor(appObject) {
33
34
  super(appObject, HostStateMachinePM.type);
34
35
  this.onEntityChange = () => {
35
36
  if (!this.stateMachine)
36
37
  return;
37
- const states = this.stateMachine.states.map((stateID) => {
38
- const name = this.stateMachine?.getStateByID(stateID)?.name ?? "";
39
- return { id: stateID, name };
40
- });
38
+ // Get the state IDs directly without mapping to name
39
+ const states = [...this.stateMachine.states];
40
+ const activeStateName = this.stateMachine.activeState
41
+ ? this.stateMachine.getStateByID(this.stateMachine.activeState)?.name
42
+ : undefined;
41
43
  const vm = {
42
44
  activeSlideID: this.stateMachine.activeState,
45
+ activeSlideName: activeStateName,
43
46
  nextSlideID: this.stateMachine.nextState,
44
47
  previousSlideID: this.stateMachine.previousState,
45
- states
48
+ states,
49
+ isSingleSlide: states.length === 1
46
50
  };
47
51
  this.doUpdateView(vm);
48
52
  };
@@ -58,8 +62,10 @@ class HostStateMachinePMImp extends HostStateMachinePM {
58
62
  }
59
63
  export const defaultHostStateMachineVM = {
60
64
  activeSlideID: undefined,
65
+ activeSlideName: undefined,
61
66
  nextSlideID: undefined,
62
67
  previousSlideID: undefined,
63
- states: []
68
+ states: [],
69
+ isSingleSlide: false
64
70
  };
65
71
  //# sourceMappingURL=HostStateMachinePM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HostStateMachinePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStateMachinePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport interface HostStateMachineVM {\r\n activeSlideID: string | undefined;\r\n nextSlideID: string | undefined;\r\n previousSlideID: string | undefined;\r\n states: { id: string; name: string }[];\r\n}\r\n\r\nexport abstract class HostStateMachinePM extends AppObjectPM<HostStateMachineVM> {\r\n static type = \"HostStateMachinePM\";\r\n\r\n static get(appObjects: AppObjectRepo): HostStateMachinePM | undefined {\r\n return getSingletonComponent(HostStateMachinePM.type, appObjects);\r\n }\r\n}\r\n\r\nexport function makeHostStateMachinePM(appObject: AppObject) {\r\n return new HostStateMachinePMImp(appObject);\r\n}\r\n\r\nclass HostStateMachinePMImp extends HostStateMachinePM {\r\n private stateMachine?: HostStateMachine;\r\n\r\n vmsAreEqual(a: HostStateMachineVM, b: HostStateMachineVM): boolean {\r\n if (a.activeSlideID !== b.activeSlideID) return false;\r\n if (a.nextSlideID !== b.nextSlideID) return false;\r\n if (a.previousSlideID !== b.previousSlideID) return false;\r\n if (a.states.length !== b.states.length) return false;\r\n\r\n let statesAreEqual = true;\r\n a.states.forEach((stateA, i) => {\r\n const stateB = b.states[i];\r\n if (stateA.id !== stateB.id) statesAreEqual = false;\r\n if (stateA.name !== stateB.name) statesAreEqual = false;\r\n });\r\n\r\n return statesAreEqual;\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.stateMachine) return;\r\n\r\n const states = this.stateMachine.states.map((stateID) => {\r\n const name = this.stateMachine?.getStateByID(stateID)?.name ?? \"\";\r\n return { id: stateID, name };\r\n });\r\n\r\n const vm: HostStateMachineVM = {\r\n activeSlideID: this.stateMachine.activeState,\r\n nextSlideID: this.stateMachine.nextState,\r\n previousSlideID: this.stateMachine.previousState,\r\n states\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachinePM.type);\r\n\r\n this.stateMachine = appObject.getComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n if (!this.stateMachine) {\r\n this.error(\r\n \"PM has been added to an App Object that does not have a HostStateMachine\"\r\n );\r\n return;\r\n }\r\n\r\n this.stateMachine.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n\r\nexport const defaultHostStateMachineVM: HostStateMachineVM = {\r\n activeSlideID: undefined,\r\n nextSlideID: undefined,\r\n previousSlideID: undefined,\r\n states: []\r\n};\r\n"]}
1
+ {"version":3,"file":"HostStateMachinePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStateMachinePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport interface HostStateMachineVM {\r\n activeSlideID: string | undefined;\r\n activeSlideName: string | undefined;\r\n nextSlideID: string | undefined;\r\n previousSlideID: string | undefined;\r\n states: string[];\r\n isSingleSlide: boolean;\r\n}\r\n\r\nexport abstract class HostStateMachinePM extends AppObjectPM<HostStateMachineVM> {\r\n static type = \"HostStateMachinePM\";\r\n\r\n static get(appObjects: AppObjectRepo): HostStateMachinePM | undefined {\r\n return getSingletonComponent(HostStateMachinePM.type, appObjects);\r\n }\r\n}\r\n\r\nexport function makeHostStateMachinePM(appObject: AppObject) {\r\n return new HostStateMachinePMImp(appObject);\r\n}\r\n\r\nclass HostStateMachinePMImp extends HostStateMachinePM {\r\n private stateMachine?: HostStateMachine;\r\n\r\n vmsAreEqual(a: HostStateMachineVM, b: HostStateMachineVM): boolean {\r\n if (a.activeSlideID !== b.activeSlideID) return false;\r\n if (a.activeSlideName !== b.activeSlideName) return false;\r\n if (a.nextSlideID !== b.nextSlideID) return false;\r\n if (a.previousSlideID !== b.previousSlideID) return false;\r\n if (a.states.length !== b.states.length) return false;\r\n if (a.isSingleSlide !== b.isSingleSlide) return false;\r\n\r\n // Compare states arrays\r\n for (let i = 0; i < a.states.length; i++) {\r\n if (a.states[i] !== b.states[i]) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.stateMachine) return;\r\n\r\n // Get the state IDs directly without mapping to name\r\n const states = [...this.stateMachine.states];\r\n\r\n const activeStateName = this.stateMachine.activeState\r\n ? this.stateMachine.getStateByID(this.stateMachine.activeState)?.name\r\n : undefined;\r\n\r\n const vm: HostStateMachineVM = {\r\n activeSlideID: this.stateMachine.activeState,\r\n activeSlideName: activeStateName,\r\n nextSlideID: this.stateMachine.nextState,\r\n previousSlideID: this.stateMachine.previousState,\r\n states,\r\n isSingleSlide: states.length === 1\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachinePM.type);\r\n\r\n this.stateMachine = appObject.getComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n if (!this.stateMachine) {\r\n this.error(\r\n \"PM has been added to an App Object that does not have a HostStateMachine\"\r\n );\r\n return;\r\n }\r\n\r\n this.stateMachine.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n\r\nexport const defaultHostStateMachineVM: HostStateMachineVM = {\r\n activeSlideID: undefined,\r\n activeSlideName: undefined,\r\n nextSlideID: undefined,\r\n previousSlideID: undefined,\r\n states: [],\r\n isSingleSlide: false\r\n};\r\n"]}