@vived/host 4.5.3 → 4.7.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 (95) hide show
  1. package/dist/cjs/Apps/Entities/AppEntity.js +29 -3
  2. package/dist/cjs/Apps/Entities/AppEntity.js.map +1 -1
  3. package/dist/cjs/Apps/PMs/AppPM.js +44 -3
  4. package/dist/cjs/Apps/PMs/AppPM.js.map +1 -1
  5. package/dist/cjs/Assets/Adapters/assetFileAdapter.js +45 -0
  6. package/dist/cjs/Assets/Adapters/assetFileAdapter.js.map +1 -0
  7. package/dist/cjs/Assets/Adapters/index.js +1 -0
  8. package/dist/cjs/Assets/Adapters/index.js.map +1 -1
  9. package/dist/cjs/Assets/Factories/setupAssetsForSandbox.js +1 -0
  10. package/dist/cjs/Assets/Factories/setupAssetsForSandbox.js.map +1 -1
  11. package/dist/cjs/Assets/Mocks/AssetFilePMMock.js +24 -0
  12. package/dist/cjs/Assets/Mocks/AssetFilePMMock.js.map +1 -0
  13. package/dist/cjs/Assets/Mocks/index.js +1 -0
  14. package/dist/cjs/Assets/Mocks/index.js.map +1 -1
  15. package/dist/cjs/Assets/PMs/AssetFilePM.js +134 -0
  16. package/dist/cjs/Assets/PMs/AssetFilePM.js.map +1 -0
  17. package/dist/cjs/Assets/PMs/index.js +1 -0
  18. package/dist/cjs/Assets/PMs/index.js.map +1 -1
  19. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js +62 -0
  20. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  21. package/dist/cjs/StateMachine/Entities/HostStateEntity.js +91 -2
  22. package/dist/cjs/StateMachine/Entities/HostStateEntity.js.map +1 -1
  23. package/dist/cjs/StateMachine/Entities/HostStateMachine.js +127 -0
  24. package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
  25. package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js +1 -0
  26. package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
  27. package/dist/cjs/StateMachine/PMs/HostStatePM.js +6 -2
  28. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -1
  29. package/dist/cjs/StateMachine/UCs/DeleteStateUC.js +1 -1
  30. package/dist/cjs/StateMachine/UCs/DeleteStateUC.js.map +1 -1
  31. package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js +1 -1
  32. package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
  33. package/dist/cjs/StateMachine/UCs/SavePersistentStates.js.map +1 -1
  34. package/dist/esm/Apps/Entities/AppEntity.js +30 -4
  35. package/dist/esm/Apps/Entities/AppEntity.js.map +1 -1
  36. package/dist/esm/Apps/PMs/AppPM.js +44 -3
  37. package/dist/esm/Apps/PMs/AppPM.js.map +1 -1
  38. package/dist/esm/Assets/Adapters/assetFileAdapter.js +42 -0
  39. package/dist/esm/Assets/Adapters/assetFileAdapter.js.map +1 -0
  40. package/dist/esm/Assets/Adapters/index.js +1 -0
  41. package/dist/esm/Assets/Adapters/index.js.map +1 -1
  42. package/dist/esm/Assets/Factories/setupAssetsForSandbox.js +2 -1
  43. package/dist/esm/Assets/Factories/setupAssetsForSandbox.js.map +1 -1
  44. package/dist/esm/Assets/Mocks/AssetFilePMMock.js +20 -0
  45. package/dist/esm/Assets/Mocks/AssetFilePMMock.js.map +1 -0
  46. package/dist/esm/Assets/Mocks/index.js +1 -0
  47. package/dist/esm/Assets/Mocks/index.js.map +1 -1
  48. package/dist/esm/Assets/PMs/AssetFilePM.js +129 -0
  49. package/dist/esm/Assets/PMs/AssetFilePM.js.map +1 -0
  50. package/dist/esm/Assets/PMs/index.js +1 -0
  51. package/dist/esm/Assets/PMs/index.js.map +1 -1
  52. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js +62 -0
  53. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  54. package/dist/esm/StateMachine/Entities/HostStateEntity.js +90 -1
  55. package/dist/esm/StateMachine/Entities/HostStateEntity.js.map +1 -1
  56. package/dist/esm/StateMachine/Entities/HostStateMachine.js +127 -0
  57. package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
  58. package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js +2 -1
  59. package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
  60. package/dist/esm/StateMachine/PMs/HostStatePM.js +7 -3
  61. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -1
  62. package/dist/esm/StateMachine/UCs/DeleteStateUC.js +1 -1
  63. package/dist/esm/StateMachine/UCs/DeleteStateUC.js.map +1 -1
  64. package/dist/esm/StateMachine/UCs/DuplicateStateUC.js +1 -1
  65. package/dist/esm/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
  66. package/dist/esm/StateMachine/UCs/SavePersistentStates.js.map +1 -1
  67. package/dist/types/Apps/Entities/AppEntity.d.ts +1 -0
  68. package/dist/types/Apps/Entities/AppEntity.d.ts.map +1 -1
  69. package/dist/types/Apps/PMs/AppPM.d.ts +2 -0
  70. package/dist/types/Apps/PMs/AppPM.d.ts.map +1 -1
  71. package/dist/types/Assets/Adapters/assetFileAdapter.d.ts +8 -0
  72. package/dist/types/Assets/Adapters/assetFileAdapter.d.ts.map +1 -0
  73. package/dist/types/Assets/Adapters/index.d.ts +1 -0
  74. package/dist/types/Assets/Adapters/index.d.ts.map +1 -1
  75. package/dist/types/Assets/Factories/setupAssetsForSandbox.d.ts.map +1 -1
  76. package/dist/types/Assets/Mocks/AssetFilePMMock.d.ts +19 -0
  77. package/dist/types/Assets/Mocks/AssetFilePMMock.d.ts.map +1 -0
  78. package/dist/types/Assets/Mocks/index.d.ts +1 -0
  79. package/dist/types/Assets/Mocks/index.d.ts.map +1 -1
  80. package/dist/types/Assets/PMs/AssetFilePM.d.ts +51 -0
  81. package/dist/types/Assets/PMs/AssetFilePM.d.ts.map +1 -0
  82. package/dist/types/Assets/PMs/index.d.ts +1 -0
  83. package/dist/types/Assets/PMs/index.d.ts.map +1 -1
  84. package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts +42 -0
  85. package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts.map +1 -1
  86. package/dist/types/StateMachine/Entities/HostStateEntity.d.ts +72 -5
  87. package/dist/types/StateMachine/Entities/HostStateEntity.d.ts.map +1 -1
  88. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +77 -0
  89. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
  90. package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts +2 -1
  91. package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts.map +1 -1
  92. package/dist/types/StateMachine/PMs/HostStatePM.d.ts +2 -0
  93. package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -1
  94. package/dist/types/StateMachine/UCs/SavePersistentStates.d.ts.map +1 -1
  95. package/package.json +3 -3
