@vived/host 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js +24 -0
  2. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  3. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js +49 -0
  4. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  5. package/dist/cjs/StateMachine/Adapters/index.js +1 -0
  6. package/dist/cjs/StateMachine/Adapters/index.js.map +1 -1
  7. package/dist/cjs/StateMachine/Controllers/editStateName.js +13 -0
  8. package/dist/cjs/StateMachine/Controllers/editStateName.js.map +1 -0
  9. package/dist/cjs/StateMachine/Controllers/editStateName.test.js +49 -0
  10. package/dist/cjs/StateMachine/Controllers/editStateName.test.js.map +1 -0
  11. package/dist/cjs/StateMachine/Controllers/index.js +1 -0
  12. package/dist/cjs/StateMachine/Controllers/index.js.map +1 -1
  13. package/dist/cjs/StateMachine/Entities/HostStateMachine.js +67 -24
  14. package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
  15. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js +174 -0
  16. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  17. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js +12 -0
  18. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  19. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js +23 -0
  20. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  21. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js +21 -15
  22. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  23. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  24. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  25. package/dist/cjs/StateMachine/PMs/HostStatePM.js +136 -0
  26. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -0
  27. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js +405 -0
  28. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  29. package/dist/cjs/StateMachine/PMs/index.js +1 -0
  30. package/dist/cjs/StateMachine/PMs/index.js.map +1 -1
  31. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js +35 -0
  32. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  33. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js +58 -0
  34. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  35. package/dist/cjs/StateMachine/UCs/index.js +1 -0
  36. package/dist/cjs/StateMachine/UCs/index.js.map +1 -1
  37. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js +21 -0
  38. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  39. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js +47 -0
  40. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  41. package/dist/esm/StateMachine/Adapters/index.js +1 -0
  42. package/dist/esm/StateMachine/Adapters/index.js.map +1 -1
  43. package/dist/esm/StateMachine/Controllers/editStateName.js +10 -0
  44. package/dist/esm/StateMachine/Controllers/editStateName.js.map +1 -0
  45. package/dist/esm/StateMachine/Controllers/editStateName.test.js +47 -0
  46. package/dist/esm/StateMachine/Controllers/editStateName.test.js.map +1 -0
  47. package/dist/esm/StateMachine/Controllers/index.js +1 -0
  48. package/dist/esm/StateMachine/Controllers/index.js.map +1 -1
  49. package/dist/esm/StateMachine/Entities/HostStateMachine.js +67 -24
  50. package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
  51. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js +174 -0
  52. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  53. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js +8 -0
  54. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  55. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js +18 -0
  56. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  57. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js +21 -15
  58. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  59. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  60. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  61. package/dist/esm/StateMachine/PMs/HostStatePM.js +131 -0
  62. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -0
  63. package/dist/esm/StateMachine/PMs/HostStatePM.test.js +403 -0
  64. package/dist/esm/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  65. package/dist/esm/StateMachine/PMs/index.js +1 -0
  66. package/dist/esm/StateMachine/PMs/index.js.map +1 -1
  67. package/dist/esm/StateMachine/UCs/EditStateNameUC.js +30 -0
  68. package/dist/esm/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  69. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js +56 -0
  70. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  71. package/dist/esm/StateMachine/UCs/index.js +1 -0
  72. package/dist/esm/StateMachine/UCs/index.js.map +1 -1
  73. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts +4 -0
  74. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts.map +1 -0
  75. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts +2 -0
  76. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts.map +1 -0
  77. package/dist/types/StateMachine/Adapters/index.d.ts +1 -0
  78. package/dist/types/StateMachine/Adapters/index.d.ts.map +1 -1
  79. package/dist/types/StateMachine/Controllers/editStateName.d.ts +3 -0
  80. package/dist/types/StateMachine/Controllers/editStateName.d.ts.map +1 -0
  81. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts +2 -0
  82. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts.map +1 -0
  83. package/dist/types/StateMachine/Controllers/index.d.ts +1 -0
  84. package/dist/types/StateMachine/Controllers/index.d.ts.map +1 -1
  85. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +6 -0
  86. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
  87. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts +7 -0
  88. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts.map +1 -0
  89. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts +9 -0
  90. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts.map +1 -0
  91. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts +3 -4
  92. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts.map +1 -1
  93. package/dist/types/StateMachine/PMs/HostStatePM.d.ts +18 -0
  94. package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -0
  95. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts +2 -0
  96. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts.map +1 -0
  97. package/dist/types/StateMachine/PMs/index.d.ts +1 -0
  98. package/dist/types/StateMachine/PMs/index.d.ts.map +1 -1
  99. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts +9 -0
  100. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts.map +1 -0
  101. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts +2 -0
  102. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts.map +1 -0
  103. package/dist/types/StateMachine/UCs/index.d.ts +1 -0
  104. package/dist/types/StateMachine/UCs/index.d.ts.map +1 -1
  105. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditStateNameUC = void 0;
