@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.
- package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js +24 -0
- package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
- package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js +49 -0
- package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
- package/dist/cjs/StateMachine/Adapters/index.js +1 -0
- package/dist/cjs/StateMachine/Adapters/index.js.map +1 -1
- package/dist/cjs/StateMachine/Controllers/editStateName.js +13 -0
- package/dist/cjs/StateMachine/Controllers/editStateName.js.map +1 -0
- package/dist/cjs/StateMachine/Controllers/editStateName.test.js +49 -0
- package/dist/cjs/StateMachine/Controllers/editStateName.test.js.map +1 -0
- package/dist/cjs/StateMachine/Controllers/index.js +1 -0
- package/dist/cjs/StateMachine/Controllers/index.js.map +1 -1
- package/dist/cjs/StateMachine/Entities/HostStateMachine.js +67 -24
- package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
- package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js +174 -0
- package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
- package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js +12 -0
- package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
- package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js +23 -0
- package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
- package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js +21 -15
- package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
- package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
- package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
- package/dist/cjs/StateMachine/PMs/HostStatePM.js +136 -0
- package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -0
- package/dist/cjs/StateMachine/PMs/HostStatePM.test.js +405 -0
- package/dist/cjs/StateMachine/PMs/HostStatePM.test.js.map +1 -0
- package/dist/cjs/StateMachine/PMs/index.js +1 -0
- package/dist/cjs/StateMachine/PMs/index.js.map +1 -1
- package/dist/cjs/StateMachine/UCs/EditStateNameUC.js +35 -0
- package/dist/cjs/StateMachine/UCs/EditStateNameUC.js.map +1 -0
- package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js +58 -0
- package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
- package/dist/cjs/StateMachine/UCs/index.js +1 -0
- package/dist/cjs/StateMachine/UCs/index.js.map +1 -1
- package/dist/esm/StateMachine/Adapters/hostStateAdapter.js +21 -0
- package/dist/esm/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
- package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js +47 -0
- package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
- package/dist/esm/StateMachine/Adapters/index.js +1 -0
- package/dist/esm/StateMachine/Adapters/index.js.map +1 -1
- package/dist/esm/StateMachine/Controllers/editStateName.js +10 -0
- package/dist/esm/StateMachine/Controllers/editStateName.js.map +1 -0
- package/dist/esm/StateMachine/Controllers/editStateName.test.js +47 -0
- package/dist/esm/StateMachine/Controllers/editStateName.test.js.map +1 -0
- package/dist/esm/StateMachine/Controllers/index.js +1 -0
- package/dist/esm/StateMachine/Controllers/index.js.map +1 -1
- package/dist/esm/StateMachine/Entities/HostStateMachine.js +67 -24
- package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
- package/dist/esm/StateMachine/Entities/HostStateMachine.test.js +174 -0
- package/dist/esm/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
- package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js +8 -0
- package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
- package/dist/esm/StateMachine/Mocks/MockHostStatePM.js +18 -0
- package/dist/esm/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
- package/dist/esm/StateMachine/PMs/HostStateMachinePM.js +21 -15
- package/dist/esm/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
- package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
- package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
- package/dist/esm/StateMachine/PMs/HostStatePM.js +131 -0
- package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -0
- package/dist/esm/StateMachine/PMs/HostStatePM.test.js +403 -0
- package/dist/esm/StateMachine/PMs/HostStatePM.test.js.map +1 -0
- package/dist/esm/StateMachine/PMs/index.js +1 -0
- package/dist/esm/StateMachine/PMs/index.js.map +1 -1
- package/dist/esm/StateMachine/UCs/EditStateNameUC.js +30 -0
- package/dist/esm/StateMachine/UCs/EditStateNameUC.js.map +1 -0
- package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js +56 -0
- package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
- package/dist/esm/StateMachine/UCs/index.js +1 -0
- package/dist/esm/StateMachine/UCs/index.js.map +1 -1
- package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts +4 -0
- package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts.map +1 -0
- package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts +2 -0
- package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts.map +1 -0
- package/dist/types/StateMachine/Adapters/index.d.ts +1 -0
- package/dist/types/StateMachine/Adapters/index.d.ts.map +1 -1
- package/dist/types/StateMachine/Controllers/editStateName.d.ts +3 -0
- package/dist/types/StateMachine/Controllers/editStateName.d.ts.map +1 -0
- package/dist/types/StateMachine/Controllers/editStateName.test.d.ts +2 -0
- package/dist/types/StateMachine/Controllers/editStateName.test.d.ts.map +1 -0
- package/dist/types/StateMachine/Controllers/index.d.ts +1 -0
- package/dist/types/StateMachine/Controllers/index.d.ts.map +1 -1
- package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +6 -0
- package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
- package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts +7 -0
- package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts.map +1 -0
- package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts +9 -0
- package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts.map +1 -0
- package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts +3 -4
- package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts.map +1 -1
- package/dist/types/StateMachine/PMs/HostStatePM.d.ts +18 -0
- package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -0
- package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts +2 -0
- package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts.map +1 -0
- package/dist/types/StateMachine/PMs/index.d.ts +1 -0
- package/dist/types/StateMachine/PMs/index.d.ts.map +1 -1
- package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts +9 -0
- package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts.map +1 -0
- package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts +2 -0
- package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts.map +1 -0
- package/dist/types/StateMachine/UCs/index.d.ts +1 -0
- package/dist/types/StateMachine/UCs/index.d.ts.map +1 -1
- 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 +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"]}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
32
|
+
if (!this._activeState)
|
|
33
|
+
return undefined;
|
|
34
|
+
const currentIndex = this.getStateIndex(this._activeState);
|
|
35
|
+
if (currentIndex === undefined || currentIndex >= this._states.length - 1)
|
|
36
|
+
return undefined;
|
|
37
|
+
return this._states[currentIndex + 1].id;
|
|
25
38
|
}
|
|
26
39
|
get isAuthoring() {
|
|
27
40
|
return this.memoizedIsAuthoring.val;
|
|
@@ -80,33 +93,17 @@ class HostStateMachineImp extends HostStateMachine {
|
|
|
80
93
|
if (state.id === this._activeState)
|
|
81
94
|
return;
|
|
82
95
|
this._activeState = state.id;
|
|
83
|
-
const index = this.getStateIndex(id);
|
|
84
|
-
if (index === undefined) {
|
|
85
|
-
this._nextState = undefined;
|
|
86
|
-
this._previousState = undefined;
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const prevIndex = index - 1;
|
|
90
|
-
const nextIndex = index + 1;
|
|
91
|
-
if (prevIndex >= 0) {
|
|
92
|
-
this._previousState = this._states[prevIndex].id;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this._previousState = undefined;
|
|
96
|
-
}
|
|
97
|
-
if (nextIndex < this._states.length) {
|
|
98
|
-
this._nextState = this._states[nextIndex].id;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this._nextState = undefined;
|
|
102
|
-
}
|
|
103
96
|
this.notifyOnChange();
|
|
104
97
|
};
|
|
98
|
+
this.setActiveStateByIndex = (index) => {
|
|
99
|
+
if (index < 0 || index >= this._states.length)
|
|
100
|
+
return;
|
|
101
|
+
const state = this._states[index];
|
|
102
|
+
this.setActiveStateByID(state.id);
|
|
103
|
+
};
|
|
105
104
|
this.clearActiveState = () => {
|
|
106
105
|
if (!this.activeState)
|
|
107
106
|
return;
|
|
108
|
-
this._nextState = undefined;
|
|
109
|
-
this._previousState = undefined;
|
|
110
107
|
this._activeState = undefined;
|
|
111
108
|
this.notifyOnChange();
|
|
112
109
|
};
|
|
@@ -137,6 +134,17 @@ class HostStateMachineImp extends HostStateMachine {
|
|
|
137
134
|
this._states.splice(index, 1);
|
|
138
135
|
this.notifyOnChange();
|
|
139
136
|
};
|
|
137
|
+
this.deleteAllStates = () => {
|
|
138
|
+
if (this._states.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
// Dispose all state app objects
|
|
141
|
+
this._states.forEach((state) => {
|
|
142
|
+
state.appObject.dispose();
|
|
143
|
+
});
|
|
144
|
+
this._states = [];
|
|
145
|
+
this.clearActiveState();
|
|
146
|
+
this.notifyOnChange();
|
|
147
|
+
};
|
|
140
148
|
this.getStateIndex = (id) => {
|
|
141
149
|
let index = -1;
|
|
142
150
|
this._states.forEach((state, i) => {
|
|
@@ -151,6 +159,41 @@ class HostStateMachineImp extends HostStateMachine {
|
|
|
151
159
|
return undefined;
|
|
152
160
|
}
|
|
153
161
|
};
|
|
162
|
+
this.setPreviousStateActive = () => {
|
|
163
|
+
if (!this.previousState)
|
|
164
|
+
return;
|
|
165
|
+
this.setActiveStateByID(this.previousState);
|
|
166
|
+
};
|
|
167
|
+
this.setNextStateActive = () => {
|
|
168
|
+
if (!this.nextState)
|
|
169
|
+
return;
|
|
170
|
+
this.setActiveStateByID(this.nextState);
|
|
171
|
+
};
|
|
172
|
+
this.setStateIndex = (stateID, index) => {
|
|
173
|
+
// Check if the state exists
|
|
174
|
+
const state = this.getStateByID(stateID);
|
|
175
|
+
if (!state)
|
|
176
|
+
return;
|
|
177
|
+
// Check if the index is valid
|
|
178
|
+
if (index < 0 || index >= this._states.length)
|
|
179
|
+
return;
|
|
180
|
+
// Get the current index
|
|
181
|
+
const currentIndex = this.getStateIndex(stateID);
|
|
182
|
+
if (currentIndex === undefined)
|
|
183
|
+
return;
|
|
184
|
+
// If the index is the same, do nothing
|
|
185
|
+
if (currentIndex === index)
|
|
186
|
+
return;
|
|
187
|
+
// Remove the state from the current position
|
|
188
|
+
const stateToMove = this._states.splice(currentIndex, 1)[0];
|
|
189
|
+
// Insert it at the new position
|
|
190
|
+
this._states.splice(index, 0, stateToMove);
|
|
191
|
+
// If the moved state was active, update previous and next states
|
|
192
|
+
if (stateID === this._activeState) {
|
|
193
|
+
this.setActiveStateByID(stateID);
|
|
194
|
+
}
|
|
195
|
+
this.notifyOnChange();
|
|
196
|
+
};
|
|
154
197
|
this.appObjects.registerSingleton(this);
|
|
155
198
|
}
|
|
156
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n private _previousState: string | undefined;\r\n get previousState() {\r\n return this._previousState;\r\n }\r\n\r\n private _nextState: string | undefined;\r\n get nextState() {\r\n return this._nextState;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n return;\r\n }\r\n\r\n const prevIndex = index - 1;\r\n const nextIndex = index + 1;\r\n\r\n if (prevIndex >= 0) {\r\n this._previousState = this._states[prevIndex].id;\r\n } else {\r\n this._previousState = undefined;\r\n }\r\n\r\n if (nextIndex < this._states.length) {\r\n this._nextState = this._states[nextIndex].id;\r\n } else {\r\n this._nextState = undefined;\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n abstract stateCount: number;\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract deleteAllStates: () => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n abstract setPreviousStateActive: () => void;\r\n abstract setNextStateActive: () => void;\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n get previousState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex === 0) return undefined;\r\n \r\n return this._states[currentIndex - 1].id;\r\n }\r\n\r\n get nextState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex >= this._states.length - 1) return undefined;\r\n \r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n setActiveStateByIndex = (index: number): void => {\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n const state = this._states[index];\r\n this.setActiveStateByID(state.id);\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n deleteAllStates = (): void => {\r\n if (this._states.length === 0) return;\r\n\r\n // Dispose all state app objects\r\n this._states.forEach((state) => {\r\n state.appObject.dispose();\r\n });\r\n\r\n this._states = [];\r\n this.clearActiveState();\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n setPreviousStateActive = (): void => {\r\n if (!this.previousState) return;\r\n\r\n this.setActiveStateByID(this.previousState);\r\n };\r\n\r\n setNextStateActive = (): void => {\r\n if (!this.nextState) return;\r\n\r\n this.setActiveStateByID(this.nextState);\r\n };\r\n\r\n setStateIndex = (stateID: string, index: number): void => {\r\n // Check if the state exists\r\n const state = this.getStateByID(stateID);\r\n if (!state) return;\r\n\r\n // Check if the index is valid\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n // Get the current index\r\n const currentIndex = this.getStateIndex(stateID);\r\n if (currentIndex === undefined) return;\r\n\r\n // If the index is the same, do nothing\r\n if (currentIndex === index) return;\r\n\r\n // Remove the state from the current position\r\n const stateToMove = this._states.splice(currentIndex, 1)[0];\r\n\r\n // Insert it at the new position\r\n this._states.splice(index, 0, stateToMove);\r\n\r\n // If the moved state was active, update previous and next states\r\n if (stateID === this._activeState) {\r\n this.setActiveStateByID(stateID);\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|