@@ -1,25 +1,68 @@
1
1
  import { generateUniqueID, MemoizedBoolean } from "@vived/core";
2
2
  import { getSingletonComponent, AppObjectEntity } from "@vived/core";
3
3
  import { makeHostStateEntity } from "./HostStateEntity";
4
+ /**
5
+ * HostStateMachine manages a collection of states and controls state transitions.
6
+ *
7
+ * This singleton component serves as the central controller for the VIVED platform's
8
+ * state-based application model. It maintains an ordered collection of states,
9
+ * tracks the currently active state, and provides methods for state transitions,
10
+ * creation, deletion, and reordering.
11
+ *
12
+ * The state machine can be used in both runtime and authoring modes:
13
+ * - In runtime: For navigating between predefined states in an application
14
+ * - In authoring: For creating and organizing states through a content editor
15
+ *
16
+ * This entity works closely with HostStateEntity (individual states) and
17
+ * HostEditingStateEntity (for state authoring).
18
+ */
4
19
  export class HostStateMachine extends AppObjectEntity {
20
+ /**
21
+ * Gets the singleton instance of HostStateMachine
22
+ * @param appObjects The app object repository
23
+ * @returns The HostStateMachine instance
24
+ */
5
25
  static get(appObjects) {
6
26
  return getSingletonComponent(HostStateMachine.type, appObjects);
7
27
  }
8
28
  }
9
29
  HostStateMachine.type = "HostStateMachine";
30
+ /**
31
+ * Factory function for creating a HostStateMachine instance
32
+ * @param appObject The AppObject to associate with this entity
33
+ * @returns A new HostStateMachine instance
34
+ */
10
35
  export function makeHostStateMachine(appObject) {
11
36
  return new HostStateMachineImp(appObject);
12
37
  }