4
+ exports.makeEditStateNameUC = makeEditStateNameUC;
5
+ const core_1 = require("@vived/core");
6
+ const HostStateEntity_1 = require("../Entities/HostStateEntity");
7
+ class EditStateNameUC extends core_1.AppObjectUC {
8
+ static get(appObj) {
9
+ return appObj.getComponent(this.type);
10
+ }
11
+ static getById(id, appObjects) {
12
+ return appObjects.get(id)?.getComponent(this.type);
13
+ }
14
+ }
15
+ exports.EditStateNameUC = EditStateNameUC;
16
+ EditStateNameUC.type = "EditStateNameUC";
17
+ function makeEditStateNameUC(appObject) {
18
+ return new EditStateNameUCImp(appObject);
19
+ }
20
+ class EditStateNameUCImp extends EditStateNameUC {
21
+ get hostStateEntity() {
22
+ return this.getCachedLocalComponent(HostStateEntity_1.HostStateEntity.type);
23
+ }
24
+ constructor(appObject) {
25
+ super(appObject, EditStateNameUC.type);
26
+ this.editStateName = (name) => {
27
+ if (!this.hostStateEntity) {
28
+ this.warn("Unable to find HostStateEntity");
29
+ return;
30
+ }
31
+ this.hostStateEntity.name = name;
32
+ };
33
+ }
34
+ }
35
+ //# sourceMappingURL=EditStateNameUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditStateNameUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/EditStateNameUC.ts"],"names":[],"mappings":";;;AAoBA,kDAEC;AAtBD,sCAAoE;AACpE,iEAA8D;AAE9D,MAAsB,eAAgB,SAAQ,kBAAW;IAKvD,MAAM,CAAC,GAAG,CAAC,MAAiB;QAC1B,OAAO,MAAM,CAAC,YAAY,CAAkB,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,OAAO,CACZ,EAAU,EACV,UAAyB;QAEzB,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,CAAkB,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;;AAdH,0CAeC;AAdiB,oBAAI,GAAG,iBAAiB,CAAC;AAgB3C,SAAgB,mBAAmB,CAAC,SAAoB;IACtD,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,kBAAmB,SAAQ,eAAe;IAC9C,IAAY,eAAe;QACzB,OAAO,IAAI,CAAC,uBAAuB,CAAkB,iCAAe,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAWD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAVzC,kBAAa,GAAG,CAAC,IAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;QACnC,CAAC,CAAC;IAIF,CAAC;CACF","sourcesContent":["import { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\nimport { HostStateEntity } from \"../Entities/HostStateEntity\";\r\n\r\nexport abstract class EditStateNameUC extends AppObjectUC {\r\n static readonly type = \"EditStateNameUC\";\r\n\r\n abstract editStateName(name: string): void;\r\n\r\n static get(appObj: AppObject): EditStateNameUC | undefined {\r\n return appObj.getComponent<EditStateNameUC>(this.type);\r\n }\r\n\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): EditStateNameUC | undefined {\r\n return appObjects.get(id)?.getComponent<EditStateNameUC>(this.type);\r\n }\r\n}\r\n\r\nexport function makeEditStateNameUC(appObject: AppObject): EditStateNameUC {\r\n return new EditStateNameUCImp(appObject);\r\n}\r\n\r\nclass EditStateNameUCImp extends EditStateNameUC {\r\n private get hostStateEntity() {\r\n return this.getCachedLocalComponent<HostStateEntity>(HostStateEntity.type);\r\n }\r\n\r\n editStateName = (name: string) => {\r\n if (!this.hostStateEntity) {\r\n this.warn(\"Unable to find HostStateEntity\");\r\n return;\r\n }\r\n\r\n this.hostStateEntity.name = name;\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EditStateNameUC.type);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@vived/core");
4
+ const HostStateEntity_1 = require("../Entities/HostStateEntity");
5
+ const EditStateNameUC_1 = require("./EditStateNameUC");
6
+ describe("EditStateNameUC", () => {
7
+ let appObjects;
8
+ let appObject;
9
+ let uc;
10
+ let entity;
11
+ const testId = "test-state-id";
12
+ const initialName = "Initial State Name";
13
+ const newName = "Updated State Name";
14
+ beforeEach(() => {
15
+ // Create a fresh repository and app object for each test
16
+ appObjects = (0, core_1.makeAppObjectRepo)();
17
+ appObject = appObjects.getOrCreate(testId);
18
+ // Create the entity on the same app object
19
+ entity = (0, HostStateEntity_1.makeHostStateEntity)(appObject);
20
+ entity.name = initialName;
21
+ // Create the use case
22
+ uc = (0, EditStateNameUC_1.makeEditStateNameUC)(appObject);
23
+ });
24
+ it("should edit the state name in the entity", () => {
25
+ // Test the main functionality
26
+ uc.editStateName(newName);
27
+ // Verify the entity was updated
28
+ expect(entity.name).toBe(newName);
29
+ });
30
+ it("should log a warning when entity is not found", () => {
31
+ // Create a new app object without the required entity
32
+ const newAppObject = appObjects.getOrCreate("another-id");
33
+ // Spy on the warn method
34
+ const warnSpy = jest.spyOn(appObjects, "submitWarning");
35
+ // Create a use case without the dependency
36
+ const isolatedUC = (0, EditStateNameUC_1.makeEditStateNameUC)(newAppObject);
37
+ // Execute the use case
38
+ isolatedUC.editStateName(newName);
39
+ // Verify warning was logged
40
+ expect(warnSpy).toHaveBeenCalled();
41
+ });
42
+ it("should be retrievable via static get method", () => {
43
+ // Test the component access pattern
44
+ const retrievedUC = EditStateNameUC_1.EditStateNameUC.get(appObject);
45
+ expect(retrievedUC).toBe(uc);
46
+ });
47
+ it("should be retrievable via static getById method", () => {
48
+ // Test ID-based retrieval
49
+ const retrievedUC = EditStateNameUC_1.EditStateNameUC.getById(testId, appObjects);
50
+ expect(retrievedUC).toBe(uc);
51
+ });
52
+ it("should return undefined when getById is called with non-existent id", () => {
53
+ // Test graceful handling of missing components
54
+ const retrievedUC = EditStateNameUC_1.EditStateNameUC.getById("non-existent-id", appObjects);
55
+ expect(retrievedUC).toBeUndefined();
56
+ });
57
+ });
58
+ //# sourceMappingURL=EditStateNameUC.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditStateNameUC.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/EditStateNameUC.test.ts"],"names":[],"mappings":";;AAAA,sCAA0E;AAC1E,iEAGqC;AACrC,uDAAyE;AAEzE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAoB,CAAC;IACzB,IAAI,EAAmB,CAAC;IACxB,IAAI,MAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,WAAW,GAAG,oBAAoB,CAAC;IACzC,MAAM,OAAO,GAAG,oBAAoB,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACd,yDAAyD;QACzD,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;QACjC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE3C,2CAA2C;QAC3C,MAAM,GAAG,IAAA,qCAAmB,EAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC;QAE1B,sBAAsB;QACtB,EAAE,GAAG,IAAA,qCAAmB,EAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,8BAA8B;QAC9B,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE1B,gCAAgC;QAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,sDAAsD;QACtD,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE1D,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAExD,2CAA2C;QAC3C,MAAM,UAAU,GAAG,IAAA,qCAAmB,EAAC,YAAY,CAAC,CAAC;QAErD,uBAAuB;QACvB,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAElC,4BAA4B;QAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,oCAAoC;QACpC,MAAM,WAAW,GAAG,iCAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,0BAA0B;QAC1B,MAAM,WAAW,GAAG,iCAAe,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,+CAA+C;QAC/C,MAAM,WAAW,GAAG,iCAAe,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { AppObject, AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport {\r\n HostStateEntity,\r\n makeHostStateEntity\r\n} from \"../Entities/HostStateEntity\";\r\nimport { EditStateNameUC, makeEditStateNameUC } from \"./EditStateNameUC\";\r\n\r\ndescribe(\"EditStateNameUC\", () => {\r\n let appObjects: AppObjectRepo;\r\n let appObject: AppObject;\r\n let uc: EditStateNameUC;\r\n let entity: HostStateEntity;\r\n const testId = \"test-state-id\";\r\n const initialName = \"Initial State Name\";\r\n const newName = \"Updated State Name\";\r\n\r\n beforeEach(() => {\r\n // Create a fresh repository and app object for each test\r\n appObjects = makeAppObjectRepo();\r\n appObject = appObjects.getOrCreate(testId);\r\n\r\n // Create the entity on the same app object\r\n entity = makeHostStateEntity(appObject);\r\n entity.name = initialName;\r\n\r\n // Create the use case\r\n uc = makeEditStateNameUC(appObject);\r\n });\r\n\r\n it(\"should edit the state name in the entity\", () => {\r\n // Test the main functionality\r\n uc.editStateName(newName);\r\n\r\n // Verify the entity was updated\r\n expect(entity.name).toBe(newName);\r\n });\r\n\r\n it(\"should log a warning when entity is not found\", () => {\r\n // Create a new app object without the required entity\r\n const newAppObject = appObjects.getOrCreate(\"another-id\");\r\n\r\n // Spy on the warn method\r\n const warnSpy = jest.spyOn(appObjects, \"submitWarning\");\r\n\r\n // Create a use case without the dependency\r\n const isolatedUC = makeEditStateNameUC(newAppObject);\r\n\r\n // Execute the use case\r\n isolatedUC.editStateName(newName);\r\n\r\n // Verify warning was logged\r\n expect(warnSpy).toHaveBeenCalled();\r\n });\r\n\r\n it(\"should be retrievable via static get method\", () => {\r\n // Test the component access pattern\r\n const retrievedUC = EditStateNameUC.get(appObject);\r\n expect(retrievedUC).toBe(uc);\r\n });\r\n\r\n it(\"should be retrievable via static getById method\", () => {\r\n // Test ID-based retrieval\r\n const retrievedUC = EditStateNameUC.getById(testId, appObjects);\r\n expect(retrievedUC).toBe(uc);\r\n });\r\n\r\n it(\"should return undefined when getById is called with non-existent id\", () => {\r\n // Test graceful handling of missing components\r\n const retrievedUC = EditStateNameUC.getById(\"non-existent-id\", appObjects);\r\n expect(retrievedUC).toBeUndefined();\r\n });\r\n});\r\n"]}
@@ -18,6 +18,7 @@ __exportStar(require("./CancelEditing"), exports);
18
18
  __exportStar(require("./ConsumeState"), exports);
