@vived/core 1.4.2 → 1.4.4
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/README.md +142 -20
- package/dist/cjs/AppObject/AppObject.js +53 -0
- package/dist/cjs/AppObject/AppObject.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectComponent.js +78 -0
- package/dist/cjs/AppObject/AppObjectComponent.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectController.js +22 -0
- package/dist/cjs/AppObject/AppObjectController.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectEntity.js +52 -0
- package/dist/cjs/AppObject/AppObjectEntity.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectEntityRepo.js +75 -1
- package/dist/cjs/AppObject/AppObjectEntityRepo.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectPM.js +46 -0
- package/dist/cjs/AppObject/AppObjectPM.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectRepo.js +20 -0
- package/dist/cjs/AppObject/AppObjectRepo.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectUC.js +23 -0
- package/dist/cjs/AppObject/AppObjectUC.js.map +1 -1
- package/dist/cjs/AppObject/AppObjectView.js +22 -0
- package/dist/cjs/AppObject/AppObjectView.js.map +1 -1
- package/dist/cjs/AppObject/getSingletonComponent.js +19 -0
- package/dist/cjs/AppObject/getSingletonComponent.js.map +1 -1
- package/dist/cjs/Entities/MemoizedAngle.js +21 -0
- package/dist/cjs/Entities/MemoizedAngle.js.map +1 -1
- package/dist/cjs/Entities/MemoizedBoolean.js +21 -0
- package/dist/cjs/Entities/MemoizedBoolean.js.map +1 -1
- package/dist/cjs/Entities/MemoizedColor.js +21 -0
- package/dist/cjs/Entities/MemoizedColor.js.map +1 -1
- package/dist/cjs/Entities/MemoizedNumber.js +21 -0
- package/dist/cjs/Entities/MemoizedNumber.js.map +1 -1
- package/dist/cjs/Entities/MemoizedQuaternion.js +21 -0
- package/dist/cjs/Entities/MemoizedQuaternion.js.map +1 -1
- package/dist/cjs/Entities/MemoizedString.js +21 -0
- package/dist/cjs/Entities/MemoizedString.js.map +1 -1
- package/dist/cjs/Entities/MemoizedVector2.js +21 -0
- package/dist/cjs/Entities/MemoizedVector2.js.map +1 -1
- package/dist/cjs/Entities/MemoizedVector3.js +21 -0
- package/dist/cjs/Entities/MemoizedVector3.js.map +1 -1
- package/dist/cjs/Entities/ObservableEntity.js +17 -0
- package/dist/cjs/Entities/ObservableEntity.js.map +1 -1
- package/dist/cjs/Entities/ObserverList.js +21 -0
- package/dist/cjs/Entities/ObserverList.js.map +1 -1
- package/dist/cjs/Entities/RangedNumber.js +29 -0
- package/dist/cjs/Entities/RangedNumber.js.map +1 -1
- package/dist/cjs/ExampleFeature/Adapters/examplePmAdapter.js +64 -0
- package/dist/cjs/ExampleFeature/Adapters/examplePmAdapter.js.map +1 -0
- package/dist/cjs/ExampleFeature/Adapters/exampleSingletonPmAdapter.js +60 -0
- package/dist/cjs/ExampleFeature/Adapters/exampleSingletonPmAdapter.js.map +1 -0
- package/dist/cjs/ExampleFeature/Adapters/index.js +19 -0
- package/dist/cjs/ExampleFeature/Adapters/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/Controllers/index.js +19 -0
- package/dist/cjs/ExampleFeature/Controllers/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/Controllers/setExampleText.js +48 -0
- package/dist/cjs/ExampleFeature/Controllers/setExampleText.js.map +1 -0
- package/dist/cjs/ExampleFeature/Controllers/toggleExampleBoolean.js +47 -0
- package/dist/cjs/ExampleFeature/Controllers/toggleExampleBoolean.js.map +1 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleEntity.js +90 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleEntity.js.map +1 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleRepo.js +113 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleRepo.js.map +1 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleSingletonEntity.js +69 -0
- package/dist/cjs/ExampleFeature/Entities/ExampleSingletonEntity.js.map +1 -0
- package/dist/cjs/ExampleFeature/Entities/index.js +20 -0
- package/dist/cjs/ExampleFeature/Entities/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/Factory/index.js +18 -0
- package/dist/cjs/ExampleFeature/Factory/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/Factory/setupExampleFeature.js +29 -0
- package/dist/cjs/ExampleFeature/Factory/setupExampleFeature.js.map +1 -0
- package/dist/cjs/ExampleFeature/Mocks/MockEditExampleStringUC.js +47 -0
- package/dist/cjs/ExampleFeature/Mocks/MockEditExampleStringUC.js.map +1 -0
- package/dist/cjs/ExampleFeature/Mocks/MockExamplePM.js +48 -0
- package/dist/cjs/ExampleFeature/Mocks/MockExamplePM.js.map +1 -0
- package/dist/cjs/ExampleFeature/Mocks/MockExampleSingletonPM.js +59 -0
- package/dist/cjs/ExampleFeature/Mocks/MockExampleSingletonPM.js.map +1 -0
- package/dist/cjs/ExampleFeature/Mocks/MockToggleExampleBooleanUC.js +57 -0
- package/dist/cjs/ExampleFeature/Mocks/MockToggleExampleBooleanUC.js.map +1 -0
- package/dist/cjs/ExampleFeature/Mocks/index.js +21 -0
- package/dist/cjs/ExampleFeature/Mocks/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/PMs/ExamplePM.js +97 -0
- package/dist/cjs/ExampleFeature/PMs/ExamplePM.js.map +1 -0
- package/dist/cjs/ExampleFeature/PMs/ExampleSingletonPM.js +102 -0
- package/dist/cjs/ExampleFeature/PMs/ExampleSingletonPM.js.map +1 -0
- package/dist/cjs/ExampleFeature/PMs/index.js +19 -0
- package/dist/cjs/ExampleFeature/PMs/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/UCs/EditExampleStringUC.js +87 -0
- package/dist/cjs/ExampleFeature/UCs/EditExampleStringUC.js.map +1 -0
- package/dist/cjs/ExampleFeature/UCs/ToggleExampleBooleanUC.js +79 -0
- package/dist/cjs/ExampleFeature/UCs/ToggleExampleBooleanUC.js.map +1 -0
- package/dist/cjs/ExampleFeature/UCs/index.js +19 -0
- package/dist/cjs/ExampleFeature/UCs/index.js.map +1 -0
- package/dist/cjs/ExampleFeature/index.js +24 -0
- package/dist/cjs/ExampleFeature/index.js.map +1 -0
- package/dist/cjs/Types/PmAdapter.js.map +1 -1
- package/dist/cjs/Types/SingletonPmAdapter.js.map +1 -1
- package/dist/cjs/ValueObjects/Angle.js +1 -1
- package/dist/cjs/ValueObjects/Angle.js.map +1 -1
- package/dist/cjs/ValueObjects/LineSegment2D.js +6 -6
- package/dist/cjs/ValueObjects/LineSegment2D.js.map +1 -1
- package/dist/cjs/ValueObjects/Matrix.js +6 -6
- package/dist/cjs/ValueObjects/Matrix.js.map +1 -1
- package/dist/cjs/ValueObjects/Quaternion.js +17 -17
- package/dist/cjs/ValueObjects/Quaternion.js.map +1 -1
- package/dist/cjs/ValueObjects/Vector2.js +15 -8
- package/dist/cjs/ValueObjects/Vector2.js.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/AppObject/AppObject.js +53 -0
- package/dist/esm/AppObject/AppObject.js.map +1 -1
- package/dist/esm/AppObject/AppObjectComponent.js +78 -0
- package/dist/esm/AppObject/AppObjectComponent.js.map +1 -1
- package/dist/esm/AppObject/AppObjectController.js +22 -0
- package/dist/esm/AppObject/AppObjectController.js.map +1 -1
- package/dist/esm/AppObject/AppObjectEntity.js +52 -0
- package/dist/esm/AppObject/AppObjectEntity.js.map +1 -1
- package/dist/esm/AppObject/AppObjectEntityRepo.js +75 -1
- package/dist/esm/AppObject/AppObjectEntityRepo.js.map +1 -1
- package/dist/esm/AppObject/AppObjectPM.js +46 -0
- package/dist/esm/AppObject/AppObjectPM.js.map +1 -1
- package/dist/esm/AppObject/AppObjectRepo.js +20 -0
- package/dist/esm/AppObject/AppObjectRepo.js.map +1 -1
- package/dist/esm/AppObject/AppObjectUC.js +24 -1
- package/dist/esm/AppObject/AppObjectUC.js.map +1 -1
- package/dist/esm/AppObject/AppObjectView.js +23 -1
- package/dist/esm/AppObject/AppObjectView.js.map +1 -1
- package/dist/esm/AppObject/getSingletonComponent.js +19 -0
- package/dist/esm/AppObject/getSingletonComponent.js.map +1 -1
- package/dist/esm/Entities/MemoizedAngle.js +21 -0
- package/dist/esm/Entities/MemoizedAngle.js.map +1 -1
- package/dist/esm/Entities/MemoizedBoolean.js +21 -0
- package/dist/esm/Entities/MemoizedBoolean.js.map +1 -1
- package/dist/esm/Entities/MemoizedColor.js +21 -0
- package/dist/esm/Entities/MemoizedColor.js.map +1 -1
- package/dist/esm/Entities/MemoizedNumber.js +21 -0
- package/dist/esm/Entities/MemoizedNumber.js.map +1 -1
- package/dist/esm/Entities/MemoizedQuaternion.js +21 -0
- package/dist/esm/Entities/MemoizedQuaternion.js.map +1 -1
- package/dist/esm/Entities/MemoizedString.js +21 -0
- package/dist/esm/Entities/MemoizedString.js.map +1 -1
- package/dist/esm/Entities/MemoizedVector2.js +21 -0
- package/dist/esm/Entities/MemoizedVector2.js.map +1 -1
- package/dist/esm/Entities/MemoizedVector3.js +21 -0
- package/dist/esm/Entities/MemoizedVector3.js.map +1 -1
- package/dist/esm/Entities/ObservableEntity.js +17 -0
- package/dist/esm/Entities/ObservableEntity.js.map +1 -1
- package/dist/esm/Entities/ObserverList.js +21 -0
- package/dist/esm/Entities/ObserverList.js.map +1 -1
- package/dist/esm/Entities/RangedNumber.js +29 -0
- package/dist/esm/Entities/RangedNumber.js.map +1 -1
- package/dist/esm/ExampleFeature/Adapters/examplePmAdapter.js +61 -0
- package/dist/esm/ExampleFeature/Adapters/examplePmAdapter.js.map +1 -0
- package/dist/esm/ExampleFeature/Adapters/exampleSingletonPmAdapter.js +57 -0
- package/dist/esm/ExampleFeature/Adapters/exampleSingletonPmAdapter.js.map +1 -0
- package/dist/esm/ExampleFeature/Adapters/index.js +3 -0
- package/dist/esm/ExampleFeature/Adapters/index.js.map +1 -0
- package/dist/esm/ExampleFeature/Controllers/index.js +3 -0
- package/dist/esm/ExampleFeature/Controllers/index.js.map +1 -0
- package/dist/esm/ExampleFeature/Controllers/setExampleText.js +45 -0
- package/dist/esm/ExampleFeature/Controllers/setExampleText.js.map +1 -0
- package/dist/esm/ExampleFeature/Controllers/toggleExampleBoolean.js +44 -0
- package/dist/esm/ExampleFeature/Controllers/toggleExampleBoolean.js.map +1 -0
- package/dist/esm/ExampleFeature/Entities/ExampleEntity.js +85 -0
- package/dist/esm/ExampleFeature/Entities/ExampleEntity.js.map +1 -0
- package/dist/esm/ExampleFeature/Entities/ExampleRepo.js +108 -0
- package/dist/esm/ExampleFeature/Entities/ExampleRepo.js.map +1 -0
- package/dist/esm/ExampleFeature/Entities/ExampleSingletonEntity.js +64 -0
- package/dist/esm/ExampleFeature/Entities/ExampleSingletonEntity.js.map +1 -0
- package/dist/esm/ExampleFeature/Entities/index.js +4 -0
- package/dist/esm/ExampleFeature/Entities/index.js.map +1 -0
- package/dist/esm/ExampleFeature/Factory/index.js +2 -0
- package/dist/esm/ExampleFeature/Factory/index.js.map +1 -0
- package/dist/esm/ExampleFeature/Factory/setupExampleFeature.js +26 -0
- package/dist/esm/ExampleFeature/Factory/setupExampleFeature.js.map +1 -0
- package/dist/esm/ExampleFeature/Mocks/MockEditExampleStringUC.js +43 -0
- package/dist/esm/ExampleFeature/Mocks/MockEditExampleStringUC.js.map +1 -0
- package/dist/esm/ExampleFeature/Mocks/MockExamplePM.js +44 -0
- package/dist/esm/ExampleFeature/Mocks/MockExamplePM.js.map +1 -0
- package/dist/esm/ExampleFeature/Mocks/MockExampleSingletonPM.js +54 -0
- package/dist/esm/ExampleFeature/Mocks/MockExampleSingletonPM.js.map +1 -0
- package/dist/esm/ExampleFeature/Mocks/MockToggleExampleBooleanUC.js +52 -0
- package/dist/esm/ExampleFeature/Mocks/MockToggleExampleBooleanUC.js.map +1 -0
- package/dist/esm/ExampleFeature/Mocks/index.js +5 -0
- package/dist/esm/ExampleFeature/Mocks/index.js.map +1 -0
- package/dist/esm/ExampleFeature/PMs/ExamplePM.js +92 -0
- package/dist/esm/ExampleFeature/PMs/ExamplePM.js.map +1 -0
- package/dist/esm/ExampleFeature/PMs/ExampleSingletonPM.js +97 -0
- package/dist/esm/ExampleFeature/PMs/ExampleSingletonPM.js.map +1 -0
- package/dist/esm/ExampleFeature/PMs/index.js +3 -0
- package/dist/esm/ExampleFeature/PMs/index.js.map +1 -0
- package/dist/esm/ExampleFeature/UCs/EditExampleStringUC.js +82 -0
- package/dist/esm/ExampleFeature/UCs/EditExampleStringUC.js.map +1 -0
- package/dist/esm/ExampleFeature/UCs/ToggleExampleBooleanUC.js +74 -0
- package/dist/esm/ExampleFeature/UCs/ToggleExampleBooleanUC.js.map +1 -0
- package/dist/esm/ExampleFeature/UCs/index.js +3 -0
- package/dist/esm/ExampleFeature/UCs/index.js.map +1 -0
- package/dist/esm/ExampleFeature/index.js +8 -0
- package/dist/esm/ExampleFeature/index.js.map +1 -0
- package/dist/esm/Types/PmAdapter.js.map +1 -1
- package/dist/esm/Types/SingletonPmAdapter.js.map +1 -1
- package/dist/esm/ValueObjects/Angle.js +1 -1
- package/dist/esm/ValueObjects/Angle.js.map +1 -1
- package/dist/esm/ValueObjects/LineSegment2D.js +6 -6
- package/dist/esm/ValueObjects/LineSegment2D.js.map +1 -1
- package/dist/esm/ValueObjects/Matrix.js +6 -6
- package/dist/esm/ValueObjects/Matrix.js.map +1 -1
- package/dist/esm/ValueObjects/Quaternion.js +17 -17
- package/dist/esm/ValueObjects/Quaternion.js.map +1 -1
- package/dist/esm/ValueObjects/Vector2.js +15 -8
- package/dist/esm/ValueObjects/Vector2.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/AppObject/AppObject.d.ts +42 -0
- package/dist/types/AppObject/AppObject.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectComponent.d.ts +80 -0
- package/dist/types/AppObject/AppObjectComponent.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectController.d.ts +22 -0
- package/dist/types/AppObject/AppObjectController.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectEntity.d.ts +55 -0
- package/dist/types/AppObject/AppObjectEntity.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectEntityRepo.d.ts +75 -0
- package/dist/types/AppObject/AppObjectEntityRepo.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectPM.d.ts +53 -0
- package/dist/types/AppObject/AppObjectPM.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectRepo.d.ts +124 -0
- package/dist/types/AppObject/AppObjectRepo.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectUC.d.ts +23 -0
- package/dist/types/AppObject/AppObjectUC.d.ts.map +1 -1
- package/dist/types/AppObject/AppObjectView.d.ts +22 -0
- package/dist/types/AppObject/AppObjectView.d.ts.map +1 -1
- package/dist/types/AppObject/getSingletonComponent.d.ts +19 -0
- package/dist/types/AppObject/getSingletonComponent.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedAngle.d.ts +21 -0
- package/dist/types/Entities/MemoizedAngle.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedBoolean.d.ts +21 -0
- package/dist/types/Entities/MemoizedBoolean.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedColor.d.ts +21 -0
- package/dist/types/Entities/MemoizedColor.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedNumber.d.ts +21 -0
- package/dist/types/Entities/MemoizedNumber.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedQuaternion.d.ts +21 -0
- package/dist/types/Entities/MemoizedQuaternion.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedString.d.ts +21 -0
- package/dist/types/Entities/MemoizedString.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedVector2.d.ts +21 -0
- package/dist/types/Entities/MemoizedVector2.d.ts.map +1 -1
- package/dist/types/Entities/MemoizedVector3.d.ts +21 -0
- package/dist/types/Entities/MemoizedVector3.d.ts.map +1 -1
- package/dist/types/Entities/ObservableEntity.d.ts +20 -0
- package/dist/types/Entities/ObservableEntity.d.ts.map +1 -1
- package/dist/types/Entities/ObserverList.d.ts +21 -0
- package/dist/types/Entities/ObserverList.d.ts.map +1 -1
- package/dist/types/Entities/RangedNumber.d.ts +37 -0
- package/dist/types/Entities/RangedNumber.d.ts.map +1 -1
- package/dist/types/ExampleFeature/Adapters/examplePmAdapter.d.ts +29 -0
- package/dist/types/ExampleFeature/Adapters/examplePmAdapter.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Adapters/exampleSingletonPmAdapter.d.ts +31 -0
- package/dist/types/ExampleFeature/Adapters/exampleSingletonPmAdapter.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Adapters/index.d.ts +3 -0
- package/dist/types/ExampleFeature/Adapters/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Controllers/index.d.ts +3 -0
- package/dist/types/ExampleFeature/Controllers/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Controllers/setExampleText.d.ts +35 -0
- package/dist/types/ExampleFeature/Controllers/setExampleText.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Controllers/toggleExampleBoolean.d.ts +34 -0
- package/dist/types/ExampleFeature/Controllers/toggleExampleBoolean.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Entities/ExampleEntity.d.ts +55 -0
- package/dist/types/ExampleFeature/Entities/ExampleEntity.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Entities/ExampleRepo.d.ts +62 -0
- package/dist/types/ExampleFeature/Entities/ExampleRepo.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Entities/ExampleSingletonEntity.d.ts +43 -0
- package/dist/types/ExampleFeature/Entities/ExampleSingletonEntity.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Entities/index.d.ts +4 -0
- package/dist/types/ExampleFeature/Entities/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Factory/index.d.ts +2 -0
- package/dist/types/ExampleFeature/Factory/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Factory/setupExampleFeature.d.ts +17 -0
- package/dist/types/ExampleFeature/Factory/setupExampleFeature.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Mocks/MockEditExampleStringUC.d.ts +42 -0
- package/dist/types/ExampleFeature/Mocks/MockEditExampleStringUC.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Mocks/MockExamplePM.d.ts +41 -0
- package/dist/types/ExampleFeature/Mocks/MockExamplePM.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Mocks/MockExampleSingletonPM.d.ts +49 -0
- package/dist/types/ExampleFeature/Mocks/MockExampleSingletonPM.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Mocks/MockToggleExampleBooleanUC.d.ts +47 -0
- package/dist/types/ExampleFeature/Mocks/MockToggleExampleBooleanUC.d.ts.map +1 -0
- package/dist/types/ExampleFeature/Mocks/index.d.ts +5 -0
- package/dist/types/ExampleFeature/Mocks/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/PMs/ExamplePM.d.ts +42 -0
- package/dist/types/ExampleFeature/PMs/ExamplePM.d.ts.map +1 -0
- package/dist/types/ExampleFeature/PMs/ExampleSingletonPM.d.ts +52 -0
- package/dist/types/ExampleFeature/PMs/ExampleSingletonPM.d.ts.map +1 -0
- package/dist/types/ExampleFeature/PMs/index.d.ts +3 -0
- package/dist/types/ExampleFeature/PMs/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/UCs/EditExampleStringUC.d.ts +52 -0
- package/dist/types/ExampleFeature/UCs/EditExampleStringUC.d.ts.map +1 -0
- package/dist/types/ExampleFeature/UCs/ToggleExampleBooleanUC.d.ts +44 -0
- package/dist/types/ExampleFeature/UCs/ToggleExampleBooleanUC.d.ts.map +1 -0
- package/dist/types/ExampleFeature/UCs/index.d.ts +3 -0
- package/dist/types/ExampleFeature/UCs/index.d.ts.map +1 -0
- package/dist/types/ExampleFeature/index.d.ts +8 -0
- package/dist/types/ExampleFeature/index.d.ts.map +1 -0
- package/dist/types/Types/PmAdapter.d.ts +60 -0
- package/dist/types/Types/PmAdapter.d.ts.map +1 -1
- package/dist/types/Types/SingletonPmAdapter.d.ts +55 -0
- package/dist/types/Types/SingletonPmAdapter.d.ts.map +1 -1
- package/dist/types/ValueObjects/Angle.d.ts +1 -1
- package/dist/types/ValueObjects/Matrix.d.ts +5 -5
- package/dist/types/ValueObjects/Matrix.d.ts.map +1 -1
- package/dist/types/ValueObjects/Quaternion.d.ts +17 -17
- package/dist/types/ValueObjects/Vector2.d.ts +8 -3
- package/dist/types/ValueObjects/Vector2.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/cjs/AppObject/AppObject.test.js +0 -113
- package/dist/cjs/AppObject/AppObject.test.js.map +0 -1
- package/dist/cjs/AppObject/AppObjectComponent.test.js +0 -132
- package/dist/cjs/AppObject/AppObjectComponent.test.js.map +0 -1
- package/dist/cjs/AppObject/AppObjectEntity.test.js +0 -108
- package/dist/cjs/AppObject/AppObjectEntity.test.js.map +0 -1
- package/dist/cjs/AppObject/AppObjectEntityRepo.test.js +0 -149
- package/dist/cjs/AppObject/AppObjectEntityRepo.test.js.map +0 -1
- package/dist/cjs/AppObject/AppObjectPM.test.js +0 -103
- package/dist/cjs/AppObject/AppObjectPM.test.js.map +0 -1
- package/dist/cjs/AppObject/AppObjectRepo.test.js +0 -213
- package/dist/cjs/AppObject/AppObjectRepo.test.js.map +0 -1
- package/dist/cjs/AppObject/getSingletonComponent.test.js +0 -13
- package/dist/cjs/AppObject/getSingletonComponent.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedAngle.test.js +0 -30
- package/dist/cjs/Entities/MemoizedAngle.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedBoolean.test.js +0 -34
- package/dist/cjs/Entities/MemoizedBoolean.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedColor.test.js +0 -32
- package/dist/cjs/Entities/MemoizedColor.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedNumber.test.js +0 -29
- package/dist/cjs/Entities/MemoizedNumber.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedQuaternion.test.js +0 -32
- package/dist/cjs/Entities/MemoizedQuaternion.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedString.test.js +0 -29
- package/dist/cjs/Entities/MemoizedString.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedVector2.test.js +0 -32
- package/dist/cjs/Entities/MemoizedVector2.test.js.map +0 -1
- package/dist/cjs/Entities/MemoizedVector3.test.js +0 -32
- package/dist/cjs/Entities/MemoizedVector3.test.js.map +0 -1
- package/dist/cjs/Entities/ObservableEntity.test.js +0 -25
- package/dist/cjs/Entities/ObservableEntity.test.js.map +0 -1
- package/dist/cjs/Entities/ObserverList.test.js +0 -44
- package/dist/cjs/Entities/ObserverList.test.js.map +0 -1
- package/dist/cjs/Entities/RangedNumber.test.js +0 -96
- package/dist/cjs/Entities/RangedNumber.test.js.map +0 -1
- package/dist/cjs/Utilities/LengthConverters.test.js +0 -24
- package/dist/cjs/Utilities/LengthConverters.test.js.map +0 -1
- package/dist/cjs/Utilities/LerpNumber.test.js +0 -90
- package/dist/cjs/Utilities/LerpNumber.test.js.map +0 -1
- package/dist/cjs/Utilities/addAlphaToHex.test.js +0 -34
- package/dist/cjs/Utilities/addAlphaToHex.test.js.map +0 -1
- package/dist/cjs/Utilities/alphaToHex.test.js +0 -75
- package/dist/cjs/Utilities/alphaToHex.test.js.map +0 -1
- package/dist/cjs/Utilities/degreesToRadians.test.js +0 -9
- package/dist/cjs/Utilities/degreesToRadians.test.js.map +0 -1
- package/dist/cjs/Utilities/easeFunctions.test.js +0 -209
- package/dist/cjs/Utilities/easeFunctions.test.js.map +0 -1
- package/dist/cjs/Utilities/interpolateNumber.test.js +0 -26
- package/dist/cjs/Utilities/interpolateNumber.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Angle.test.js +0 -28
- package/dist/cjs/ValueObjects/Angle.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Color.test.js +0 -147
- package/dist/cjs/ValueObjects/Color.test.js.map +0 -1
- package/dist/cjs/ValueObjects/LineSegment2D.test.js +0 -102
- package/dist/cjs/ValueObjects/LineSegment2D.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Matrix.test.js +0 -385
- package/dist/cjs/ValueObjects/Matrix.test.js.map +0 -1
- package/dist/cjs/ValueObjects/ParametricLine.test.js +0 -126
- package/dist/cjs/ValueObjects/ParametricLine.test.js.map +0 -1
- package/dist/cjs/ValueObjects/ParametricPlane.test.js +0 -101
- package/dist/cjs/ValueObjects/ParametricPlane.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Quaternion.test.js +0 -240
- package/dist/cjs/ValueObjects/Quaternion.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Rectangle.test.js +0 -32
- package/dist/cjs/ValueObjects/Rectangle.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Vector2.test.js +0 -136
- package/dist/cjs/ValueObjects/Vector2.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Vector3.test.js +0 -188
- package/dist/cjs/ValueObjects/Vector3.test.js.map +0 -1
- package/dist/cjs/ValueObjects/Version.test.js +0 -310
- package/dist/cjs/ValueObjects/Version.test.js.map +0 -1
- package/dist/esm/AppObject/AppObject.test.js +0 -110
- package/dist/esm/AppObject/AppObject.test.js.map +0 -1
- package/dist/esm/AppObject/AppObjectComponent.test.js +0 -130
- package/dist/esm/AppObject/AppObjectComponent.test.js.map +0 -1
- package/dist/esm/AppObject/AppObjectEntity.test.js +0 -106
- package/dist/esm/AppObject/AppObjectEntity.test.js.map +0 -1
- package/dist/esm/AppObject/AppObjectEntityRepo.test.js +0 -147
- package/dist/esm/AppObject/AppObjectEntityRepo.test.js.map +0 -1
- package/dist/esm/AppObject/AppObjectPM.test.js +0 -101
- package/dist/esm/AppObject/AppObjectPM.test.js.map +0 -1
- package/dist/esm/AppObject/AppObjectRepo.test.js +0 -211
- package/dist/esm/AppObject/AppObjectRepo.test.js.map +0 -1
- package/dist/esm/AppObject/getSingletonComponent.test.js +0 -11
- package/dist/esm/AppObject/getSingletonComponent.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedAngle.test.js +0 -28
- package/dist/esm/Entities/MemoizedAngle.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedBoolean.test.js +0 -32
- package/dist/esm/Entities/MemoizedBoolean.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedColor.test.js +0 -30
- package/dist/esm/Entities/MemoizedColor.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedNumber.test.js +0 -27
- package/dist/esm/Entities/MemoizedNumber.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedQuaternion.test.js +0 -30
- package/dist/esm/Entities/MemoizedQuaternion.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedString.test.js +0 -27
- package/dist/esm/Entities/MemoizedString.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedVector2.test.js +0 -30
- package/dist/esm/Entities/MemoizedVector2.test.js.map +0 -1
- package/dist/esm/Entities/MemoizedVector3.test.js +0 -30
- package/dist/esm/Entities/MemoizedVector3.test.js.map +0 -1
- package/dist/esm/Entities/ObservableEntity.test.js +0 -23
- package/dist/esm/Entities/ObservableEntity.test.js.map +0 -1
- package/dist/esm/Entities/ObserverList.test.js +0 -42
- package/dist/esm/Entities/ObserverList.test.js.map +0 -1
- package/dist/esm/Entities/RangedNumber.test.js +0 -94
- package/dist/esm/Entities/RangedNumber.test.js.map +0 -1
- package/dist/esm/Utilities/LengthConverters.test.js +0 -22
- package/dist/esm/Utilities/LengthConverters.test.js.map +0 -1
- package/dist/esm/Utilities/LerpNumber.test.js +0 -88
- package/dist/esm/Utilities/LerpNumber.test.js.map +0 -1
- package/dist/esm/Utilities/addAlphaToHex.test.js +0 -32
- package/dist/esm/Utilities/addAlphaToHex.test.js.map +0 -1
- package/dist/esm/Utilities/alphaToHex.test.js +0 -73
- package/dist/esm/Utilities/alphaToHex.test.js.map +0 -1
- package/dist/esm/Utilities/degreesToRadians.test.js +0 -7
- package/dist/esm/Utilities/degreesToRadians.test.js.map +0 -1
- package/dist/esm/Utilities/easeFunctions.test.js +0 -207
- package/dist/esm/Utilities/easeFunctions.test.js.map +0 -1
- package/dist/esm/Utilities/interpolateNumber.test.js +0 -24
- package/dist/esm/Utilities/interpolateNumber.test.js.map +0 -1
- package/dist/esm/ValueObjects/Angle.test.js +0 -26
- package/dist/esm/ValueObjects/Angle.test.js.map +0 -1
- package/dist/esm/ValueObjects/Color.test.js +0 -145
- package/dist/esm/ValueObjects/Color.test.js.map +0 -1
- package/dist/esm/ValueObjects/LineSegment2D.test.js +0 -100
- package/dist/esm/ValueObjects/LineSegment2D.test.js.map +0 -1
- package/dist/esm/ValueObjects/Matrix.test.js +0 -383
- package/dist/esm/ValueObjects/Matrix.test.js.map +0 -1
- package/dist/esm/ValueObjects/ParametricLine.test.js +0 -124
- package/dist/esm/ValueObjects/ParametricLine.test.js.map +0 -1
- package/dist/esm/ValueObjects/ParametricPlane.test.js +0 -99
- package/dist/esm/ValueObjects/ParametricPlane.test.js.map +0 -1
- package/dist/esm/ValueObjects/Quaternion.test.js +0 -238
- package/dist/esm/ValueObjects/Quaternion.test.js.map +0 -1
- package/dist/esm/ValueObjects/Rectangle.test.js +0 -30
- package/dist/esm/ValueObjects/Rectangle.test.js.map +0 -1
- package/dist/esm/ValueObjects/Vector2.test.js +0 -134
- package/dist/esm/ValueObjects/Vector2.test.js.map +0 -1
- package/dist/esm/ValueObjects/Vector3.test.js +0 -186
- package/dist/esm/ValueObjects/Vector3.test.js.map +0 -1
- package/dist/esm/ValueObjects/Version.test.js +0 -308
- package/dist/esm/ValueObjects/Version.test.js.map +0 -1
- package/dist/types/AppObject/AppObject.test.d.ts +0 -7
- package/dist/types/AppObject/AppObject.test.d.ts.map +0 -1
- package/dist/types/AppObject/AppObjectComponent.test.d.ts +0 -2
- package/dist/types/AppObject/AppObjectComponent.test.d.ts.map +0 -1
- package/dist/types/AppObject/AppObjectEntity.test.d.ts +0 -2
- package/dist/types/AppObject/AppObjectEntity.test.d.ts.map +0 -1
- package/dist/types/AppObject/AppObjectEntityRepo.test.d.ts +0 -2
- package/dist/types/AppObject/AppObjectEntityRepo.test.d.ts.map +0 -1
- package/dist/types/AppObject/AppObjectPM.test.d.ts +0 -2
- package/dist/types/AppObject/AppObjectPM.test.d.ts.map +0 -1
- package/dist/types/AppObject/AppObjectRepo.test.d.ts +0 -2
- package/dist/types/AppObject/AppObjectRepo.test.d.ts.map +0 -1
- package/dist/types/AppObject/getSingletonComponent.test.d.ts +0 -2
- package/dist/types/AppObject/getSingletonComponent.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedAngle.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedAngle.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedBoolean.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedBoolean.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedColor.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedColor.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedNumber.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedNumber.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedQuaternion.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedQuaternion.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedString.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedString.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedVector2.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedVector2.test.d.ts.map +0 -1
- package/dist/types/Entities/MemoizedVector3.test.d.ts +0 -2
- package/dist/types/Entities/MemoizedVector3.test.d.ts.map +0 -1
- package/dist/types/Entities/ObservableEntity.test.d.ts +0 -2
- package/dist/types/Entities/ObservableEntity.test.d.ts.map +0 -1
- package/dist/types/Entities/ObserverList.test.d.ts +0 -2
- package/dist/types/Entities/ObserverList.test.d.ts.map +0 -1
- package/dist/types/Entities/RangedNumber.test.d.ts +0 -2
- package/dist/types/Entities/RangedNumber.test.d.ts.map +0 -1
- package/dist/types/Utilities/LengthConverters.test.d.ts +0 -2
- package/dist/types/Utilities/LengthConverters.test.d.ts.map +0 -1
- package/dist/types/Utilities/LerpNumber.test.d.ts +0 -2
- package/dist/types/Utilities/LerpNumber.test.d.ts.map +0 -1
- package/dist/types/Utilities/addAlphaToHex.test.d.ts +0 -2
- package/dist/types/Utilities/addAlphaToHex.test.d.ts.map +0 -1
- package/dist/types/Utilities/alphaToHex.test.d.ts +0 -2
- package/dist/types/Utilities/alphaToHex.test.d.ts.map +0 -1
- package/dist/types/Utilities/degreesToRadians.test.d.ts +0 -2
- package/dist/types/Utilities/degreesToRadians.test.d.ts.map +0 -1
- package/dist/types/Utilities/easeFunctions.test.d.ts +0 -2
- package/dist/types/Utilities/easeFunctions.test.d.ts.map +0 -1
- package/dist/types/Utilities/interpolateNumber.test.d.ts +0 -2
- package/dist/types/Utilities/interpolateNumber.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Angle.test.d.ts +0 -2
- package/dist/types/ValueObjects/Angle.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Color.test.d.ts +0 -2
- package/dist/types/ValueObjects/Color.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/LineSegment2D.test.d.ts +0 -2
- package/dist/types/ValueObjects/LineSegment2D.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Matrix.test.d.ts +0 -2
- package/dist/types/ValueObjects/Matrix.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/ParametricLine.test.d.ts +0 -2
- package/dist/types/ValueObjects/ParametricLine.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/ParametricPlane.test.d.ts +0 -2
- package/dist/types/ValueObjects/ParametricPlane.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Quaternion.test.d.ts +0 -2
- package/dist/types/ValueObjects/Quaternion.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Rectangle.test.d.ts +0 -2
- package/dist/types/ValueObjects/Rectangle.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Vector2.test.d.ts +0 -2
- package/dist/types/ValueObjects/Vector2.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Vector3.test.d.ts +0 -2
- package/dist/types/ValueObjects/Vector3.test.d.ts.map +0 -1
- package/dist/types/ValueObjects/Version.test.d.ts +0 -2
- package/dist/types/ValueObjects/Version.test.d.ts.map +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExamplePM.ts
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to implement a Presentation Manager (PM) component.
|
|
5
|
+
* PMs are responsible for transforming entity data into view models (VMs) for the UI.
|
|
6
|
+
* They observe entities for changes and update their views when data changes.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - PMs extend AppObjectPM<VM> where VM is the view model type
|
|
10
|
+
* - They observe entities and transform entity data into view models
|
|
11
|
+
* - They notify UI components (views) when view models change
|
|
12
|
+
* - Each PM instance is associated with a specific AppObject
|
|
13
|
+
*
|
|
14
|
+
* Usage pattern:
|
|
15
|
+
* 1. Get a PM instance using getById
|
|
16
|
+
* 2. Register UI components as views using addView(callback)
|
|
17
|
+
* 3. PM will call the view callbacks with updated view models when entities change
|
|
18
|
+
* 4. Remove UI components with removeView(callback) when they're unmounted
|
|
19
|
+
*/
|
|
20
|
+
import { AppObjectPM } from "../../AppObject";
|
|
21
|
+
import { ExampleEntity } from "../Entities/ExampleEntity";
|
|
22
|
+
/**
|
|
23
|
+
* ExamplePM transforms ExampleEntity data into a simple string view model.
|
|
24
|
+
* Abstract class provides the interface and static helper methods.
|
|
25
|
+
*/
|
|
26
|
+
export class ExamplePM extends AppObjectPM {
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves an ExamplePM by its parent AppObject's ID
|
|
29
|
+
* @param id The ID of the parent AppObject
|
|
30
|
+
* @param appObjects The AppObjectRepo to search in
|
|
31
|
+
* @returns The ExamplePM component or undefined if not found
|
|
32
|
+
*/
|
|
33
|
+
static getById(id, appObjects) {
|
|
34
|
+
return appObjects.get(id)?.getComponent(ExamplePM.type);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Unique type identifier for this component */
|
|
38
|
+
ExamplePM.type = "ExamplePMType";
|
|
39
|
+
/**
|
|
40
|
+
* Factory function to create a new ExamplePM
|
|
41
|
+
* @param appObject The AppObject to attach the PM to
|
|
42
|
+
* @returns A new ExamplePM instance
|
|
43
|
+
*/
|
|
44
|
+
export function makeExamplePM(appObject) {
|
|
45
|
+
return new ExamplePMImp(appObject);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Concrete implementation of ExamplePM
|
|
49
|
+
* This private class handles the actual implementation details
|
|
50
|
+
*/
|
|
51
|
+
class ExamplePMImp extends ExamplePM {
|
|
52
|
+
/**
|
|
53
|
+
* Gets the ExampleEntity from the same AppObject
|
|
54
|
+
* Uses getCachedLocalComponent for efficient repeated access
|
|
55
|
+
*/
|
|
56
|
+
get exampleEntity() {
|
|
57
|
+
return this.getCachedLocalComponent(ExampleEntity.type);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Compares two view models to determine if they're equal
|
|
61
|
+
* Used to avoid unnecessary view updates when values haven't changed
|
|
62
|
+
*/
|
|
63
|
+
vmsAreEqual(a, b) {
|
|
64
|
+
return a === b;
|
|
65
|
+
}
|
|
66
|
+
constructor(appObject) {
|
|
67
|
+
super(appObject, ExamplePM.type);
|
|
68
|
+
/**
|
|
69
|
+
* Handler for entity change events
|
|
70
|
+
* Transforms entity data into a view model and updates views
|
|
71
|
+
*/
|
|
72
|
+
this.onEntityChange = () => {
|
|
73
|
+
if (!this.exampleEntity)
|
|
74
|
+
return;
|
|
75
|
+
// In this simple case, our view model is just the string property value
|
|
76
|
+
this.doUpdateView(this.exampleEntity.aStringProperty);
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Cleanup method called when the PM is being disposed
|
|
80
|
+
* Removes any observers to prevent memory leaks
|
|
81
|
+
*/
|
|
82
|
+
this.dispose = () => {
|
|
83
|
+
super.dispose();
|
|
84
|
+
this.exampleEntity?.removeChangeObserver(this.onEntityChange);
|
|
85
|
+
};
|
|
86
|
+
// Register as an observer of the entity to receive change notifications
|
|
87
|
+
this.exampleEntity?.addChangeObserver(this.onEntityChange);
|
|
88
|
+
// Call the change handler initially to set up the initial view model
|
|
89
|
+
this.onEntityChange();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=ExamplePM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExamplePM.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/PMs/ExamplePM.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAa,WAAW,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,MAAM,OAAgB,SAAU,SAAQ,WAAmB;IAIzD;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,EAAU,EAAE,UAAyB;QAClD,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,CAAY,SAAS,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;;AAXD,gDAAgD;AAChC,cAAI,GAAG,eAAe,CAAC;AAazC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAoB;IAChD,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,YAAa,SAAQ,SAAS;IAClC;;;OAGG;IACH,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,uBAAuB,CAAgB,aAAa,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,CAAS,EAAE,CAAS;QAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAsBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QArBnC;;;WAGG;QACH,mBAAc,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAEhC,wEAAwE;YACxE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF;;;WAGG;QACH,YAAO,GAAG,GAAS,EAAE;YACnB,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC,CAAC;QAKA,wEAAwE;QACxE,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3D,qEAAqE;QACrE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;CACF","sourcesContent":["/**\r\n * ExamplePM.ts\r\n * \r\n * This file demonstrates how to implement a Presentation Manager (PM) component.\r\n * PMs are responsible for transforming entity data into view models (VMs) for the UI.\r\n * They observe entities for changes and update their views when data changes.\r\n * \r\n * Key concepts:\r\n * - PMs extend AppObjectPM<VM> where VM is the view model type\r\n * - They observe entities and transform entity data into view models\r\n * - They notify UI components (views) when view models change\r\n * - Each PM instance is associated with a specific AppObject\r\n * \r\n * Usage pattern:\r\n * 1. Get a PM instance using getById\r\n * 2. Register UI components as views using addView(callback)\r\n * 3. PM will call the view callbacks with updated view models when entities change\r\n * 4. Remove UI components with removeView(callback) when they're unmounted\r\n */\r\n\r\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"../../AppObject\";\r\nimport { ExampleEntity } from \"../Entities/ExampleEntity\";\r\n\r\n/**\r\n * ExamplePM transforms ExampleEntity data into a simple string view model.\r\n * Abstract class provides the interface and static helper methods.\r\n */\r\nexport abstract class ExamplePM extends AppObjectPM<string> {\r\n /** Unique type identifier for this component */\r\n static readonly type = \"ExamplePMType\";\r\n\r\n /**\r\n * Retrieves an ExamplePM by its parent AppObject's ID\r\n * @param id The ID of the parent AppObject\r\n * @param appObjects The AppObjectRepo to search in\r\n * @returns The ExamplePM component or undefined if not found\r\n */\r\n static getById(id: string, appObjects: AppObjectRepo) {\r\n return appObjects.get(id)?.getComponent<ExamplePM>(ExamplePM.type);\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new ExamplePM\r\n * @param appObject The AppObject to attach the PM to\r\n * @returns A new ExamplePM instance\r\n */\r\nexport function makeExamplePM(appObject: AppObject): ExamplePM {\r\n return new ExamplePMImp(appObject);\r\n}\r\n\r\n/**\r\n * Concrete implementation of ExamplePM\r\n * This private class handles the actual implementation details\r\n */\r\nclass ExamplePMImp extends ExamplePM {\r\n /**\r\n * Gets the ExampleEntity from the same AppObject\r\n * Uses getCachedLocalComponent for efficient repeated access\r\n */\r\n private get exampleEntity() {\r\n return this.getCachedLocalComponent<ExampleEntity>(ExampleEntity.type);\r\n }\r\n\r\n /**\r\n * Compares two view models to determine if they're equal\r\n * Used to avoid unnecessary view updates when values haven't changed\r\n */\r\n vmsAreEqual(a: string, b: string): boolean {\r\n return a === b;\r\n }\r\n\r\n /**\r\n * Handler for entity change events\r\n * Transforms entity data into a view model and updates views\r\n */\r\n onEntityChange = () => {\r\n if (!this.exampleEntity) return;\r\n\r\n // In this simple case, our view model is just the string property value\r\n this.doUpdateView(this.exampleEntity.aStringProperty);\r\n };\r\n\r\n /**\r\n * Cleanup method called when the PM is being disposed\r\n * Removes any observers to prevent memory leaks\r\n */\r\n dispose = (): void => {\r\n super.dispose();\r\n this.exampleEntity?.removeChangeObserver(this.onEntityChange);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ExamplePM.type);\r\n\r\n // Register as an observer of the entity to receive change notifications\r\n this.exampleEntity?.addChangeObserver(this.onEntityChange);\r\n \r\n // Call the change handler initially to set up the initial view model\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExampleSingletonPM.ts
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to implement a Singleton Presentation Manager (PM).
|
|
5
|
+
* Singleton PMs are special PMs that exist only once in the application and can be
|
|
6
|
+
* accessed globally. They transform data from singleton entities into view models.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - Singleton PMs extend AppObjectPM<VM> like regular PMs
|
|
10
|
+
* - They register themselves as singletons with appObjects.registerSingleton()
|
|
11
|
+
* - They're accessed through a static get() method using getSingletonComponent()
|
|
12
|
+
* - They typically observe singleton entities and provide data to multiple UI components
|
|
13
|
+
*
|
|
14
|
+
* Usage pattern:
|
|
15
|
+
* 1. Access the singleton PM using the static get() method
|
|
16
|
+
* 2. Register UI components as views using addView(callback)
|
|
17
|
+
* 3. PM will call the view callbacks with updated view models when entities change
|
|
18
|
+
* 4. Remove UI components with removeView(callback) when they're unmounted
|
|
19
|
+
*/
|
|
20
|
+
import { AppObjectPM, } from "../../AppObject";
|
|
21
|
+
import { getSingletonComponent } from "../../AppObject/getSingletonComponent";
|
|
22
|
+
import { SingletonEntityExample } from "../Entities/ExampleSingletonEntity";
|
|
23
|
+
/**
|
|
24
|
+
* ExampleSingletonPM transforms SingletonEntityExample data into an ExampleVM.
|
|
25
|
+
* As a singleton, only one instance exists in the application.
|
|
26
|
+
*/
|
|
27
|
+
export class ExampleSingletonPM extends AppObjectPM {
|
|
28
|
+
}
|
|
29
|
+
/** Unique type identifier for this component */
|
|
30
|
+
ExampleSingletonPM.type = "ExampleSingletonPMType";
|
|
31
|
+
/**
|
|
32
|
+
* Global accessor for the singleton PM
|
|
33
|
+
* @param appObjects The AppObjectRepo to search in
|
|
34
|
+
* @returns The singleton PM or undefined if not created yet
|
|
35
|
+
*/
|
|
36
|
+
ExampleSingletonPM.get = (appObjects) => getSingletonComponent(ExampleSingletonPM.type, appObjects);
|
|
37
|
+
/**
|
|
38
|
+
* Default view model used when no data is available
|
|
39
|
+
* UI components can use this initially or when the PM is not found
|
|
40
|
+
*/
|
|
41
|
+
export const defaultSlideNavigationVM = {
|
|
42
|
+
aBoolProperty: true
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Factory function to create a new ExampleSingletonPM
|
|
46
|
+
* @param appObject The AppObject to attach the PM to
|
|
47
|
+
* @returns A new ExampleSingletonPM instance
|
|
48
|
+
*/
|
|
49
|
+
export function makeExampleSingletonPM(appObject) {
|
|
50
|
+
return new ExampleSingletonPMImp(appObject);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Concrete implementation of ExampleSingletonPM
|
|
54
|
+
* This private class handles the actual implementation details
|
|
55
|
+
*/
|
|
56
|
+
class ExampleSingletonPMImp extends ExampleSingletonPM {
|
|
57
|
+
/**
|
|
58
|
+
* Gets the SingletonEntityExample from the application
|
|
59
|
+
* Uses getCachedSingleton for efficient repeated access
|
|
60
|
+
*/
|
|
61
|
+
get exampleEntity() {
|
|
62
|
+
return this.getCachedSingleton(SingletonEntityExample.type);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Compares two view models to determine if they're equal
|
|
66
|
+
* Used to avoid unnecessary view updates when values haven't changed
|
|
67
|
+
*/
|
|
68
|
+
vmsAreEqual(a, b) {
|
|
69
|
+
if (a.aBoolProperty !== b.aBoolProperty)
|
|
70
|
+
return false;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
constructor(appObject) {
|
|
74
|
+
super(appObject, ExampleSingletonPM.type);
|
|
75
|
+
/**
|
|
76
|
+
* Handler for entity change events
|
|
77
|
+
* Transforms entity data into a view model and updates views
|
|
78
|
+
*/
|
|
79
|
+
this.onEntityChange = () => {
|
|
80
|
+
if (!this.exampleEntity)
|
|
81
|
+
return;
|
|
82
|
+
// Extract the boolean property from the entity
|
|
83
|
+
const aBoolProperty = this.exampleEntity.aBoolProperty;
|
|
84
|
+
// Create a view model with the extracted data
|
|
85
|
+
const vm = { aBoolProperty };
|
|
86
|
+
// Update all registered views with the new view model
|
|
87
|
+
this.doUpdateView(vm);
|
|
88
|
+
};
|
|
89
|
+
// Register as an observer of the entity to receive change notifications
|
|
90
|
+
this.exampleEntity?.addChangeObserver(this.onEntityChange);
|
|
91
|
+
// Call the change handler initially to set up the initial view model
|
|
92
|
+
this.onEntityChange();
|
|
93
|
+
// Register this PM as a singleton so it can be accessed globally
|
|
94
|
+
this.appObjects.registerSingleton(this);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ExampleSingletonPM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExampleSingletonPM.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/PMs/ExampleSingletonPM.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,WAAW,GAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAS5E;;;GAGG;AACH,MAAM,OAAgB,kBAAmB,SAAQ,WAAsB;;AACrE,gDAAgD;AAChC,uBAAI,GAAG,wBAAwB,CAAC;AAEhD;;;;GAIG;AACI,sBAAG,GAAG,CAAC,UAAyB,EAAkC,EAAE,CACzE,qBAAqB,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAG/D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAc;IACjD,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAoB;IAEpB,OAAO,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,qBAAsB,SAAQ,kBAAkB;IACpD;;;OAGG;IACH,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,kBAAkB,CAC5B,sBAAsB,CAAC,IAAI,CAC5B,CAAC;IACJ,CAAC;IAmBD;;;OAGG;IACH,WAAW,CAAC,CAAY,EAAE,CAAY;QACpC,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;QA3B5C;;;WAGG;QACH,mBAAc,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAEhC,+CAA+C;YAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;YAEvD,8CAA8C;YAC9C,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;YAE7B,sDAAsD;YACtD,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAcA,wEAAwE;QACxE,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3D,qEAAqE;QACrE,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["/**\r\n * ExampleSingletonPM.ts\r\n * \r\n * This file demonstrates how to implement a Singleton Presentation Manager (PM).\r\n * Singleton PMs are special PMs that exist only once in the application and can be\r\n * accessed globally. They transform data from singleton entities into view models.\r\n * \r\n * Key concepts:\r\n * - Singleton PMs extend AppObjectPM<VM> like regular PMs\r\n * - They register themselves as singletons with appObjects.registerSingleton()\r\n * - They're accessed through a static get() method using getSingletonComponent()\r\n * - They typically observe singleton entities and provide data to multiple UI components\r\n * \r\n * Usage pattern:\r\n * 1. Access the singleton PM using the static get() method\r\n * 2. Register UI components as views using addView(callback)\r\n * 3. PM will call the view callbacks with updated view models when entities change\r\n * 4. Remove UI components with removeView(callback) when they're unmounted\r\n */\r\n\r\nimport {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n} from \"../../AppObject\";\r\nimport { getSingletonComponent } from \"../../AppObject/getSingletonComponent\";\r\nimport { SingletonEntityExample } from \"../Entities/ExampleSingletonEntity\";\r\n\r\n/**\r\n * Interface defining the structure of the view model provided by ExampleSingletonPM\r\n */\r\nexport interface ExampleVM {\r\n aBoolProperty: boolean;\r\n}\r\n\r\n/**\r\n * ExampleSingletonPM transforms SingletonEntityExample data into an ExampleVM.\r\n * As a singleton, only one instance exists in the application.\r\n */\r\nexport abstract class ExampleSingletonPM extends AppObjectPM<ExampleVM> {\r\n /** Unique type identifier for this component */\r\n static readonly type = \"ExampleSingletonPMType\";\r\n\r\n /**\r\n * Global accessor for the singleton PM\r\n * @param appObjects The AppObjectRepo to search in\r\n * @returns The singleton PM or undefined if not created yet\r\n */\r\n static get = (appObjects: AppObjectRepo): ExampleSingletonPM | undefined =>\r\n getSingletonComponent(ExampleSingletonPM.type, appObjects);\r\n}\r\n\r\n/**\r\n * Default view model used when no data is available\r\n * UI components can use this initially or when the PM is not found\r\n */\r\nexport const defaultSlideNavigationVM: ExampleVM = {\r\n aBoolProperty: true\r\n};\r\n\r\n/**\r\n * Factory function to create a new ExampleSingletonPM\r\n * @param appObject The AppObject to attach the PM to\r\n * @returns A new ExampleSingletonPM instance\r\n */\r\nexport function makeExampleSingletonPM(\r\n appObject: AppObject\r\n): ExampleSingletonPM {\r\n return new ExampleSingletonPMImp(appObject);\r\n}\r\n\r\n/**\r\n * Concrete implementation of ExampleSingletonPM\r\n * This private class handles the actual implementation details\r\n */\r\nclass ExampleSingletonPMImp extends ExampleSingletonPM {\r\n /**\r\n * Gets the SingletonEntityExample from the application\r\n * Uses getCachedSingleton for efficient repeated access\r\n */\r\n private get exampleEntity() {\r\n return this.getCachedSingleton<SingletonEntityExample>(\r\n SingletonEntityExample.type\r\n );\r\n }\r\n\r\n /**\r\n * Handler for entity change events\r\n * Transforms entity data into a view model and updates views\r\n */\r\n onEntityChange = () => {\r\n if (!this.exampleEntity) return;\r\n\r\n // Extract the boolean property from the entity\r\n const aBoolProperty = this.exampleEntity.aBoolProperty;\r\n\r\n // Create a view model with the extracted data\r\n const vm = { aBoolProperty };\r\n\r\n // Update all registered views with the new view model\r\n this.doUpdateView(vm);\r\n };\r\n\r\n /**\r\n * Compares two view models to determine if they're equal\r\n * Used to avoid unnecessary view updates when values haven't changed\r\n */\r\n vmsAreEqual(a: ExampleVM, b: ExampleVM): boolean {\r\n if (a.aBoolProperty !== b.aBoolProperty) return false;\r\n return true;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ExampleSingletonPM.type);\r\n\r\n // Register as an observer of the entity to receive change notifications\r\n this.exampleEntity?.addChangeObserver(this.onEntityChange);\r\n \r\n // Call the change handler initially to set up the initial view model\r\n this.onEntityChange();\r\n \r\n // Register this PM as a singleton so it can be accessed globally\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/PMs/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC","sourcesContent":["export * from \"./ExamplePM\";\r\nexport * from \"./ExampleSingletonPM\";\r\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EditExampleStringUC.ts
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to implement a Use Case (UC) component.
|
|
5
|
+
* UCs handle business logic and operations that modify entities.
|
|
6
|
+
* They encapsulate specific actions that can be performed in the application.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - UCs extend AppObjectUC and provide methods for specific operations
|
|
10
|
+
* - They implement business logic for modifying entities
|
|
11
|
+
* - They validate inputs and handle errors
|
|
12
|
+
* - Each UC instance is associated with a specific AppObject
|
|
13
|
+
*
|
|
14
|
+
* Usage pattern:
|
|
15
|
+
* 1. Get a UC instance using getById or get
|
|
16
|
+
* 2. Call the UC's methods to perform operations
|
|
17
|
+
* 3. The UC will update entities, which will trigger PM updates and UI refreshes
|
|
18
|
+
*/
|
|
19
|
+
import { AppObjectUC } from "../../AppObject";
|
|
20
|
+
import { ExampleEntity } from "../Entities/ExampleEntity";
|
|
21
|
+
/**
|
|
22
|
+
* EditExampleStringUC provides functionality to update the string property of an ExampleEntity.
|
|
23
|
+
* Abstract class provides the interface and static helper methods.
|
|
24
|
+
*/
|
|
25
|
+
export class EditExampleStringUC extends AppObjectUC {
|
|
26
|
+
/**
|
|
27
|
+
* Retrieves an EditExampleStringUC component from an AppObject
|
|
28
|
+
* @param appObj The AppObject to get the component from
|
|
29
|
+
* @returns The EditExampleStringUC component or undefined if not found
|
|
30
|
+
*/
|
|
31
|
+
static get(appObj) {
|
|
32
|
+
return appObj.getComponent(this.type);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Retrieves an EditExampleStringUC by its parent AppObject's ID
|
|
36
|
+
* @param id The ID of the parent AppObject
|
|
37
|
+
* @param appObjects The AppObjectRepo to search in
|
|
38
|
+
* @returns The EditExampleStringUC component or undefined if not found
|
|
39
|
+
*/
|
|
40
|
+
static getById(id, appObjects) {
|
|
41
|
+
return appObjects.get(id)?.getComponent(this.type);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Unique type identifier for this component */
|
|
45
|
+
EditExampleStringUC.type = "EditExampleStringUCType";
|
|
46
|
+
/**
|
|
47
|
+
* Factory function to create a new EditExampleStringUC
|
|
48
|
+
* @param appObject The AppObject to attach the UC to
|
|
49
|
+
* @returns A new EditExampleStringUC instance
|
|
50
|
+
*/
|
|
51
|
+
export function makeEditSlideTextUC(appObject) {
|
|
52
|
+
return new EditSlideTextUCImp(appObject);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Concrete implementation of EditExampleStringUC
|
|
56
|
+
* This private class handles the actual implementation details
|
|
57
|
+
*/
|
|
58
|
+
class EditSlideTextUCImp extends EditExampleStringUC {
|
|
59
|
+
/**
|
|
60
|
+
* Gets the ExampleEntity from the same AppObject
|
|
61
|
+
* Uses getCachedLocalComponent for efficient repeated access
|
|
62
|
+
*/
|
|
63
|
+
get exampleEntity() {
|
|
64
|
+
return this.getCachedLocalComponent(ExampleEntity.type);
|
|
65
|
+
}
|
|
66
|
+
constructor(appObject) {
|
|
67
|
+
super(appObject, EditExampleStringUC.type);
|
|
68
|
+
/**
|
|
69
|
+
* Implements the editExampleString method to update the entity's string property
|
|
70
|
+
* @param text The new string value to set
|
|
71
|
+
*/
|
|
72
|
+
this.editExampleString = (text) => {
|
|
73
|
+
if (!this.exampleEntity) {
|
|
74
|
+
this.warn("Unable to find AppState");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Update the entity property, which will trigger PM updates and UI refreshes
|
|
78
|
+
this.exampleEntity.aStringProperty = text;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=EditExampleStringUC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditExampleStringUC.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/UCs/EditExampleStringUC.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAA4B,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;GAGG;AACH,MAAM,OAAgB,mBAAoB,SAAQ,WAAW;IAU3D;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,MAAiB;QAC1B,OAAO,MAAM,CAAC,YAAY,CAAsB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CACZ,EAAU,EACV,UAAyB;QAEzB,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,CAAsB,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;;AA7BD,gDAAgD;AAChC,wBAAI,GAAG,yBAAyB,CAAC;AA+BnD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,kBAAmB,SAAQ,mBAAmB;IAClD;;;OAGG;IACH,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,uBAAuB,CAAgB,aAAa,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAgBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAf7C;;;WAGG;QACH,sBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,6EAA6E;YAC7E,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5C,CAAC,CAAC;IAIF,CAAC;CACF","sourcesContent":["/**\r\n * EditExampleStringUC.ts\r\n * \r\n * This file demonstrates how to implement a Use Case (UC) component.\r\n * UCs handle business logic and operations that modify entities.\r\n * They encapsulate specific actions that can be performed in the application.\r\n * \r\n * Key concepts:\r\n * - UCs extend AppObjectUC and provide methods for specific operations\r\n * - They implement business logic for modifying entities\r\n * - They validate inputs and handle errors\r\n * - Each UC instance is associated with a specific AppObject\r\n * \r\n * Usage pattern:\r\n * 1. Get a UC instance using getById or get\r\n * 2. Call the UC's methods to perform operations\r\n * 3. The UC will update entities, which will trigger PM updates and UI refreshes\r\n */\r\n\r\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"../../AppObject\";\r\nimport { ExampleEntity } from \"../Entities/ExampleEntity\";\r\n\r\n/**\r\n * EditExampleStringUC provides functionality to update the string property of an ExampleEntity.\r\n * Abstract class provides the interface and static helper methods.\r\n */\r\nexport abstract class EditExampleStringUC extends AppObjectUC {\r\n /** Unique type identifier for this component */\r\n static readonly type = \"EditExampleStringUCType\";\r\n\r\n /**\r\n * Updates the string property of the associated ExampleEntity\r\n * @param text The new string value to set\r\n */\r\n abstract editExampleString(text: string): void;\r\n\r\n /**\r\n * Retrieves an EditExampleStringUC component from an AppObject\r\n * @param appObj The AppObject to get the component from\r\n * @returns The EditExampleStringUC component or undefined if not found\r\n */\r\n static get(appObj: AppObject): EditExampleStringUC | undefined {\r\n return appObj.getComponent<EditExampleStringUC>(this.type);\r\n }\r\n\r\n /**\r\n * Retrieves an EditExampleStringUC by its parent AppObject's ID\r\n * @param id The ID of the parent AppObject\r\n * @param appObjects The AppObjectRepo to search in\r\n * @returns The EditExampleStringUC component or undefined if not found\r\n */\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): EditExampleStringUC | undefined {\r\n return appObjects.get(id)?.getComponent<EditExampleStringUC>(this.type);\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new EditExampleStringUC\r\n * @param appObject The AppObject to attach the UC to\r\n * @returns A new EditExampleStringUC instance\r\n */\r\nexport function makeEditSlideTextUC(appObject: AppObject): EditExampleStringUC {\r\n return new EditSlideTextUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Concrete implementation of EditExampleStringUC\r\n * This private class handles the actual implementation details\r\n */\r\nclass EditSlideTextUCImp extends EditExampleStringUC {\r\n /**\r\n * Gets the ExampleEntity from the same AppObject\r\n * Uses getCachedLocalComponent for efficient repeated access\r\n */\r\n private get exampleEntity() {\r\n return this.getCachedLocalComponent<ExampleEntity>(ExampleEntity.type);\r\n }\r\n\r\n /**\r\n * Implements the editExampleString method to update the entity's string property\r\n * @param text The new string value to set\r\n */\r\n editExampleString = (text: string) => {\r\n if (!this.exampleEntity) {\r\n this.warn(\"Unable to find AppState\");\r\n return;\r\n }\r\n\r\n // Update the entity property, which will trigger PM updates and UI refreshes\r\n this.exampleEntity.aStringProperty = text;\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EditExampleStringUC.type);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToggleExampleBooleanUC.ts
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to implement a Singleton Use Case (UC) component.
|
|
5
|
+
* Singleton UCs are special UCs that exist only once in the application and can be
|
|
6
|
+
* accessed globally. They handle business logic and operations that modify singleton entities.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - Singleton UCs extend AppObjectUC like regular UCs
|
|
10
|
+
* - They register themselves as singletons with appObjects.registerSingleton()
|
|
11
|
+
* - They're accessed through a static get() method using getSingletonComponent()
|
|
12
|
+
* - They typically operate on singleton entities
|
|
13
|
+
*
|
|
14
|
+
* Usage pattern:
|
|
15
|
+
* 1. Access the singleton UC using the static get() method
|
|
16
|
+
* 2. Call the UC's methods to perform operations
|
|
17
|
+
* 3. The UC will update entities, which will trigger PM updates and UI refreshes
|
|
18
|
+
*/
|
|
19
|
+
import { AppObjectUC } from "../../AppObject";
|
|
20
|
+
import { getSingletonComponent } from "../../AppObject/getSingletonComponent";
|
|
21
|
+
import { SingletonEntityExample } from "../Entities/ExampleSingletonEntity";
|
|
22
|
+
/**
|
|
23
|
+
* ToggleExampleBooleanUC provides functionality to toggle the boolean property
|
|
24
|
+
* of the SingletonEntityExample. As a singleton, only one instance exists in the application.
|
|
25
|
+
*/
|
|
26
|
+
export class ToggleExampleBooleanUC extends AppObjectUC {
|
|
27
|
+
}
|
|
28
|
+
/** Unique type identifier for this component */
|
|
29
|
+
ToggleExampleBooleanUC.type = "ToggleExampleBooleanUCType";
|
|
30
|
+
/**
|
|
31
|
+
* Global accessor for the singleton UC
|
|
32
|
+
* @param appObjects The AppObjectRepo to search in
|
|
33
|
+
* @returns The singleton UC or undefined if not created yet
|
|
34
|
+
*/
|
|
35
|
+
ToggleExampleBooleanUC.get = (appObjects) => getSingletonComponent(ToggleExampleBooleanUC.type, appObjects);
|
|
36
|
+
/**
|
|
37
|
+
* Factory function to create a new ToggleExampleBooleanUC
|
|
38
|
+
* @param appObject The AppObject to attach the UC to
|
|
39
|
+
* @returns A new ToggleExampleBooleanUC instance
|
|
40
|
+
*/
|
|
41
|
+
export function makeToggleExampleBooleanUC(appObject) {
|
|
42
|
+
return new ToggleExampleBooleanUCImp(appObject);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Concrete implementation of ToggleExampleBooleanUC
|
|
46
|
+
* This private class handles the actual implementation details
|
|
47
|
+
*/
|
|
48
|
+
class ToggleExampleBooleanUCImp extends ToggleExampleBooleanUC {
|
|
49
|
+
/**
|
|
50
|
+
* Gets the SingletonEntityExample from the application
|
|
51
|
+
* Uses getCachedSingleton for efficient repeated access
|
|
52
|
+
*/
|
|
53
|
+
get singletonEntityExample() {
|
|
54
|
+
return this.getCachedSingleton(SingletonEntityExample.type);
|
|
55
|
+
}
|
|
56
|
+
constructor(appObject) {
|
|
57
|
+
super(appObject, ToggleExampleBooleanUC.type);
|
|
58
|
+
/**
|
|
59
|
+
* Implements the toggleExampleBoolean method to invert the entity's boolean property
|
|
60
|
+
*/
|
|
61
|
+
this.toggleExampleBoolean = () => {
|
|
62
|
+
if (!this.singletonEntityExample) {
|
|
63
|
+
this.warn("Unable to find SingletonEntityExample");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Toggle the boolean property by inverting its current value
|
|
67
|
+
this.singletonEntityExample.aBoolProperty =
|
|
68
|
+
!this.singletonEntityExample?.aBoolProperty;
|
|
69
|
+
};
|
|
70
|
+
// Register this UC as a singleton so it can be accessed globally
|
|
71
|
+
this.appObjects.registerSingleton(this);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ToggleExampleBooleanUC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleExampleBooleanUC.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/UCs/ToggleExampleBooleanUC.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAGL,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E;;;GAGG;AACH,MAAM,OAAgB,sBAAuB,SAAQ,WAAW;;AAC9D,gDAAgD;AAChC,2BAAI,GAAG,4BAA4B,CAAC;AAOpD;;;;GAIG;AACI,0BAAG,GAAG,CACX,UAAyB,EACW,EAAE,CACtC,qBAAqB,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAGnE;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,yBAA0B,SAAQ,sBAAsB;IAC5D;;;OAGG;IACH,IAAY,sBAAsB;QAChC,OAAO,IAAI,CAAC,kBAAkB,CAC5B,sBAAsB,CAAC,IAAI,CAC5B,CAAC;IACJ,CAAC;IAgBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAfhD;;WAEG;QACH,yBAAoB,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,6DAA6D;YAC7D,IAAI,CAAC,sBAAsB,CAAC,aAAa;gBACvC,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC;QAChD,CAAC,CAAC;QAIA,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["/**\r\n * ToggleExampleBooleanUC.ts\r\n * \r\n * This file demonstrates how to implement a Singleton Use Case (UC) component.\r\n * Singleton UCs are special UCs that exist only once in the application and can be\r\n * accessed globally. They handle business logic and operations that modify singleton entities.\r\n * \r\n * Key concepts:\r\n * - Singleton UCs extend AppObjectUC like regular UCs\r\n * - They register themselves as singletons with appObjects.registerSingleton()\r\n * - They're accessed through a static get() method using getSingletonComponent()\r\n * - They typically operate on singleton entities\r\n * \r\n * Usage pattern:\r\n * 1. Access the singleton UC using the static get() method\r\n * 2. Call the UC's methods to perform operations\r\n * 3. The UC will update entities, which will trigger PM updates and UI refreshes\r\n */\r\n\r\nimport {\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"../../AppObject\";\r\nimport { getSingletonComponent } from \"../../AppObject/getSingletonComponent\";\r\nimport { SingletonEntityExample } from \"../Entities/ExampleSingletonEntity\";\r\n\r\n/**\r\n * ToggleExampleBooleanUC provides functionality to toggle the boolean property\r\n * of the SingletonEntityExample. As a singleton, only one instance exists in the application.\r\n */\r\nexport abstract class ToggleExampleBooleanUC extends AppObjectUC {\r\n /** Unique type identifier for this component */\r\n static readonly type = \"ToggleExampleBooleanUCType\";\r\n\r\n /**\r\n * Toggles the boolean property of the SingletonEntityExample\r\n */\r\n abstract toggleExampleBoolean(): void;\r\n\r\n /**\r\n * Global accessor for the singleton UC\r\n * @param appObjects The AppObjectRepo to search in\r\n * @returns The singleton UC or undefined if not created yet\r\n */\r\n static get = (\r\n appObjects: AppObjectRepo\r\n ): ToggleExampleBooleanUC | undefined =>\r\n getSingletonComponent(ToggleExampleBooleanUC.type, appObjects);\r\n}\r\n\r\n/**\r\n * Factory function to create a new ToggleExampleBooleanUC\r\n * @param appObject The AppObject to attach the UC to\r\n * @returns A new ToggleExampleBooleanUC instance\r\n */\r\nexport function makeToggleExampleBooleanUC(\r\n appObject: AppObject\r\n): ToggleExampleBooleanUC {\r\n return new ToggleExampleBooleanUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Concrete implementation of ToggleExampleBooleanUC\r\n * This private class handles the actual implementation details\r\n */\r\nclass ToggleExampleBooleanUCImp extends ToggleExampleBooleanUC {\r\n /**\r\n * Gets the SingletonEntityExample from the application\r\n * Uses getCachedSingleton for efficient repeated access\r\n */\r\n private get singletonEntityExample() {\r\n return this.getCachedSingleton<SingletonEntityExample>(\r\n SingletonEntityExample.type\r\n );\r\n }\r\n\r\n /**\r\n * Implements the toggleExampleBoolean method to invert the entity's boolean property\r\n */\r\n toggleExampleBoolean = () => {\r\n if (!this.singletonEntityExample) {\r\n this.warn(\"Unable to find SingletonEntityExample\");\r\n return;\r\n }\r\n\r\n // Toggle the boolean property by inverting its current value\r\n this.singletonEntityExample.aBoolProperty =\r\n !this.singletonEntityExample?.aBoolProperty;\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ToggleExampleBooleanUC.type);\r\n // Register this UC as a singleton so it can be accessed globally\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ExampleFeature/UCs/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC","sourcesContent":["export * from \"./EditExampleStringUC\";\r\nexport * from \"./ToggleExampleBooleanUC\";\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ExampleFeature/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC","sourcesContent":["export * from \"./Adapters\";\r\nexport * from \"./Controllers\";\r\nexport * from \"./Entities\";\r\nexport * from \"./Factory\";\r\nexport * from \"./Mocks\";\r\nexport * from \"./PMs\";\r\nexport * from \"./UCs\";"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PmAdapter.js","sourceRoot":"","sources":["../../../src/Types/PmAdapter.ts"],"names":[],"mappings":"","sourcesContent":["import { AppObjectRepo } from \"../AppObject\";\r\n\r\nexport interface PmAdapter<VM> {\r\n defaultVM: VM;\r\n subscribe(\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: VM) => void\r\n ): void;\r\n unsubscribe(\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: VM) => void\r\n ): void;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"PmAdapter.js","sourceRoot":"","sources":["../../../src/Types/PmAdapter.ts"],"names":[],"mappings":"","sourcesContent":["import { AppObjectRepo } from \"../AppObject\";\r\n\r\n/**\r\n * PmAdapter interface defines a bridge between UI components and AppObjectPM (Presentation Manager) components.\r\n * It allows UI frameworks (like React, Vue, Angular, etc.) to subscribe to view model updates from specific AppObjects.\r\n * \r\n * This adapter is used for AppObject-specific subscriptions, where each UI component subscribes to\r\n * a particular AppObject's presentation manager, identified by its ID.\r\n * \r\n * Usage example with React:\r\n * ```typescript\r\n * // Define an adapter for a specific view model type\r\n * class MyComponentAdapter implements PmAdapter<MyViewModel> {\r\n * // Default view model when no data is available\r\n * defaultVM: MyViewModel = { value: 0, label: \"\" };\r\n * \r\n * // Subscribe to updates from a specific AppObject's presentation manager\r\n * subscribe(id: string, appObjects: AppObjectRepo, setVM: (vm: MyViewModel) => void): void {\r\n * const appObject = appObjects.get(id);\r\n * if (!appObject) return;\r\n * \r\n * const pm = appObject.getComponent<MyPM>(\"MyPresentationManager\");\r\n * if (pm) {\r\n * pm.addView(setVM);\r\n * // Initial update with current view model if available\r\n * if (pm.lastVM) setVM(pm.lastVM);\r\n * }\r\n * }\r\n * \r\n * // Unsubscribe when component unmounts\r\n * unsubscribe(id: string, appObjects: AppObjectRepo, setVM: (vm: MyViewModel) => void): void {\r\n * const appObject = appObjects.get(id);\r\n * if (!appObject) return;\r\n * \r\n * const pm = appObject.getComponent<MyPM>(\"MyPresentationManager\");\r\n * if (pm) {\r\n * pm.removeView(setVM);\r\n * }\r\n * }\r\n * }\r\n * ```\r\n * \r\n * @typeparam VM The view model type provided by this adapter\r\n */\r\nexport interface PmAdapter<VM> {\r\n /**\r\n * Default view model to use when no data is available\r\n * This prevents null/undefined handling in UI components\r\n */\r\n defaultVM: VM;\r\n \r\n /**\r\n * Subscribe to view model updates from an AppObject's presentation manager\r\n * \r\n * @param id The ID of the AppObject to subscribe to\r\n * @param appObjects The repository containing the AppObjects\r\n * @param setVM Callback function that updates the UI with new view models\r\n */\r\n subscribe(\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: VM) => void\r\n ): void;\r\n \r\n /**\r\n * Unsubscribe from view model updates when a component is being unmounted or no longer needs updates\r\n * \r\n * @param id The ID of the AppObject to unsubscribe from\r\n * @param appObjects The repository containing the AppObjects\r\n * @param setVM The same callback function that was provided to subscribe\r\n */\r\n unsubscribe(\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: VM) => void\r\n ): void;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingletonPmAdapter.js","sourceRoot":"","sources":["../../../src/Types/SingletonPmAdapter.ts"],"names":[],"mappings":"","sourcesContent":["import { AppObjectRepo } from \"../AppObject\";\r\n\r\nexport interface SingletonPmAdapter<VM> {\r\n defaultVM: VM;\r\n subscribe(appObjects: AppObjectRepo, setVM: (vm: VM) => void): void;\r\n unsubscribe(appObjects: AppObjectRepo, setVM: (vm: VM) => void): void;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SingletonPmAdapter.js","sourceRoot":"","sources":["../../../src/Types/SingletonPmAdapter.ts"],"names":[],"mappings":"","sourcesContent":["import { AppObjectRepo } from \"../AppObject\";\r\n\r\n/**\r\n * SingletonPmAdapter interface defines a bridge between UI components and singleton presentation managers.\r\n * It's similar to PmAdapter but designed for components that subscribe to a singleton PM \r\n * (a PM that exists only once in the application).\r\n * \r\n * This adapter simplifies the subscription process when there's only one instance of a specific\r\n * presentation manager type in the entire application, eliminating the need to specify an AppObject ID.\r\n * \r\n * Usage example with React:\r\n * ```typescript\r\n * // Define an adapter for a singleton presentation manager\r\n * class GlobalSettingsPMAdapter implements SingletonPmAdapter<SettingsViewModel> {\r\n * // Default view model when no data is available\r\n * defaultVM: SettingsViewModel = { theme: \"light\", fontSize: \"medium\" };\r\n * \r\n * // Subscribe to updates from the singleton presentation manager\r\n * subscribe(appObjects: AppObjectRepo, setVM: (vm: SettingsViewModel) => void): void {\r\n * // Get the singleton PM\r\n * const settingsPM = appObjects.getSingleton<SettingsPM>(\"SettingsPM\");\r\n * if (settingsPM) {\r\n * // Register the update callback\r\n * settingsPM.addView(setVM);\r\n * // Initial update with current view model if available\r\n * if (settingsPM.lastVM) setVM(settingsPM.lastVM);\r\n * }\r\n * }\r\n * \r\n * // Unsubscribe when component unmounts\r\n * unsubscribe(appObjects: AppObjectRepo, setVM: (vm: SettingsViewModel) => void): void {\r\n * const settingsPM = appObjects.getSingleton<SettingsPM>(\"SettingsPM\");\r\n * if (settingsPM) {\r\n * settingsPM.removeView(setVM);\r\n * }\r\n * }\r\n * }\r\n * ```\r\n * \r\n * @typeparam VM The view model type provided by this adapter\r\n */\r\nexport interface SingletonPmAdapter<VM> {\r\n /**\r\n * Default view model to use when no data is available\r\n * This prevents null/undefined handling in UI components\r\n */\r\n defaultVM: VM;\r\n \r\n /**\r\n * Subscribe to view model updates from a singleton presentation manager\r\n * \r\n * @param appObjects The repository containing the AppObjects\r\n * @param setVM Callback function that updates the UI with new view models\r\n */\r\n subscribe(appObjects: AppObjectRepo, setVM: (vm: VM) => void): void;\r\n \r\n /**\r\n * Unsubscribe from view model updates when a component is being unmounted or no longer needs updates\r\n * \r\n * @param appObjects The repository containing the AppObjects\r\n * @param setVM The same callback function that was provided to subscribe\r\n */\r\n unsubscribe(appObjects: AppObjectRepo, setVM: (vm: VM) => void): void;\r\n}\r\n"]}
|
|
@@ -20,7 +20,7 @@ export class Angle {
|
|
|
20
20
|
* @param a Angle A
|
|
21
21
|
* @param b Angle B
|
|
22
22
|
* @param tolerance Tolerance for "Close" in degrees. Defaults to 0.001;
|
|
23
|
-
* @returns True if the difference between A and B (in
|
|
23
|
+
* @returns True if the difference between A and B (in degrees) is less than the tolerance
|
|
24
24
|
*/
|
|
25
25
|
static Close(a, b, tolerance = 0.001) {
|
|
26
26
|
let diff = a.degrees - b.degrees;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/ValueObjects/Angle.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IAChB;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAe;QACvC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAe;QACvC,OAAO,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,CAAQ,EAAE,CAAQ,EAAE,YAAoB,KAAK;QAC/D,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACjC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,GAAG,CAAC,IAAI,CAAC;QACf,CAAC;QACD,OAAO,IAAI,GAAG,SAAS,CAAC;IAC1B,CAAC;IAGD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACzC,CAAC;IAED,YAAoB,OAAe;QAT3B,aAAQ,GAAG,CAAC,CAAC;QAUnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CACF","sourcesContent":["export class Angle {\r\n /**\r\n * Creates an angle from degrees\r\n * @param degrees Angle in degrees\r\n * @returns The angle\r\n */\r\n public static FromDegrees(degrees: number): Angle {\r\n return new Angle(degrees);\r\n }\r\n\r\n /**\r\n * Creates an angle from radians\r\n * @param radians Angle in radians\r\n * @returns The angle\r\n */\r\n public static FromRadians(radians: number): Angle {\r\n return new Angle((radians * 180) / Math.PI);\r\n }\r\n\r\n /**\r\n * Check to see if two angles are close\r\n * @param a Angle A\r\n * @param b Angle B\r\n * @param tolerance Tolerance for \"Close\" in degrees. Defaults to 0.001;\r\n * @returns True if the difference between A and B (in
|
|
1
|
+
{"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/ValueObjects/Angle.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IAChB;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAe;QACvC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,WAAW,CAAC,OAAe;QACvC,OAAO,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,CAAQ,EAAE,CAAQ,EAAE,YAAoB,KAAK;QAC/D,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACjC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,GAAG,CAAC,IAAI,CAAC;QACf,CAAC;QACD,OAAO,IAAI,GAAG,SAAS,CAAC;IAC1B,CAAC;IAGD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACzC,CAAC;IAED,YAAoB,OAAe;QAT3B,aAAQ,GAAG,CAAC,CAAC;QAUnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CACF","sourcesContent":["export class Angle {\r\n /**\r\n * Creates an angle from degrees\r\n * @param degrees Angle in degrees\r\n * @returns The angle\r\n */\r\n public static FromDegrees(degrees: number): Angle {\r\n return new Angle(degrees);\r\n }\r\n\r\n /**\r\n * Creates an angle from radians\r\n * @param radians Angle in radians\r\n * @returns The angle\r\n */\r\n public static FromRadians(radians: number): Angle {\r\n return new Angle((radians * 180) / Math.PI);\r\n }\r\n\r\n /**\r\n * Check to see if two angles are close\r\n * @param a Angle A\r\n * @param b Angle B\r\n * @param tolerance Tolerance for \"Close\" in degrees. Defaults to 0.001;\r\n * @returns True if the difference between A and B (in degrees) is less than the tolerance\r\n */\r\n public static Close(a: Angle, b: Angle, tolerance: number = 0.001): boolean {\r\n let diff = a.degrees - b.degrees;\r\n if (diff < 0) {\r\n diff = -diff;\r\n }\r\n return diff < tolerance;\r\n }\r\n\r\n private _degrees = 0;\r\n public get degrees() {\r\n return this._degrees;\r\n }\r\n\r\n public get radians() {\r\n return (this._degrees * Math.PI) / 180;\r\n }\r\n\r\n private constructor(degrees: number) {\r\n this._degrees = degrees;\r\n }\r\n}\r\n"]}
|
|
@@ -22,14 +22,14 @@ export class LineSegment2D {
|
|
|
22
22
|
}
|
|
23
23
|
const tNumerator = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4);
|
|
24
24
|
const t = tNumerator / denominator;
|
|
25
|
-
const
|
|
26
|
-
if (t < -
|
|
25
|
+
const tTolerance = tolerance / a.length;
|
|
26
|
+
if (t < -tTolerance || t > 1 + tTolerance) {
|
|
27
27
|
return undefined;
|
|
28
28
|
}
|
|
29
29
|
const uNumerator = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
|
|
30
30
|
const u = uNumerator / denominator;
|
|
31
|
-
const
|
|
32
|
-
if (u < -
|
|
31
|
+
const uTolerance = tolerance / b.length;
|
|
32
|
+
if (u < -uTolerance || u > 1 + uTolerance)
|
|
33
33
|
return undefined;
|
|
34
34
|
const px = x1 + t * (x2 - x1);
|
|
35
35
|
const py = y1 + t * (y2 - y1);
|
|
@@ -49,13 +49,13 @@ export class LineSegment2D {
|
|
|
49
49
|
return line.end;
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
52
|
-
const length = t * direction.
|
|
52
|
+
const length = t * direction.magnitude;
|
|
53
53
|
direction = Vector2.NewVectorOfLength(direction, length);
|
|
54
54
|
return Vector2.Add(line.start, direction);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
get length() {
|
|
58
|
-
return Vector2.Subtract(this.start, this.end).
|
|
58
|
+
return Vector2.Subtract(this.start, this.end).magnitude;
|
|
59
59
|
}
|
|
60
60
|
get direction() {
|
|
61
61
|
return Vector2.Subtract(this.end, this.start).unit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineSegment2D.js","sourceRoot":"","sources":["../../../src/ValueObjects/LineSegment2D.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector2 } from \"./Vector2\";\r\n\r\nexport class LineSegment2D {\r\n public static GetPositionAtPercent(\r\n line: LineSegment2D,\r\n percent: number\r\n ): Vector2 {\r\n const dir = line.direction;\r\n const length = percent * line.length;\r\n\r\n const localPos = Vector2.NewVectorOfLength(dir, length);\r\n\r\n return Vector2.Add(line.start, localPos);\r\n }\r\n\r\n public static Intersect(\r\n a: LineSegment2D,\r\n b: LineSegment2D,\r\n tolerance = 0\r\n ): Vector2 | undefined {\r\n // See https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection\r\n const x1 = a.start.x;\r\n const y1 = a.start.y;\r\n const x2 = a.end.x;\r\n const y2 = a.end.y;\r\n const x3 = b.start.x;\r\n const y3 = b.start.y;\r\n const x4 = b.end.x;\r\n const y4 = b.end.y;\r\n\r\n const denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\r\n if (denominator === 0) {\r\n return undefined;\r\n }\r\n\r\n const tNumerator = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4);\r\n const t = tNumerator / denominator;\r\n\r\n const
|
|
1
|
+
{"version":3,"file":"LineSegment2D.js","sourceRoot":"","sources":["../../../src/ValueObjects/LineSegment2D.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector2 } from \"./Vector2\";\r\n\r\nexport class LineSegment2D {\r\n public static GetPositionAtPercent(\r\n line: LineSegment2D,\r\n percent: number\r\n ): Vector2 {\r\n const dir = line.direction;\r\n const length = percent * line.length;\r\n\r\n const localPos = Vector2.NewVectorOfLength(dir, length);\r\n\r\n return Vector2.Add(line.start, localPos);\r\n }\r\n\r\n public static Intersect(\r\n a: LineSegment2D,\r\n b: LineSegment2D,\r\n tolerance = 0\r\n ): Vector2 | undefined {\r\n // See https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection\r\n const x1 = a.start.x;\r\n const y1 = a.start.y;\r\n const x2 = a.end.x;\r\n const y2 = a.end.y;\r\n const x3 = b.start.x;\r\n const y3 = b.start.y;\r\n const x4 = b.end.x;\r\n const y4 = b.end.y;\r\n\r\n const denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\r\n if (denominator === 0) {\r\n return undefined;\r\n }\r\n\r\n const tNumerator = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4);\r\n const t = tNumerator / denominator;\r\n\r\n const tTolerance = tolerance / a.length;\r\n if (t < -tTolerance || t > 1 + tTolerance) {\r\n return undefined;\r\n }\r\n\r\n const uNumerator = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);\r\n const u = uNumerator / denominator;\r\n\r\n const uTolerance = tolerance / b.length;\r\n if (u < -uTolerance || u > 1 + uTolerance) return undefined;\r\n\r\n const px = x1 + t * (x2 - x1);\r\n const py = y1 + t * (y2 - y1);\r\n\r\n return new Vector2(px, py);\r\n }\r\n\r\n public static ClosestPointOnLine(\r\n line: LineSegment2D,\r\n point: Vector2\r\n ): Vector2 {\r\n // see https://monkeyproofsolutions.nl/wordpress/how-to-calculate-the-shortest-distance-between-a-point-and-a-line/\r\n let direction = Vector2.Subtract(line.end, line.start);\r\n const pointToStart = Vector2.Subtract(point, line.start);\r\n const tNumerator = Vector2.Dot(direction, pointToStart);\r\n const tDenominator = Vector2.Dot(direction, direction);\r\n const t = tNumerator / tDenominator;\r\n\r\n if (t < 0) {\r\n return line.start;\r\n } else if (t > 1) {\r\n return line.end;\r\n } else {\r\n const length = t * direction.magnitude;\r\n direction = Vector2.NewVectorOfLength(direction, length);\r\n return Vector2.Add(line.start, direction);\r\n }\r\n }\r\n\r\n readonly start: Vector2;\r\n readonly end: Vector2;\r\n\r\n public get length(): number {\r\n return Vector2.Subtract(this.start, this.end).magnitude;\r\n }\r\n\r\n public get direction(): Vector2 {\r\n return Vector2.Subtract(this.end, this.start).unit;\r\n }\r\n\r\n constructor(start: Vector2, end: Vector2) {\r\n this.start = start;\r\n this.end = end;\r\n }\r\n}\r\n"]}
|
|
@@ -2,21 +2,21 @@ import { Quaternion } from "./Quaternion";
|
|
|
2
2
|
import { Vector3 } from "./Vector3";
|
|
3
3
|
export class Matrix {
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Constructs an identity matrix
|
|
6
6
|
* @returns An identity matrix
|
|
7
7
|
*/
|
|
8
8
|
static Identity() {
|
|
9
9
|
return new Matrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Constructs
|
|
12
|
+
* Constructs a matrix of zeros
|
|
13
13
|
* @returns A matrix of zeros
|
|
14
14
|
*/
|
|
15
15
|
static Zero() {
|
|
16
16
|
return new Matrix([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Compares two
|
|
19
|
+
* Compares two matrices
|
|
20
20
|
* @param a Matrix A
|
|
21
21
|
* @param b Matrix B
|
|
22
22
|
* @returns True if all the elements in matrix A are equal to all the elements of matrix B
|
|
@@ -35,7 +35,7 @@ export class Matrix {
|
|
|
35
35
|
* Checks to see if Matrix A is close to Matrix B by comparing elements
|
|
36
36
|
* @param a Matrix A
|
|
37
37
|
* @param b Matrix B
|
|
38
|
-
* @param threshold "Close"
|
|
38
|
+
* @param threshold "Close" threshold. Defaults to 0.001
|
|
39
39
|
* @returns True if all the difference between the elements in each array is less than the threshold
|
|
40
40
|
*/
|
|
41
41
|
static Close(a, b, threshold = 0.001) {
|
|
@@ -129,7 +129,7 @@ export class Matrix {
|
|
|
129
129
|
]);
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
|
-
* Composes a matrix from a scale vector, rotation
|
|
132
|
+
* Composes a matrix from a scale vector, rotation quaternion, and translation vector
|
|
133
133
|
* @param scale The scale of the transformation matrix
|
|
134
134
|
* @param rotation The rotation of the transformation matrix
|
|
135
135
|
* @param translation The translation of the transformation matrix
|
|
@@ -340,7 +340,7 @@ export class Matrix {
|
|
|
340
340
|
array[12],
|
|
341
341
|
array[13],
|
|
342
342
|
array[14],
|
|
343
|
-
array[15]
|
|
343
|
+
array[15],
|
|
344
344
|
];
|
|
345
345
|
return new Matrix(matrixArray);
|
|
346
346
|
}
|