38
+ /**
39
+ * Implementation of the HostStateMachine abstract class
40
+ * Provides concrete implementation of state machine functionality
41
+ */
13
42
  class HostStateMachineImp extends HostStateMachine {
43
+ /**
44
+ * List of all state IDs in order
45
+ * @returns Array of state IDs
46
+ */
14
47
  get states() {
15
48
  return this._states.map((state) => state.id);
16
49
  }
50
+ /**
51
+ * Total number of states in the machine
52
+ * @returns Number of states
53
+ */
17
54
  get stateCount() {
18
55
  return this._states.length;
19
56
  }
20
57
  get activeState() {
21
58
  return this._activeState;
22
59
  }
60
+ /**
61
+ * ID of the state preceding the active state
62
+ * Returns undefined if:
63
+ * - No active state
64
+ * - Active state is the first state
65
+ */
23
66
  get previousState() {
24
67
  if (!this._activeState)
25
68
  return undefined;
@@ -28,6 +71,12 @@ class HostStateMachineImp extends HostStateMachine {
28
71
  return undefined;
29
72
  return this._states[currentIndex - 1].id;
30
73
  }
74
+ /**
75
+ * ID of the state following the active state
76
+ * Returns undefined if:
77
+ * - No active state
78
+ * - Active state is the last state
79
+ */
31
80
  get nextState() {
32
81
  if (!this._activeState)
33
82
  return undefined;
@@ -63,6 +112,11 @@ class HostStateMachineImp extends HostStateMachine {
63
112
  set lastAssets(lastAssets) {
64
113
  this._lastAssets = lastAssets;
65
114
  }
115
+ /**
116
+ * Helper method to find a state by ID
117
+ * @param id ID to search for
118
+ * @returns The state entity or undefined if not found
119
+ */
66
120
  findStateByID(id) {
67
121
  for (const state of this._states) {
68
122
  if (state.id === id) {
@@ -73,10 +127,25 @@ class HostStateMachineImp extends HostStateMachine {
73
127
  }
74
128
  constructor(appObject) {
75
129
  super(appObject, HostStateMachine.type);
130
+ /** Internal storage for state entities */
76
131
  this._states = [];
132
+ /** Duration for transitions between states (in seconds) */
77
133
  this.transitionDuration = 1;
134
+ /**
135
+ * Whether the state machine is in authoring mode
136
+ * In authoring mode, additional editing features are enabled
137
+ */
78
138
  this.memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);
139
+ /**
140
+ * Tracks assets used in previous state for preloading optimization
141
+ * Helps optimize asset loading between state transitions
142
+ */
79
143
  this._lastAssets = [];
144
+ /**
145
+ * Checks if a state with the given ID exists
146
+ * @param id ID to check
147
+ * @returns true if state exists, false otherwise
148
+ */
80
149
  this.hasState = (id) => {
81
150
  const state = this.findStateByID(id);
82
151
  if (state) {
@@ -86,6 +155,10 @@ class HostStateMachineImp extends HostStateMachine {
86
155
  return false;
87
156
  }
88
157
  };
158
+ /**
159
+ * Sets the active state by its ID
160
+ * @param id ID of the state to activate
161
+ */
89
162
  this.setActiveStateByID = (id) => {
90
163
  const state = this.findStateByID(id);
91
164
  if (!state)
@@ -95,35 +168,66 @@ class HostStateMachineImp extends HostStateMachine {
95
168
  this._activeState = state.id;
96
169
  this.notifyOnChange();
97
170
  };
171
+ /**
172
+ * Sets the active state by its index in the states array
173
+ * @param index Zero-based index of the state to activate
174
+ */
98
175
  this.setActiveStateByIndex = (index) => {
99
176
  if (index < 0 || index >= this._states.length)
100
177
  return;
101
178
  const state = this._states[index];
102
179
  this.setActiveStateByID(state.id);
103
180
  };
181
+ /**
182
+ * Clears the active state (no state will be active)
183
+ */
104
184
  this.clearActiveState = () => {
105
185
  if (!this.activeState)
106
186
  return;
107
187
  this._activeState = undefined;
108
188
  this.notifyOnChange();
109
189
  };
190
+ /**
191
+ * Replaces all states with a new collection
192
+ * @param states Array of state entities to use
193
+ */
110
194
  this.setStates = (states) => {
111
195
  this._states = states;
112
196
  this.notifyOnChange();
113
197
  };
198
+ /**
199
+ * Factory function for creating state entities
200
+ * Creates a new AppObject with the given ID and wraps it in a HostStateEntity
201
+ * @param id ID for the new state
202
+ * @returns A new HostStateEntity instance
203
+ */
114
204
  this.stateFactory = (id) => {
115
205
  const ao = this.appObjects.getOrCreate(id);
116
206
  return makeHostStateEntity(ao);
117
207
  };
208
+ /**
209
+ * Creates a new empty state and adds it to the end of the states array
210
+ * @returns The newly created state entity
211
+ */
118
212
  this.createNewState = () => {
119
213
  const newState = this.stateFactory(generateUniqueID());
120
214
  this._states.push(newState);
121
215
  this.notifyOnChange();
122
216
  return newState;
123
217
  };
218
+ /**
219
+ * Gets a state entity by its ID
220
+ * @param id ID of the state to retrieve
221
+ * @returns The state entity or undefined if not found
222
+ */
124
223
  this.getStateByID = (id) => {
125
224
  return this.findStateByID(id);
126
225
  };
226
+ /**
227
+ * Deletes a state from the machine by its ID
228
+ * Also disposes the associated AppObject
229
+ * @param id ID of the state to delete
230
+ */
127
231
  this.deleteState = (id) => {
128
232
  const index = this.getStateIndex(id);
129
233
  if (index === undefined) {
@@ -134,6 +238,10 @@ class HostStateMachineImp extends HostStateMachine {
134
238
  this._states.splice(index, 1);
135
239
  this.notifyOnChange();
136
240
  };
241
+ /**
242
+ * Deletes all states from the machine
243
+ * Also disposes all associated AppObjects
244
+ */
137
245
  this.deleteAllStates = () => {
138
246
  if (this._states.length === 0)
139
247
  return;
@@ -145,6 +253,11 @@ class HostStateMachineImp extends HostStateMachine {
145
253
  this.clearActiveState();
146
254
  this.notifyOnChange();
147
255
  };
256
+ /**
257
+ * Gets the index of a state in the states array
258
+ * @param id ID of the state
259
+ * @returns Zero-based index or undefined if not found
260
+ */
148
261
  this.getStateIndex = (id) => {
149
262
  let index = -1;
150
263
  this._states.forEach((state, i) => {
@@ -159,16 +272,30 @@ class HostStateMachineImp extends HostStateMachine {
159
272
  return undefined;
160
273
  }
161
274
  };
275
+ /**
276
+ * Activates the state before the current active state
277
+ * Does nothing if there is no previous state
278
+ */
162
279
  this.setPreviousStateActive = () => {
163
280
  if (!this.previousState)
164
281
  return;
165
282
  this.setActiveStateByID(this.previousState);
166
283
  };
284
+ /**
285
+ * Activates the state after the current active state
286
+ * Does nothing if there is no next state
287
+ */
167
288
  this.setNextStateActive = () => {
168
289
  if (!this.nextState)
169
290
  return;
170
291
  this.setActiveStateByID(this.nextState);
171
292
  };
293
+ /**
294
+ * Moves a state to a different position in the states array
295
+ * Used for reordering states in the state machine
296
+ * @param stateID ID of the state to move
297
+ * @param index Destination index
298
+ */
172
299
  this.setStateIndex = (stateID, index) => {
173
300
  // Check if the state exists
174
301
  const state = this.getStateByID(stateID);
@@ -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 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"]}
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\n/**\r\n * HostStateMachine manages a collection of states and controls state transitions.\r\n *\r\n * This singleton component serves as the central controller for the VIVED platform's\r\n * state-based application model. It maintains an ordered collection of states,\r\n * tracks the currently active state, and provides methods for state transitions,\r\n * creation, deletion, and reordering.\r\n *\r\n * The state machine can be used in both runtime and authoring modes:\r\n * - In runtime: For navigating between predefined states in an application\r\n * - In authoring: For creating and organizing states through a content editor\r\n *\r\n * This entity works closely with HostStateEntity (individual states) and\r\n * HostEditingStateEntity (for state authoring).\r\n */\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n /** Array of all state IDs in order */\r\n abstract states: string[];\r\n\r\n /** Total number of states in the machine */\r\n abstract stateCount: number;\r\n\r\n /** ID of the currently active state, if any */\r\n abstract activeState: string | undefined;\r\n\r\n /** ID of the state preceding the active state, if any */\r\n abstract previousState: string | undefined;\r\n\r\n /** ID of the state following the active state, if any */\r\n abstract nextState: string | undefined;\r\n\r\n /** Duration of transition animations between states (in seconds) */\r\n abstract transitionDuration: number;\r\n\r\n /**\r\n * Sets a state as active by its ID\r\n * @param id ID of the state to activate\r\n */\r\n abstract setActiveStateByID: (id: string) => void;\r\n\r\n /**\r\n * Sets a state as active by its position in the states array\r\n * @param index Zero-based index of the state to activate\r\n */\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n\r\n /** Deactivates the current state (no state will be active) */\r\n abstract clearActiveState: () => void;\r\n\r\n /**\r\n * Replaces all states with a new collection\r\n * @param states Array of state entities to use\r\n */\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n\r\n /** Creates a new empty state and adds it to the end of the states array */\r\n abstract createNewState: () => HostStateEntity;\r\n\r\n /**\r\n * Retrieves a state entity by its ID\r\n * @param id The ID of the state to retrieve\r\n * @returns The state entity or undefined if not found\r\n */\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n\r\n /**\r\n * Removes a state from the machine\r\n * @param id ID of the state to remove\r\n */\r\n abstract deleteState: (id: string) => void;\r\n\r\n /** Removes all states from the machine */\r\n abstract deleteAllStates: () => void;\r\n\r\n /**\r\n * Gets the index of a state in the states array\r\n * @param id ID of the state\r\n * @returns Zero-based index or undefined if not found\r\n */\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n\r\n /**\r\n * Checks if a state with the given ID exists in the machine\r\n * @param id ID to check\r\n * @returns true if the state exists, false otherwise\r\n */\r\n abstract hasState: (id: string) => boolean;\r\n\r\n /**\r\n * Factory function for creating state entities\r\n * @param id ID for the new state\r\n * @returns A new HostStateEntity instance\r\n */\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n\r\n /** Activates the state before the current active state */\r\n abstract setPreviousStateActive: () => void;\r\n\r\n /** Activates the state after the current active state */\r\n abstract setNextStateActive: () => void;\r\n\r\n /**\r\n * Moves a state to a different position in the states array\r\n * @param stateID ID of the state to move\r\n * @param index Destination index\r\n */\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n /**\r\n * Gets the singleton instance of HostStateMachine\r\n * @param appObjects The app object repository\r\n * @returns The HostStateMachine instance\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\n/**\r\n * Factory function for creating a HostStateMachine instance\r\n * @param appObject The AppObject to associate with this entity\r\n * @returns A new HostStateMachine instance\r\n */\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of the HostStateMachine abstract class\r\n * Provides concrete implementation of state machine functionality\r\n */\r\nclass HostStateMachineImp extends HostStateMachine {\r\n /** Internal storage for state entities */\r\n private _states: HostStateEntity[] = [];\r\n\r\n /** Duration for transitions between states (in seconds) */\r\n transitionDuration = 1;\r\n\r\n /**\r\n * List of all state IDs in order\r\n * @returns Array of state IDs\r\n */\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n /**\r\n * Total number of states in the machine\r\n * @returns Number of states\r\n */\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n /** ID of the currently active state */\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n /**\r\n * ID of the state preceding the active state\r\n * Returns undefined if:\r\n * - No active state\r\n * - Active state is the first state\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 /**\r\n * ID of the state following the active state\r\n * Returns undefined if:\r\n * - No active state\r\n * - Active state is the last state\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)\r\n return undefined;\r\n\r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n /**\r\n * Whether the state machine is in authoring mode\r\n * In authoring mode, additional editing features are enabled\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 /** State to initially show in editing mode */\r\n public initialEditingState?: string;\r\n\r\n /**\r\n * Last state data that was being edited\r\n * Used to restore editing state when returning to editor\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 /**\r\n * Tracks assets used in previous state for preloading optimization\r\n * Helps optimize asset loading between state transitions\r\n */\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n /** Error message for state validation failures */\r\n public validationErrorMessage?: string;\r\n\r\n /**\r\n * Checks if a state with the given ID exists\r\n * @param id ID to check\r\n * @returns true if state exists, false otherwise\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 /**\r\n * Sets the active state by its ID\r\n * @param id ID of the state to activate\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 /**\r\n * Sets the active state by its index in the states array\r\n * @param index Zero-based index of the state to activate\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 /**\r\n * Clears the active state (no state will be active)\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 /**\r\n * Replaces all states with a new collection\r\n * @param states Array of state entities to use\r\n */\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Factory function for creating state entities\r\n * Creates a new AppObject with the given ID and wraps it in a HostStateEntity\r\n * @param id ID for the new state\r\n * @returns A new HostStateEntity instance\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 /**\r\n * Creates a new empty state and adds it to the end of the states array\r\n * @returns The newly created state entity\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 /**\r\n * Gets a state entity by its ID\r\n * @param id ID of the state to retrieve\r\n * @returns The state entity or undefined if not found\r\n */\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n /**\r\n * Deletes a state from the machine by its ID\r\n * Also disposes the associated AppObject\r\n * @param id ID of the state to delete\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 /**\r\n * Deletes all states from the machine\r\n * Also disposes all associated AppObjects\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 /**\r\n * Gets the index of a state in the states array\r\n * @param id ID of the state\r\n * @returns Zero-based index or undefined if not found\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 /**\r\n * Helper method to find a state by ID\r\n * @param id ID to search for\r\n * @returns The state entity or undefined if not found\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 /**\r\n * Activates the state before the current active state\r\n * Does nothing if there is no previous state\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 /**\r\n * Activates the state after the current active state\r\n * Does nothing if there is no next state\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 /**\r\n * Moves a state to a different position in the states array\r\n * Used for reordering states in the state machine\r\n * @param stateID ID of the state to move\r\n * @param index Destination index\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"]}
@@ -1,4 +1,4 @@
1
- import { ChallengeResponse, HostStateEntity } from "../Entities/HostStateEntity";
1
+ import { ChallengeResponse, HostStateEntity, StreamState } from "../Entities/HostStateEntity";
2
2
  export class MockHostStateEntity extends HostStateEntity {
3
3
  get id() {
4
4
  return this.appObject.id;
@@ -8,6 +8,7 @@ export class MockHostStateEntity extends HostStateEntity {
8
8
  }
9
9
  constructor(appObject) {
10
10
  super(appObject, HostStateEntity.type);
11
+ this.streamState = StreamState.INIT;
11
12
  this.name = "State Name";
12
13
  this.assets = [];
13
14
  this.expectedResponse = ChallengeResponse.NONE;
@@ -1 +1 @@
1
- {"version":3,"file":"MockHostStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockHostStateEntity.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3B,CAAC;IAQD,IAAI,SAAS;QACX,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAdzC,SAAI,GAAG,YAAY,CAAC;QACpB,WAAM,GAAG,EAAE,CAAC;QACZ,qBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC;QAC1C,UAAK,GAAG,OAAO,CAAC;QAChB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAMnB,iBAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAIzB,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAU,EAAE,UAAyB;IAC3E,OAAO,IAAI,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity\r\n} from \"../Entities/HostStateEntity\";\r\n\r\nexport class MockHostStateEntity extends HostStateEntity {\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n name = \"State Name\";\r\n assets = [];\r\n expectedResponse = ChallengeResponse.NONE;\r\n appID = \"AppID\";\r\n getDTO = jest.fn();\r\n setDTO = jest.fn();\r\n\r\n get stateData(): object {\r\n return { foo: \"bar\" };\r\n }\r\n\r\n setStateData = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockHostStateEntity(id: string, appObjects: AppObjectRepo) {\r\n return new MockHostStateEntity(appObjects.getOrCreate(id));\r\n}\r\n"]}
1
+ {"version":3,"file":"MockHostStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockHostStateEntity.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,WAAW,EACZ,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAEtD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3B,CAAC;IAQD,IAAI,SAAS;QACX,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAlBzC,gBAAW,GAAgB,WAAW,CAAC,IAAI,CAAC;QAI5C,SAAI,GAAG,YAAY,CAAC;QACpB,WAAM,GAAG,EAAE,CAAC;QACZ,qBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC;QAC1C,UAAK,GAAG,OAAO,CAAC;QAChB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAMnB,iBAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAIzB,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAU,EAAE,UAAyB;IAC3E,OAAO,IAAI,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n StreamState\r\n} from \"../Entities/HostStateEntity\";\r\n\r\nexport class MockHostStateEntity extends HostStateEntity {\r\n streamState: StreamState = StreamState.INIT;\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n name = \"State Name\";\r\n assets = [];\r\n expectedResponse = ChallengeResponse.NONE;\r\n appID = \"AppID\";\r\n getDTO = jest.fn();\r\n setDTO = jest.fn();\r\n\r\n get stateData(): object {\r\n return { foo: \"bar\" };\r\n }\r\n\r\n setStateData = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockHostStateEntity(id: string, appObjects: AppObjectRepo) {\r\n return new MockHostStateEntity(appObjects.getOrCreate(id));\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { AppObjectPM } from "@vived/core";
2
2
  import { AppRepoEntity } from "../../Apps/Entities/AppRepo";
3
- import { HostStateEntity } from "../Entities/HostStateEntity";
3
+ import { HostStateEntity, StreamState } from "../Entities/HostStateEntity";
4
4
  import { HostStateMachine } from "../Entities/HostStateMachine";
5
5
  export class HostStatePM extends AppObjectPM {
6
6
  // Non-singleton getter pattern
@@ -18,7 +18,8 @@ HostStatePM.defaultVM = {
18
18
  appName: "",
19
19
  canBumpBackwards: false,
20
20
  canBumpForward: false,
21
- index: -1
21
+ index: -1,
22
+ streamState: StreamState.INIT
22
23
  };
23
24
  export function makeHostStatePM(appObject) {
24
25
  return new HostStatePMImp(appObject);
@@ -52,6 +53,8 @@ class HostStatePMImp extends HostStatePM {
52
53
  return false;
53
54
  if (a.index !== b.index)
54
55
  return false;
56
+ if (a.streamState !== b.streamState)
57
+ return false;
55
58
  // Deep comparison for the data object
56
59
  const aData = JSON.stringify(a.data);
57
60
  const bData = JSON.stringify(b.data);
@@ -100,7 +103,8 @@ class HostStatePMImp extends HostStatePM {
100
103
  appName,
101
104
  canBumpBackwards,
102
105
  canBumpForward,
103
- index
106
+ index,
107
+ streamState: entity.streamState
104
108
  };
105
109
  // Update the view with the new view model
106
110
  this.doUpdateView(newVM);
@@ -1 +1 @@
1
- {"version":3,"file":"HostStatePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStatePM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AppRepoEntity } from \"../../Apps/Entities/AppRepo\";\r\nimport { HostStateEntity } from \"../Entities/HostStateEntity\";\r\nimport { HostStateMachine } from \"../Entities/HostStateMachine\";\r\n\r\nexport interface HostStateVM {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly data: object;\r\n readonly isActive: boolean;\r\n readonly appName: string;\r\n readonly canBumpBackwards: boolean;\r\n readonly canBumpForward: boolean;\r\n readonly index: number;\r\n}\r\n\r\nexport abstract class HostStatePM extends AppObjectPM<HostStateVM> {\r\n static readonly type = \"HostStatePM\";\r\n\r\n // Default view model\r\n static readonly defaultVM: HostStateVM = {\r\n id: \"\",\r\n name: \"\",\r\n data: {},\r\n isActive: false,\r\n appName: \"\",\r\n canBumpBackwards: false,\r\n canBumpForward: false,\r\n index: -1\r\n };\r\n\r\n // Non-singleton getter pattern\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): HostStatePM | undefined {\r\n return appObjects.get(id)?.getComponent<HostStatePM>(HostStatePM.type);\r\n }\r\n}\r\n\r\nexport function makeHostStatePM(appObject: AppObject): HostStatePM {\r\n return new HostStatePMImp(appObject);\r\n}\r\n\r\nclass HostStatePMImp extends HostStatePM {\r\n // Get the entity from the same AppObject\r\n private get hostStateEntity() {\r\n return this.getCachedLocalComponent<HostStateEntity>(HostStateEntity.type);\r\n }\r\n\r\n // Get the state machine which is a singleton\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Get the app repo which is a singleton\r\n private get appRepo() {\r\n return this.getCachedSingleton<AppRepoEntity>(AppRepoEntity.type);\r\n }\r\n\r\n // Required equality check method for view models\r\n vmsAreEqual(a: HostStateVM, b: HostStateVM): boolean {\r\n if (a.id !== b.id) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.isActive !== b.isActive) return false;\r\n if (a.appName !== b.appName) return false;\r\n if (a.canBumpBackwards !== b.canBumpBackwards) return false;\r\n if (a.canBumpForward !== b.canBumpForward) return false;\r\n if (a.index !== b.index) return false;\r\n\r\n // Deep comparison for the data object\r\n const aData = JSON.stringify(a.data);\r\n const bData = JSON.stringify(b.data);\r\n if (aData !== bData) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Handler for entity changes\r\n private onEntityChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n // Handler for state machine changes\r\n private onStateMachineChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n private updateViewModel(): void {\r\n const entity = this.hostStateEntity;\r\n const stateMachine = this.hostStateMachine;\r\n const appRepo = this.appRepo;\r\n\r\n if (!entity) {\r\n this.doUpdateView(HostStatePM.defaultVM);\r\n return;\r\n }\r\n\r\n // Check if this state is the active one in the state machine\r\n const isActive = stateMachine?.activeState === entity.id;\r\n\r\n // Look up the app name using the appID from the state entity\r\n let appName = \"\";\r\n if (appRepo && entity.appID) {\r\n const app = appRepo.getApp(entity.appID);\r\n if (app) {\r\n appName = app.name;\r\n }\r\n }\r\n\r\n // Determine if the state can be bumped backwards or forwards\r\n let canBumpBackwards = false;\r\n let canBumpForward = false;\r\n let index = -1;\r\n\r\n if (stateMachine) {\r\n const stateIndex = stateMachine.getStateIndex(entity.id);\r\n if (stateIndex !== undefined) {\r\n index = stateIndex;\r\n // Can bump backwards if index > 0\r\n canBumpBackwards = stateIndex > 0;\r\n // Can bump forward if index < length-1\r\n canBumpForward = stateIndex < stateMachine.stateCount - 1;\r\n }\r\n }\r\n\r\n // Create a new immutable view model based on entity state\r\n const newVM: HostStateVM = {\r\n id: entity.id,\r\n name: entity.name,\r\n data: entity.stateData,\r\n isActive: isActive || false,\r\n appName,\r\n canBumpBackwards,\r\n canBumpForward,\r\n index\r\n };\r\n\r\n // Update the view with the new view model\r\n this.doUpdateView(newVM);\r\n }\r\n\r\n dispose = (): void => {\r\n this.hostStateEntity?.removeChangeObserver(this.onEntityChange);\r\n this.hostStateMachine?.removeChangeObserver(this.onStateMachineChange);\r\n super.dispose();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStatePM.type);\r\n\r\n // Subscribe to entity changes\r\n this.hostStateEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n // Subscribe to state machine changes\r\n this.hostStateMachine?.addChangeObserver(this.onStateMachineChange);\r\n\r\n // Initialize the view model\r\n this.updateViewModel();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostStatePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStatePM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AppRepoEntity } from \"../../Apps/Entities/AppRepo\";\r\nimport { HostStateEntity, StreamState } from \"../Entities/HostStateEntity\";\r\nimport { HostStateMachine } from \"../Entities/HostStateMachine\";\r\n\r\nexport interface HostStateVM {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly data: object;\r\n readonly isActive: boolean;\r\n readonly appName: string;\r\n readonly canBumpBackwards: boolean;\r\n readonly canBumpForward: boolean;\r\n readonly index: number;\r\n readonly streamState: StreamState;\r\n}\r\n\r\nexport abstract class HostStatePM extends AppObjectPM<HostStateVM> {\r\n static readonly type = \"HostStatePM\";\r\n\r\n // Default view model\r\n static readonly defaultVM: HostStateVM = {\r\n id: \"\",\r\n name: \"\",\r\n data: {},\r\n isActive: false,\r\n appName: \"\",\r\n canBumpBackwards: false,\r\n canBumpForward: false,\r\n index: -1,\r\n streamState: StreamState.INIT\r\n };\r\n\r\n // Non-singleton getter pattern\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): HostStatePM | undefined {\r\n return appObjects.get(id)?.getComponent<HostStatePM>(HostStatePM.type);\r\n }\r\n}\r\n\r\nexport function makeHostStatePM(appObject: AppObject): HostStatePM {\r\n return new HostStatePMImp(appObject);\r\n}\r\n\r\nclass HostStatePMImp extends HostStatePM {\r\n // Get the entity from the same AppObject\r\n private get hostStateEntity() {\r\n return this.getCachedLocalComponent<HostStateEntity>(HostStateEntity.type);\r\n }\r\n\r\n // Get the state machine which is a singleton\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Get the app repo which is a singleton\r\n private get appRepo() {\r\n return this.getCachedSingleton<AppRepoEntity>(AppRepoEntity.type);\r\n }\r\n\r\n // Required equality check method for view models\r\n vmsAreEqual(a: HostStateVM, b: HostStateVM): boolean {\r\n if (a.id !== b.id) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.isActive !== b.isActive) return false;\r\n if (a.appName !== b.appName) return false;\r\n if (a.canBumpBackwards !== b.canBumpBackwards) return false;\r\n if (a.canBumpForward !== b.canBumpForward) return false;\r\n if (a.index !== b.index) return false;\r\n if (a.streamState !== b.streamState) return false;\r\n\r\n // Deep comparison for the data object\r\n const aData = JSON.stringify(a.data);\r\n const bData = JSON.stringify(b.data);\r\n if (aData !== bData) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Handler for entity changes\r\n private onEntityChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n // Handler for state machine changes\r\n private onStateMachineChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n private updateViewModel(): void {\r\n const entity = this.hostStateEntity;\r\n const stateMachine = this.hostStateMachine;\r\n const appRepo = this.appRepo;\r\n\r\n if (!entity) {\r\n this.doUpdateView(HostStatePM.defaultVM);\r\n return;\r\n }\r\n\r\n // Check if this state is the active one in the state machine\r\n const isActive = stateMachine?.activeState === entity.id;\r\n\r\n // Look up the app name using the appID from the state entity\r\n let appName = \"\";\r\n if (appRepo && entity.appID) {\r\n const app = appRepo.getApp(entity.appID);\r\n if (app) {\r\n appName = app.name;\r\n }\r\n }\r\n\r\n // Determine if the state can be bumped backwards or forwards\r\n let canBumpBackwards = false;\r\n let canBumpForward = false;\r\n let index = -1;\r\n\r\n if (stateMachine) {\r\n const stateIndex = stateMachine.getStateIndex(entity.id);\r\n if (stateIndex !== undefined) {\r\n index = stateIndex;\r\n // Can bump backwards if index > 0\r\n canBumpBackwards = stateIndex > 0;\r\n // Can bump forward if index < length-1\r\n canBumpForward = stateIndex < stateMachine.stateCount - 1;\r\n }\r\n }\r\n\r\n // Create a new immutable view model based on entity state\r\n const newVM: HostStateVM = {\r\n id: entity.id,\r\n name: entity.name,\r\n data: entity.stateData,\r\n isActive: isActive || false,\r\n appName,\r\n canBumpBackwards,\r\n canBumpForward,\r\n index,\r\n streamState: entity.streamState\r\n };\r\n\r\n // Update the view with the new view model\r\n this.doUpdateView(newVM);\r\n }\r\n\r\n dispose = (): void => {\r\n this.hostStateEntity?.removeChangeObserver(this.onEntityChange);\r\n this.hostStateMachine?.removeChangeObserver(this.onStateMachineChange);\r\n super.dispose();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStatePM.type);\r\n\r\n // Subscribe to entity changes\r\n this.hostStateEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n // Subscribe to state machine changes\r\n this.hostStateMachine?.addChangeObserver(this.onStateMachineChange);\r\n\r\n // Initialize the view model\r\n this.updateViewModel();\r\n }\r\n}\r\n"]}
@@ -11,7 +11,7 @@ export function makeDeleteStateUC(appObject) {
11
11
  }
12
12
  class DeleteStateUCImp extends DeleteStateUC {
13
13
  get stateMachine() {
14
- return this.getCachedLocalComponent(HostStateMachine.type);
14
+ return this.getCachedSingleton(HostStateMachine.type);
15
15
  }
16
16
  constructor(appObject) {
17
17
  super(appObject, DeleteStateUC.type);
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DeleteStateUC.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,aAAc,SAAQ,WAAW;IAGrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AAJM,kBAAI,GAAG,eAAe,CAAC;AAShC,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,gBAAiB,SAAQ,aAAa;IAC1C,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,uBAAuB,CACjC,gBAAgB,CAAC,IAAI,CACtB,CAAC;IACJ,CAAC;IAcD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAbvC,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DeleteStateUC extends AppObjectUC {\r\n static type = \"DeleteStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DeleteStateUC>(DeleteStateUC.type, appObjects);\r\n }\r\n\r\n abstract deleteState(id: string): void;\r\n}\r\n\r\nexport function makeDeleteStateUC(appObject: AppObject): DeleteStateUC {\r\n return new DeleteStateUCImp(appObject);\r\n}\r\n\r\nclass DeleteStateUCImp extends DeleteStateUC {\r\n private get stateMachine() {\r\n return this.getCachedLocalComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n }\r\n\r\n deleteState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (this.stateMachine.hasState(id)) {\r\n this.stateMachine.deleteState(id);\r\n } else {\r\n this.warn(\"Unable to find state to delete\");\r\n return;\r\n }\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DeleteStateUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DeleteStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DeleteStateUC.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,aAAc,SAAQ,WAAW;IAGrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AAJM,kBAAI,GAAG,eAAe,CAAC;AAShC,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,gBAAiB,SAAQ,aAAa;IAC1C,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAcD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAbvC,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DeleteStateUC extends AppObjectUC {\r\n static type = \"DeleteStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DeleteStateUC>(DeleteStateUC.type, appObjects);\r\n }\r\n\r\n abstract deleteState(id: string): void;\r\n}\r\n\r\nexport function makeDeleteStateUC(appObject: AppObject): DeleteStateUC {\r\n return new DeleteStateUCImp(appObject);\r\n}\r\n\r\nclass DeleteStateUCImp extends DeleteStateUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n deleteState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (this.stateMachine.hasState(id)) {\r\n this.stateMachine.deleteState(id);\r\n } else {\r\n this.warn(\"Unable to find state to delete\");\r\n return;\r\n }\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DeleteStateUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -11,7 +11,7 @@ export function makeDuplicateStateUC(appObject) {
11
11
  }
12
12
  class DuplicateStateUCImp extends DuplicateStateUC {
13
13
  get stateMachine() {
14
- return this.getCachedLocalComponent(HostStateMachine.type);
14
+ return this.getCachedSingleton(HostStateMachine.type);
15
15
  }
16
16
  constructor(appObject) {
17
17
  super(appObject, DuplicateStateUC.type);
@@ -1 +1 @@
1
- {"version":3,"file":"DuplicateStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DuplicateStateUC.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,gBAAiB,SAAQ,WAAW;IAGxD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAPM,qBAAI,GAAG,kBAAkB,CAAC;AAYnC,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,uBAAuB,CACjC,gBAAgB,CAAC,IAAI,CACtB,CAAC;IACJ,CAAC;IAkBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAjB1C,mBAAc,GAAG,CAAC,EAAU,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DuplicateStateUC extends AppObjectUC {\r\n static type = \"DuplicateStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DuplicateStateUC>(\r\n DuplicateStateUC.type,\r\n appObjects\r\n );\r\n }\r\n\r\n abstract duplicateState(id: string): void;\r\n}\r\n\r\nexport function makeDuplicateStateUC(appObject: AppObject): DuplicateStateUC {\r\n return new DuplicateStateUCImp(appObject);\r\n}\r\n\r\nclass DuplicateStateUCImp extends DuplicateStateUC {\r\n private get stateMachine() {\r\n return this.getCachedLocalComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n }\r\n\r\n duplicateState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (!state) {\r\n this.warn(\"Unable to find state to duplicate\");\r\n return;\r\n }\r\n\r\n const newState = this.stateMachine.createNewState();\r\n const dto = state.getDTO();\r\n dto.id = newState.id;\r\n dto.name = dto.name + \" Copy\";\r\n newState.setDTO(dto);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DuplicateStateUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DuplicateStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DuplicateStateUC.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,gBAAiB,SAAQ,WAAW;IAGxD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAPM,qBAAI,GAAG,kBAAkB,CAAC;AAYnC,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAkBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAjB1C,mBAAc,GAAG,CAAC,EAAU,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DuplicateStateUC extends AppObjectUC {\r\n static type = \"DuplicateStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DuplicateStateUC>(\r\n DuplicateStateUC.type,\r\n appObjects\r\n );\r\n }\r\n\r\n abstract duplicateState(id: string): void;\r\n}\r\n\r\nexport function makeDuplicateStateUC(appObject: AppObject): DuplicateStateUC {\r\n return new DuplicateStateUCImp(appObject);\r\n}\r\n\r\nclass DuplicateStateUCImp extends DuplicateStateUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n duplicateState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (!state) {\r\n this.warn(\"Unable to find state to duplicate\");\r\n return;\r\n }\r\n\r\n const newState = this.stateMachine.createNewState();\r\n const dto = state.getDTO();\r\n dto.id = newState.id;\r\n dto.name = dto.name + \" Copy\";\r\n newState.setDTO(dto);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DuplicateStateUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SavePersistentStates.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/SavePersistentStates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,sBAAuB,SAAQ,WAAW;IAK9D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,sBAAsB,CAAC,IAAI,EAC3B,UAAU,CACX,CAAC;IACJ,CAAC;;AATM,2BAAI,GAAG,wBAAwB,CAAC;AAYzC,MAAM,UAAU,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AASD,MAAM,yBAA0B,SAAQ,sBAAsB;IAC5D,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QA3BhD,gBAAW,GAAG,GAAS,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GAAqB;wBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,IAAI,EAAE,KAAK,CAAC,SAAS;wBACrB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,QAAQ,GAAG,uBAAuB,CAAC;YACrC,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class SavePersistentStatesUC extends AppObjectUC {\r\n static type = \"SavePersistentStatesUC\";\r\n\r\n abstract saveLocally(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<SavePersistentStatesUC>(\r\n SavePersistentStatesUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeSavePersistentStatesUC(\r\n appObject: AppObject\r\n): SavePersistentStatesUC {\r\n return new SavePersistentStatesUCImp(appObject);\r\n}\r\n\r\ninterface SandboxStateData {\r\n id: string;\r\n name: string;\r\n data: object;\r\n assets: string[];\r\n}\r\n\r\nclass SavePersistentStatesUCImp extends SavePersistentStatesUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n saveLocally = (): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const states: SandboxStateData[] = [];\r\n this.stateMachine.states.forEach((stateID) => {\r\n const state = this.stateMachine?.getStateByID(stateID);\r\n if (state) {\r\n const rVal: SandboxStateData = {\r\n assets: state.assets,\r\n data: state.stateData,\r\n id: state.id,\r\n name: state.name\r\n };\r\n\r\n states.push(rVal);\r\n }\r\n });\r\n\r\n const statesData = JSON.stringify(states);\r\n const a = document.createElement(\"a\");\r\n const file = new Blob([statesData], { type: \"text/plain\" });\r\n a.href = URL.createObjectURL(file);\r\n a.download = \"persistentStates.json\";\r\n a.click();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SavePersistentStatesUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SavePersistentStates.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/SavePersistentStates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,OAAgB,sBAAuB,SAAQ,WAAW;IAK9D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,sBAAsB,CAAC,IAAI,EAC3B,UAAU,CACX,CAAC;IACJ,CAAC;;AATM,2BAAI,GAAG,wBAAwB,CAAC;AAYzC,MAAM,UAAU,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,yBAA0B,SAAQ,sBAAsB;IAC5D,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QA3BhD,gBAAW,GAAG,GAAS,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GAAqB;wBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,IAAI,EAAE,KAAK,CAAC,SAAS;wBACrB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,QAAQ,GAAG,uBAAuB,CAAC;YACrC,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\nimport { SandboxStateData } from \"./setSandboxStatesFromData\";\r\n\r\nexport abstract class SavePersistentStatesUC extends AppObjectUC {\r\n static type = \"SavePersistentStatesUC\";\r\n\r\n abstract saveLocally(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<SavePersistentStatesUC>(\r\n SavePersistentStatesUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeSavePersistentStatesUC(\r\n appObject: AppObject\r\n): SavePersistentStatesUC {\r\n return new SavePersistentStatesUCImp(appObject);\r\n}\r\n\r\nclass SavePersistentStatesUCImp extends SavePersistentStatesUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n saveLocally = (): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const states: SandboxStateData[] = [];\r\n this.stateMachine.states.forEach((stateID) => {\r\n const state = this.stateMachine?.getStateByID(stateID);\r\n if (state) {\r\n const rVal: SandboxStateData = {\r\n assets: state.assets,\r\n data: state.stateData,\r\n id: state.id,\r\n name: state.name\r\n };\r\n\r\n states.push(rVal);\r\n }\r\n });\r\n\r\n const statesData = JSON.stringify(states);\r\n const a = document.createElement(\"a\");\r\n const file = new Blob([statesData], { type: \"text/plain\" });\r\n a.href = URL.createObjectURL(file);\r\n a.download = \"persistentStates.json\";\r\n a.click();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SavePersistentStatesUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -30,6 +30,7 @@ export declare abstract class AppEntity extends AppObjectEntity {
30
30
  abstract name: string;
31
31
  abstract description: string;
32
32
  abstract image_url: string;
33
+ abstract imageAssetId: string | undefined;
33
34
  abstract versions: Version[];
34
35
  abstract get latestVersion(): Version | undefined;
35
36
  abstract errorMessage?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AppEntity.d.ts","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,OAAO,EACR,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;;;;;;GAOG;AACH,8BAAsB,SAAU,SAAQ,eAAe;IACrD,kDAAkD;IAClD,MAAM,CAAC,IAAI,SAAe;IAE1B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;IAahD,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,QAAQ,KAAK,aAAa,IAAI,OAAO,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAElC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,KAAK,iBAAiB,IAAI,OAAO,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAE7D"}
1
+ {"version":3,"file":"AppEntity.d.ts","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,OAAO,EAER,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;;;;;;GAOG;AACH,8BAAsB,SAAU,SAAQ,eAAe;IACrD,kDAAkD;IAClD,MAAM,CAAC,IAAI,SAAe;IAE1B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;IAahD,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,QAAQ,KAAK,aAAa,IAAI,OAAO,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAElC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,KAAK,iBAAiB,IAAI,OAAO,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAE7D"}
@@ -12,6 +12,8 @@ export interface AppVM {
12
12
  description: string;
13
13
  /** URL to the app's thumbnail or preview image */
14
14
  imageURL: string;
15
+ /** Whether the image asset is currently being fetched */
16
+ isFetching: boolean;
15
17
  }
16
18
  /**
17
19
  * Default empty AppVM for initialization
@@ -1 +1 @@
1
- {"version":3,"file":"AppPM.d.ts","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGpE;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAK1B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,8BAAsB,KAAM,SAAQ,WAAW,CAAC,KAAK,CAAC;IACpD,MAAM,CAAC,IAAI,SAAW;IAEtB;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;CAQjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAErD"}
1
+ {"version":3,"file":"AppPM.d.ts","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIpE;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,8BAAsB,KAAM,SAAQ,WAAW,CAAC,KAAK,CAAC;IACpD,MAAM,CAAC,IAAI,SAAW;IAEtB;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;CAQjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAErD"}
@@ -0,0 +1,8 @@
1
+ import { PmAdapter } from "@vived/core";
2
+ import { AssetFileVM } from "../PMs/AssetFilePM";
3
+ /**
4
+ * Adapter for connecting AssetFilePM to UI components
5
+ * Provides the interface for React components to subscribe to AssetFileVM updates
6
+ */
7
+ export declare const assetFileAdapter: PmAdapter<AssetFileVM>;
8
+ //# sourceMappingURL=assetFileAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetFileAdapter.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/assetFileAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAEL,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,WAAW,CA6CnD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from "./appAssetListAdapter";
2
2
  export * from "./assetAdapter";
3
+ export * from "./assetFileAdapter";
3
4
  export * from "./editingAppAssetAdapter";
4
5
  export * from "./showArchivedAppAssetAdapter";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"setupAssetsForSandbox.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6B5C,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,QAuB9D"}
1
+ {"version":3,"file":"setupAssetsForSandbox.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA8B5C,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,QAuB9D"}
@@ -0,0 +1,19 @@
1
+ import { AppObject } from "@vived/core";
2
+ import { AssetFilePM } from "../PMs/AssetFilePM";
3
+ /**
4
+ * Mock implementation of AssetFilePM for testing
5
+ * Provides Jest mock functions for testing adapters and other components
6
+ */
7
+ export declare class AssetFilePMMock extends AssetFilePM {
8
+ /**
9
+ * Mock implementation of vmsAreEqual for testing
10
+ */
11
+ vmsAreEqual: jest.Mock<any, any, any>;
12
+ /**
13
+ * Creates a new AssetFilePMMock instance
14
+ *
15
+ * @param appObject - The app object to associate with this mock PM
16
+ */
17
+ constructor(appObject: AppObject);
18
+ }
19
+ //# sourceMappingURL=AssetFilePMMock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetFilePMMock.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/AssetFilePMMock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C;;OAEG;IACH,WAAW,2BAAa;IAExB;;;;OAIG;gBACS,SAAS,EAAE,SAAS;CAGjC"}
@@ -1,5 +1,6 @@
1
1
  export * from "./AppAssetListPMMock";
2
2
  export * from "./AssetPMMock";
3
+ export * from "./AssetFilePMMock";
3
4
  export * from "./EditingAppAssetPMMock";
4
5
  export * from "./MockArchiveAsset";
5
6
  export * from "./MockDeleteAssetUC";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}