19
19
  __exportStar(require("./DeleteStateUC"), exports);
20
20
  __exportStar(require("./DuplicateStateUC"), exports);
21
+ __exportStar(require("./EditStateNameUC"), exports);
21
22
  __exportStar(require("./EditActiveState"), exports);
22
23
  __exportStar(require("./EditState"), exports);
23
24
  __exportStar(require("./EndActivity"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,kDAAgC;AAChC,qDAAmC;AACnC,oDAAkC;AAClC,8CAA4B;AAC5B,gDAA8B;AAC9B,6CAA2B;AAC3B,kDAAgC;AAChC,sDAAoC;AACpC,yDAAuC;AACvC,6DAA2C;AAC3C,mEAAiD","sourcesContent":["export * from \"./CancelEditing\";\r\nexport * from \"./ConsumeState\";\r\nexport * from \"./DeleteStateUC\";\r\nexport * from \"./DuplicateStateUC\";\r\nexport * from \"./EditActiveState\";\r\nexport * from \"./EditState\";\r\nexport * from \"./EndActivity\";\r\nexport * from \"./NewState\";\r\nexport * from \"./SaveAuthoring\";\r\nexport * from \"./TransitionToState\";\r\nexport * from \"./SavePersistentStates\";\r\nexport * from \"./setSandboxStatesFromData\";\r\nexport * from \"./setSandboxStatesFromStringData\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,kDAAgC;AAChC,qDAAmC;AACnC,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,gDAA8B;AAC9B,6CAA2B;AAC3B,kDAAgC;AAChC,sDAAoC;AACpC,yDAAuC;AACvC,6DAA2C;AAC3C,mEAAiD","sourcesContent":["export * from \"./CancelEditing\";\r\nexport * from \"./ConsumeState\";\r\nexport * from \"./DeleteStateUC\";\r\nexport * from \"./DuplicateStateUC\";\r\nexport * from \"./EditStateNameUC\";\r\nexport * from \"./EditActiveState\";\r\nexport * from \"./EditState\";\r\nexport * from \"./EndActivity\";\r\nexport * from \"./NewState\";\r\nexport * from \"./SaveAuthoring\";\r\nexport * from \"./TransitionToState\";\r\nexport * from \"./SavePersistentStates\";\r\nexport * from \"./setSandboxStatesFromData\";\r\nexport * from \"./setSandboxStatesFromStringData\";\r\n"]}
@@ -0,0 +1,21 @@
1
+ import { HostStatePM } from "../PMs/HostStatePM";
2
+ export const hostStateAdapter = {
3
+ defaultVM: HostStatePM.defaultVM,
4
+ subscribe: (id, appObjects, setVM) => {
5
+ if (!id) {
6
+ return;
7
+ }
8
+ const pm = HostStatePM.getById(id, appObjects);
9
+ if (!pm) {
10
+ appObjects.submitError("hostStateAdapter", `Unable to find HostStatePM for ID: ${id}`);
11
+ return;
12
+ }
13
+ pm.addView(setVM);
14
+ },
15
+ unsubscribe: (id, appObjects, setVM) => {
16
+ if (!id)
17
+ return;
18
+ HostStatePM.getById(id, appObjects)?.removeView(setVM);
19
+ }
20
+ };
21
+ //# sourceMappingURL=hostStateAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostStateAdapter.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/hostStateAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,SAAS,EAAE,WAAW,CAAC,SAAS;IAChC,SAAS,EAAE,CACT,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,WAAW,CACpB,kBAAkB,EAClB,sCAAsC,EAAE,EAAE,CAC3C,CAAC;YACF,OAAO;QACT,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,WAAW,EAAE,CACX,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;CACF,CAAC","sourcesContent":["import { AppObjectRepo, PmAdapter } from \"@vived/core\";\r\nimport { HostStatePM, HostStateVM } from \"../PMs/HostStatePM\";\r\n\r\nexport const hostStateAdapter: PmAdapter<HostStateVM> = {\r\n defaultVM: HostStatePM.defaultVM,\r\n subscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: HostStateVM) => void\r\n ) => {\r\n if (!id) {\r\n return;\r\n }\r\n\r\n const pm = HostStatePM.getById(id, appObjects);\r\n if (!pm) {\r\n appObjects.submitError(\r\n \"hostStateAdapter\",\r\n `Unable to find HostStatePM for ID: ${id}`\r\n );\r\n return;\r\n }\r\n\r\n pm.addView(setVM);\r\n },\r\n unsubscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: HostStateVM) => void\r\n ) => {\r\n if (!id) return;\r\n\r\n HostStatePM.getById(id, appObjects)?.removeView(setVM);\r\n }\r\n};\r\n"]}
@@ -0,0 +1,47 @@
1
+ import { makeAppObjectRepo } from "@vived/core";
2
+ import { HostStatePM } from "../PMs/HostStatePM";
3
+ import { hostStateAdapter } from "./hostStateAdapter";
4
+ import { makeMockHostStatePM } from "../Mocks/MockHostStatePM";
5
+ describe("hostStateAdapter", () => {
6
+ let appObjects;
7
+ let appObject;
8
+ let mockPM;
9
+ const testId = "test-state-id";
10
+ const setVM = jest.fn();
11
+ beforeEach(() => {
12
+ appObjects = makeAppObjectRepo();
13
+ appObject = appObjects.getOrCreate(testId);
14
+ // Create the mock PM instead of a real one
15
+ mockPM = makeMockHostStatePM(appObject);
16
+ // Reset the mock function before each test
17
+ setVM.mockReset();
18
+ });
19
+ it("should provide the default VM from HostStatePM", () => {
20
+ expect(hostStateAdapter.defaultVM).toEqual(HostStatePM.defaultVM);
21
+ });
22
+ it("should add a view on subscribe", () => {
23
+ const addViewSpy = jest.spyOn(mockPM, "addView");
24
+ hostStateAdapter.subscribe(testId, appObjects, setVM);
25
+ expect(addViewSpy).toHaveBeenCalledWith(setVM);
26
+ });
27
+ it("should remove a view on unsubscribe", () => {
28
+ const removeViewSpy = jest.spyOn(mockPM, "removeView");
29
+ hostStateAdapter.unsubscribe(testId, appObjects, setVM);
30
+ expect(removeViewSpy).toHaveBeenCalledWith(setVM);
31
+ });
32
+ it("should handle missing PM on subscribe", () => {
33
+ // Create a new AppObjectRepo without the PM
34
+ const emptyAppObjects = makeAppObjectRepo();
35
+ emptyAppObjects.submitError = jest.fn();
36
+ // Using an ID that doesn't have a PM
37
+ hostStateAdapter.subscribe(testId, emptyAppObjects, setVM);
38
+ expect(emptyAppObjects.submitError).toHaveBeenCalledWith("hostStateAdapter", expect.stringContaining("Unable to find HostStatePM"));
39
+ });
40
+ it("should handle missing PM on unsubscribe without error", () => {
41
+ // This should not throw an error
42
+ expect(() => {
43
+ hostStateAdapter.unsubscribe("non-existent", appObjects, setVM);
44
+ }).not.toThrow();
45
+ });
46
+ });
47
+ //# sourceMappingURL=hostStateAdapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostStateAdapter.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/hostStateAdapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAmB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAoB,CAAC;IACzB,IAAI,MAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACjC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE3C,2CAA2C;QAC3C,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAExC,2CAA2C;QAC3C,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEjD,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEtD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAEvD,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAExD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,4CAA4C;QAC5C,MAAM,eAAe,GAAG,iBAAiB,EAAE,CAAC;QAC5C,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAExC,qCAAqC;QACrC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QAE3D,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACtD,kBAAkB,EAClB,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CACtD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE;YACV,gBAAgB,CAAC,WAAW,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { AppObject, AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { HostStatePM } from \"../PMs/HostStatePM\";\r\nimport { hostStateAdapter } from \"./hostStateAdapter\";\r\nimport { MockHostStatePM, makeMockHostStatePM } from \"../Mocks/MockHostStatePM\";\r\n\r\ndescribe(\"hostStateAdapter\", () => {\r\n let appObjects: AppObjectRepo;\r\n let appObject: AppObject;\r\n let mockPM: MockHostStatePM;\r\n const testId = \"test-state-id\";\r\n const setVM = jest.fn();\r\n\r\n beforeEach(() => {\r\n appObjects = makeAppObjectRepo();\r\n appObject = appObjects.getOrCreate(testId);\r\n\r\n // Create the mock PM instead of a real one\r\n mockPM = makeMockHostStatePM(appObject);\r\n\r\n // Reset the mock function before each test\r\n setVM.mockReset();\r\n });\r\n\r\n it(\"should provide the default VM from HostStatePM\", () => {\r\n expect(hostStateAdapter.defaultVM).toEqual(HostStatePM.defaultVM);\r\n });\r\n\r\n it(\"should add a view on subscribe\", () => {\r\n const addViewSpy = jest.spyOn(mockPM, \"addView\");\r\n\r\n hostStateAdapter.subscribe(testId, appObjects, setVM);\r\n\r\n expect(addViewSpy).toHaveBeenCalledWith(setVM);\r\n });\r\n\r\n it(\"should remove a view on unsubscribe\", () => {\r\n const removeViewSpy = jest.spyOn(mockPM, \"removeView\");\r\n\r\n hostStateAdapter.unsubscribe(testId, appObjects, setVM);\r\n\r\n expect(removeViewSpy).toHaveBeenCalledWith(setVM);\r\n });\r\n\r\n it(\"should handle missing PM on subscribe\", () => {\r\n // Create a new AppObjectRepo without the PM\r\n const emptyAppObjects = makeAppObjectRepo();\r\n emptyAppObjects.submitError = jest.fn();\r\n\r\n // Using an ID that doesn't have a PM\r\n hostStateAdapter.subscribe(testId, emptyAppObjects, setVM);\r\n\r\n expect(emptyAppObjects.submitError).toHaveBeenCalledWith(\r\n \"hostStateAdapter\",\r\n expect.stringContaining(\"Unable to find HostStatePM\")\r\n );\r\n });\r\n\r\n it(\"should handle missing PM on unsubscribe without error\", () => {\r\n // This should not throw an error\r\n expect(() => {\r\n hostStateAdapter.unsubscribe(\"non-existent\", appObjects, setVM);\r\n }).not.toThrow();\r\n });\r\n});\r\n"]}
@@ -1,3 +1,4 @@
1
1
  export * from "./editingStateAdapter";
2
2
  export * from "./hostStateMachinePMAdapter";
3
+ export * from "./hostStateAdapter";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC","sourcesContent":["export * from \"./editingStateAdapter\";\r\nexport * from \"./hostStateMachinePMAdapter\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./editingStateAdapter\";\r\nexport * from \"./hostStateMachinePMAdapter\";\r\nexport * from \"./hostStateAdapter\";\r\n"]}
@@ -0,0 +1,10 @@
1
+ import { EditStateNameUC } from "../UCs/EditStateNameUC";
2
+ export function editStateName(name, id, appObjects) {
3
+ const uc = EditStateNameUC.getById(id, appObjects);
4
+ if (!uc) {
5
+ appObjects.submitWarning("editStateName", "Unable to find EditStateNameUC");
6
+ return;
7
+ }
8
+ uc.editStateName(name);
9
+ }
10
+ //# sourceMappingURL=editStateName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editStateName.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/editStateName.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,EAAU,EACV,UAAyB;IAEzB,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { EditStateNameUC } from \"../UCs/EditStateNameUC\";\r\n\r\nexport function editStateName(\r\n name: string,\r\n id: string,\r\n appObjects: AppObjectRepo\r\n) {\r\n const uc = EditStateNameUC.getById(id, appObjects);\r\n if (!uc) {\r\n appObjects.submitWarning(\"editStateName\", \"Unable to find EditStateNameUC\");\r\n return;\r\n }\r\n\r\n uc.editStateName(name);\r\n}\r\n"]}
@@ -0,0 +1,47 @@
1
+ import { makeAppObjectRepo } from "@vived/core";
2
+ import { MockEditStateNameUC } from "../Mocks/MockEditStateNameUC";
3
+ import { editStateName } from "./editStateName";
4
+ describe("editStateName", () => {
5
+ let appObjects;
6
+ let mockUC;
7
+ let mockEditFunction;
8
+ const testId = "test-state-id";
9
+ const testName = "New State Name";
10
+ beforeEach(() => {
11
+ // Create a fresh repository for each test
12
+ appObjects = makeAppObjectRepo();
13
+ const testAppObject = appObjects.getOrCreate(testId);
14
+ // Create the mock UC
15
+ mockUC = new MockEditStateNameUC(testAppObject);
16
+ // Setup the spy on the mock function
17
+ mockEditFunction = jest.fn();
18
+ mockUC.editStateName = mockEditFunction;
19
+ });
20
+ it("should call EditStateNameUC with the provided name", () => {
21
+ // Call the controller function
22
+ editStateName(testName, testId, appObjects);
23
+ // Verify the use case was called with the correct name
24
+ expect(mockEditFunction).toBeCalledWith(testName);
25
+ });
26
+ it("should do nothing when UC cannot be found", () => {
27
+ // Call with an ID that doesn't have the UC
28
+ const nonExistentId = "non-existent-id";
29
+ // This should not throw an error
30
+ expect(() => {
31
+ editStateName(testName, nonExistentId, appObjects);
32
+ }).not.toThrow();
33
+ // Verify our original mock wasn't called
34
+ expect(mockEditFunction).not.toHaveBeenCalled();
35
+ });
36
+ it("should submit a warning when UC is not found", () => {
37
+ // Spy on the warning submission method
38
+ const submitWarningSpy = jest.spyOn(appObjects, "submitWarning");
39
+ // Call the controller function with a non-existent ID
40
+ editStateName(testName, "non-existent-id", appObjects);
41
+ // Verify warning was submitted
42
+ expect(submitWarningSpy).toHaveBeenCalledWith("editStateName", "Unable to find EditStateNameUC");
43
+ // Verify that the edit function was not called
44
+ expect(mockEditFunction).not.toHaveBeenCalled();
45
+ });
46
+ });
47
+ //# sourceMappingURL=editStateName.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editStateName.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/editStateName.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,IAAI,UAAyB,CAAC;IAC9B,IAAI,MAA2B,CAAC;IAChC,IAAI,gBAA2B,CAAC;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAElC,UAAU,CAAC,GAAG,EAAE;QACf,0CAA0C;QAC1C,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAErD,qBAAqB;QACrB,MAAM,GAAG,IAAI,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAEhD,qCAAqC;QACrC,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,+BAA+B;QAC/B,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAE5C,uDAAuD;QACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,2CAA2C;QAC3C,MAAM,aAAa,GAAG,iBAAiB,CAAC;QAExC,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE;YACX,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAEjB,yCAAyC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,uCAAuC;QACvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjE,sDAAsD;QACtD,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAEvD,+BAA+B;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC5C,eAAe,EACf,gCAAgC,CAChC,CAAC;QAEF,+CAA+C;QAC/C,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport {MockEditStateNameUC } from \"../Mocks/MockEditStateNameUC\";\r\nimport { editStateName } from \"./editStateName\";\r\n\r\ndescribe(\"editStateName\", () => {\r\n\tlet appObjects: AppObjectRepo;\r\n\tlet mockUC: MockEditStateNameUC;\r\n\tlet mockEditFunction: jest.Mock;\r\n\tconst testId = \"test-state-id\";\r\n\tconst testName = \"New State Name\";\r\n\r\n\tbeforeEach(() => {\r\n\t\t// Create a fresh repository for each test\r\n\t\tappObjects = makeAppObjectRepo();\r\n\t\tconst testAppObject = appObjects.getOrCreate(testId);\r\n\r\n\t\t// Create the mock UC\r\n\t\tmockUC = new MockEditStateNameUC(testAppObject);\r\n\t\t\r\n\t\t// Setup the spy on the mock function\r\n\t\tmockEditFunction = jest.fn();\r\n\t\tmockUC.editStateName = mockEditFunction;\r\n\t});\r\n\r\n\tit(\"should call EditStateNameUC with the provided name\", () => {\r\n\t\t// Call the controller function\r\n\t\teditStateName(testName, testId, appObjects);\r\n\r\n\t\t// Verify the use case was called with the correct name\r\n\t\texpect(mockEditFunction).toBeCalledWith(testName);\r\n\t});\r\n\r\n\tit(\"should do nothing when UC cannot be found\", () => {\r\n\t\t// Call with an ID that doesn't have the UC\r\n\t\tconst nonExistentId = \"non-existent-id\";\r\n\r\n\t\t// This should not throw an error\r\n\t\texpect(() => {\r\n\t\t\teditStateName(testName, nonExistentId, appObjects);\r\n\t\t}).not.toThrow();\r\n\r\n\t\t// Verify our original mock wasn't called\r\n\t\texpect(mockEditFunction).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"should submit a warning when UC is not found\", () => {\r\n\t\t// Spy on the warning submission method\r\n\t\tconst submitWarningSpy = jest.spyOn(appObjects, \"submitWarning\");\r\n\r\n\t\t// Call the controller function with a non-existent ID\r\n\t\teditStateName(testName, \"non-existent-id\", appObjects);\r\n\r\n\t\t// Verify warning was submitted\r\n\t\texpect(submitWarningSpy).toHaveBeenCalledWith(\r\n\t\t\t\"editStateName\",\r\n\t\t\t\"Unable to find EditStateNameUC\"\r\n\t\t);\r\n\r\n\t\t// Verify that the edit function was not called\r\n\t\texpect(mockEditFunction).not.toHaveBeenCalled();\r\n\t});\r\n});\r\n"]}
@@ -4,6 +4,7 @@ export * from "./deleteState";
4
4
  export * from "./duplicateState";
5
5
  export * from "./editActiveState";
6
6
  export * from "./editState";
7
+ export * from "./editStateName";
7
8
  export * from "./endActivity";
8
9
  export * from "./newState";
9
10
  export * from "./saveAuthoring";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC","sourcesContent":["export * from \"./cancelEditing\";\r\nexport * from \"./consumeState\";\r\nexport * from \"./deleteState\";\r\nexport * from \"./duplicateState\";\r\nexport * from \"./editActiveState\";\r\nexport * from \"./editState\";\r\nexport * from \"./endActivity\";\r\nexport * from \"./newState\";\r\nexport * from \"./saveAuthoring\";\r\nexport * from \"./transitionToState\";\r\nexport * from \"./savePersistentStates\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC","sourcesContent":["export * from \"./cancelEditing\";\r\nexport * from \"./consumeState\";\r\nexport * from \"./deleteState\";\r\nexport * from \"./duplicateState\";\r\nexport * from \"./editActiveState\";\r\nexport * from \"./editState\";\r\nexport * from \"./editStateName\";\r\nexport * from \"./endActivity\";\r\nexport * from \"./newState\";\r\nexport * from \"./saveAuthoring\";\r\nexport * from \"./transitionToState\";\r\nexport * from \"./savePersistentStates\";\r\n"]}
@@ -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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EACL,qBAAqB,EAErB,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,OAAgB,gBAAiB,SAAQ,eAAe;IAqB5D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAzBM,qBAAI,GAAG,kBAAkB,CAAC;AA4BnC,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAKhD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAGD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAGD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAGD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,GAAY;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,CAAC;IACrC,CAAC;IAKD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAuB;QAC1C,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAEtE,MAAM,YAAY,GAChB,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,YAAY,KAAK,WAAW;YAAE,OAAO;QAEzC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAGD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,UAAoB;QACjC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IA4GO,aAAa,CAAC,EAAU;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAlLlC,YAAO,GAAsB,EAAE,CAAC;QAExC,uBAAkB,GAAG,CAAC,CAAC;QAqBf,wBAAmB,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QA6BtE,gBAAW,GAAa,EAAE,CAAC;QAWnC,aAAQ,GAAG,CAAC,EAAU,EAAW,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAEF,uBAAkB,GAAG,CAAC,EAAU,EAAQ,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY;gBAAE,OAAO;YAC3C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC;YAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;YAE5B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAClC,CAAC;YAED,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,qBAAgB,GAAG,GAAS,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAE9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,MAAyB,EAAQ,EAAE;YAC9C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,EAAU,EAAmB,EAAE;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,mBAAc,GAAG,GAAoB,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAEvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,EAAU,EAA+B,EAAE;YACzD,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;YAE3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,kBAAa,GAAG,CAAC,EAAU,EAAsB,EAAE;YACjD,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YAEf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAChC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;oBACpB,KAAK,GAAG,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAeA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","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"]}